Troubleshooting

Importação de Produtos Defensivos

Importação de Produtos Defensivos

⚠️ Situação Ocorrida

Durante a migração do Docker de OrbStack para Colima, foi executado php artisan migrate:fresh --seed que zerou completamente o banco de dados, perdendo os 4.000 produtos defensivos que haviam sido importados anteriormente.

Por que os volumes Docker não preservaram os dados?

Os volumes Docker preservaram o banco PostgreSQL corretamente. O problema foi que executamos um comando que propositalmente apaga e recria todas as tabelas:

php artisan migrate:fresh --seed  # ❌ NUNCA usar em produção!

Este comando:

  1. Remove (DROP) todas as tabelas
  2. Recria as tabelas do zero
  3. Executa os seeders básicos

Comando correto para migração:

php artisan migrate --seed  # ✅ Apenas adiciona novas migrations

🎯 Solução Implementada

Foi criado um comando Artisan para reimportar todos os produtos a partir do arquivo CSV original.

Arquivo CSV Original

  • Localização: /Users/gustavocarneiro/EMPRESA/web/agrsis/dados_produtos.csv
  • Total de registros: 4.015 linhas (incluindo header)
  • Produtos válidos: 3.969

Comando de Importação

php artisan import:products /caminho/para/dados_produtos.csv

📊 Dados Importados

Estatísticas Finais:

  • Produtos: 3.969 defensivos agrícolas
  • Marcas: 240 (Nortox, Syngenta, UPL, Adama, FMC, etc.)
  • Princípios Ativos: 712
  • Subtipos: 41

Tipo de Produto:

Todos os produtos do CSV são classificados como:

  • ID: 2
  • Nome: Defensivos Agrícolas

Subtipos Criados (41):

Os subtipos foram extraídos da coluna tp_descricao do CSV:

  • Acaricida/Inseticida
  • Acaricida/Inseticida/Nematicida
  • Adjuvante
  • Espalhante Adesivo
  • Fungicida
  • Herbicida
  • Inseticida
  • Nematicida
  • E outros...

🔧 Como Usar

1. Via Seeder (Recomendado para produção):

O seeder ProductSeeder foi criado para facilitar a importação dos produtos em produção. O arquivo CSV já está incluído no repositório em database/seeders/data/dados_produtos.csv.

# Executar apenas o ProductSeeder
php artisan db:seed --class=ProductSeeder

# Ou executar todos os seeders (inclui ProductSeeder)
php artisan db:seed

2. Via Comando Artisan (Importação manual):

Para importar de um arquivo CSV específico:

# Dentro do Container Docker:
docker cp dados_produtos.csv agrsis_api:/var/www/html/storage/app/
docker exec agrsis_api php artisan import:products /var/www/html/storage/app/dados_produtos.csv

# Localmente (fora do Docker):
cd apps/api
php artisan import:products /caminho/absoluto/dados_produtos.csv

📝 Estrutura do CSV

id,unidade_medida_id,um_descricao,principio_ativo_id,pa_descricao,marca_id,marca_descricao,tipo_produto_id,tp_descricao,nome_comercial,tipo_de_insumo
1,1,Litro,1,Abamectina,1,Nortox,1,Acaricida/Inseticida,ABAMECTIN 72 EC NORTOX,

Mapeamento de Colunas:

  • unidade_medida_idmeasurement_unit_id
  • pa_descricao → Cria/busca em active_ingredients
  • marca_descricao → Cria/busca em brands
  • tp_descricao → Cria/busca em product_subtypes
  • nome_comercial → Vai para descricao e nome_comercial em products

🚀 Funcionalidades do Comando

Recursos Implementados:

Import em lotes: Commit a cada 100 produtos ✅ Evita duplicatas: Verifica nome_comercial antes de inserir ✅ Cria relacionamentos: Marcas, princípios ativos e subtipos automaticamente ✅ Validação de dados: Ignora produtos com measurement_unit_id inválido ✅ Tratamento de erros: Continua importação mesmo com erros pontuais ✅ Estatísticas finais: Mostra resumo ao concluir

Logs de Progresso:

O comando exibe progresso a cada 100 produtos:

Importados 100 produtos...
Importados 200 produtos...
...
Importados 3900 produtos...
✅ Importação concluída!

⚠️ Observações Importantes

1. Sobre os Tipos de Produtos

Atualmente o ProductTypeSeeder possui 21 tipos genéricos, mas o correto deveria ser apenas 5:

  1. Defensivos Agrícolas
  2. Fertilizantes & Nutrição
  3. Sementes
  4. Adjuvantes & Modificadores de Calda
  5. Bioinsumos

TODO: Atualizar o ProductTypeSeeder.php para refletir os 5 tipos corretos.

2. Nomenclatura do Banco de Dados

O banco de dados possui nomenclatura mista:

  • Tabela orders: Colunas em inglês
  • Tabela products: Colunas em português (descricao, nome_comercial)
  • Tabela brands: Colunas em português (descricao)
  • Tabela active_ingredients: Colunas em português (descricao)

TODO: Padronizar nomenclatura do banco de dados futuramente.

3. Produtos com Dados Inválidos

11 produtos do CSV foram ignorados por terem:

  • measurement_unit_id = 0 (inválido)
  • nome_comercial vazio

🔄 Reimportação

Para reimportar todos os produtos (limpar e importar novamente):

# 1. Limpar produtos existentes
docker exec agrsis_api php artisan tinker --execute="
DB::table('products')->truncate();
DB::table('brands')->truncate();
DB::table('active_ingredients')->truncate();
DB::table('product_subtypes')->truncate();
echo 'Tabelas limpas!';
"

# 2. Reimportar do CSV
docker exec agrsis_api php artisan import:products /var/www/html/storage/app/dados_produtos.csv

📚 Referências

  • Arquivo CSV: /Users/gustavocarneiro/EMPRESA/web/agrsis/dados_produtos.csv
  • Comando: apps/api/app/Console/Commands/ImportProducts.php
  • Seeder Tipos: apps/api/database/seeders/ProductTypeSeeder.php
  • Seeder Unidades: apps/api/database/seeders/MeasurementUnitSeeder.php

Última atualização: 2025-12-19 Versão: 1.0

Copyright © 2026