Bops
A team of AI bots that runs your business ops: inbox, pipeline, invoices, reports. Each one has its own computer, email and phone number, and remembers everything.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Dashboard executivo de operação de armazém (CD Vulcabras — Extrema/MG) para acompanhamento de Outbound, Inbound, Estoque, Reversa e Balanço WMS×SAP do e-commerce. Este documento não é só um manual de uso: é o registro do processo usado para construir o projeto — decisões de arquitetura, por que cada padrão técnico existe, quais bugs reais ele resolveu, e como replicar esse mesmo processo para um novo contexto (ex.: recriar o projeto para uma distribuidora, com fluxo de dados diferente mas a mesma base tecnológica e a mesma identidade visual).Read the full README ↗
Dashboard executivo de operação de armazém (CD Vulcabras — Extrema/MG) para acompanhamento de Outbound, Inbound, Estoque, Reversa e Balanço WMS×SAP do e-commerce. Este documento não é só um manual de uso: é o registro do processo usado para construir o projeto — decisões de arquitetura, por que cada padrão técnico existe, quais bugs reais ele resolveu, e como replicar esse mesmo processo para um novo contexto (ex.: recriar o projeto para uma distribuidora, com fluxo de dados diferente mas a mesma base tecnológica e a mesma identidade visual).
Se você está lendo isto para recriar o projeto em outro contexto, vá direto para Recriando para um novo contexto. O restante do documento explica o "porquê" de cada peça, que é o que você vai precisar decidir de novo lá.
O projeto é deliberadamente simples em número de peças, e deliberadamente rígido na separação de responsabilidades entre elas:
Planilhas/exports do WMS, SAP, Forecast, etc.
│
│ (upload manual, feito pelo operador no navegador)
▼
┌───────────────┐
│ ingest.js │ Lê os arquivos, cruza dados, calcula os
│ (processa e │ indicadores, grava tudo já pronto no banco.
│ só escreve) │ NUNCA desenha nada na tela.
└───────┬────────┘
│ grava
▼
┌───────────────┐
│ Supabase │ Postgres (dados estruturados) +
│ (Postgres + │ Storage (backup dos arquivos originais,
│ Storage) │ comprimidos em gzip)
└───────┬────────┘
│ lê (snapshot já pronto)
▼
┌───────────────┐
│ index.html │ Lê o snapshot mais recente e desenha os
│ (renderiza e │ cards/gráficos/tabelas. NUNCA processa ou
│ só lê) │ recalcula regra de negócio.
└───────────────┘
│
▼
Vercel (hospedagem estática do index.html)
Por que essa separação existe (e por que ela não é opcional):
No início do projeto, cálculo e renderização estavam misturados no mesmo
arquivo. Isso criava dois problemas recorrentes: (1) qualquer ajuste visual
arriscava re-executar lógica de negócio sem querer, e (2) toda vez que a base
crescia, a tela travava porque o navegador do operador tentava reprocessar
tudo a cada carregamento. A solução foi mover todo o processamento pesado
para um script único (ingest.js), rodado uma vez por atualização de dados,
que grava o resultado já pronto como um "snapshot" (JSON) no Postgres. O
index.html ficou livre para ser burro e rápido: ele só busca o snapshot mais
recente da página que está exibindo e desenha. Essa regra foi reforçada
várias vezes ao longo do desenvolvimento e deve ser tratada como inegociável
em qualquer evolução futura — inclusive na recriação para a distribuidora.
ingest.js — processamentodashboard_snapshots — uma tabela com uma linha por
pagina (outbound, inbound, estoque, reversa, balanco), cada
linha contendo o JSON já pronto para renderizar e um timestamp
gerado_em (sempre gravado como new Date().toISOString(), ou seja, UTC).document.querySelector, manipulação de DOM, ou
qualquer coisa relacionada a exibir informação na tela. Se um ajuste pede
para "mudar como algo aparece", ele pertence ao index.html, não a este
arquivo — mesmo que pareça mais fácil calcular ali.index.html — renderizaçãodashboard_snapshots o registro mais recente de cada pagina e
desenha os cards, tabelas e gráficos a partir do JSON já pronto.ingest.js (como o número foi calculado), não o index.html (como ele é
exibido) — essa distinção economizou bastante tempo de debug ao longo do
projeto.ca-central-1.dashboard_snapshots (uma linha "mais recente" por
pagina, versionada por gerado_em).dim_embalas, pedidos
etc.) — o ingest.js lê e escreve nelas antes de consolidar o snapshot.index.html.index.html como site estático. Sem variáveis de ambiente
sensíveis no build — as credenciais do Supabase usadas pelo index.html
são a anon key pública (protegida por RLS no backend, não por estar
"escondida" no front).This is the beginning of the README. Read the rest at the original. Read the full README ↗