Cauê Faleiros 543a9a9fb4
Some checks failed
Build and deploy / Validate source (push) Successful in 5s
Build and deploy / Integration suite on a real stack (push) Failing after 10m30s
Build and deploy / Secret scan and release gate (push) Successful in 5s
Build and deploy / Publish images and notify Portainer (push) Has been skipped
perf: index the real queries, bound the board, and correct what the Site promises
Five items that needed no decisions.

Indexes: the schema indexed only uploads(owner), so the worker's once-a-second
outbox poll scanned a table that only grows, and every per-customer and
per-order lookup did the same. Ten indexes now follow queries the application
actually issues, and no more, since each one is paid for on every write. The
outbox and live uploads use partial indexes so they stay the size of the backlog
rather than of all history. Confirmed against the database that the planner
chooses them.

Board: /api/operator/board returned every order ever created. Finished orders
are terminal, so they were pure growth. It now returns everything still in
progress however old, plus a window of recent finished ones and the true
finished total, and the Kanban column says "50 de 213" rather than letting the
count read as an all-time figure. An operator cannot lose a card they could act
on.

Dependencies: the root requirements.txt was the prototype's, pinned by wildcard,
listing packages this system does not use, next to the hash-locked lock file.
Deleted. pip was pinned as a runtime dependency, which installed a package
manager into the read-only production image; nothing depended on it, so it is
gone from both the direct list and the lock, and the base image's pip performs
the hash-enforced install.

Retention copy: the Site told customers their artwork was kept 90 days with 12
months of history, and invited them to reorder without uploading again. Files
are kept 30 days. The copy now matches the policy and drops the promise the
system cannot keep.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 14:29:07 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00
2026-09-15 16:42:34 -03:00

Sistema DTF 24h — Altus Group

Active local milestone (2026-09-11): Read CONTEXT.md first. Start with docker compose up --build, then open the Site and Kanban. Optional configuration: copy .env.example to .env. Follow LOCAL_SETUP.md for the complete test flow, local login, health checks, and troubleshooting. See IMPLEMENTATION_REPORT.md for scope and reuse decisions. Production delivery uses one Portainer stack; see PORTAINER.md. Everything below is preserved historical prototype documentation, not the active setup or delivery specification. Do not run its production integrations or agent.

Documentação para o TI. Reúne o contexto do projeto, as decisões já tomadas, a arquitetura, o código e o que ainda depende de resposta. Base: conversas de 29 e 30/08/2026 com Marcus.


Por que este projeto existe

A sala de DTF tem 6 máquinas a 20 m/h. Em dois turnos, das 5h às 20h, isso dá 37.800 metros/mês de capacidade. A produção real de maio a agosto de 2026 ficou em 11.605 metros/mês — 31% de ocupação. O pico foi junho, com 12.373 m.

Não falta máquina. Falta a porta ficar aberta.

O que limita a venda é o horário em que conseguimos receber e responder. O pedido que chega às 17h30 espera até as 5h da manhã, porque não há ninguém para receber o arquivo, tratar e mandar imprimir. O cliente de DTF compra por rapidez, e a rapidez tem duas metades: receber e produzir. Hoje as duas param juntas às 20h.

O que muda com o projeto

Hoje · 18k m Com 24h · 36k m
Custo por metro R$ 9,43 R$ 7,46
Receita R$ 268.200 R$ 536.400
Resultado R$ 77.011 R$ 225.032
Margem 28,7% 42,0%

Ganho de R$ 148 mil/mês, R$ 1,78 milhão/ano, com a folha subindo 20% (R$ 6.333). Cada metro acima de 18 mil rende R$ 8,76 de margem de contribuição — insumo e manutenção custam R$ 4,94 e não mudam; folha, fixo e administrativo já estão pagos.

Contra isso, a infraestrutura do projeto custa R$ 160 a 450 por mês.

Os quatro furos do fluxo atual

  1. A arte entra por WhatsApp — canal que não registra nada auditável
  2. O número do pedido é digitado à mão no nome do arquivo; se errar, a arte some no servidor e ninguém descobre até o cliente cobrar
  3. O status vive numa pasta de rede — o Tiny sabe do pedido no começo e no fim, no meio ninguém sabe
  4. Ninguém mede o tempo de espera entre etapas

