Portal corporativo da ABZ Group. Pessoas, escala offshore, folha DP, e-Social, férias, reembolso e o resto do dia a dia no mesmo sistema.
Versão: 5.87.2 · Produção: Vercel · Repo: Caiolinooo/painel-abz

Next.js + Supabase. Login JWT/Supabase, permissões por módulo/feature/ACL, dados operacionais em tabelas gt_* (fonte local). MIO e PoliWeb entram só por pull admin/cron — o runtime não chama eles na carga da página.
Histórico de versões: CHANGELOG.md. Segurança: SECURITY.md. Contratos de código: AGENTS.md.
MainLayout (sidebar + topbar) no layout de /folha-pagamento, cards brancos (FIN_CARD_CLASS sem dark:bg-gray-800).sheets, nova, funcionarios e empresas restauradas como páginas reais sem redirect()./department/dp?tab=folha, e a página do DP respeita o parâmetro ?tab=._lib/http que não existia; o parser das notas reais quebrava o tsc com never[]. Os dois erros fecharam — compile integral verde.17.01, IBSCBS / NIF). Emissão ainda desligada; só consulta..cursor/skills com as skills oficiais e a sobe-o-git.GET /api/dp/folha/contracheque — holerite CLT com rubricas, descontos e bases, pronto para baixar/imprimir em A4.npm audit limpo.Uint8Array nas respostas — bytes idênticos)..order('id') + .range(); marcões persistem e aparecem.| Camada | Uso real |
|---|---|
| Next.js 15.5 (App Router) + React 18 + TypeScript 5 | UI e API routes |
| Tailwind CSS + Radix UI | Layout |
| Supabase (PostgreSQL + RLS + Storage) | Banco e arquivos |
| JWT próprio + Supabase Auth | Sessão |
| Vercel | Produção e preview (não é Netlify) |
Node >= 20.9.
Fonte única: src/config/modules.ts. Sidebar, UserEditor e POST /api/acl/init leem esse catálogo.
| Área | Rotas | O que faz |
|---|---|---|
| Departamento Pessoal | /department/dp | Cadastro do zero, lista, fechamento de escala/folha, vencimento e agendamento de ASO |
| Gestão de Tripulantes | /department/gestao-tripulantes | Matriz, ficha, escala, documentos, treinamentos, desligamento |
| Man Schedule | /department/man-schedule | Grade de escala a partir de gt_historico_embarques |
| e-Social | /department/e-social | Eventos (S-2200…S-2299 e correlatos), XML, envio, matrícula |
| Férias | /ferias | Pedido, histórico, PDF com assinatura, export |
| Reembolso | /reembolso | Solicitação, aprovação, e-mails (listas no admin) |
| EPI / QHSE | /epi | Estoque e ficha; na ficha GT a aba QHSE não lista ASO |
| Academy, contratos, ponto, contracheque, lista de presença | rotas homônimas | RH do dia a dia |
| Calendário | /calendario | Só feriados oficiais + ICS compartilhado |
| IA / KPIs | /ia, /kpi | Companion global + quadro KPI (tools, sem inventar número) |
| Admin | /admin/* | Usuários, e-mail, GT, ACL, splash |
Permissões em três camadas: módulo on/off, features JSONB, ACL (acl_permissions). hasFeature trata JSONB e nome ACL como o mesmo grant.
gt_colaboradores. DP e GT leem/escrevem pela API /api/gestao-tripulantes/colaboradores.gt_historico_embarques, não da coluna stale status_embarque.POST /api/gestao-tripulantes/mio/sync. Nunca PUT/PATCH/DELETE de volta ao MIO.users_unified: identidade de portal é tax_id + e-mail. Não existe coluna cpf.git clone https://github.com/Caiolinooo/painel-abz.git
cd painel-abz
npm install
cp .env.example .env.local
npm run dev
Sobe em http://localhost:3000.
npm run build # produção local
npm run lint
npx tsx --test src/lib/gestao-tripulantes/colaborador-cadastro.test.ts
npx tsx --test src/lib/gestao-tripulantes/fechamento-calculo.test.ts
Migrações do módulo GT / e-Social / cache: supabase/migrations/ e scripts npm run db:* conforme o caso. Schema novo não se aplica no db:setup antigo sozinho — use o SQL Editor do Supabase ou o script do módulo.
| Variável | Função |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Projeto Supabase |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Cliente |
SUPABASE_SERVICE_ROLE_KEY | APIs server-side (nunca no browser) |
JWT_SECRET | Tokens do portal |
E-mail: bootstrap no .env (EMAIL_* / MS_GRAPH_*). Operação: /admin/email-settings → app_secrets (senha AES). Ordem em runtime: DB → env. Contrato: src/app/api/admin/email-settings/AGENTS.md.
Não commitar senha, JWT, app password ou fallback real. Ver SECURITY.md. CI: Gitleaks (.gitleaks.toml).
Só Vercel. Preview e produção usam as mesmas env vars do projeto. Cron (avaliações, vencimento ASO, etc.) é vercel.json, não Netlify.
Branch de integração deste fluxo: portal.
src/app/ páginas e API routes
src/components/ UI (GT, IA, e-Social, layouts)
src/lib/ regras (cadastro, fechamento, e-Social, OCR, IA)
src/config/ catálogo vivo de módulos
supabase/ migrations
Contratos por pasta ficam no AGENTS.md mais próximo — não duplicar regra de negócio neste README.
TypeScript
62.1%
JavaScript
28.1%
HTML
7.5%
PLpgSQL
2.0%
Portal corporativo da ABZ Group. Pessoas, escala offshore, folha DP, e-Social, férias, reembolso e o resto do dia a dia no mesmo sistema.
Versão: 5.87.2 · Produção: Vercel · Repo: Caiolinooo/painel-abz

Next.js + Supabase. Login JWT/Supabase, permissões por módulo/feature/ACL, dados operacionais em tabelas gt_* (fonte local). MIO e PoliWeb entram só por pull admin/cron — o runtime não chama eles na carga da página.
Histórico de versões: CHANGELOG.md. Segurança: SECURITY.md. Contratos de código: AGENTS.md.
MainLayout (sidebar + topbar) no layout de /folha-pagamento, cards brancos (FIN_CARD_CLASS sem dark:bg-gray-800).sheets, nova, funcionarios e empresas restauradas como páginas reais sem redirect()./department/dp?tab=folha, e a página do DP respeita o parâmetro ?tab=._lib/http que não existia; o parser das notas reais quebrava o tsc com never[]. Os dois erros fecharam — compile integral verde.17.01, IBSCBS / NIF). Emissão ainda desligada; só consulta..cursor/skills com as skills oficiais e a sobe-o-git.GET /api/dp/folha/contracheque — holerite CLT com rubricas, descontos e bases, pronto para baixar/imprimir em A4.npm audit limpo.Uint8Array nas respostas — bytes idênticos)..order('id') + .range(); marcões persistem e aparecem.| Camada | Uso real |
|---|---|
| Next.js 15.5 (App Router) + React 18 + TypeScript 5 | UI e API routes |
| Tailwind CSS + Radix UI | Layout |
| Supabase (PostgreSQL + RLS + Storage) | Banco e arquivos |
| JWT próprio + Supabase Auth | Sessão |
| Vercel | Produção e preview (não é Netlify) |
Node >= 20.9.
Fonte única: src/config/modules.ts. Sidebar, UserEditor e POST /api/acl/init leem esse catálogo.
| Área | Rotas | O que faz |
|---|---|---|
| Departamento Pessoal | /department/dp | Cadastro do zero, lista, fechamento de escala/folha, vencimento e agendamento de ASO |
| Gestão de Tripulantes | /department/gestao-tripulantes | Matriz, ficha, escala, documentos, treinamentos, desligamento |
| Man Schedule | /department/man-schedule | Grade de escala a partir de gt_historico_embarques |
| e-Social | /department/e-social | Eventos (S-2200…S-2299 e correlatos), XML, envio, matrícula |
| Férias | /ferias | Pedido, histórico, PDF com assinatura, export |
| Reembolso | /reembolso | Solicitação, aprovação, e-mails (listas no admin) |
| EPI / QHSE | /epi | Estoque e ficha; na ficha GT a aba QHSE não lista ASO |
| Academy, contratos, ponto, contracheque, lista de presença | rotas homônimas | RH do dia a dia |
| Calendário | /calendario | Só feriados oficiais + ICS compartilhado |
| IA / KPIs | /ia, /kpi | Companion global + quadro KPI (tools, sem inventar número) |
| Admin | /admin/* | Usuários, e-mail, GT, ACL, splash |
Permissões em três camadas: módulo on/off, features JSONB, ACL (acl_permissions). hasFeature trata JSONB e nome ACL como o mesmo grant.
gt_colaboradores. DP e GT leem/escrevem pela API /api/gestao-tripulantes/colaboradores.gt_historico_embarques, não da coluna stale status_embarque.POST /api/gestao-tripulantes/mio/sync. Nunca PUT/PATCH/DELETE de volta ao MIO.users_unified: identidade de portal é tax_id + e-mail. Não existe coluna cpf.git clone https://github.com/Caiolinooo/painel-abz.git
cd painel-abz
npm install
cp .env.example .env.local
npm run dev
Sobe em http://localhost:3000.
npm run build # produção local
npm run lint
npx tsx --test src/lib/gestao-tripulantes/colaborador-cadastro.test.ts
npx tsx --test src/lib/gestao-tripulantes/fechamento-calculo.test.ts
Migrações do módulo GT / e-Social / cache: supabase/migrations/ e scripts npm run db:* conforme o caso. Schema novo não se aplica no db:setup antigo sozinho — use o SQL Editor do Supabase ou o script do módulo.
| Variável | Função |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Projeto Supabase |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Cliente |
SUPABASE_SERVICE_ROLE_KEY | APIs server-side (nunca no browser) |
JWT_SECRET | Tokens do portal |
E-mail: bootstrap no .env (EMAIL_* / MS_GRAPH_*). Operação: /admin/email-settings → app_secrets (senha AES). Ordem em runtime: DB → env. Contrato: src/app/api/admin/email-settings/AGENTS.md.
Não commitar senha, JWT, app password ou fallback real. Ver SECURITY.md. CI: Gitleaks (.gitleaks.toml).
Só Vercel. Preview e produção usam as mesmas env vars do projeto. Cron (avaliações, vencimento ASO, etc.) é vercel.json, não Netlify.
Branch de integração deste fluxo: portal.
src/app/ páginas e API routes
src/components/ UI (GT, IA, e-Social, layouts)
src/lib/ regras (cadastro, fechamento, e-Social, OCR, IA)
src/config/ catálogo vivo de módulos
supabase/ migrations
Contratos por pasta ficam no AGENTS.md mais próximo — não duplicar regra de negócio neste README.
TypeScript
62.1%
JavaScript
28.1%
HTML
7.5%
PLpgSQL
2.0%