25 Commits

Author SHA1 Message Date
e282628952 feat(dados): adicionar formatação de documentos para exibição correta de CPF e CNPJ
All checks were successful
Dev Build & Deploy Portal / build-deploy (push) Successful in 2m30s
2026-05-20 00:20:52 -03:00
3fb5cdb6a8 feat(portal): adicionar navegação e mock de dados para certidões, alvarás e pagamentos
All checks were successful
Dev Build & Deploy Portal / build-deploy (push) Successful in 2m29s
2026-05-20 00:13:10 -03:00
b638af1a39 fix(prefeitura): garantir que o cache do Redis seja utilizado corretamente e evitar falhas
All checks were successful
Dev Build & Deploy Portal / build-deploy (push) Successful in 2m32s
2026-05-19 21:10:29 -03:00
8b5c37abe9 feat(api): adicionar tratamento de erros e logging nas requisições
All checks were successful
Dev Build & Deploy Portal / build-deploy (push) Successful in 2m30s
2026-05-19 20:58:14 -03:00
4ee054f98f feat: adicionar desabilitação de botões durante carregamento em várias páginas
All checks were successful
Dev Build & Deploy Portal / build-deploy (push) Successful in 2m33s
2026-05-19 18:25:57 -03:00
f3e46cca4c feat(portal): simplificar fluxo de primeiro acesso para Opção B
Remove etapas OTP (canal, código, senha). Novo fluxo: identificar (CPF/CNPJ)
→ confirmar (mostra nome + email mascarado) → sucesso (email enviado via Keycloak).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 18:09:33 -03:00
e146dbc1f9 Merge pull request 'fix: node 22-alpine no Dockerfile + package-lock.json atualizado' (#2) from feat/nuxt-bff into developer
All checks were successful
Dev Build & Deploy Portal / build-deploy (push) Successful in 2m32s
Reviewed-on: #2
2026-05-19 00:26:39 +00:00
81efa97c27 Merge pull request 'feat/nuxt-bff' (#1) from feat/nuxt-bff into developer
Some checks failed
Dev Build & Deploy Portal / build-deploy (push) Failing after 8s
Reviewed-on: #1
2026-05-19 00:22:54 +00:00
51dc2f753f fix: node 22-alpine no Dockerfile + package-lock.json atualizado
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>
2026-05-18 21:21:04 -03:00
875b6b41c3 chore: Dockerfile + pipelines Gitea CI/CD para deploy em Docker Swarm
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>
2026-05-18 20:47:01 -03:00
8905e7f27c feat: remove tela intermediária de login — home vai direto ao Keycloak
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>
2026-05-18 20:44:03 -03:00
71e1a3f970 feat: portal Nuxt 3 com BFF + autenticação Keycloak (Fase 1)
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>
2026-05-18 20:31:19 -03:00
4275f830c4 chore: adiciona .env.example com todas as variáveis de ambiente documentadas
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 01:19:54 -03:00
6635030d53 feat: mock system + documentação de API
- `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>
2026-05-18 01:14:00 -03:00
f687e650b8 feat: portal autenticado — Certidões, Alvarás, Pagamentos e Dados Cadastrais
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>
2026-05-18 01:02:58 -03:00
fed6998a6f feat: portal autenticado — Painel e Débitos com UI real
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>
2026-05-18 01:00:04 -03:00
1b2aea444e feat: wizards Primeiro Acesso (4 etapas) e Credenciamento (6 etapas)
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>
2026-05-18 00:58:01 -03:00
9cf6063383 feat: telas Certidão e IPTU com UI real + camada de serviços
- 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>
2026-05-18 00:55:38 -03:00
d234b9ebe0 docs: CLAUDE.md com contexto completo do projeto para desenvolvimento assistido por IA
Cobre: stack, arquitetura multi-tenant, ordem de inicialização, theming dinâmico,
dark mode, clientes HTTP, estrutura de pastas, rotas, fluxo de login, variáveis de
ambiente, regras de código, acessibilidade, como adicionar telas, pendências e pitfalls.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 00:52:28 -03:00
1612b89867 fix: voltar em serviços vai sempre para home + hover primário na borda dos serviços públicos
- ServicosHubView: router.back() → router.push({ name: 'home' }) para evitar historico inesperado
- HomeView: serviços públicos com border sutil (white/10) que destaca para primary/70 no hover; ícone também muda para primary no hover

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 00:49:03 -03:00
e3b5a7ae9e fix(servicos): título menos escuro + botão voltar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 00:45:06 -03:00
caf25236b5 feat: dark mode completo via widget de acessibilidade
- main.css: @variant dark com seletor .app-dark (alinhado com PrimeVue darkModeSelector)
- AccessibilityWidget: novo toggle "Modo escuro" no painel; preferências persistidas no localStorage (fonte, contraste, escuro)
- PublicLayout/PortalLayout: dark:bg-slate-950/900, dark:border, dark:text em todos os elementos
- AppHeader/AppFooter: dark variants em bg, border, textos e links
- ServiceCard: usa cores primary em vez de blue hardcoded; dark variants completos
- HomeView: dark nos avisos do carrossel (bg coloridos suavizados), card de login, seção de serviços autenticados e CTA
- LoginView: dark no card, campo documento, label senha, links e botão voltar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 00:42:35 -03:00
4658d60ad0 feat: widget de acessibilidade flutuante + fix carrossel mobile
- AccessibilityWidget: botão fixo bottom-right com painel de tamanho de texto (A/A+/A++) e toggle alto contraste, aplicados via classes no <html>
- layout.scss: remove override global de min-height em botões/links; mantém apenas focus-visible, skip-link, reduced-motion e classes do widget a11y
- HomeView: carrossel — botão de ação movido para abaixo do texto (não mais ao lado) para evitar compressão do texto no mobile

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 00:35:01 -03:00
6b6d47ba8a feat(a11y): implementa acessibilidade WCAG 2.1 AA em todo o portal público
- layout.scss: focus-visible ring, skip link, prefers-reduced-motion, touch targets ≥44px, font-size base 16px
- App.vue: skip link + aplica tema dinâmico no onMounted (após PrimeVue inicializado)
- composables/useMotion.js: detecta prefers-reduced-motion com listener reativo
- HomeView: aria-label em seções, carrossel respeita reduced-motion, contraste de texto melhorado
- LoginView: h1 correto, label+for+aria-describedby no campo senha, role=alert no erro, touch targets nos botões
- DocumentoInput: aria-label, aria-required, autocomplete=username
- AppHeader: aria-label no logo e nav, aria-current na rota ativa, aria-hidden nos ícones decorativos
- AppFooter: role=contentinfo, nav com aria-label, contraste text-slate-400→500, ícone decorativo aria-hidden
- PortalLayout: role=banner, aria-label no nav, aria-current nas rotas, aria-live no nome do usuário
- PublicLayout: tabindex=-1 no main para receber foco via skip link

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 00:28:40 -03:00
5a7f4ba07a feat: scaffold inicial do portal público de autoatendimento fiscal
- Vue 3.5 + Vite 8 + PrimeVue 4 (Aura) + TailwindCSS 4 + DM Sans
- Sistema de tenant multi-prefeitura: bootstrap, prefeituraStore, getTenant
- Tema dinâmico por município via applyTemplate (9 paletas)
- Logo e foto de fundo resolvidos a partir do VITE_API_URL + path relativo
- HomeView: hero split com foto/gradiente, carousel de avisos, cards de serviços
- LoginView: fluxo 2 etapas (documento na home → senha em /login)
- Roteamento completo: público (/), serviços (/servicos/*), portal autenticado (/portal/*)
- authStore + authService estruturados para Keycloak PKCE (integração pendente)
- Placeholders para todas as telas da área logada

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 00:20:07 -03:00