O item 4 é o que mais importa. Sem ele, não dá para saber se o gargalo é máquina ou designer — e essa resposta decide se vale montar o terceiro turno.


Três componentes que fazem a sala de DTF receber arte 24 horas e medir o próprio tempo.

Comece pelo TAREFAS.md — ordem de execução com critério de aceite. Depois ESPECIFICACAO.md — ele traz as fases de implementação, as funcionalidades uma a uma, e o que mudou depois das reuniões com os designers e a sala em 02/09/2026. Este README cobre a arquitetura.

TAREFAS.md         o que fazer, em ordem, com critério de aceite
ESPECIFICACAO.md   as funcionalidades uma a uma e o que mudou nas reuniões
API.md             contratos de todos os endpoints
schema.sql         banco completo, nuvem e local
README.md          arquitetura e decisões (este arquivo)

portal/   FastAPI na nuvem  · recebe a arte, valida, repete, fatia, carimba
agente/   script na fábrica · traz o arquivo aprovado para o servidor
kanban/   FastAPI local     · a sala move o card, o Tiny recebe o marcador
          static/kanban.html  front já conectado à API

O que cada um faz

portal — aberto na internet, roda em VPS. O Tiny avisa por webhook que nasceu um pedido; o portal cria um link com token e manda no WhatsApp. O cliente sobe o arquivo direto para o storage, sem passar pelo servidor. O robô valida, empilha as repetições, fatia em partes de no máximo 15 m e carimba a última.

agente — roda como serviço no servidor da fábrica. Busca o que foi aprovado e grava na pasta 00_ARTE_RECEBIDA. Se a internet cair, ele para e o portal continua recebendo; quando voltar, baixa o acumulado.

kanban — tela da sala, só na rede interna. Mover o card grava o movimento, move o arquivo entre as pastas e enfileira o marcador no Tiny e o WhatsApp.


Regras do processo, em código

Regra Onde está
Área útil 57 × 97 cm (30 mm de rodapé) preflight.AREA_UTIL_CM
DPI efetivo mínimo 150, ideal 300 preflight.validar()
Largura máxima 57 cm preflight.validar()
Repetição da arte preflight.empilhar()
Montagem empilhada de vários arquivos preflight.montar_folha()
Normalização por natureza do arquivo preflight.normalizar()
CDR entra sem validar, etiqueta "conferir" preflight.FORMATOS_SEM_VALIDACAO
Máximo 20 m por arquivo preflight.fatiar()
Carimbo: QR 20 mm + texto, só preto preflight.carimbar()
Um carimbo por pedido, na última parte preflight.processar()

A regra que mais pega arquivo ruim é o DPI efetivo. O valor gravado no cabeçalho mente com frequência — o cliente escala a imagem e o programa mantém "300". O que vale é pixels ÷ (centímetros comprados ÷ 2,54).


Decisões já tomadas

Não precisam ser rediscutidas. Estão implementadas no código.

Assunto Decisão Por quê
Chave do pedido número do Tiny é o que a empresa inteira já usa
Gatilho do link webhook do Tiny, não polling o link sai no segundo em que o pedido nasce
Hospedagem do portal fora da fábrica se a internet cair às 3h, o cliente sobe do mesmo jeito
Hospedagem do kanban rede interna é tela de operação, funciona sem internet
Upload direto para o storage, URL pré-assinada 200 MB passando pelo VPS derrubaria o processo
Limite do site VNDA não aceita 200 MB por isso o portal é externo
Faixa do rodapé 30 mm → área útil 57 × 97 cm cabe o QR de 20 mm com folga
QR 20 mm, leitura por celular não haverá coletor; celular lê com folga
Conteúdo do QR URL do card no kanban a revisão bipa e cai na tela do pedido
Carimbo um por pedido, na última parte é ela que fecha o pedido
Cor do carimbo só canal preto sem branco de apoio: economiza a tinta mais cara
Repetição campo no portal, robô empilha tira do designer o trabalho mais braçal
Limite por arquivo 20 metros 100 m viram 5 arquivos
Tamanho do upload 5 GB é o que os PCs da sala aguentam abrir
Retenção 30 dias depois apaga do storage
Montagem empilhada, sem encaixe lado a lado são artes de 1 m em sequência
CDR entra com etiqueta conferir a licença do Corel é de estação, não de servidor
Movimento no kanban, pasta espelha sem watchdog: uma peça a menos para manter
Qualidade na mensagem % e DPI juntos um para leigo, outro para quem é do ramo
Marcadores no Tiny 3, não 7 o kanban é a fonte de verdade
Avisos ao cliente 3 + correção sete viraria spam e ele para de ler
Designer de madrugada não haverá a noite imprime o que já estava tratado

