Voltar

SFN — Portal Multi-Secretaria de Fiscalização Municipal

Nasceu como sistema único de fiscalização de obras e evoluiu para uma plataforma multi-secretaria: portal com SSO/LDAP compartilhado, registro de subsistemas e encaminhamento entre equipes. Um subsistema completo em produção (Obras — cadeia Solicitação → Notificação → Embargo → Multa) e três em implementação (Meio Ambiente, Área Pública, Bem-Estar Animal), cada um com domínio de negócio próprio sobre a mesma base offline-first, PWA e impressão térmica Zebra.

React 19TypeScriptExpress 5PostgreSQL 17LDAP SSOPWAArquitetura Multi-SecretariaZebra ZQ220

Todos os dados exibidos nos screenshots (nomes, endereços, processos) são fictícios — ambiente de demonstração. As telas são do subsistema SFO (Obras), o mais maduro e em produção — exceto a última, do SFAP (Área Pública), em implementação.

Contexto

O SFN nasceu como um sistema único de fiscalização de obras para a Secretaria de Obras de uma prefeitura municipal, substituindo blocos de papel e planilhas por um pipeline auditável. Com a adesão de novas secretarias, o projeto foi reestruturado de aplicação única para portal multi-secretaria: login único (SSO) na raiz do domínio, cada secretaria com seu próprio subsistema, todos compartilhando a mesma infraestrutura offline-first, PWA e impressão térmica — mas com domínio de negócio e fluxo de trabalho próprios, porque cada secretaria fiscaliza de um jeito diferente.

A plataforma é PWA tablet-first: o fiscal cria o procedimento no local, anexa fotos da vistoria, imprime no Zebra portátil e entrega o documento físico ao autuado — tudo offline-capable, em qualquer subsistema.

Arquitetura do portal

Um domínio único da prefeitura roteia por path para stacks Docker independentes — cada subsistema com seu próprio client, server e (quando aplicável) banco, publicados sob o mesmo domínio via Nginx:

SubsistemaSecretariaPathStatus
SFNPortal (SSO)/Produção — LDAP/AD + JWT, sem banco próprio
SFOInfraestrutura e Obras/obras/Produção — subsistema completo (cadeia abaixo)
SFAMMeio Ambiente e Habitação/meio-ambiente/Em implementação — 2 equipes (Regularização Fundiária, Meio Ambiente)
SFAPFiscalização de Área Pública/area-publica/Em implementação — fluxo próprio (ver abaixo)
SFBEABem-Estar Animal/bem-estar-animal/Em implementação — desmembrado do SFAM como subsistema próprio

O portal SFN concentra a autenticação LDAP/AD e emite um JWT (segredo HS256 compartilhado por todos os subsistemas) — o usuário loga uma vez e, se tiver acesso a mais de um subsistema, escolhe qual abrir. Um registro central (SUBSISTEMAS_JSON) mapeia cada subsistema a seu grupo de AD, URL base e credencial de API, e alimenta tanto o seletor de subsistemas quanto o encaminhamento entre eles (abaixo).

Cadeia de procedimentos — subsistema SFO (Obras)

Cada item é registro independente — dados são copiados no momento da criação, alterações posteriores não afetam os demais. A navegação bidirecional mostra origem e gerados.

Solicitação → Notificação → Embargo → Multa

Qualquer procedimento pode ser encerrado como regularizado — a saída “boa” da cadeia, que interrompe o escalonamento sem gerar embargo ou multa e alimenta o indicador de regularizações do dashboard.

Extensibilidade sem duplicar regra de negócio

Cada novo subsistema parte de uma cópia da stack do SFO, mas a estratégia é reaproveitar a infraestrutura (autenticação/SSO, sync offline-first, sistema de impressão, PWA) e deixar o domínio de negócio livre para divergir — porque cada secretaria fiscaliza de um jeito realmente diferente. O caso mais claro é o SFAP (Área Pública), que diverge do SFO em pontos estruturais:

O SFAM segue o caminho inverso: reaproveita o fluxo linear do SFO, mas com 2 equipes internas (Regularização Fundiária, Meio Ambiente) que recebem, cada uma, legislação e workflow próprios. O SFBEA, desmembrado do SFAM, ganhou subsistema próprio ao ficar claro que o domínio de bem-estar animal não cabia como “mais uma equipe” dentro do Meio Ambiente.

Recursos principais

Dashboard e auditoria

Offline-first

O fiscal opera em campo sem rede — criação de procedimentos, fotos, assinatura e impressão funcionam offline, com sincronização automática ao reconectar:

API de Integração Externa e encaminhamento entre subsistemas

API REST autenticada por chave permite que sistemas externos (georreferenciamento, ouvidoria, MP, app cidadão) criem solicitações sem login LDAP — e o mesmo contrato de API é reutilizado internamente para o encaminhamento entre subsistemas do portal.

Stack

CamadaTecnologia
FrontendReact 19, TypeScript 5.9, Vite 8, TailwindCSS 4.2
BackendExpress 5, TypeScript, Node.js 22
BancoPostgreSQL 17 (migrations SQL sequenciais)
AuthLDAP/AD + JWT compartilhado entre subsistemas (SSO)
InfraDocker Compose, Nginx — 1 stack independente por subsistema, roteadas por path no mesmo domínio
ImpressãoZebra ZQ220 Plus (ZPL / jsPDF fallback)

Desafios resolvidos

Galeria

Dashboard — filtro por período (7 dias, 30 dias, trimestre, ano), abas por procedimento, cards com sparkline, total acumulado em U.F.M e opção de incluir registros legados.
Solicitações de Fiscalização — lista com origem, status e fiscal responsável; alternância entre 'Todas' e 'Minhas'.
Detalhe da solicitação — prioridade, prazo legal calculado, triagem registrada, coordenada GPS com link para o mapa e cadeia de procedimentos gerados.
Notificações — busca por nome, nº, endereço ou assunto; chips de entrega (presencial / AR dos Correios), prazo e status.
Nova notificação · passo 1 — busca no cadastro imobiliário, com aviso quando o imóvel da solicitação não está cadastrado e opção de preencher manualmente.
Nova notificação · passo 4 — a categoria da irregularidade preenche descrição e fundamento legal; o serviço a executar vem do catálogo em chips, sempre editável.
Detalhe da notificação — endereço autuado e endereço de entrega separados, dias restantes do prazo e cadeia bidirecional (origem e gerados).
Ações da notificação — marcar como regularizado, gerar embargo/multa (bloqueados quando já existem), renotificar; fotos de vistoria e assinatura anexadas.
Embargos — lista com tipo de entrega, prazo e status herdados da notificação de origem.
Detalhe do embargo — motivo, fundamento legal, dias restantes e a cadeia completa (solicitação → notificação → multa).
Multas — status de entrega e janela de recurso por registro.
Configurações · Geral — provedor de mapas, legislação vigente aplicada pelo sistema e cache local offline com cota e armazenamento persistente.
Configurações · Impressão — MAC Bluetooth da Zebra, intensidade de impressão térmica e gramatura dos caracteres.
Configurações · Impressão — diagnóstico de conexão, teste de impressão, APK do Zebra Browser Print e guia de pareamento da ZQ220.
Configurações · Infrações/Multas — categorias com descrição, fundamento legal separado para notificação e multa, valor diário em U.F.M e prazo.
Configurações · Origens — origens de solicitação/notificação (Ouvidoria, MP, georreferenciamento, outras secretarias…) com escopo de uso.
Configurações · Serviços — catálogo de ações sugeridas ao criar a notificação.
Administração · Logs — trilha de auditoria filtrável por tipo de evento, período e usuário, com impressão.
SFAP (Área Pública) · Monitoramento — áreas fiscalizadas periodicamente em mapa Leaflet, com registro da última visita.