9.3 KiB
Análise — Área da Recepção / Coordenação de Tratamentos (Treatment Coordinator)
Gatilho (23/jun/2026):
recep.consulttclinic@gmail.comlançou uma prótese mas não tinha a aba para acompanhá-la. Análise do gap + recomendação fundamentada em modelos validados de software odontológico. Conecta comFASE2-PROTETICO-AREA.md(o outro lado do fluxo).
1. Diagnóstico (DEV scoreodonto_dev)
| Entidade | Achado |
|---|---|
| Dono | consulttclinic@gmail.com → Rui Cesar, donoclinica |
| Funcionária | recep.consulttclinic@gmail.com (u_1780962424310_cqsxn), role funcionario, vínculo na CONSULTT CLINIC LTDA (c_1780871001549_koqa3o) |
| Cargo | função "Recepcionista" (fnc_1780962382528_m28go) |
| Permissões (antes) | ["agenda","ortodontia","contratos","tratamentos","pacientes","lancar-gto"] |
| Prótese lançada | OS pos_1782228267898_zgfzn — Prótese Total, paciente ABIGAIR, R$600, protético "Zeca Andrade Fake", status solicitado, via GTO (gto_item_id=QOJWR6D) |
Gap exato: o cargo tinha lancar-gto (lançar) mas não proteses (acompanhar). O RBAC da
Sidebar.tsx é literal (return wsPerms.includes(item.id)), então a OS criada por ela ficava
invisível para ela própria. A Fase 1 (GTO→OS) funcionou; o problema era de configuração de
cargo, não de arquitetura.
2. Modelos validados (referência externa)
- Papel = "Treatment Coordinator" + Front Desk. É a ponte entre paciente e equipe clínica: sequencia planos multi-etapa, conduz o aceite do caso (case acceptance), arranjo financeiro e follow-up até a conclusão — exatamente "gerir tratamentos" de ponta a ponta.
- RBAC por papel é o padrão. Permissões mapeadas a papéis, não a indivíduos; o front desk
recebe agenda/cadastro/cobrança, tipicamente sem notas clínicas. O ScoreOdonto já faz isso
via
funcoes.permissoes[]. - Prótese = "Lab Case", acompanhada pelo front desk. No Dentrix Lab Case Manager: clínico cria a prescrição → status Sent → o front desk muda para Received quando volta do lab → Finished ao assentar. Ou seja: acompanhar a OS de prótese é, por modelo consagrado, atribuição da recepção — o acesso que faltava.
Fontes:
- The Role of a Treatment Coordinator — https://www.dentalmanagers.com/blog/role-of-treatment-coordinator-in-dental-practice/
- What Does a Treatment Plan Coordinator Do? — https://www.teero.com/blog/treatment-plan-coordinator
- Dental Software User Permissions (Curve) — https://www.curvedental.com/blog/dental-software-user-permissions
- RBAC in Healthcare — https://www.accountablehq.com/post/role-based-access-control-rbac-in-healthcare-benefits-examples-and-best-practices
- Manage Your Lab Cases in Dentrix — https://magazine.dentrix.com/manage-your-lab-cases-in-dentrix/
- Open Dental — Lab Cases — https://www.opendental.com/manual/labcasemanage.html
3. Ação aplicada — Nível 1 (configuração, sem código)
✅ Aplicado no DEV em 23/jun/2026. Função "Recepcionista" da CONSULTT CLINIC LTDA atualizada:
UPDATE funcoes
SET permissoes = '["agenda","pacientes","tratamentos","ortodontia","proteses","lancar-gto","orcamentos","contratos"]'
WHERE id = 'fnc_1780962382528_m28go'; -- UPDATE 1
Acréscimos: proteses (acompanhar a OS que ela lança) e orcamentos (case acceptance —
coração do papel TC). Efeito imediato: a OS pos_1782228267898_zgfzn passa a aparecer para ela.
Escopo: alteração só no DEV. Não há mudança de código nem migração — é dado de configuração. Para refletir em outras clínicas, ajustar o cargo equivalente de cada uma (ou rever o template de cargos padrão, se existir).
3b. Causa raiz (investigação 23/jun) — proteses não é concedível pela UI
A correção de dado acima trata o sintoma. A causa raiz é um bug de configuração de RBAC:
- Cargos não têm seed no backend (signup não cria funções). São criados manualmente pelo
dono em Gestão de Equipe (
POST → INSERT INTO funcoes,server.js:806), partindo de 4 templates do frontend (GestaoEquipeView.tsx:96). - Nenhum template inclui
proteses: RECEPÇÃO (dashboard,agenda,pacientes,leads,orcamentos), AUXILIAR (...,ortodontia,tratamentos), FINANCEIRO (...,financeiro,relatorios,lancar-gto), GERENTE ([...TODAS_PAGINAS]). - Raiz:
protesesnão está emPAGINAS_RBAC(GestaoEquipeView.tsx:57), a lista mestre de páginas atribuíveis. ComoTODAS_PAGINAS = PAGINAS_RBAC.flatMap(...), nem o GERENTE / "MARCAR TODAS" concede prótese. ⇒ É impossível um dono darprotesesa um funcionário pela interface — só via UPDATE direto no banco (o que foi feito na §3). - Também ausentes da lista atribuível, embora em uso:
contratos(a função tinha — legado),comissoes,glosas.
Resposta à pergunta "o cargo Recepcionista padrão nasce sem proteses?": Sim — e mais, nenhum cargo consegue tê-la pela UI hoje.
Fix de raiz (código) — ✅ aplicado e validado no DEV (23/jun)
Em frontend/views/GestaoEquipeView.tsx:
PAGINAS_RBAC, grupoATENDIMENTO: +{ key: 'proteses', label: 'PRÓTESES' }e{ key: 'contratos', label: 'CONTRATOS' }→ agora concedíveis pela UI (e entram emTODAS_PAGINAS/GERENTE/"MARCAR TODAS").- Templates: RECEPÇÃO ganhou
contratos, lancar-gto, proteses; AUXILIAR ganhouproteses(alinhado ao papel TC).
Validação: vite build transformou 2382 módulos OK; container DEV rebuildado e no ar; o
bundle servido pelo nginx DEV (index-*.js, alvo de dev.scoreodonto.com) contém
key:"proteses",label:"PRÓTESES" e a string proteses nos 3 pontos editados. Cargos padrão
passam a nascer coerentes — sem UPDATE manual por clínica.
⚠️ Pendente de commit + deploy à produção (a mudança está só no DEV). Os fixes de dado (§3, função da CONSULTT CLINIC) continuam sendo só-DEV e não se propagam por este fix de código.
4. Recomendação — Nível 2 (estrutural, "Fase 3")
Em vez de abas soltas (tratamentos, proteses, ortodontia), um hub de Coordenação de
Tratamentos por paciente: pipeline único com o status de cada frente (clínico / prótese-lab /
orto), espelhando o "lab case visível para toda a equipe" do Dentrix. View nova que agrega o que
já existe (tratamentos + protese_os + ortodontia por paciente) — sem dado novo.
5. Conexão com a Fase 2
Dois lados do mesmo fluxo, unidos pela mesma protese_os:
- Fase 2 → casa do protético (quem produz; avança status na Bancada).
- Esta análise → recepção/TC (quem encomenda e acompanha; lê o status no hub). O status que o lab avança é o mesmo que a recepção lê — o "Lab Case Manager" repartido entre os papéis.
6. Salas: acesso do funcionário corrigido + bloqueio de manutenção (23/jun)
Gatilho: a mesma recepcionista aparecia com MINHAS SALAS e ALUGAR SALAS (gestão de locação, de titular) e deveria ter apenas a agenda da sala e o bloqueio para manutenção.
6a. Bug — vazamento dos menus de locação ✅ corrigido (Sidebar.tsx)
MINHAS SALAS (locador) e ALUGAR SALAS (locatário) eram empurrados a "todos menos
superadmin" (Sidebar.tsx:42), vazando para funcionário e paciente — papéis que não são
titulares de sala. Passaram a exibir apenas a PAPEIS_LOCACAO
(donosala/donoclinica/donoconsultorio/admin/dentista/biomedico/protetico). O backend já era
seguro por ownership; era vazamento só de UI.
6b. Feature — acesso operacional + manutenção ✅ implementada e validada no DEV
Não existia caminho para "funcionário vê só a agenda" nem "bloqueio para manutenção" — foram criados (modelos de mercado: Dentrix/Open Dental Lab... não; aqui é gestão de espaço — o padrão é front desk opera a agenda da sala sem tocar no financeiro do locador).
- Acesso operacional (
server.jslistarWorkspaces): sala cujaclinica_idé uma clínica onde o usuário tem vínculo (e ele não é o dono) entra como workspacetipo='sala'compapel_sala='operador'. OSalaHomeViewdetecta o modo operador e esconde recebíveis, relatório e baixa — mostra só a agenda + botão de bloqueio. - Bloqueio de manutenção (
POST /api/salas/:id/manutencao): reservatipo='manutencao'(coluna nova, default'locacao'),valor=0, nasce'confirmada'(sem aprovação) e não gera recebível. Acesso: dono ou membro com vínculo na clínica da sala. Reaproveita o anti-conflito de horário (409) e o cancelamento por solicitante/unidade. A agenda renderiza o bloqueio em cinza (legenda "Manutenção").
Validação ponta a ponta (DEV, JWT real da recepcionista, sala de teste vinculada à clínica):
| Caso | Resultado |
|---|---|
| Sala da clínica vira workspace operador dela | ✅ query retorna a sala |
| POST bloqueio | ✅ status:confirmada, tipo:manutencao |
| GET agenda mostra bloqueio + motivo | ✅ valor:0, motivo:"Conserto do equipo" |
| Conflito de horário | ✅ HTTP 409 |
| Não gera financeiro | ✅ 0 lançamentos |
Commits: fix(salas) (menu) + feat(salas) (operador + manutenção). Backend e frontend no ar
no DEV; dados de teste limpos.
⚠️ Pendente de push + deploy (produção segue em v1.0.19).