O que o robô NÃO faz

Tratar arte continua sendo trabalho do designer: remover fundo quando o cliente não removeu, corrigir cor para o perfil da impressora, e julgar o que não presta mesmo passando na validação técnica — degradê que vira mancha branca, traço fino que some na aplicação.

O robô filtra o que nem deveria chegar ao designer: DPI baixo, fundo não removido, largura acima de 57 cm, arquivo corrompido. Isso volta ao cliente automaticamente e não consome minuto de arte nenhum.

Isso gera o número que decide o terceiro turno: quanto do tempo do designer é retrabalho de arquivo ruim, e quanto é trabalho de verdade. O kanban mede isso na primeira semana, olhando o tempo entre Arte recebida e Arte tratada.

Referência de mercado

O dtflexprint.com.br, de Salvador, já opera este modelo: upload no próprio produto, pré-flight automático, sem receber arquivo por WhatsApp. Cobram R$ 55,00 pela mesma unidade de 57 × 100 cm que vendemos a R$ 14,90.

A guerra de preço é local; o mercado não é. Depois de resolver a dinâmica de horário, o passo seguinte é logística nacional.


Fase 1 — limpeza dos marcadores do Tiny

Primeira entrega do projeto. Não depende de nada e pode começar hoje.

Regra que não pode ser violada

Limpar a lista de sugestão, não o histórico dos pedidos. Apagar marcador de pedido já fechado destrói o pouco de dado que existe sobre o passado. O que atrapalha é a lista de opções aparecer poluída na hora de marcar um pedido novo.

O que sai da lista

Todas as variações de horário e duração digitadas à mão. Existem dezenas, quase todas com um ou dois pedidos:

inicio 14:45   inicio13:34   inicio 12:38hr   inicio 930   INICIO 15:09
11:10          15:30hr       1hrs             3h           3hr
2hrs           1h30min       +20m             +30min de correcao
+1hr (correcao)

Alguém na sala está tentando registrar tempo de máquina há meses, à mão, sem padrão nenhum. O kanban passa a fazer isso sozinho e melhor, com carimbo automático de entrada e saída em cada etapa. Esse trabalho manual deixa de existir — e é bom dizer isso à sala, porque é esforço real que estava sendo desperdiçado.

O que fica

Marcador Pedidos Para quê
fila de impressao 2.004 coluna do kanban
CORRECAO DTF 116 coluna do kanban
Maq 1 … Maq 6 3.406 histórico de máquina
multiempresa, VALE, Troca, BOLETO NEXSTAR SICCOB — outra natureza, não mexer

O que nasce

DTF-PRODUCAO e DTF-PRONTO. Só dois — ver a seção de marcadores acima.

Atenção: os marcadores de duração NÃO são poluição

30 min   → 2.430 pedidos
1 hora   →   833 pedidos
3 horas  →    40 pedidos

Estes são padronizados e parecem ser a estimativa de minutos de máquina do pedido — exatamente o dado que o kanban precisa para calcular fila contra capacidade.

Hoje o código estima esse tempo pelos metros, a 20 m/h (kanban/main.py, campo minutos_maquina). Mas arte complexa pode demorar mais que arte simples do mesmo tamanho.

Confirmar com o Thales antes de apagar: esses marcadores são estimativa de tempo de máquina ou outra coisa? Se forem estimativa e refletirem algo que a sala sabe e o metro não captura, viram campo no card, não marcador — e o cálculo de capacidade fica mais preciso que a conta por metragem.


Como o arquivo chega na máquina

Desenho novo, decidido em 30/08/2026. O PC central deixa de ser passagem obrigatória e vira posto de validação e exceção.

Antes

PC central  →  abre o arquivo, aplica o SPOT à mão, salva de novo na pasta
     ↓
