feat(financeiro+salas): motor financeiro V1/V2, glosas, GTO→financeiro, contratos de convênio e redesenho de Salas

Financeiro V1 (Épicos 1–4):
- FKs de origem no lançamento (paciente/profissional/procedimento/agendamento/contrato/realizado), soft delete e cron "Atrasado"
- prontuário de procedimentos realizados (fotos antes/depois) + regra sem-comissão (garantia/reabertura do mesmo profissional)
- normalizeFinanceiro: corrige CHECK capitalizado vs enforceUppercase (lançamentos não salvavam pela UI)
- baixa de pagamento (pago_em), despesas (fornecedor/centro de custo/recorrente), competência por data de conclusão
- relatório financeiro (período, paciente, profissional, forma, convênio, glosa)
- orçamento Assinado -> contas a receber; contrato vigente -> cobrança recorrente; renovação automática de contrato

Financeiro V2 (Comissão/Repasse):
- regras de % (padrão/procedimento/override por profissional) + custo de laboratório
- base selecionável (recebido/produção), fechamento persistido, pagar (gera despesa) + comprovante + estorno

Glosas de convênio: por item de GTO, recurso/protocolo/prazo, recuperar/estornar, impacto no relatório

GTO -> Financeiro: finalizar gera RECEITA (convênio a receber); LancarGTO passa a persistir; convênios reais (planos)

Contratos: modelo "Atendimento a Convênios / Repasse (Dentista Credenciado)" + variáveis de convênio

Salas (redesenho): perfil "Dono de Sala"; locação sempre ativa; menus MINHAS/ALUGAR SALAS;
sala como workspace isolado (seletor agrupado Clínicas x Salas, tenantGuard por dono); financeiro de
locação (reserva confirmada -> recebível); Painel da Sala (KPIs, agenda visual, recebíveis, relatório por sala)

Docs: BACKLOG-FINANCEIRO-V1, AUDITORIA-FUNCIONAL-SCOREODONTO, CHECKLIST-DEPLOY-PRODUCAO

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-06-16 00:28:07 +02:00
parent 92a0ec3917
commit 3e64514b08
62 changed files with 6528 additions and 1035 deletions
+8 -8
View File
@@ -53,7 +53,7 @@ export const WaitingInviteView: React.FC = () => {
};
const colorMap: Record<string, string> = {
blue: 'from-blue-600 to-indigo-600',
blue: 'from-teal-600 to-emerald-600',
purple: 'from-purple-600 to-violet-600',
};
@@ -66,7 +66,7 @@ export const WaitingInviteView: React.FC = () => {
<Stethoscope size={18} className="text-white" />
</div>
<span className="text-xl font-black text-gray-900 tracking-tighter uppercase italic">
Score<span className="text-blue-600">Odonto</span>
Score<span className="text-teal-600">Odonto</span>
</span>
</div>
@@ -119,21 +119,21 @@ export const WaitingInviteView: React.FC = () => {
</div>
{/* Info box */}
<div className="bg-blue-50 border border-blue-100 rounded-2xl p-4 text-left mb-4">
<p className="text-[10px] font-black text-blue-600 uppercase tracking-widest mb-1">
<div className="bg-teal-50 border border-teal-100 rounded-2xl p-4 text-left mb-4">
<p className="text-[10px] font-black text-teal-600 uppercase tracking-widest mb-1">
O que fazer agora?
</p>
<ul className="space-y-1.5 text-sm text-blue-800 font-medium">
<ul className="space-y-1.5 text-sm text-teal-800 font-medium">
<li className="flex items-start gap-2">
<span className="text-blue-400 mt-0.5">1.</span>
<span className="text-teal-400 mt-0.5">1.</span>
Informe seu e-mail <strong>{email}</strong> ao administrador
</li>
<li className="flex items-start gap-2">
<span className="text-blue-400 mt-0.5">2.</span>
<span className="text-teal-400 mt-0.5">2.</span>
Aguarde o convite ser enviado
</li>
<li className="flex items-start gap-2">
<span className="text-blue-400 mt-0.5">3.</span>
<span className="text-teal-400 mt-0.5">3.</span>
Acesse o link do convite para completar o vínculo
</li>
</ul>