Skip to content
Vicente Augusto edited this page Jun 6, 2026 · 1 revision

🦷 OdontoFlow — Project Board & Backlog

SaaS B2B Multi-tenant de Gerenciamento Clínico Odontológico
Stack: Node.js · Express · TypeScript · Prisma ORM v7 · PostgreSQL · Docker


✅ FEITO — O que já está pronto

Infraestrutura & Config

  • Estrutura de pastas definida (controllers, services, routes, middlewares, types, shared, lib, docs, __tests__)
  • Docker Compose com PostgreSQL 16
  • Prisma v7 configurado com prisma.config.ts + adapter @prisma/adapter-pg
  • tsconfig.json configurado para CommonJS + Node 24
  • tsx como runner de desenvolvimento
  • .env com DATABASE_URL, JWT_SECRET, JWT_EXPIRES_IN
  • server.ts com Express + CORS + JSON parser
  • Health check endpoint GET /health

Schema & Banco

  • Schema multi-tenant com modelo Tenant como entidade máxima
  • Enums tipados: TenantPlan, UserRole, AppointmentStatus, AppointmentType, Room, PaymentMethod, TransactionType, Gender
  • Models: Tenant, Clinic, User, Patient, Appointment, Product, Supplier, Transaction
  • Soft delete em Patient, Product, Supplier
  • Índices compostos para queries multi-tenant (tenantId + clinicId)
  • @@unique([tenantId, cpf]) em Patient
  • Migrations aplicadas e banco sincronizado

Auth

  • auth.types.ts — DTOs e JwtPayload com tenantId + clinicId
  • auth.service.ts — register, login, getMe com isolamento multi-tenant
  • auth.middleware.tsauthenticate (JWT) + authorize(...roles) (RBAC)
  • auth.controller.ts — controllers com next(error)
  • auth.routes.ts — POST /register, POST /login, GET /me
  • Hash de senha com bcryptjs (salt 12)
  • JWT assinado com tenantId, clinicId, role
  • Validação de tenant.isActive e user.isActive no login
  • lastLoginAt atualizado em fire-and-forget

Patients

  • patient.types.ts — CreatePatientDTO, UpdatePatientDTO, PatientFiltersDTO
  • patient.service.ts — CRUD completo + soft delete + paginação + filtros por nome/CPF
  • patient.controller.ts — todos os controllers com next(error)
  • patient.routes.ts — CRUD com RBAC por role

Utilitários

  • AppError — classe de erro customizada com statusCode
  • errorHandler.middleware.ts — middleware global de erro
  • prisma.ts — singleton do PrismaClient com globalThis pattern
  • routes/index.ts — agregador central de rotas

📋 BACKLOG — O que falta construir

🔴 Alta Prioridade

Módulo Appointments (Agendamentos)

  • appointment.types.ts
  • appointment.service.ts — CRUD + validação de conflito de sala/dentista/horário
  • appointment.controller.ts
  • appointment.routes.ts
  • Regra: não permitir dois agendamentos na mesma sala no mesmo horário
  • Regra: não permitir dentista com dois agendamentos simultâneos
  • Filtros: por data, dentista, sala, status, paciente
  • Endpoint de mudança de status: PATCH /appointments/:id/status

Módulo Transactions (Financeiro)

  • transaction.types.ts
  • transaction.service.ts — RECEITA e DESPESA
  • transaction.controller.ts
  • transaction.routes.ts
  • Criação automática de Transaction ao finalizar Appointment
  • Relatório financeiro por período (GET /transactions/report)
  • Filtros: por tipo, método de pagamento, período, categoria

Validação de Inputs

  • Instalar e configurar zod
  • Schemas de validação para todos os DTOs (auth, patient, appointment, transaction)
  • Middleware validate(schema) reutilizável

🟡 Média Prioridade

Módulo Products (Estoque)

  • product.types.ts
  • product.service.ts — CRUD + alertas de estoque mínimo
  • product.controller.ts
  • product.routes.ts
  • Endpoint GET /products/low-stock — produtos abaixo do minQuantity
  • Endpoint GET /products/expiring — produtos próximos do vencimento

Módulo Suppliers (Fornecedores)

  • supplier.types.ts
  • supplier.service.ts
  • supplier.controller.ts
  • supplier.routes.ts

Módulo Clinics (Gestão de Filiais)

  • clinic.service.ts — CRUD de clínicas por tenant
  • Apenas ADMIN pode criar/editar clínicas
  • Endpoint GET /clinics — lista filiais do tenant

Módulo Users (Gestão de Usuários)

  • user.service.ts — CRUD de usuários por clínica
  • PATCH /users/:id/status — ativar/desativar usuário
  • PATCH /users/:id/role — alterar role (apenas ADMIN)
  • PATCH /auth/change-password — troca de senha