PC da máquina  →  alguém pega o arquivo e toca no software

Todos os arquivos passavam por uma máquina e uma pessoa. Se ela saía, a fila parava. Às 3h da manhã, não havia ninguém.

Agora

portal → robô (valida · monta · SPOT · carimba) → fila única
                                                     ↓
                              operador clica "puxar próximo" na máquina
                                                     ↓
                              arquivo cai na hot folder 30_MAQ1 … 30_MAQ6
                                                     ↓
                              FlexiPRINT processa sozinho de lá

O operador abre no Flexi, roda, e arrasta o card para Finalizado. Um clique no começo, um arraste no fim. Nunca escolhe pedido, nunca procura arquivo, nunca decide ordem.

Por que puxada e não empurro

Empurrar exigiria adivinhar qual máquina estará livre daqui a duas horas. Se uma travar, a fila dela para enquanto outra fica ociosa, e alguém remaneja na mão. Por puxada nunca desbalanceia.

Três regras que sustentam isso:

Regra Por quê
Reserva expira em 3 min ajustado pela sala: 15 era demais
Devolver põe no topo, não no fim o pedido já esperou uma vez
Um pedido por vez a sala preferiu assim a puxar lote de trabalho

Ver /api/puxar e /api/devolver em kanban/main.py.

O que sobra para o PC central

Validação, exceções e o SPOT manual dos casos que a regra automática não cobre. Deixa de estar no caminho crítico de todo pedido.


A validar com os designers e a sala — SPOT

O canal branco passa a ser gerado pelo robô. A regra base é medível e cabe em poucas linhas, mas existem variações que precisam ser confirmadas antes de codificar.

O que já é regra, não julgamento

Choke (contração do branco) evita que o branco apareça na borda quando o registro sai levemente fora. O problema é que em traço fino ele come a linha: um filete de 0,4 mm a 300 DPI tem ~5 px; tirando 2 de cada lado sobra 1, e o branco quase some.

Isso é medível. O robô mede a espessura de cada elemento e aplica choke proporcional — na mesma arte, texto grosso encolhe e filete fino não:

Espessura do elemento Choke
acima de 2 mm 2 px
1 a 2 mm 1 px
abaixo de 1 mm nenhum

O que precisa ser validado

Ponto Pergunta para a sala
Valores do choke 2 px acima de 2 mm está certo, ou vocês usam outro número?
Limite do traço fino abaixo de quanto vocês nunca aplicam contração?
Branco em degradê onde a arte tem transparência parcial, o branco fica meio transparente. Vocês ajustam? Como?
Densidade do branco arte escura pede mais branco que arte clara? Isso é ajustado hoje?
Tipo de tecido o branco muda conforme o cliente vai aplicar em algodão ou poliéster?
Casos que nunca dão certo no automático quais?

Como conduzir a conversa

Não perguntar "o que vocês fazem". Pedir cinco arquivos:

  • dois que sempre saem bem no automático
  • dois que sempre precisam de ajuste
  • um que já deu errado

Com esses cinco dá para descobrir se a regra cabe em três linhas de código ou se há julgamento de verdade envolvido.

Aposta: 80% dos casos cabem na regra de espessura. Os 20% restantes viram uma etiqueta spot manual no card e vão para o PC central como exceção, não como padrão.

Isso decide a madrugada: se o SPOT manual for exceção, o turno da noite roda no automático e deixa as exceções para o dia. Não precisa de designer de plantão.


Insumos: tudo que passa pelo depósito já está medido

O aproveitamento do filme sai das transferências para o depósito de impressão no Tiny. O mesmo caminho serve para todo o resto:

Insumo Consumo teórico por 100 m O que o desvio revela
Filme 100 m comprados → 90 úteis acerto, prova de cor, refile, ponta
Tinta 1,5 L purga excessiva, vazamento, apontamento errado
Poliamida 2,5 kg idem
Peças de máquina — custo por metro, sem teórico

O sistema sabe quantos metros imprimiu, então calcula o teórico e compara com o transferido. Tinta a 1,8 L por 100 m significa 20% de desvio — hoje ninguém saberia.


FlexiPRINT · hot folder confirmado, arquitetura a definir

