- documentação/MAPA-FUNCIONAL-COMPLETO.md: inventário de rotas/telas/botões/fluxos, matriz de módulos, mapa de conexões (mermaid) e notas — baseado em evidências do código. - documentação/AUDITORIA-ESTRATEGICA-MODELAGEM.md: análise Pessoa→Vínculo→Workspace, entidades mal classificadas e riscos arquiteturais. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
30 KiB
MAPA FUNCIONAL COMPLETO — ScoreOdonto
Auditoria funcional baseada SOMENTE em evidências do código. Nada aqui foi assumido. Fonte:
frontend/(React 19 + Vite, roteador próprio emApp.tsx) ebackend/server.js(Express monolítico, ~516 KB, 277 rotas, ~70 tabelas Postgres acessadas por SQL direto). Estado verificado: produçãov1.0.18· DEVdev(banco isoladopgdev). Data: 19/jun/2026.
Sumário executivo (o que o sistema É, na prática)
O ScoreOdonto é um ERP odontológico multiempresa (SaaS) cujo núcleo é o ciclo Lead → Paciente → Agenda → Procedimento → Financeiro → Comissão → Repasse, com módulos clínicos (Ortodontia, Próteses/GTO, RX), administrativos (Equipe/RBAC, Planos, Procedimentos) e três frentes de marketplace (Locação de Salas, Diretório/Propostas de Profissionais, Tutoria de Ortodontia — esta última a única com cobrança automatizada via MercadoPago).
A arquitetura é multi-tenant real: quase toda rota passa por tenantGuard e filtra por
clinica_id. O "workspace" ativo (clínica ou sala) governa menu, permissões e dados visíveis.
Evidências estruturais:
- Frontend sem
react-router: roteamento próprio (ROUTE_MAP/VIEW_TO_ROUTEemApp.tsx). - 44 views (
frontend/views/*.tsx), 16 componentes, 3 plugins. - Backend num único
server.js(516 KB) — sem camada de serviços/controllers separada. - Prisma quase não usado (4 modelos legados de GTO); o banco real é SQL puro via
pg.
ETAPA 1 — INVENTÁRIO DE ROTAS
Roteamento definido em frontend/App.tsx (ROUTE_MAP, VIEW_TO_ROUTE, renderView, isViewAllowed).
Papéis (roles): superadmin, admin, donoclinica, donoconsultorio, funcionario,
dentista, biomedico, protetico, paciente, donosala.
Tipos de workspace: clínica (padrão) e sala (isola o contexto). Plugins: rx-scoreodonto,
locacao-salas (sempre ON), profissionais-marketplace.
| URL | View | Componente / Arquivo | Acesso (papéis) | Origem | Destino |
|---|---|---|---|---|---|
/ |
landing | LandingPage.tsx |
Público | — | login / área |
/login |
login | LoginView.tsx |
Público | landing | dashboard por papel |
/contato |
public | PublicContactForm.tsx |
Público | landing | cria interesse/lead |
/dashboard |
dashboard | Dashboard.tsx |
admin/donos/func/dentista/bio/prot | login, menu | agenda, pacientes |
/leads |
leads | LeadsView.tsx |
admin/donos/funcionário | menu | converter→paciente+agenda |
/pacientes |
pacientes | PatientsView.tsx |
admin/donos/funcionário | menu, dashboard | agenda, orçamento, procedimento, ortodontia, RX |
/agenda |
agenda | AgendaView.tsx |
quase todos os papéis clínicos | menu, dashboard | paciente, avaliação, procedimento |
/ortodontia |
ortodontia | OrthoView.tsx |
dentista (odonto) | menu, paciente | evolução, fotos, tutoria |
/financeiro |
financeiro | FinanceiroView.tsx |
admin/donos/funcionário | menu | comissão, glosa |
/comissoes |
comissoes | ComissoesView.tsx |
admin/donos | menu apenas ⚠️ | repasse |
/glosas |
glosas | GlosasView.tsx |
admin/donos/funcionário | menu apenas ⚠️ | recebíveis convênio |
/proteses |
proteses | ProteseView.tsx |
dentista/protético/func | menu | OS de laboratório, GTO |
/orcamentos |
orcamentos | OrcamentosView.tsx |
admin/donos/funcionário | menu, paciente | contrato |
/contratos |
contratos | ContratosView.tsx |
admin/donos/funcionário | menu, orçamento | cobrança/financeiro |
/relatorios |
relatorios | ReportsView.tsx |
admin/donos/funcionário | menu | — |
/tratamentos |
tratamentos | MeusTratamentos.tsx |
paciente + clínicos | menu | — |
/lancar-gto |
lancar-gto | LancarGTO.tsx |
biomédico/protético/func | menu | guias odontológicas |
/notificacoes |
notificacoes | NotificationsView.tsx |
todos | menu | — |
/clinicas |
clinicas | ClinicasView.tsx |
membros | menu, seletor de workspace | criar-clinica |
/gestao-equipe |
gestao-equipe | GestaoEquipeView.tsx |
admin/donos | menu | membros, cargos (RBAC) |
/admin/dentistas |
dentistas | AdminViews.tsx |
admin/donos | menu | horários |
/admin/especialidades |
especialidades | AdminViews.tsx |
admin/donos/biomédico | menu | procedimentos |
/admin/procedimentos |
procedimentos | AdminViews.tsx |
admin/donos/biomédico | menu | valores por plano |
/admin/planos |
planos | AdminViews.tsx |
admin/donos | menu | — |
/admin/sync |
sync | AdminViews.tsx (SyncView) |
NINGUÉM (bloqueado) ⚠️ | — | — |
/plugins |
plugins | PluginsView.tsx |
superadmin apenas | menu (superadmin) | ativa plugins |
/rx-radiografias |
rx-radiografias | plugins/RXPlugin.tsx |
dentista/donos/func (plugin RX) | menu | dispositivos RX |
/rx-config |
rx-config | RxConfigView.tsx |
admin/donos/superadmin | menu | dispositivos RX |
/salas /minhas-salas /alugar-salas |
salas | plugins/SalasPlugin.tsx |
todos (plugin locacao-salas, sempre ON) |
menu | reservas |
/sala-home |
sala-home | SalaHomeView.tsx |
workspace tipo sala |
seletor de workspace | reservas da sala |
/marketplace-profissionais |
marketplace-profissionais | plugins/ProfissionaisPlugin.tsx |
clínicos exceto paciente (plugin) | menu | propostas |
/diretorio-profissionais |
diretorio-profissionais | DiretorioProfissionaisView.tsx (absorvido pelo plugin) |
clínicos | menu | — |
/candidatura-tutor |
candidatura-tutor | TutorCandidaturaView.tsx |
dentista | menu | pagamento MercadoPago |
/tutoria-painel |
tutoria-painel | TutorPainelView.tsx |
tutores aprovados (is_tutor) |
menu | solicitações |
/admin-gestao-tutores |
admin-gestao-tutores | AdminGestaoTutoresView.tsx |
superadmin | menu | confirma pagamentos/repasses |
/criar-clinica |
criar-clinica | CreateClinicView.tsx |
admin/donos sem workspace | pós-cadastro | dashboard |
/cadastro-dentista |
cadastro-dentista | DentistRegisterView.tsx |
standalone (magic-link) | menu apenas ⚠️ | aguardando-convite |
/aguardando-convite |
aguardando-convite | WaitingInviteView.tsx |
dentista/bio/prot sem vínculo | pós-cadastro | — |
/superadmin/* |
superadmin-* | SuperAdminView.tsx (tabs) |
superadmin | menu | usuários, clínicas, logs, financeiro, notificações |
/update |
update | UpdateDbView.tsx |
técnica (URL direta, sempre liberada) | fora do menu | migração de banco |
⚠️ Inconsistências de roteamento encontradas (evidência: ROUTE_MAP vs VIEW_TO_ROUTE em App.tsx):
/comissoes,/glosase/cadastro-dentistaexistem emVIEW_TO_ROUTE(a navegação por menu empurra a URL), mas NÃO existem emROUTE_MAP. Consequência: abrir essas URLs direto (deep-link / refresh) cai emdashboard. Deep-link quebrado para 3 telas reais./admin/syncestá mapeada, masisViewAllowedretornafalsesempre (substituída por "backup por clínica"). A tela e a rota existem, porém são inacessíveis (código morto navegável).
ETAPA 2 — INVENTÁRIO DE TELAS
(Resumo por tela — objetivo / usuário-alvo / valor / dependências / impacto. Apenas telas reais.)
Dashboard
- Objetivo: visão consolidada (KPIs via
GET /api/dashboard/stats). Usuário: gestores/clínicos. - Valor: ponto de entrada operacional. Depende de: agenda, pacientes, financeiro. Impacta: navegação.
Leads / Gestão de Leads
- Objetivo: captar e converter interessados em pacientes. Usuário: funcionário/donos.
- Valor: topo do funil comercial. Depende de:
interesses/contato público. Impacta: Pacientes + Agenda (a conversão cria ambos —POST /api/leads/:id/converter).
Pacientes
- Objetivo: prontuário e cadastro (dados, família, score, faltas). Usuário: funcionário/donos.
- Valor: entidade central do negócio. Depende de: clínica ativa. Impacta: Agenda, Orçamento, Procedimento realizado, Ortodontia, RX, Receita/Exame. É o hub clínico (view de 92 KB).
Agenda
- Objetivo: agendar/confirmar/remarcar; controle de presença e anti-overbooking. Usuário: todos clínicos.
- Valor: coração operacional. Depende de: Pacientes, Dentistas+horários. Impacta: Avaliação, Procedimento, Financeiro (presença libera lançamento).
Ortodontia
- Objetivo: tratamento orto completo (triagem, diagnóstico, plano, evoluções, fotos, contenção). Usuário: dentista.
- Valor: vertical clínica de alto valor recorrente. Depende de: Paciente. Impacta: Tutoria, fotos.
Próteses / GTO
- Objetivo: OS de laboratório (
protese_os), produtos, custo lab, entrega. Usuário: protético/dentista. - Valor: controle do laboratório e do custo que abate comissão. Depende de: Procedimentos, Laboratórios. Impacta: Comissão (custo lab entra no cálculo).
Financeiro
- Objetivo: contas a receber/pagar (
financeiro: RECEITA/DESPESA), formas, centro de custo, fornecedor. Usuário: gestores. - Valor: caixa da clínica. Depende de: Procedimentos realizados, Contratos, Repasses. Impacta: Comissão, Glosa.
Comissões
- Objetivo: definir % (padrão da clínica, por procedimento, override por profissional) e ver produção/comissão.
- Usuário: donos. Depende de: Procedimentos realizados + Próteses (custo lab). Impacta: Repasses.
Glosas
- Objetivo: registrar glosa sobre recebíveis (convênio), recorrer, recuperar. Usuário: gestores.
- Valor: recupera receita negada por convênio. Depende de: Financeiro (recebíveis). Impacta: caixa.
Orçamentos → Contratos
- Objetivo: propor tratamento (itens/valores) e formalizar em contrato (modelos com variáveis, assinatura, cobrança).
- Usuário: funcionário/donos. Depende de: Paciente, Procedimentos. Impacta: Financeiro (
gerar-cobranca).
Equipe / Usuários (RBAC)
- Objetivo: membros, cargos (
funcoes), setores e permissões por workspace. Usuário: donos. - Valor: governa quem vê o quê. Impacta: menu e
isViewAllowedde todos os membros.
Salas (Locação) / Painel da Sala
- Objetivo: cadastrar salas, publicar no marketplace, receber/aceitar reservas. Usuário: qualquer conta.
- Valor: receita de locação P2P. Depende de: conta/sala. Impacta:
sala_reservas.
Marketplace de Profissionais / Diretório
- Objetivo: profissional publica perfil; clínica envia proposta (
propostas_profissional). Usuário: clínicas e profissionais. - Valor: conexão oferta/demanda de mão de obra. Impacta: mensagens/propostas (sem cobrança hoje).
Tutoria de Ortodontia (Candidatura / Painel / Gestão)
- Objetivo: dentista vira tutor (pagando inscrição via MercadoPago); resolve solicitações orto.
- Usuário: dentistas + superadmin (gestão). Valor: única receita de plataforma automatizada.
SuperAdmin (overview/users/clínicas/logs/financeiro/notificações)
- Objetivo: administração global da plataforma (preços/assinaturas, broadcast, auditoria de acesso).
- Usuário: superadmin. Valor: operação do SaaS.
Configurações / Notificações / Minhas Clínicas
- Conta, integrações (Google), backup por clínica; notificações; seletor/gestão de workspaces.
ETAPA 3 — INVENTÁRIO DE BOTÕES (telas transacionais)
Rótulos extraídos das views; ações mapeadas para as rotas/tabelas do backend.
Agenda (AgendaView.tsx)
- Novo Agendamento →
POST /api/agendamentos→ tabelaagendamentos. Fluxo: Paciente ↓ Procedimento ↓ Financeiro. - Confirmar / Confirmar Presença →
POST /api/agendamentos/:id/confirmar+/api/agenda/presenca→agendamentos,agenda_presenca. Libera lançamento financeiro. - Reagendar / Remarcar →
POST /api/agendamentos/:id/remarcar→agendamentos. - Registrar Falta →
POST /api/agendamentos/:id/falta→agendamentos(impacta score do paciente). - Solicitar Avaliação →
POST /api/agendamentos/:id/solicitar-avaliacao→avaliacoes.
Pacientes (PatientsView.tsx)
- Editar/Cadastrar Paciente →
POST|PUT /api/pacientes→pacientes. - Agendar → abre fluxo da Agenda. Lançar Procedimento (
LancarProcedimentoModal) →POST /api/procedimentos-realizados→procedimentos_realizados(+ gerafinanceiro). - Orçamento (
OrcamentoModal) →orcamentos. Receita (ReceitaModal) →modelos_receita/items_receita. Pedido de Exame (PedidoExameModal) →pedidos_exame.
Financeiro (FinanceiroView.tsx)
- Novo lançamento (RECEITA/DESPESA, forma, vencimento, centro de custo, fornecedor) →
POST /api/financeiro→financeiro. - Marcar Pago / Alterar / Excluir →
PUT|DELETE /api/financeiro/:id→financeiro.
Comissões (ComissoesView.tsx)
- Salvar % padrão / por procedimento / override por profissional →
PUT /api/comissoes/regras→comissao_regras. - Base de cálculo (produção × recebido) e Custo lab abatido. Próximo fluxo: Fechar repasse.
Repasses (em Financeiro/Comissões)
- Fechar Repasse →
POST /api/repasses/fechar→repasses(statusfechado). - Pagar →
POST /api/repasses/:id/pagar→ cria DESPESA emfinanceiro(origemrepasse, centro de custoCOMISSÕES). - Anexar Comprovante →
POST /api/repasses/:id/comprovante. Cancelar → estorna a despesa.
Glosas (GlosasView.tsx)
- Registrar Glosa (total/livre, motivo, valor) →
POST /api/glosas→glosas. - Recorrer →
POST /api/glosas/:id/recorrer. Recuperar →POST /api/glosas/:id/recuperar.
Orçamentos / Contratos
- Novo Orçamento (itens, valor, entrada, parcelas) →
POST /api/orcamentos→orcamentos/orcamento_itens. - Gerar Contrato (modelo + variáveis + prévia) →
POST /api/contratos/instancias→contratos. - Enviar / Assinar / Gerar Cobrança / Cancelar →
POST /api/contratos/instancias/:id/{enviar,assinar,gerar-cobranca,cancelar}→ liga aofinanceiro.
Próteses (ProteseView.tsx)
- Nova OS (produto, dentes, material, custo lab, preço, prazo) →
POST /api/protese/os→protese_os. - Marcar Entregue / Mudar Status →
POST /api/protese/os/:id/status→protese_os_evento.
Leads (LeadsView.tsx)
- Cadastrar Lead →
POST /api/leads→leads. - Cadastrar o Paciente / Converter (com data, hora, dentista) →
POST /api/leads/:id/converter→ criapacientes+agendamentos(anti-overbooking).
ETAPA 4 — FLUXOS DE NEGÓCIO
Fluxo principal (núcleo do produto) — COMPLETO
Lead/Interesse ──converter──▶ Paciente ──▶ Agenda ──confirmar/presença──▶ Atendimento
(leads) (pacientes) (agendamentos) │
▼
Procedimento Realizado
(procedimentos_realizados)
│ valor>0
▼
Financeiro RECEITA (origem='procedimento')
(financeiro, flag sem_comissao)
│
computeComissoes = (base − custo_lab) × %
▼
Repasse FECHADO (repasses) ──pagar──▶
Financeiro DESPESA (origem='repasse',
centro_custo='COMISSÕES')
- Onde começa: Lead/Interesse (ou cadastro direto de Paciente).
- Onde termina: pagamento do repasse ao profissional (DESPESA conciliada no caixa) — ciclo fechado.
- Onde quebra / desvio:
- Geração de RECEITA é opcional (
gerarLancamento !== falseevalor>0): um procedimento sem valor não entra no financeiro — possível receita não registrada (depende do operador). - Glosa é um ramo paralelo sobre recebíveis de convênio (recupera receita), não integrado ao repasse.
- Garantia/Reabertura marcam
sem_comissao(regra: garantia sempre; reabertura só se mesmo profissional) — corretamente excluídas do repasse.
- Geração de RECEITA é opcional (
- Duplicidade: não há dupla geração de comissão — o repasse pago entra como DESPESA com
sem_comissao=true(evita recomissionar). Bom controle.
Fluxo comercial paralelo
Orçamento (orcamentos) ──▶ Contrato (contratos) ──gerar-cobranca──▶ Financeiro (a receber)
Fluxos de marketplace (ver Etapas 7 e 8)
Sala (salas) ──publica──▶ Marketplace ──reserva──▶ sala_reservas (valor, status) [pagamento MANUAL]
Profissional ──perfil──▶ Diretório ──proposta──▶ propostas_profissional (mensagem) [sem cobrança]
Dentista ──candidatura──▶ MercadoPago (pago) ──webhook──▶ Tutor ativo ──▶ Solicitações de tutoria
ETAPA 5 — MATRIZ DE MÓDULOS
| Módulo | Existe? | Acessível? | Funcional? | Completo? | Em uso? | Classificação |
|---|---|---|---|---|---|---|
| Autenticação / Workspaces / RBAC | Sim | Sim | Sim | Sim | Sim | Maduro |
| Pacientes | Sim | Sim | Sim | Sim | Sim | Maduro |
| Agenda (+presença/anti-overbooking) | Sim | Sim | Sim | Sim | Sim | Maduro |
| Financeiro (receita/despesa) | Sim | Sim | Sim | Sim | Sim | Maduro |
| Comissão + Repasse | Sim | Sim | Sim | Sim | Sim | Operacional |
| Glosas | Sim | menu apenas (deep-link quebrado) | Sim | Parcial | Sim | Operacional |
| Orçamentos → Contratos | Sim | Sim | Sim | Sim | Sim | Operacional |
| Ortodontia | Sim | Sim | Sim | Sim | Sim | Maduro |
| Próteses / GTO | Sim | Sim | Sim | Parcial | Sim | Operacional |
| Leads | Sim | Sim | Sim | Sim | Sim | Operacional |
| Plano/Procedimentos/Especialidades | Sim | Sim | Sim | Sim | Sim | Operacional |
| RX / Radiografias (plugin) | Sim | por plugin/papel | Sim | Parcial | depende clínica | Parcial |
| Locação de Salas (marketplace) | Sim | Sim (sempre ON) | Sim | Parcial (sem gateway) | baixo | Parcial |
| Marketplace Profissionais | Sim | por plugin | Sim | Parcial (só mensagem) | baixo | MVP |
| Tutoria de Ortodontia (MercadoPago) | Sim | Sim | Sim | Sim | baixo | Operacional |
| SuperAdmin | Sim | superadmin | Sim | Sim | Sim | Operacional |
| Sync Google/legado (global) | Sim | bloqueado | parcial | — | não | Abandonado |
| Relatórios | Sim | Sim | Sim | Parcial | Sim | Parcial |
ETAPA 6 — MULTIEMPRESA
Evidência: quase todas as 277 rotas usam tenantGuard e filtram por req.clinicaId/clinica_id.
O workspace ativo é resolvido por GET /api/me/workspaces (tabela vinculos = usuário↔clínica) + salas próprias.
| Entidade | Como é modelada | Multiempresa respeitado? |
|---|---|---|
| Workspaces | vinculos (clínica) + salas (tipo sala); seletor no Sidebar |
✅ Sim |
| Clínicas | clinicas + clinica_id em todas as tabelas operacionais |
✅ Sim |
| Consultórios | papel donoconsultorio (variação de dono, mesmo modelo de clínica) |
✅ Sim |
| Dentistas / Biomédicos / Protéticos | papéis distintos com menus próprios; vínculo por clínica | ✅ Sim |
| Salas | salas + workspace tipo='sala' isola o contexto (menu reduzido) |
✅ Sim |
| Laboratórios | protese_laboratorios por clínica |
✅ Sim |
- Acoplamento indevido: não encontrado acoplamento a "clínica única" — o
clinica_idé onipresente. - Ponto de atenção: o contexto é cacheado no
localStorage(SCOREODONTO_USER_DATA, plugins) e reconciliado viahydrateMyPlugins(). Plugins ativos vivem emlocalStorage(cliente), não só no servidor — risco de divergência entre dispositivos (mitigado porme/plugins, mas é o elo mais frágil do multiempresa). - O marketplace de salas é cross-tenant por desenho (uma clínica aluga sala de outra) — acoplamento intencional.
Veredito: conceito multiempresa bem respeitado no backend; a fragilidade é o estado de UI/plugins no cliente.
ETAPA 7 — MARKETPLACE
Salas (salas) ─┬─ Locação (sala_reservas: valor, modelo, status pendente/aceita)
└─ Profissionais (perfil) ─ Propostas (propostas_profissional: mensagem)
└─ Protéticos/Laboratórios (protese_*)
| Frente | O que existe hoje | O que falta | Gera receita? | Pode gerar |
|---|---|---|---|---|
| Locação de salas | CRUD de salas, publicação no marketplace, reserva com valor e workflow de status (pendente→aceita), painel da sala |
Gateway de pagamento e taxa da plataforma (hoje o valor é registrado, mas o pagamento é manual/externo) |
Não diretamente | Sim — comissão sobre locação |
| Profissionais | Perfil público + envio de proposta (mensagem) clínica→profissional | Negociação, contrato, e qualquer cobrança | Não | Sim — taxa de match/assinatura premium |
| Protéticos / Laboratórios | OS, produtos, custo lab integrados ao financeiro/comissão | Marketplace aberto de laboratórios (hoje é interno por clínica) | Indireto (operacional) | Sim — rede de laboratórios |
| Tutoria de Ortodontia | Candidatura paga via MercadoPago (preferences + mp-webhook), comissao_pct, solicitações/mensagens |
Escala (oferta de tutores), avaliação | ✅ Sim (a única automatizada) | Já gera |
Conclusão: a infraestrutura de marketplace existe, mas só a Tutoria tem captura de pagamento real.
Salas é a frente mais próxima de monetizar (já tem valor e reservas) — falta o gateway + a taxa.
ETAPA 8 — FINANCEIRO
ORIGEM DO DINHEIRO → DESTINO → RESPONSÁVEL
Procedimento realizado (RECEITA) → financeiro (a receber) → Clínica
Contrato (gerar-cobranca) → financeiro (a receber) → Clínica
Convênio (recebíveis) − Glosa → financeiro / recupera → Clínica
Comissão (base − custo lab × %) → repasses (fechado) → Profissional
Repasse pago → financeiro DESPESA (COMISSÕES) → Clínica paga Profissional
Locação de sala (valor reserva) → sala_reservas (status) → Locador [pagamento manual]
Tutoria (inscrição) → MercadoPago → ativa tutor → Plataforma (comissao_pct)
| Item | Tabela | Estado |
|---|---|---|
| Orçamentos | orcamentos/orcamento_itens |
✅ completo |
| Contratos | contratos/contrato_* |
✅ completo (modelos, variáveis, assinatura, cobrança) |
| Convênios/Planos | planos, procedimentos_valores_planos |
✅ |
| Produção | procedimentos_realizados → financeiro |
✅ (RECEITA opcional por valor) |
| Comissão | comissao_regras + computeComissoes |
✅ (3 níveis de regra; abate custo lab) |
| Repasse | repasses (fechar/pagar/cancelar/comprovante) |
✅ ciclo fechado, com estorno |
| Glosas | glosas (recorrer/recuperar) |
✅ funcional, isolado do repasse |
| Locação | sala_reservas.valor |
⚠️ registra valor, sem captura de pagamento |
Pontos fortes: rastreabilidade (cada DESPESA de repasse referencia o período/profissional; audit_log em tudo),
e não-duplicação de comissão (sem_comissao propagado). Lacuna: receita de procedimento depende de ação manual.
ETAPA 9 — MAPA DE CONEXÕES (Mermaid)
flowchart TD
U[Usuário] --> WS{Workspace ativo}
WS -->|clínica| CL[Clínica / RBAC]
WS -->|sala| SH[Painel da Sala]
CL --> LEAD[Leads]
LEAD -->|converter| PAC[Pacientes]
PAC --> AG[Agenda]
AG --> AV[Avaliação]
AG --> PR[Procedimento Realizado]
PAC --> ORTO[Ortodontia]
PAC --> RX[RX / Radiografias]
PAC --> ORC[Orçamento]
ORC --> CON[Contrato]
CON -->|gerar-cobranca| FIN[Financeiro]
PR -->|RECEITA| FIN
PR --> COM[Comissão]
PROT[Próteses / Custo Lab] --> COM
COM --> REP[Repasse]
REP -->|pagar DESPESA| FIN
FIN --> GLO[Glosas]
FIN --> REL[Relatórios]
SH --> RES[Reservas de Sala]
CL --> SAL[Salas Marketplace]
SAL --> RES
CL --> MKP[Marketplace Profissionais]
MKP --> PROP[Propostas]
ORTO --> TUT[Tutoria Orto]
TUT -->|MercadoPago| MP[(Pagamento)]
SUPER[SuperAdmin] --> CL
SUPER --> PLUG[Plugins]
flowchart LR
subgraph Núcleo financeiro
PR[procedimentos_realizados] --> FINr[financeiro RECEITA]
FINr --> CR[comissao_regras]
CR --> RP[repasses]
RP --> FINd[financeiro DESPESA]
FINr --> GL[glosas]
end
ETAPA 10 — OPORTUNIDADES
Funcionalidades órfãs (existem no código, ninguém usa)
views/OrthoReports.tsx— não é roteada emApp.tsxnem importada por nenhuma view. Órfã real (importaOrthoPhotoWorkspace, mas nada importaOrthoReports). Relatórios de ortodontia prontos e desligados.SyncView(/admin/sync) — tela e rota existem, masisViewAllowedretornafalsesempre. Código morto navegável.
Funcionalidades escondidas (existem mas não aparecem no menu)
/update(UpdateDbView) — migração de banco; acessível por URL direta, fora do menu (ferramenta técnica)./cadastro-dentista— só alcançável por fluxo/magic-link; sem entrada no menu e com deep-link quebrado.- Comissões deep-link — visível no menu (admin/donos) mas
/comissoesdireto cai em dashboard.
Funcionalidades incompletas (começam mas não terminam o fluxo)
- Locação de salas — reserva com
valore status, mas sem captura de pagamento (fluxo financeiro não fecha). - Marketplace de profissionais — proposta é só mensagem; não evolui para contratação/cobrança.
- RECEITA de procedimento opcional — pode não gerar lançamento (receita potencialmente não registrada).
- Glosas isoladas — recuperam receita, mas não reconciliam com o repasse correspondente.
Funcionalidades de alto potencial (podem gerar receita)
- Gateway na Locação de Salas (já existe
valor+reserva): cobrança + taxa da plataforma → receita recorrente. - Assinatura/planos da plataforma (
superadmin/pricing,assinaturasjá existem): monetizar o SaaS por clínica. - Marketplace de Profissionais premium: taxa de match / destaque de perfil.
- Tutoria de Ortodontia em escala (único pago hoje): aumentar oferta de tutores e volume.
RESULTADO FINAL
Notas (0–100) — com base nas evidências
| Eixo | Nota | Justificativa (evidência) |
|---|---|---|
| Arquitetura funcional | 72 | Roteamento+RBAC robustos, mas server.js monolítico (516 KB), roteador próprio e 3 deep-links quebrados. |
| Integração dos módulos | 78 | Cadeia Lead→…→Repasse bem costurada, com auditoria e não-duplicação de comissão. |
| Fluxos de negócio | 70 | Núcleo clínico+financeiro completo; ramos de marketplace incompletos; receita às vezes manual. |
| Multiempresa | 82 | tenantGuard+clinica_id onipresentes; isolamento de sala; fragilidade no estado de plugins no cliente. |
| Marketplace | 45 | Infra existe; só Tutoria captura pagamento; Salas e Profissionais sem fechar fluxo financeiro. |
| Financeiro | 80 | Receita/despesa, comissão (3 níveis), repasse com estorno, glosas, contratos com cobrança. |
| Experiência do usuário | 70 | Menus por papel, nav mobile, "visualizar como"; prejudicada por deep-links quebrados e estado em localStorage. |
| Potencial de monetização | 65 | Tutoria já fatura; Salas e Assinatura SaaS são alavancas prontas e subutilizadas. |
1. O que remover
views/OrthoReports.tsx(órfã) — ou religar ao menu de Ortodontia se desejado.SyncView/ rota/admin/synce telas de sync global desativadas (já substituídas por backup por clínica).server.js.bake scripts de transformação legados (transform.js,pg-convert.js) do diretório de produção.
2. O que corrigir
- Adicionar
/comissoes,/glosas,/cadastro-dentistaaoROUTE_MAP(deep-link/refresh quebrado). - Reconciliação de plugins ativos: tratar o servidor como fonte da verdade (reduzir dependência de
localStorage). - Tornar a geração de RECEITA do procedimento o padrão claro (evitar receita não registrada).
3. O que finalizar
- Locação de Salas: captura de pagamento + taxa da plataforma (fecha o fluxo financeiro do marketplace).
- Marketplace de Profissionais: evoluir proposta → contratação → cobrança.
- Relatórios: consolidar (há
reports/productivity+ telas parciais).
4. O que priorizar
- Corrigir deep-links e estado de plugins (baixo esforço, destrava UX e confiabilidade).
- Gateway de pagamento na Locação de Salas (alavanca de receita mais próxima).
- Cobrança por assinatura da plataforma (
superadmin/pricing+assinaturasjá existem).
5. O que gera receita mais rapidamente
- Locação de Salas com pagamento — o
valore o fluxo de reserva já existem; falta só a captura + taxa. - Assinatura SaaS por clínica — a base multiempresa e o
pricingjá estão prontos no superadmin.
6. Próximo módulo mais estratégico
- Monetização da plataforma (Billing/Assinaturas + taxa de marketplace de salas). É o que converte uma base técnica madura (ERP odontológico multiempresa funcional) em receita recorrente da plataforma — hoje só a Tutoria cobra. Tudo o mais já está construído; falta o módulo que fatura.
Nota de método: este mapa reflete exclusivamente o que foi encontrado no código em 19/jun/2026 (
frontend/App.tsx,frontend/views/*,frontend/components/Sidebar.tsx,backend/server.js). Onde havia ambiguidade (ex.: receita opcional, pagamento manual de salas), o fato foi descrito como está, sem inferir intenção. Nenhuma funcionalidade foi inventada.