Files
scoreodonto.com/documentação/MAPA-FUNCIONAL-COMPLETO.md
T
VPS 4 Builder 5b99292b2d docs: auditoria funcional + auditoria estratégica de modelagem
- 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>
2026-06-19 18:23:54 +02:00

486 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 em `App.tsx`) e `backend/server.js`
> (Express monolítico, ~516 KB, **277 rotas**, ~70 tabelas Postgres acessadas por SQL direto).
> Estado verificado: produção `v1.0.18` · DEV `dev` (banco isolado `pgdev`). 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_ROUTE` em `App.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`, `/glosas` e `/cadastro-dentista` **existem em `VIEW_TO_ROUTE`** (a navegação por menu empurra a URL),
mas **NÃO existem em `ROUTE_MAP`**. Consequência: abrir essas URLs direto (deep-link / refresh) cai em `dashboard`.
**Deep-link quebrado** para 3 telas reais.
- `/admin/sync` está mapeada, mas `isViewAllowed` retorna `false` **sempre** (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 `isViewAllowed` de 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` → tabela `agendamentos`. 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` (+ gera `financeiro`).
- **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` (status `fechado`).
- **Pagar** → `POST /api/repasses/:id/pagar` → cria DESPESA em `financeiro` (origem `repasse`, centro de custo `COMISSÕ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 ao `financeiro`.
### 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` → cria `pacientes` **+** `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 !== false` e `valor>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.
- **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 via `hydrateMyPlugins()`. Plugins ativos vivem em `localStorage` (cliente), não só no servidor —
risco de divergência entre dispositivos (mitigado por `me/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)
```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]
```
```mermaid
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 em `App.tsx` **nem** importada por nenhuma view. Órfã real
(importa `OrthoPhotoWorkspace`, mas nada importa `OrthoReports`). Relatórios de ortodontia prontos e desligados.
- **`SyncView` (`/admin/sync`)** — tela e rota existem, mas `isViewAllowed` retorna `false` sempre. 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 `/comissoes` direto cai em dashboard.
## Funcionalidades incompletas (começam mas não terminam o fluxo)
- **Locação de salas** — reserva com `valor` e 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)
1. **Gateway na Locação de Salas** (já existe `valor`+reserva): cobrança + taxa da plataforma → receita recorrente.
2. **Assinatura/planos da plataforma** (`superadmin/pricing`, `assinaturas` já existem): monetizar o SaaS por clínica.
3. **Marketplace de Profissionais premium**: taxa de match / destaque de perfil.
4. **Tutoria de Ortodontia em escala** (único pago hoje): aumentar oferta de tutores e volume.
---
# RESULTADO FINAL
## Notas (0100) — 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/sync` e telas de sync global desativadas (já substituídas por backup por clínica).
- `server.js.bak` e scripts de transformação legados (`transform.js`, `pg-convert.js`) do diretório de produção.
## 2. O que corrigir
- **Adicionar `/comissoes`, `/glosas`, `/cadastro-dentista` ao `ROUTE_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
1. Corrigir deep-links e estado de plugins (baixo esforço, destrava UX e confiabilidade).
2. Gateway de pagamento na Locação de Salas (alavanca de receita mais próxima).
3. Cobrança por assinatura da plataforma (`superadmin/pricing`+`assinaturas` já existem).
## 5. O que gera receita mais rapidamente
- **Locação de Salas com pagamento** — o `valor` e o fluxo de reserva já existem; falta só a captura + taxa.
- **Assinatura SaaS por clínica** — a base multiempresa e o `pricing` já 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.
</content>
</invoke>