A documentação oficial da SAi confirma: o Flexi tem hot folder, uma pasta por dispositivo de saída, monitorada continuamente. Arquivo copiado ou movido para dentro entra na fila automaticamente. Por padrão fica em C:\Program Files\[Software]\Jobs.

A versão 21 traz dois recursos relevantes:

  • "RIP only" ao receber na hot folder — processa o arquivo sem esperar a máquina ficar livre
  • Opções melhoradas de branco para DTF e ferramenta de fundo transparente

O problema de memória

Relato da sala: o PC que roda a máquina não aguenta preparar outro arquivo ao mesmo tempo — o RIP consome memória demais. É por isso que existe o PC central hoje.

Duas arquiteturas possíveis, e a escolha depende do que a licença de vocês permite:

A · Production Manager centralizado. Se o Flexi permitir gerenciar a fila de várias impressoras a partir de um PC só, o PC central vira servidor de RIP e os PCs das máquinas ficam leves — só transmitem dados para a impressora. Resolve o problema sem trocar computador.

B · RIP distribuído. Cada PC ripa o próprio trabalho. Aí o "RIP only" ajuda, porque o arquivo é processado enquanto a máquina ainda roda o anterior — mas o PC precisa aguentar as duas coisas.

Levantamento pendente com Thales e Alexandre (ver dtf-roteiro-reuniao.md, bloco E2):

  • edição e versão do Flexi em cada máquina — se forem diferentes, o comportamento da hot folder varia entre elas
  • a hot folder aceita pasta de rede ou só local?
  • existe "RIP only" na versão instalada?
  • o Production Manager centraliza várias impressoras?
  • o Flexi gera o canal branco a partir da transparência?
  • as licenças são por PC ou flutuantes?

Enquanto isso não fecha, não programe a fase 4. O desenho da hot folder depende de a pasta de rede funcionar.


Instalação

Portal (VPS Ubuntu)

apt install -y python3.12-venv libvips-tools postgresql nginx certbot
python3 -m venv /opt/dtf/venv && source /opt/dtf/venv/bin/activate
pip install fastapi uvicorn sqlmodel 'psycopg[binary]' boto3 httpx  # prototype only; no longer tracked
cp .env.exemplo .env    # preencher
cd portal && uvicorn main:app --host 0.0.0.0 --port 8000

Nginx faz proxy para a 8000 e o certbot cuida do TLS em arte.dropstaratacado.com.br.

Agente (servidor da fábrica)

Windows, como serviço:

nssm install DtfAgente "C:\Python312\python.exe" "C:\dtf\agente.py"
nssm set DtfAgente AppEnvironmentExtra BASE_PORTAL=... AGENTE_TOKEN=...
nssm start DtfAgente

Linux: usar agente/dtf-agente.service.

Kanban (servidor da fábrica)

cd kanban && uvicorn main:app --host 0.0.0.0 --port 8080

O front é o protótipo dtf-portal-kanban.html, apontando para /api/quadro e /api/mover. Colocar em kanban/static/kanban.html.


Estrutura de pastas no servidor

\\servidor\DTF\
  00_ARTE_RECEBIDA     10_ARTE_TRATADA    20_FILA_IMPRESSAO
  30_IMPRIMINDO        40_CORRECAO        50_APLICACAO
  60_FINALIZADO        _ERRO              _log

O banco é a fonte de verdade e a pasta é espelho. Se divergirem, o banco ganha.


Tabelas

Tabela Onde Para quê
pedido nuvem número do Tiny, cliente, token e validade
arte nuvem arquivo, DPI, status, motivo da recusa
parte nuvem + local cada arquivo gerado pelo fatiamento
card local posição atual no kanban
movimento local de onde saem todos os números
job local fila de marcador e WhatsApp, com retentativa

Normalização: o cliente manda o que quiser

Não existe "formato certo" único — normalizar tudo para um só jogaria fora o melhor de cada tipo. A regra é por natureza do conteúdo:

Chega como Sai como Por quê
PDF, AI, SVG, EPS PDF, mantendo vetor rasterizar aqui é perder qualidade
PNG, TIF, PSD, PSB TIF com alfa, LZW é o que a sala já usa
CDR não converte sem Corel no servidor

