Voltar ao trabalho

CDC Manager · Plataforma de operações dentárias · 2025 – 2026

De uma operação clínica fragmentada a uma única plataforma de gestão.

Sistema de gestão clínica para clínicas dentárias multi-unidade, construído para substituir integralmente um software legado.

  • Produto
  • Full stack
  • SaaS
Cliente
Centro Dentário Colombo (Lisboa e Amadora)
Estado
A entrar em produção na clínica; a ser preparado como produto para outras clínicas.
34 / 37
requisitos do cliente implementados
749
atos migrados do sistema legado
25+
modelos de dados, 3 áreas, 2 clínicas
Dashboard de administração do CDC Manager

Dashboard de administração — "Hoje", "A seguir" e "Requer atenção".

Contexto

O Centro Dentário Colombo opera duas clínicas: uma no Centro Comercial Colombo com cinco gabinetes e médicos rotativos, outra na Buraca com um gabinete e um único médico. A operação corria num software de gestão legado (Dentoral) que a equipa queria substituir por completo.

Comecei por construir o website institucional da clínica. Quando a direção viu o que era possível, o pedido cresceu: um sistema que cobrisse pacientes, agenda, registo clínico, cobranças, faturação, comissões de médicos, stock e portal do paciente — com dados clínicos globais e operação segregada por clínica.

O problema

A informação vivia em vários sítios: agenda num sistema, comissões em folhas de cálculo, stock de cabeça, confirmações de consulta por telefone. Erros de dupla marcação e de cobrança eram frequentes e difíceis de reconstruir depois.

Os médicos precisavam de ver a sua agenda e produção no telemóvel — no carro, entre clínicas — e os pacientes precisavam de confirmar presença e aceder a documentos sem ligar para a receção.

Depois de uma apresentação aos sócios, recebi 37 requisitos de melhoria (E1–E19, P1–P16, X1–X2). Tinham de ser faseados sem parar a operação.

O meu papel

Único developer e responsável pelo produto: levantamento de requisitos com os sócios, modelação do domínio, arquitetura, implementação, migração de dados do sistema legado, documentação e apresentações de aprovação.

Restrições

  • Dados legados: 749 atos e 22 categorias importados de um sistema que continuava a ser usado durante a migração.
  • Exatidão financeira: comissões de médicos e faturação certificada — um cêntimo errado é um problema contabilístico.
  • Marcações concorrentes em cinco gabinetes com médicos rotativos.
  • Três perfis de utilizador com permissões distintas e dados clínicos sob RGPD.
  • Utilizadores reais em produção: a operação não podia parar entre fases.

Solução

Uma aplicação Next.js com três áreas — administração/receção, médico e portal do paciente — sobre uma única base de dados MongoDB com mais de 25 modelos. Tudo o que é operacional (agenda, cobrança, faturação, recalls, stock) é segregado por clínica; pacientes e fichas clínicas são globais.

Os 37 requisitos foram organizados num plano de sete fases. A primeira foi o motor financeiro: desconto e custo direto por linha de tratamento, cadeia de resolução de comissões (override do médico → base do médico → taxa do ato → 40% por defeito), cancelamento e estorno. As restantes cobriram agenda, painel do médico, portal do paciente, RX, stock e dashboards. 34 dos 37 pedidos foram entregues; os três restantes dependem de terceiros (leitura do Cartão de Cidadão, PEM/SPMS) ou ficaram para depois da aprovação.

Agenda do CDC Manager
Agenda de administração — vista de dia com colunas por gabinete e painel de escalonamento.
Registo clínico
Registo clínico — odontograma, atos com snapshot de preço e comissão, notas.
Painel do médico em mobile
Painel do médico no telemóvel — agenda do dia, produção e consultas por fechar.
Portal do paciente
Portal do paciente — marcações com confirmação de presença e documentos.

