Sistema de Notificação de Incidentes relacionados à Segurança do Paciente em Unidades de Saúde da APS — Prefeitura de Pinhais, PR.
Plataforma mobile-first para registro anônimo de incidentes em unidades de saúde via QR Code, com dashboard administrativo para gestão e relatórios. Totalmente aderente à LGPD.
- Formulário público (
/notificar) — Registro anônimo de incidentes em 3 passos com autopreenchimento via?usf=slug - Categorias NotiVISA — Queda de paciente, erro de medicação, IRAS, falha de equipamento, violência/agressão, outros
- Protocolo único — Formato
NOT-YYYYMMDD-XXXXcom hash curto e retry em colisão - LGPD First — Modo anônimo ativado por padrão, consentimento obrigatório, IP/headers identificáveis descartados
- QR Code — Cadastro por unidade de saúde com autopreenchimento automático
- Dashboard (em desenvolvimento) — Gestão de notificações, relatórios e administração
| Camada | Tecnologia |
|---|---|
| Framework | Next.js 16 (App Router) |
| Linguagem | TypeScript 5.x |
| Estilo | Tailwind CSS 4.x |
| ORM | Drizzle ORM 0.45.x |
| Banco | Neon PostgreSQL |
| Autenticação | NextAuth v5 (Google OAuth) |
| Testes | Vitest 4.x |
# Instalar dependências
npm install
# Configurar variáveis de ambiente
cp .env.example .env.local
# Edite .env.local com suas credenciais (DATABASE_URL, AUTH_SECRET, etc.)
# Executar migrações
npm run db:push
# Iniciar dev server
npm run dev| Comando | Descrição |
|---|---|
npm run dev |
Servidor de desenvolvimento |
npm run build |
Build de produção |
npm run lint |
ESLint |
npm run typecheck |
TypeScript check |
npm test |
Vitest (testes unitários e de integração) |
src/
├── app/
│ ├── api/
│ │ ├── auth/[...nextauth]/ # NextAuth route handler
│ │ ├── notificar/ # POST /api/notificar
│ │ └── usf/ # GET /api/usf
│ ├── notificar/
│ │ ├── page.tsx # Formulário público
│ │ └── confirmacao/ # Tela de protocolo
│ ├── gestao/ # Dashboard (em desenvolvimento)
│ └── layout.tsx
├── components/
│ ├── formulario/ # Formulário 3 passos
│ └── ui/ # Componentes compartilhados
├── lib/
│ ├── auth/ # NextAuth config
│ ├── db/ # Schema Drizzle + conexão
│ └── middleware/ # Anonimização LGPD
└── utils/ # Gerador de protocolo
Em produção, o dashboard gerencial opera em subdomínio separado (gestao.pinhais.pr.gov.br) para isolar a área administrativa do formulário público.
- Adicione um registro CNAME em
gestao.pinhais.pr.gov.brapontando paracname.vercel-dns.com - No Vercel, adicione o domínio
gestao.pinhais.pr.gov.brao projeto - Configure a variável de ambiente:
GESTAO_URL=https://gestao.pinhais.pr.gov.brNEXT_PUBLIC_GESTAO_URL=https://gestao.pinhais.pr.gov.br
Em dev local (localhost), /gestao/* funciona normalmente sem subdomínio.
Os redirects condicionais e assetPrefix só são ativados em produção.
O cookie de sessão NextAuth usa domain: .pinhais.pr.gov.br para funcionar
entre o domínio principal e o subdomínio de gestão.
Retorna lista de Unidades de Saúde ativas.
Cria uma notificação anônima.
{
"usfId": "uuid",
"tipoIncidente": "queda-paciente",
"descricao": "Relato do incidente",
"grauDano": "leve|moderado|grave|obito",
"acoesTomadas": "(opcional)",
"anonimo": true
}Resposta:
{
"protocolo": "NOT-20260728-A3F2",
"success": true,
"anonimo": true
}MIT — Prefeitura Municipal de Pinhais, Paraná.