O original é sempre preservado. Pedido dos designers: se a conversão sair ruim num caso, eles voltam ao arquivo do cliente.

Resolve o limite dos 5 metros. Os designers relatam abrir PDF no Corel para não rasterizar, exportar, abrir no Photoshop — e esbarrar em 5 metros. O limite não é do Photoshop: é do formato PSD, que trava em 30.000 px por dimensão, o que a 150 DPI dá 5,08 m. PSB vai a 300.000 px, ou 50 metros. Em PDF vetorial não há esse limite.

Melhor ainda: PDF vetorial pode ir do portal direto para a hot folder. O FlexiPRINT rasteriza na resolução exata da máquina, na hora de imprimir — qualidade melhor que qualquer caminho manual, e uma etapa a menos.

CMYK vira RGB na normalização. Arquivo em CMYK é uma das causas de cor errada no DTF: o cliente monta em CMYK, a máquina trabalha em RGB, e a cor muda.

Retrabalho: meta por causa, não meta única

SKU CRRMP.TX.100CM. A Mayana abre e classifica a causa; Thales ou Alexandre autorizam, porque o retrabalho da casa entra na meta e na remuneração deles. A causa fica travada depois de aberta — com indicador atrelado a bônus, haveria incentivo para reclassificar falha de máquina como culpa do cliente. Quem discorda contesta, e a contestação fica registrada.

Causa Responsável Hoje Meta
Falha de impressão Thales e Alexandre 1,8% 0,4%
Perfil de cor Thales e Alexandre — 0,4%
Erro de tratamento designers 1,1% 0,4%
Erro de pedido comercial — 0,4%
Arte do cliente — 0,9% fora da meta
Total da casa 2,9% 1,6%

Perfil de cor virou causa própria. Cor errada é o retrabalho mais comum de DTF e quase nunca é defeito de máquina. Separando de "falha de impressão", dá para saber quanto é arte em CMYK, quanto é monitor do cliente e quanto é perfil da impressora desatualizado — só o último é da casa.

Coluna nova: aprovação de cor. Antes de imprimir o pedido inteiro, sai uma amostra, foto pelo WhatsApp e o cliente aprova. Dispara sozinho em arquivo acima de 10 m, primeiro pedido do cliente, ou cor fora do gamut CMYK. Custa centímetros de filme e evita metros de reposição.

Não existe coluna de aplicação. A sala só imprime o filme — quem aplica na peça é o cliente.

Meta única de 1,5% penalizaria o designer por falha de máquina e exigiria derrubar 64% do retrabalho de uma vez. Meta inatingível empurra para reclassificar causa, não para reduzir defeito. Ver META_POR_CAUSA e /api/relatorio/retrabalho.

Os marcadores de duração são estimativa de máquina

Confirmado pela sala em 02/09/2026. 30 min (2.430 pedidos), 1 hora (833) e 3 horas (40) não são lixo de cadastro — são a estimativa de quanto tempo o trabalho leva na máquina.

Não somem: viram o campo minutos_maquina no card. É esse número que o kanban usa para calcular fila contra capacidade do dia. Sem ele, a estimativa sai dos metros a 20 m/h — mas arte complexa demora mais que arte simples do mesmo tamanho, e a sala sabe qual é qual.

Quem preenche: o sistema sugere pelo tamanho; quem trata a arte ajusta só quando foge do normal.

Marcador Destino
inicio 14:45 e variações some — o sistema carimba a hora do movimento real
Maq 1 … Maq 6 vira etiqueta no card, sai do Tiny
fila de impressao vira coluna do kanban
CORRECAO DTF continua no Tiny — o comercial precisa ver
30 min · 1 hora · 3 horas vira campo minutos_maquina

Marcadores no Tiny: três, não sete

O kanban é a fonte de verdade da operação. O Tiny recebe só o estágio grosso, para quem não abre o kanban — comercial no telefone, expedição, celular:

Movimento no kanban Marcador no Tiny
recebida · tratada · fila · aplicação nenhum
entra em Imprimindo DTF-PRODUCAO
vai para Correção CORRECAO DTF
Finalizado DTF-PRONTO

Três chamadas por pedido em vez de sete. A 213 pedidos/dia, 640 requisições em vez de 1.500 — folga no limite da API e menos job para monitorar. A máquina que imprimiu fica só no kanban.