🟢 Baixa Prioridade

Dashboard & Relatórios

  • GET /dashboard — métricas gerais da clínica
    • Total de pacientes ativos
    • Agendamentos do dia
    • Receita do mês
    • Produtos em estoque crítico
  • GET /reports/appointments — relatório de agendamentos por período
  • GET /reports/revenue — relatório financeiro consolidado

Módulo Tenants (Super Admin)

  • CRUD de tenants (rota protegida por role SUPER_ADMIN)
  • Gestão de planos (STANDARD, PREMIUM, ENTERPRISE)
  • Endpoint de ativação/desativação de tenant

🧪 TESTES

Unitários (src/__tests__/unit/)

  • auth.service.test.ts — register, login, getMe
  • patient.service.test.ts — CRUD, validação CPF duplicado
  • appointment.service.test.ts — conflito de horário/sala
  • AppError.test.ts — statusCode e instanceof

Integração (src/__tests__/integration/)

  • auth.routes.test.ts — POST /register, POST /login, GET /me
  • patient.routes.test.ts — CRUD completo com JWT
  • appointment.routes.test.ts

Setup de Testes

  • Instalar vitest ou jest + supertest
  • Banco de dados de teste isolado (schema separado ou SQLite)
  • Factories de dados com @faker-js/faker
  • Coverage mínimo de 70%

📖 DOCUMENTAÇÃO

  • Swagger/OpenAPI com swagger-jsdoc + swagger-ui-express (já instalado)
  • GET /docs — UI interativa da API
  • Documentar todos os endpoints com exemplos de request/response
  • README.md com instruções de setup, variáveis de ambiente e scripts
  • CONTRIBUTING.md — guia de contribuição e padrões do projeto

🚀 PRÓXIMAS ISSUES SUGERIDAS

[FEAT] Módulo Appointments — CRUD + validação de conflito
[FEAT] Módulo Transactions — financeiro com criação automática
[FEAT] Validação de inputs com Zod em todos os módulos
[FEAT] Módulo Products — estoque com alertas
[FEAT] Módulo Suppliers — fornecedores
[FEAT] Módulo Users — gestão de usuários por clínica
[FEAT] Módulo Clinics — gestão de filiais por tenant
[FEAT] Dashboard endpoint com métricas consolidadas
[FEAT] Relatórios financeiros por período
[TEST] Setup vitest + supertest
[TEST] Testes unitários — Auth Service
[TEST] Testes unitários — Patient Service
[TEST] Testes de integração — rotas Auth
[DOCS] Swagger — documentação completa da API
[DOCS] README.md com setup completo
[INFRA] Pipeline CI/CD com GitHub Actions
[INFRA] Dockerfile para produção
[INFRA] Rate limiting com express-rate-limit
[INFRA] Helmet.js para segurança de headers
[INFRA] Logger estruturado com pino ou winston

💡 IDEIAS FUTURAS (já discutidas)

  • Isolamento por banco — campo databaseUrl no Tenant já previsto no schema para clientes Enterprise com banco dedicado
  • Multi-clínica por usuário — permitir que um dentista atenda em múltiplas filiais do mesmo tenant
  • Notificações — lembretes de consulta via WhatsApp/SMS (integração Twilio ou Z-API)
  • Prontuário digital — upload de radiografias e documentos por paciente
  • Agenda visual — endpoint otimizado para renderizar calendário semanal por sala/dentista
  • Plano de assinatura — limitar features por TenantPlan (ex: STANDARD sem relatórios avançados)
  • Auditoria — log de todas as ações por usuário (quem criou, editou, deletou)
  • App mobile — consumir a mesma API com React Native

🗂️ ESTRUTURA ATUAL DO PROJETO

backend/
├── prisma/
│   ├── schema.prisma
│   └── migrations/
├── prisma.config.ts
├── tsconfig.json
├── docker-compose.yml
├── .env
└── src/
    ├── server.ts
    ├── controllers/
    │   ├── auth.controller.ts
    │   └── patient.controller.ts
    ├── services/
    │   ├── auth.service.ts
    │   └── patient.service.ts
    ├── routes/
    │   ├── index.ts
    │   ├── auth.routes.ts
    │   └── patient.routes.ts
    ├── middlewares/
    │   ├── auth.middleware.ts
    │   └── errorHandler.middleware.ts
    ├── types/
    │   ├── auth.types.ts
    │   └── patient.types.ts
    ├── shared/
    │   └── AppError.ts
    ├── lib/
    │   └── prisma.ts
    ├── docs/
    └── __tests__/