PROMPT – LÓGICA DE PROCESSAMENTO DE RELATÓRIOS Plataforma Operacional ONSMS 📌 CONTEXTO Você é um engenheiro de software sênior responsável por implementar o módulo de processamento de relatórios de envio de uma Plataforma Operacional que integra com a API da OnSMS. Esse módulo recebe relatórios de envio (upload automático via e-mail ou upload manual), interpreta os dados, normaliza os status e atualiza os registros da campanha com base exclusiva no número de telefone. Não use IA, NLP ou inferência. Tudo deve ser determinístico, auditável e previsível. 🎯 OBJETIVO DO MÓDULO Ler arquivos de relatório (csv e txt) Processar cada linha como um registro de envio Usar o telefone como chave primária Extrair status, horário e observações Normalizar o status Atualizar o sistema Preparar os dados para retorno à API da OnSMS 🧠 PRINCÍPIO FUNDAMENTAL O número de telefone é a verdade absoluta do sistema. Sem telefone válido: o registro é ignorado o erro é logado nenhuma atualização é feita 🗂️ FORMATOS DE ARQUIVO SUPORTADOS (MVP) Obrigatórios .csv .txt Arquivos fora desses formatos devem ser rejeitados. 🧱 FLUXO GERAL DO PROCESSAMENTO Receber arquivo de relatório Identificar tipo do arquivo Ler o arquivo linha a linha Para cada linha: Extrair telefone Extrair status original Extrair horário (se existir) Extrair observações (se existir) Normalizar status Definir horário final Atualizar registro do telefone Registrar logs Finalizar campanha 📄 LEITURA DOS ARQUIVOS 🔹 CSV Detectar separador automaticamente (; ou ,) Ignorar cabeçalho textual Cada linha representa um telefone Exemplo: telefone,status,horario,obs 5583999999999,DELIVERED,2026-01-10 15:22:01,ok 🔹 TXT Uma linha = um registro Separadores aceitos: | ; , - \t Exemplos válidos: 5583999999999 | DELIVERED | 15:22 5583999999998 - ERRO 130472 5583999999997; ENVIADO 📞 EXTRAÇÃO E NORMALIZAÇÃO DO TELEFONE Regras: Remover espaços, parênteses, hífens e símbolos Manter apenas números Formato final esperado: DDI + DDD + NÚMERO Exemplo: +55 (83) 9 9999-9999 → 5583999999999 Regra crítica: Se não houver telefone válido → descartar linha e registrar erro 🏷️ EXTRAÇÃO DO STATUS ORIGINAL O status deve ser capturado exatamente como veio no relatório Não interpretar neste momento Pode conter texto, códigos ou mensagens Exemplos: DELIVERED ERROR 130472 NUMERO SEM WHATSAPP ENVIADO Salvar sempre como: status_original ⏰ EXTRAÇÃO E DEFINIÇÃO DO HORÁRIO 1️⃣ Tentar extrair horário do relatório Formatos aceitos: YYYY-MM-DD HH:MM:SS DD/MM/YYYY HH:MM HH:MM HH:MM:SS 2️⃣ Regra obrigatória Se o horário existir e for válido → usar o horário do relatório Se não existir ou for inválido → usar a data e hora atual do sistema 3️⃣ Auditoria Salvar também: horario_origem = "relatorio" ou "sistema" ❌ Nunca deixar horário nulo ❌ Nunca estimar horário passado 🔁 NORMALIZAÇÃO DE STATUS (REGRA OBRIGATÓRIA) Status finais permitidos: Enviado Não Enviado ➕ Mapear como Enviado Se status_original contiver (case insensitive): READ DELIVERED RECEIVED SENT ENVIADO LIDO RECEBIDO ENTREGUE ENVIADOS ❌ Mapear como Não Enviado Se status_original contiver: ERROR ERROR 130472 ERRO FALHA NAO ENVIADO NÃO ENVIADO NUMERO SEM WHATSAPP Fallback obrigatório Se não corresponder a nenhum padrão: status_final = "Não Enviado" observacao += " | Status não reconhecido" 📝 OBSERVAÇÃO (SEMPRE OBRIGATÓRIA) A observação deve sempre conter o status original, mesmo quando coincidir com o status final. Formato recomendado: "Status original: DELIVERED | Horário: 15:22" Nunca descartar o valor original. 🧱 ATUALIZAÇÃO DO REGISTRO Buscar o contato usando: campanha_id + telefone Se encontrado: Atualizar: status_final observacao horario horario_origem data_processamento Se não encontrado: Registrar log de divergência Não criar novos contatos 🔄 DUPLICIDADE DE NÚMEROS NO RELATÓRIO Regra MVP: A última ocorrência do telefone vence Registrar ocorrência duplicada em log. 🏁 FINALIZAÇÃO DA CAMPANHA Após processar todas as linhas: Se todos os telefones foram processados → Finalizada Se houver divergências → Finalizada com divergências 🔗 PREPARAÇÃO PARA ENVIO À API ONSMS Formato esperado (exemplo): { "lote_id": "1233", "phone": "5583999999999", "status": "Enviado", "observacao": "DELIVERED", "horario": "2026-02-02 09:41:12" } 🧠 FILOSOFIA DO MÓDULO Este processador deve ser: determinístico simples auditável previsível tolerante a formatos diferentes Nunca: inferir intenção “adivinhar” dados usar inteligência artificial ✅ PRIMEIRA ENTREGA ESPERADA Função principal de processamento Leitores de CSV e TXT Normalizador de status Normalizador de telefone Logs claros por linha 🔚 FIM DO PROMPT