Artes guardadas para recompra

Prefixo separado no storage: artes-cliente/{numero_cliente}/, retenção de 12 meses — contra os 30 dias do arquivo de trabalho. Guarda-se só a arte tratada, não o original: é menor e é a que vai para a máquina.

O cliente acessa por um link permanente dele (token de cliente, não de pedido), numa página "minhas artes", e pede reimpressão com um clique — que abre pedido novo no Tiny. Resolve o caso de quem quer a mesma arte de dois meses atrás.

Abrir o arquivo pelo kanban · sem instalar nada

Decisão de 30/08/2026: nada instalado nos PCs da sala. Só a tela.

Navegador não lança programa externo — é bloqueio de segurança, sem contorno. Então o desenho é:

  1. Miniatura no card — o operador confere a arte sem sair da tela
  2. Botão copia o caminho — cola no FlexiPRINT
  3. File System Access API — Chrome ou Edge pede permissão à pasta de rede uma vez; a partir daí o kanban lê e move arquivo direto do navegador

O item 3 tem uma consequência boa: a movimentação de arquivo sai do backend. O mover_arquivos() em kanban/main.py vira opcional — quem move é a própria tela. Menos código no servidor e menos chance de o estado divergir.

O que continua manual: colar o caminho no Flexi. Uma tecla a mais que o ideal. Handler local resolveria, mas exige instalação em cada máquina — descartado.

Aproveitamento do filme: sai do Tiny, sem apontamento novo

A Altus transfere o insumo para um depósito de impressão antes de rodar, porque também revende insumo — o depósito separa consumo interno de revenda.

Isso significa que o consumo de filme já é registrado hoje. O painel só lê a movimentação desse depósito e divide os metros faturados pelos metros transferidos. Nenhum gesto novo para a sala.

Ver DEPOSITO_IMPRESSAO e tiny.transferido_para_deposito().

movimento é a mais importante. Dela saem tempo por etapa, fila por máquina, taxa de retrabalho e ocupação real — os números que hoje não existem em lugar nenhum. Ver /api/relatorio/etapas.


Decisões que dependem de você, Wagner

  1. Servidor da fábrica é Windows ou Linux? Muda como o agente vira serviço.
  2. A conta do Tiny já tem aplicação na API v3? Precisamos de client id e secret.
  3. Confirmar na documentação do Tiny o endpoint de marcadores e o limite de requisições por minuto. tiny.py isola isso — se mudar, muda só ali.
  4. O número do WhatsApp do DTF migra para a API oficial da Meta, ou fica com provedor tipo Z-API? A oficial exige template aprovado para mensagem iniciada por nós, mas não corre risco de bloqueio.
  5. Latência da integração VNDA → Tiny. É ela que define quanto tempo passa entre a compra e o link chegar no cliente. Se for alta, o argumento de rapidez do projeto perde força.
  6. Retenção dos arquivos: 90 dias. Configurar regra de ciclo de vida no bucket. A arte é propriedade do cliente.

Segurança

  • Token do link: UUID v4, 7 dias, um por pedido
  • HTTPS obrigatório no portal, Let's Encrypt com renovação automática
  • Kanban sem porta aberta para fora — se precisar de acesso remoto, VPN
  • ClamAV no arquivo recebido antes de liberar para o agente
  • Dump diário do Postgres para o storage
  • Heartbeat do agente a cada 5 min; sem sinal por 15 min, alertar o TI

Serviço silencioso parado é pior que erro barulhento — ninguém percebe até o cliente cobrar.


Ordem de entrega

Fase Entrega Já dá valor sozinha?
1 Limpar marcadores — ver seção própria sim: destrava o kanban e some com trabalho manual da sala
2 Portal + robô + storage no ar sim: recebimento 24h e recusa automática
3 Agente rodando como serviço sim: arquivo cai na pasta sozinho
4 Kanban + Tiny + WhatsApp é o que transforma movimento em número

As fases 2 e 3 entregam sozinhas. A fase 4 é onde a medição começa.

Description
No description provided
Readme 20 MiB
Languages
Python 51.2%
JavaScript 30.9%
HTML 9.7%
CSS 7.8%
Shell 0.3%
Other 0.1%