尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Painel Executivo Financeiro - Ragga Gestão
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Evolução do atual Painel Executivo Financeiro (HTML com dados embutidos) para uma aplicação web com banco de dados permanente, usada pelo Financeiro/Administrativo do Grupo Londrino/Ragga para acompanhamento financeiro e operacional das 17 unidades.
Estado atual: Etapa 1 — Fundação do projeto. Sem dados reais importados, sem telas completas, sem migração do painel HTML antigo.
Usuário (desktop/mobile)
│
Next.js (App Router, TypeScript) ── Vercel
│ API routes / server actions
▼
PostgreSQL (Supabase) + Auth + Storage
Detalhes completos do planejamento e das regras de negócio aprovadas: docs/regras-negocio.md.
.
├─ apps/
│ └─ web/ # aplicação Next.js
│ ├─ app/
│ │ ├─ (dashboard)/ # Visão Geral, Comparativo, Indicadores,
│ │ │ Controles de Caixa, Análise Gerencial,
│ │ │ Plano de Ação, Fechamentos
│ │ ├─ (admin)/importacao/
│ │ └─ api/ # rotas de importação, indicadores, tratativas
│ ├─ components/
│ ├─ lib/
│ │ ├─ db/ # clientes Supabase/Drizzle, schema (Etapa 2)
│ │ ├─ import/ # parsers por tipo de base (Etapa 3)
│ │ ├─ rules/ # regras de negócio centralizadas
│ │ └─ calc/ # motor de indicadores/comparação (próximas etapas)
│ └─ tests/
│ ├─ unit/ # Vitest — regras de negócio
│ └─ e2e/ # Playwright
├─ packages/
│ └─ shared/ # tipos e constantes compartilhados (unidades, perfis, tipos de base)
├─ supabase/
│ ├─ migrations/ # geradas pelo Drizzle Kit
│ └─ seed/
├─ docs/
│ └─ regras-negocio.md # regras de negócio aprovadas (fonte de verdade)
└─ .github/workflows/ # CI
Toda regra de data, período, semáforo, deduplicação e importação vive em
apps/web/lib/rules/ — nenhuma tela reimplementa essas regras localmente.
Ver docs/regras-negocio.md para o detalhamento
de cada regra e o mapeamento para o arquivo que a implementa.
Pré-requisitos: Node.js 24+, npm 11+.
npm install
npm run dev # inicia apps/web em http://localhost:3000
npm run lint
npm run typecheck
npm run test # testes unitários (Vitest)
npm run build
Testes E2E (Playwright) exigem os browsers instalados uma vez:
npx playwright install --with-deps
npm run test:e2e
Schema definido em apps/web/lib/db/schema/*.ts. Os arquivos SQL ficam em
supabase/migrations/ (pasta de saída do Drizzle Kit — não é o mecanismo de
migrations da CLI do Supabase; não há config.toml nem o schema
supabase_migrations), com o seed em supabase/seed/:
| Migration | Conteúdo |
|---|---|
0000_schema_inicial.sql | tabelas de fato, dimensão, controle e gestão |
0001_rls.sql | Row Level Security (escrita à mão) |
0002_lonely_zaran.sql | tratativas.data_ocorrencia |
0003_cancelamento_salao_detalhe.sql | detalhe individual dos estornos do Cancelamento Salão (índice parcial, RLS e policy; idempotente) |
Como as migrations são aplicadas hoje: manualmente, sem rastreamento no banco.
O banco compartilhado (Supabase) recebeu cada SQL por fora do drizzle-kit migrate; a tabela de controle drizzle.__drizzle_migrations existe, mas está
vazia — nenhuma migration (0000 a 0003) está registrada nela. O deploy na
Vercel roda apenas next build: nenhum passo de migration é executado no
deploy. Por isso:
npm run db:migrate contra o banco compartilhado sem antes
registrar a referência (baseline) em drizzle.__drizzle_migrations: sem ela,
o Drizzle tentaria reaplicar a 0000 (as tabelas já existem) e falharia.meta/_journal.json e meta/NNNN_snapshot.json servem ao
db:generate (diff do schema); eles refletem o schema atual (até a 0003) e
não o estado do banco.Para uma nova migration: editar apps/web/lib/db/schema/*.ts, rodar
npm run db:generate (não conecta ao banco), revisar o SQL gerado, aplicá-lo
manualmente no banco (ou nas rotinas aprovadas) e fazer o commit do .sql, do
_journal.json e do novo snapshot. Para um banco novo: copiar
apps/web/.env.example para apps/web/.env.local, preencher DATABASE_URL,
aplicar os SQL de supabase/migrations/ em ordem e rodar os scripts de
supabase/seed/ (17 unidades + parâmetros de semáforo aprovados).
atualizar base)Comando permanente de linha de comando que usa a importação oficial do painel (processarArquivoBase: colunas
obrigatórias, parsers, chaves e upsert) — a mesma da tela "Importação de Bases":
cd apps/web
# 1) simulação (não grava nada): identifica as bases, valida e lista o que precisa de decisão
npm run atualizar-bases -- "caminho/BRINDES.xlsx" "caminho/CANCEL SALÃO.xlsx" ...
# 2) gravação (só sem pendências): upsert pela chave oficial, uma base por vez, com conferência de contagens
npm run atualizar-bases -- "caminho/BRINDES.xlsx" ... --gravar --plano "<plano impresso na simulação>"
CONTROLE DE CONFERENCIA E QUEBRAS DE CAIXA (n).xlsx
alimenta Conferência e Quebra de Caixa (ciclo escolhido pela data de hoje; --ref AAAA-MM-DD para outra data).tabela depois = antes + inseridos, e qualquer divergência
interrompe a execução. Guarda uma referência (contagem + hash) das tabelas e compara ao final.apps/web/scripts/rejeicoes-aceitas.json não bloqueiam.cancelamento_salao_detalhe, idempotente).DATABASE_URL em apps/web/.env.local. O procedimento completo para o Claude Code está no CLAUDE.md da raiz.fontes_por_periodo, perfis/usuários, RLS, seed). Schema definido e
migrations geradas; aplicadas manualmente ao banco compartilhado
(Supabase), inclusive a 0003 (cancelamento_salao_detalhe). As migrations
não estão registradas em drizzle.__drizzle_migrations, que permanece
vazia (ver "Banco de dados (Supabase)").resolverAba, upsert/delete+insert).O painel HTML atual permanece a referência funcional e visual até que paridade completa seja validada.