O que foi construído

  • Agenda multi-clínica com grelha de 15 minutos, horários por clínica e por profissional, correção de DST e prevenção atómica de dupla marcação por transação MongoDB.
  • Circuito de três emails por marcação (criação, lembrete por cron, confirmação pública) com página de confirmação sem login.
  • Fluxo de consulta orientado por máquina de estados: pending → confirmed → checked-in → in-progress → completed.
  • Odontograma SVG de 32 dentes com cinco faces, versionado e imutável; planos de tratamento com execução faseada; notas clínicas append-only.
  • Catálogo de 749 atos em 22 categorias importado do sistema legado por script idempotente com dry-run.
  • Fila de cobrança por clínica com checkout ao balcão, guarda anti-dupla-cobrança e documentos preparados para emissão certificada via Moloni.
  • Módulo de RX com pedido, máquina de estados, assinatura digital do consentimento e captura de imagem via Cloudinary (assets privados, URLs assinados).
  • Stock por localização: entradas centrais, requisições para gabinetes, contagens quinzenais, ledger imutável de movimentos, transferências entre clínicas como par atómico.
  • Recalls gerados automaticamente na conclusão de atos, com um único ciclo aberto por paciente e tipo de ato.
  • Dashboards de administração (KPIs, ocupação, "Requer atenção") e de médico (produção própria, comissões, consultas por fechar).
  • Portal do paciente: marcações, confirmação de presença, ficheiro .ics, documentos, dados pessoais, consentimentos RGPD.
  • RBAC estrito: só administradores veem produção e comissões dos médicos; receção com âmbito por clínica; médicos só veem os seus dados. Trilho de auditoria em todas as escritas.
  • Branding dinâmico (modelo Organization: nome, logo, cor, dados legais, remetente) para o sistema poder ser instalado noutra clínica sem tocar no código.

Decisões-chave

Imutabilidade financeira

Valores em cêntimos inteiros com arredondamento bancário. Cada ato congela preço e taxa de comissão no momento do registo. Relatórios mensais são calculados a partir desses snapshots, nunca da tabela atual.

Never delete

Nada é apagado. Registos anulam-se com autor e motivo, stock corrige-se com movimentos de acerto, o odontograma versiona-se, faturas anulam-se por nota de crédito. É o que permite reconstruir qualquer situação numa clínica.

Regra de ouro dos horários

Alterar horários de clínicas ou profissionais nunca cancela nem move marcações existentes. O sistema identifica os conflitos e a remarcação é sempre uma decisão humana.

Multi-tenancy por base de dados

Para vender a outras clínicas, o caminho escolhido foi uma base de dados por cliente (deploy e MONGODB_URI separados) em vez de um organizationId em cada coleção. Simples, isolado, e suficiente até haver vários clientes a pagar.

Mobile como prioridade de produto

Os médicos usam o painel pelo telemóvel. A shell da aplicação foi reconstruída com drawer, linhas de duas alturas e grelhas que colapsam, e as tabelas cruas passaram a ter scroll horizontal controlado. Nada foi "adaptado" no fim; foi desenhado para isso.

Arquitetura

Next.js 16 App Router com Server Actions como camada principal (uma por domínio: agenda, cobrança, faturação, recalls, stock, configurações). Rotas de API apenas para autenticação, cron de lembretes e integrações.

MongoDB Atlas com Mongoose; transações para invariantes (dupla marcação, dupla cobrança, saldo de stock). Constantes de domínio partilhadas em src/lib/domain.ts sem dependências, para que componentes de cliente nunca arrastem código de servidor.

NextAuth v5 (JWT) com RBAC; Zod para validação e máquinas de transição por domínio; Resend para email (região UE); Cloudinary para imagens privadas; Vercel.

Resultado

34 dos 37 requisitos do cliente implementados em oito entregas faseadas, com relatório de desenvolvimento e apresentação de aprovação aos sócios.

Sistema pronto para operar as duas clínicas e preparado, com branding dinâmico e isolamento por base de dados, para ser instalado noutras clínicas dentárias.

O que este projeto demonstra: capacidade de levar um produto do levantamento de requisitos com o cliente até um sistema em produção, com decisões de arquitetura pensadas para dados financeiros e clínicos.

O que mudaria

Numa segunda iteração começaria pelo modelo de permissões e pelo trilho de auditoria antes do motor financeiro: foram os pontos que mais forçaram refactoring quando chegaram os requisitos dos sócios.

A decisão de uma base de dados por clínica foi certa para vender a segunda instalação depressa, mas a partir de várias clínicas pagantes um organizationId por coleção passa a compensar — o código já está preparado para essa migração.

Stack

Next.js 16 · TypeScript · MongoDB Atlas · Mongoose · NextAuth v5 · Zod · Resend · Cloudinary · Tailwind CSS v4 · Vercel

Próximo projeto

Surfers Paradise

Não era apenas uma loja online. Era preciso construir toda a operação de e-commerce.

E-commerce completo para uma loja de surf com 20 anos de mercado no Brasil: catálogo, checkout com PIX, boleto e cartão, logística e painel de gestão.

Ver projeto
Homepage da Surfers Paradise