GET /api/profissionais/marketplace passa a trazer a 'nota' dos protéticos (helper notasScorePorProtetico, mesma fórmula da Fase 5 — só com volume mínimo). Card do protético no marketplace exibe ★ nota. Ordem mantida por proximidade; a nota é comparação visível. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
8.1 KiB
Decisão arquitetural — Provedor de Prótese (módulo de Prótese)
Decisão de negócio/interface (24/jun/2026). Base: auditoria do código (
AUDITORIA-PROTESE.md). Princípio-guia: a Clínica controla 100% do fluxo, mesmo que o Protético nunca crie conta. O login do Provedor é alavanca de crescimento (marketplace/ecossistema), não pré-requisito.
Conceito
"Provedor de Prótese" é rótulo de negócio/interface. Internamente NÃO se renomeia o
role protetico (aparece 87× no backend + 15 arquivos no front — refatorar = risco alto, ganho
zero). As três formas são variações do mesmo workspace tipo='laboratorio', diferenciadas por
metadados (futuros pessoa_tipo, tem_equipe), não por novos roles:
PROVEDOR DE PRÓTESE (role=protetico, workspace tipo='laboratorio')
├── Profissional Individual (PF)
├── Laboratório (PJ)
└── Laboratório com Equipe (PJ + técnicos)
Modos de operação
- Modo 1 — Protético SEM conta: a Clínica opera tudo (OS, etapas, envio/recebimento/devolução,
pagamentos, componentes, ocorrências, encerramento). O Protético acompanha por link seguro
(
/p/TOKENvia WhatsApp/e-mail), podendo confirmar recebimento/devolução, anexar fotos, responder ocorrências. CTA: "crie sua conta ScoreOdonto". - Modo 2 — Protético COM conta: Dashboard, Ordens, Produção, Entregas, Clientes, Financeiro, Catálogo, Notificações, Perfil.
- Modo 3 — Laboratório: + Equipe, Relatórios, Marketplace, Configurações.
Cadastro/Login
Card próprio [ PROTÉTICO / LABORATÓRIO ] com opção PF (Protético Individual) / PJ (Laboratório).
Campos futuros (não obrigatórios no MVP): Nome, Nome Fantasia, CPF, CNPJ, CROT, Responsável Técnico,
Cidade, Estado, Especialidades, Telefone, E-mail. (Campo clinicas.documento já existe para CPF/CNPJ.)
Rastreabilidade de componentes (modelo)
Uma tabela (protese_os_componente) com eixo de direção/conferência, não duas:
enviado pela clínica → recebido pelo protético → devolvido pelo protético → conferido pela clínica.
A ocorrência referencia o componente (FK opcional).
Ocorrências + Contraditório
Tabela própria. Categorias: não devolvido, danificado, incompatível, parafuso substituído/desgastado,
peça incorreta, ajuste inadequado, falha de fabricação, retrabalho, outro. Campos: autor, data,
categoria, descrição, fotos, evidências, anexos, responsável, status.
Fluxo com contraditório (proteção dos dois lados): Aberta → Respondida → Em análise → Resolvida
ou Contestada. Só ocorrências resolvidas alimentam indicadores — nunca automático.
Abas da OS (alvo)
Dados · Fotos · Componentes · Pagamentos · Custódia · Histórico · Ocorrências (nova).
Indicadores (POR ÚLTIMO)
Capturar primeiro (eventos, componentes, ocorrências, evidências, histórico); só depois derivar Score/ranking/marketplace. Não codar indicador antes de existir dado.
Roadmap (5 fases)
✅ FASE 1 — Origem da OS + LGPD (IMPLEMENTADA 24/jun)
- Clínica de origem na bancada e no detalhe (
clinica_nomevia subquery) — visível ao protético (badge na lista e no modal). Destrava o cenário multi-clínica. - Blindagem de CPF: confirmado que
pacientes.idÉ o CPF. O protético (lab) deixa de receberpaciente_id(detalhe e bancada zeram), mantendopaciente_nome. A clínica continua vendo o CPF. - Validado em DEV: protético vê
clinica_nome+paciente_id:null; clínica vê tudo.
✅ FASE 2 — Rastreabilidade & Ocorrências (IMPLEMENTADA 24/jun)
- Componentes ganham
direcao(enviado/devolvido) estatus_conferencia(pendente/ok/divergente/ ausente, comconferido_nome/_em). EndpointPOST .../componentes/:id/conferir. - Ocorrências (
protese_os_ocorrencia): 10 categorias, descrição, responsável, autor, status. Evidências viaprotese_os_foto.ocorrencia_id(reusa a infra de mídia). - Contraditório:
aberta → respondida → em_analise → resolvida | contestada;resolvidaé final (409 ao remexer). Endpoints/ocorrencias,/ocorrencias/:id/resposta,/ocorrencias/:id/status. - UI: nova aba Ocorrências no modal (com contador) + conferência inline nos componentes.
- Validado em DEV: componente
divergente; ocorrênciaparafuso_substituidopercorrendo todo o contraditório atéresolvida; resolvida final (409). Indicadores ficam para a Fase 5.
✅ FASE 3 — Operação multi-clínica (IMPLEMENTADA 24/jun)
- Clientes (tela
lab-clientes): tabela das clínicas que enviam OS, com OS totais, ativas, atrasadas, entregues, faturado e a-receber por cliente. EndpointGET /protese/lab/clientes. - Financeiro do lab (tela
lab-financeiro): KPIs (faturado/recebido/a-receber) + extrato de recebimentos (pagamentos lado lab) com clínica/paciente/forma/data. EndpointGET /protese/lab/pagamentos. Regra: faturado = custo das OS entregues (exceto garantia); a-receber = faturado − recebido. - Menu do laboratório agora: Painel · Bancada · Clientes · Financeiro · Notificações · Config.
- Histórico completo: a Bancada já lista entregues/cancelados com filtro de status (mantida).
- Validado em DEV: agregação por clínica (faturado 600 / recebido 250 / a-receber 350) + extrato.
✅ FASE 4 — Empresa de verdade (IMPLEMENTADA 24/jun)
- PF/PJ + documento:
clinicas.pessoa_tipo(PF=individual | PJ=laboratório);documento= CPF/CNPJ (já existia, agora editável). Tela Laboratório & Equipe (lab-equipe): GET/PATCH/protese/lab. - Equipe/Técnicos: novo
vinculos.role='tecnico_protese'. O dono convida por e-mail (ensureUsuarioPorEmail→ credencial temporária); endpointsGET/POST/DELETE /protese/lab/equipe. - Acesso estendido:
proteseOsAccessoreconhece o técnico (vínculo nolaboratorio_id); a bancada usalabDoUsuario(dono ou técnico). Técnico opera a produção; não vê clientes/financeiro (menu reduzido + endpoints retornam vazio/403). Gestão é exclusiva do dono. - Validado em DEV: dados PJ+CNPJ; técnico convidado acessa a bancada (vê clínica de origem), não vê clientes (0) e leva 403 ao tentar gerenciar equipe.
✅ FASE 5 — Indicadores & Score (IMPLEMENTADA 24/jun)
- Indicadores derivados (
GET /protese/lab/indicadores, só dono) calculados sobre a captura das fases 2-4: entregues, tempo médio (solicitado→entregue), atraso %, retrabalho % (garantia), ocorrências resolvidas %, componentes ausentes. Telalab-indicadores. - Nota ScoreOdonto (0-10):
10 − (atraso%×3 + retrabalho%×4 + ocorrência%×3), só com mínimo de 3 entregas (senão "score em formação"). Só ocorrências resolvidas entram (contraditório respeitado). - Ranking no marketplace:
getProteseLaboratoriospassa a devolver anotapor protético e ordena internos→maior nota→nome; a clínica vê★ notano dropdown de Nova OS e do Lançar GTO. - Validado em DEV: 4 entregas (1 atrasada, 1 garantia) → atraso 25% / retrab 25% / nota 8.3; a clínica vê a nota no dropdown; "score em formação" abaixo do mínimo.
Acoplamentos respeitados: PF/PJ veio com a equipe (Fase 4); Score só após a captura (Fases 2-4).
Pós-roadmap (entregue depois das Fases 1-5)
- ✅ Modo 1 (protético sem conta via link
/p/TOKEN) — completo (1a leitura, 1b ação, 1c gestão). VerMODO1-LINK-SEGURO-PROTESE.md. - ✅ Higiene — menu legado do protético removido (Sidebar/App): o protético opera só no workspace laboratório; fallback mínimo fora dele.
- ✅ Score público no marketplace —
GET /api/profissionais/marketplacetraz anotaScoreOdonto dos protéticos (helpernotasScorePorProtetico, mesma fórmula da Fase 5), exibida como ★ no card. Ordem mantida por proximidade; a nota é critério de comparação visível.
Ainda em aberto (futuro)
Marketplace transacional (anúncio de serviços + solicitação/contratação/propostas dentro da plataforma); agenda de produção/coleta; multi-unidade do laboratório; envio automático do link (e-mail/WhatsApp API) e herança de cadastro novo com e-mail diferente.