Pular para conteúdo

05 — Coleta por remessa: o lote nunca mais sai pela metade

Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-09-09

Entregue em v0.0.12–v0.0.13 (2026-09-08 e 2026-09-09).

Escopo

O defeito que originou a etapa é concreto: a coleta fazia um SELECT por tabela e o PowerSync grava no SQLite local a qualquer momento — inclusive no meio da coleta. Os primeiros SELECTs rodavam antes de um lote de sync aterrissar, os últimos depois; o arquivo saía com o pedido sem o cliente, o ZIM devolvia 120 - Cliente não cadastrado, e 1XX é terminal: o pedido ficava órfão para sempre (pedido 260079421, 2026-09-08).

O que foi construído

Duas vias que convivem:

  • Por remessa — o Integrador declara, a cada push, o conjunto que precisa chegar junto ao ERP (o manifesto, que desce pelo PowerSync). A linha coberta por uma remessa viva só sai quando a remessa está inteira no banco local: falta um item, nada dela viaja. O cliente lê as flags que o servidor calcula (bloqueado, resolvido, total_itens) e não deduz dependência nenhuma.
  • Por presença — a linha que não pertence a remessa nenhuma sai como sempre saiu, depois de 3 ciclos de carência. O servidor só cria remessa onde há dependência, então cadastro avulso nunca terá uma; daqui, "linha cuja remessa ainda não chegou" e "linha que nunca terá remessa" são o mesmo estado observável.

Por cima disso, a coleta lê duas vezes e confere a passada inteira, manifesto incluído — banco que não sossega em três tentativas adia o lote. E o corte no teto de 999 registros respeita remessas inteiras, nunca pela metade.

Nada espera calado: remessa travada, remessa retida há muitos ciclos e item de tabela que o fluxo não conhece viram aviso no log e no GlitchTip, deduplicado por causa.

Decisões

Decisão Assunto
0003 leitura dupla com conferência (superada pela 0004)
0004 a unidade de entrega é declarada na origem