rollup-plugin-visualizer (dep transitiva do Nuxt) exige Node >=22.
Alinha a imagem Docker com a versão local (22) e regenera o lock file
para que npm ci funcione no CI sem divergências de commander.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adiciona Dockerfile multi-stage (Node 20 Alpine, SSR Nuxt .output),
pipelines dev (branch developer) e prod (branch main) com docker service
update injetando todas as variáveis NUXT_* em runtime via --env-add.
Vars não-sensíveis via project variables; segredos via project secrets.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Remove src/pages/login.vue e atualiza index.vue e primeiro-acesso.vue
para chamar login() diretamente com login_hint pré-preenchido, eliminando
o passo desnecessário antes do redirect ao Keycloak.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Substitui o portal Vite+Vue puro por Nuxt 3 com BFF embutido (Nitro server
routes) e fluxo de autenticação Keycloak via token-handler pattern.
Server (BFF):
- server/api/auth/{login,callback,refresh,logout,me}.ts — Keycloak PKCE
- server/api/proxy/[...path].ts — proxy autenticado pro core-api com tenant
- server/utils/{session,keycloak,pkce,redis,tenant,prefeitura}.ts
- server/middleware/csrf.ts — Origin check + header X-Requested-With
Auth (token-handler pattern):
- JWT vive só server-side em Redis; cliente recebe cookie session-id opaco
- Refresh transparente quando access_token expira
- Multi-tenant via hostname → X-Municipio/X-Dominio injetados no proxy
- Realm dedicado: modumfiscal-portal-{env}
Frontend (Nuxt):
- src/pages/** (file-based routing) substitui src/views/
- Plugins SSR: prefeitura (bootstrap pré-hidratação) + auth (hidrata user via /api/auth/me)
- Composables useAuth, useApi, useLoginModal, useFocusLoginInput
- Modal global de login quando middleware /portal/** bloqueia
- Splash overlay no boot esconde flash do preset inicial pro tema dinâmico
- DocumentoInput bloqueia campo quando user autenticado (pré-preenche em certidão/IPTU)
Removidos:
- index.html, vite.config.js, src/main.js, src/router/
- src/config/apiClient.js (substituído por \$fetch via /api/proxy)
- src/services/{auth,prefeitura}Service.js (lógica migrada pra composables/plugins)
- src/mocks/ (não mais usado)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- `src/mocks/mockInterceptor.js` — interceptor Axios que substitui chamadas HTTP
por dados falsos (400–800ms de latência simulada). Cobre todos os endpoints do
portal: certidão, IPTU, primeiro acesso, credenciamento, painel, débitos,
certidões, alvarás, pagamentos e dados cadastrais.
- `src/main.js` — carrega mock condicionalmente via `VITE_USE_MOCK=true`; em modo
mock, pula `bootstrapPrefeitura` e injeta sessão fake no authStore.
- `.env.development` — documenta a variável `VITE_USE_MOCK` como template.
- `docs/api-backend.md` — especificação completa de todos os endpoints necessários
(request/response, tipos, status possíveis, tabela de implementação).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CertidoesView: lista com status (Ativa/Vencida/Cancelada), reemissão de PDF por blob, skeleton loading, CTA para nova certidão
AlvarasView: filtro por status (chip buttons), card por alvará com timeline visual de etapas (concluída/atual/pendente), skeleton
PagamentosView: filtro por ano, tabela com forma de pagamento (Boleto/Pix/Cartão), download de comprovante, valor em verde
DadosView: seções de Identificação e Endereço (somente leitura), contato editável inline (email + telefone + WhatsApp), feedback de sucesso
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
portalService: endpoints para todas as rotas /portal/* (débitos, certidões, alvarás, pagamentos, dados)
PainelView:
- Cards de resumo (totalDebitos, certidoesAtivas, alvarasAndamento, ultimoPagamento) com skeleton loading
- Alerta destacado quando há débitos vencidos
- Grid de acesso rápido (4 atalhos)
- Timeline de atividade recente com skeleton
DebitosView:
- Filtros por tipo (IPTU, ISS, TAXA...) e status (VENCIDO, A_VENCER, PARCELADO)
- Lista com checkbox de seleção múltipla + barra de total selecionado
- Chips de status coloridos por situação
- Emissão de guia individual por blob PDF
- Skeleton loading e estado vazio/erro
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Primeiro Acesso:
- Etapa 0: identificação por CPF/CNPJ com verificação na API
- Etapa 1: seleção de canal (e-mail, SMS, WhatsApp) com os dados mascarados
- Etapa 2: InputOtp 6 dígitos com reenvio de código
- Etapa 3: campo senha com medidor de força + confirmação
- Etapa 4: sucesso com redirect para login com documento preenchido
Credenciamento:
- Etapa 0: verificação de documento (bloqueia duplicados)
- Etapa 1: dados pessoais (PF) ou empresariais (PJ) com campos adaptativos
- Etapa 2: endereço com busca automática de CEP
- Etapa 3: e-mail (com confirmação), telefone e flag WhatsApp
- Etapa 4: representante legal (só PJ, pulada automaticamente para PF)
- Etapa 5/6: revisão completa + submit + tela de sucesso com prazo de análise
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- certidaoService, iptuService, credenciamentoService, primeiroAcessoService criados
- CertidaoView: consulta por CPF/CNPJ, seleção de tipo, exibe situação fiscal, emite PDF via blob
- IptuView: busca por documento ou inscrição imobiliária, lista imóveis, emite carnê e boleto avulso
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>