4. Automações invisíveis — o motor do sistema

4.1 Scheduler em background (thread fn-scheduler, tick 60s)

Nota de arquitetura: este scheduler in-process é o worker atual. A fundação (outbox + idempotência + retry) já está pronta para extrair um serviço/worker dedicado (Celery/Dramatiq/RQ) sem reescrever a lógica — ver §7.5 e o roadmap (§10).

4.2 Agente local de impressão (polling)

Agente no balcão faz polling em /api/agente/fila-impressao (header X-Agente-Token). Backend devolve em ESC/POS base64 por estação. Salão: itens de comanda não impressos. Delivery: pedidos aceitos (idempotente via producao_impressa). Piggyback fiscal: a cada poll resolve NFC-e pendentes (_atualizar_notas_processando, throttle 90s) → nota vira autorizada+XML sem abrir tela.

4.3 Motor único de produção + fluxo de status

_aplicar_transicao_status(pedido, status): carimba o horário de cada etapa (aceito_em/pronto_em/saiu_em/entregue_em), dispara o WhatsApp transacional por etapa (idempotente por flag = anti-ban) e publica o evento no Event Bus (pedido_em_preparo|pronto|saiu_entrega|entregue, ver §7.1). Acionado no Caixa/Pedidos, modal e app do motoboy. Textos editáveis em Mensagens do Bot.

Importante (arquitetura atual): o "status" não é mais um único campo linear. O pedido tem máquinas de estado SEPARADASpayment_status, production_status, delivery_status, fiscal_status — sincronizadas neste motor (ver §7.2). Isso permite estados como "pago, parcialmente pronto, nota autorizada, aguardando motoboy".

4.4 Fechamento amarrado

Pedido aceito ou comanda fechada dispara em cadeia (idempotente): baixa de estoque → emissão NFC-e (gated) → impressão de produção → alimenta financeiro/relatórios.

4.5 Webhooks assíncronos

4.6 Fidelidade, carteira & cashback

Pedido entregue/pago → _creditar_fidelidade_pedido (pontos+cashback, idempotente). Cancelado → _carteira_estornar_pedido. Carteira abate no checkout.

4.7 Editor de site ao vivo (after_request)

@app.after_request injeta o overlay do Editor quando admin acessa com ?editor=1 e aplica overrides salvos no site vivo. Outro after_request aplica cache longo a estáticos versionados.

Versão para IA/crawler: /manual.md (Markdown cru) · /manual/completo (página única) · /sitemap.xml