0011 — Coordenação de lotes e notificação agregada¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-07-16 · Decidido em: 2026-04-10
Correção 2026-07-16: o mecanismo decidido aqui continua em uso — o
ConjuntoLoteServiceainda registra o progresso emxls_conjunto_lotee dispara uma única notificação Telegram agregada ao fim do lote. O que mudou é a origem doconjunto_ide do total: eles deixaram de ser campos opcionais declarados pelo cliente no POST e passaram a ser derivados do conteúdo pelo servidor. Hoje a ingestão é uma porta únicaPOST /api/xls/processarque recebe um.zip(o zip é o lote): o id ézip-<sha256 do zip>e o total é o número de entradas.xlsx. Com isso o lote virou a regra, não a exceção — não existe mais o caso "upload avulso sem os campos" descrito nas Consequências. Estado atual no livro.
Contexto¶
O cliente comercial não envia um arquivo por vez: manda um pacote de N planilhas (os vários relatórios do período). Cada upload é independente e assíncrono, então, sem coordenação, a equipe receberia N notificações Telegram soltas — ruído — e não teria um marco claro de "o lote inteiro terminou".
Decisão¶
O POST /api/xls/processar aceita dois campos opcionais: conjunto_id
(identificador do lote) e conjunto_total (quantos arquivos o lote tem). O
service/ConjuntoLoteService registra o progresso na tabela xls_conjunto_lote
e dispara uma notificação Telegram agregada quando o N-ésimo arquivo do
conjunto chega. Sem esses campos, cada arquivo é processado normalmente, de forma
independente.
Consequências¶
- Uma notificação por lote em vez de N — sinal limpo de "terminou" para a equipe.
- Os campos são opcionais: uploads avulsos continuam funcionando sem mudança.
- A tabela
xls_conjunto_loteé metadado do processador (xls_*): não sincroniza via PowerSync; o cliente não a edita. - Recurso exclusivo do Onpetro — o irmão Transporte não recebe pacotes de N arquivos, então não tem coordenação de lote.
Alternativas consideradas¶
- Uma notificação por arquivo: ruído proporcional ao tamanho do lote e sem marco de conclusão. Descartado.
- Agregar por janela de tempo (debounce): frágil — depende de timing de
chegada, não do total real do lote; um arquivo atrasado quebraria a contagem.
O
conjunto_totalexplícito é determinístico. Descartado.