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:
- Remove (DROP) todas as tabelas
- Recria as tabelas do zero
- 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_id→measurement_unit_idpa_descricao→ Cria/busca emactive_ingredientsmarca_descricao→ Cria/busca embrandstp_descricao→ Cria/busca emproduct_subtypesnome_comercial→ Vai paradescricaoenome_comercialemproducts
🚀 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:
- Defensivos Agrícolas
- Fertilizantes & Nutrição
- Sementes
- Adjuvantes & Modificadores de Calda
- 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_comercialvazio
🔄 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