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

As capturas vêm de um ambiente local de demonstração: proprietários, endereços, protocolos e procedimentos são inventados (João Testador, Rua dos Testes), inclusive o cadastro imobiliário, anonimizado antes das telas serem geradas. 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

Portal SFN — login único (SSO via LDAP) que dá acesso aos subsistemas de fiscalização de cada secretaria.
Dashboard do SFO — filtro por período, abas por tipo de procedimento, cards com sparkline de 12 semanas e total acumulado em U.F.M.
Solicitações de fiscalização — origem, status, prioridade e fiscal responsável, com alternância entre 'Todas' e 'Minhas'.
Detalhe da solicitação — prazo legal calculado, triagem registrada, protocolo SEI e a cadeia de procedimentos gerados a partir dela.
Notificações — busca por nome, nº, endereço ou assunto, com status e serviço a executar em cada item.
Detalhe da notificação — endereço autuado e endereço de entrega separados, fundamento legal e contagem dos dias restantes de prazo.
Nova notificação · passo 1 — busca no cadastro imobiliário (52 mil imóveis em cache offline) por inscrição, proprietário ou endereço; imóvel fora do cadastro é preenchido à mão.
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.
Embargos — lista com prazo, tipo de entrega e status herdados da notificação de origem.
Detalhe do embargo — motivo, fundamento legal, dias restantes e a cadeia completa do procedimento.
Multas — valor calculado em U.F.M, status de entrega e janela de recurso por registro.
Cadastro imobiliário importado, disponível offline no dispositivo — é ele que alimenta a busca do assistente de notificação em campo.
Configurações · Geral — provedor de mapas e os textos das leis vigentes aplicadas pelo sistema.
Configurações · Impressão — MAC Bluetooth da Zebra, intensidade da impressão térmica e gramatura dos caracteres, com diagnóstico de conexão.
Configurações · Infrações/Multas — categorias com 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 na criação da notificação.
Configurações · Logs — trilha de auditoria filtrável por tipo de evento, período e usuário.
Relatórios — montagem do relatório cruzando período, tipo de procedimento, bairro, origem e descrição da irregularidade.
SFAP (Área Pública) · Monitoramento — áreas fiscalizadas periodicamente em mapa Leaflet, com a data da última visita.