Files
scoreodonto.com/frontend/index.tsx
T
VPS 4 Builder 3e64514b08 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>
2026-06-16 00:28:07 +02:00

57 lines
2.0 KiB
TypeScript

import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App.tsx';
import { ErrorBoundary } from './components/ErrorBoundary.tsx';
import { ToastProvider } from './contexts/ToastContext.tsx';
import { ConfirmProvider } from './contexts/ConfirmContext.tsx';
import './index.css';
// CSS imports are now handled in index.html via <link> tags for AI Studio compatibility,
// but we add it here too for Vite dev server robustness.
/**
* AI Studio Compatible Entrypoint
*
* This version restores the necessary providers (`ErrorBoundary`, `ToastProvider`)
* to allow the application to run correctly after the initial bootstrap.
* It uses the modern `createRoot` API, which is required for React 18 and newer.
*/
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const queryClient = new QueryClient();
// Auto-reload em chunk obsoleto pós-deploy (par do watchdog inline no index.html).
// Timestamp evita loop: só recarrega se a última tentativa foi há mais de 30s.
window.addEventListener('vite:preloadError', () => {
try {
const last = +(sessionStorage.getItem('__sd_stale_reload__') || 0);
if (Date.now() - last < 30000) return;
sessionStorage.setItem('__sd_stale_reload__', String(Date.now()));
} catch { /* ignore */ }
window.location.reload();
});
const rootElement = document.getElementById('root');
if (rootElement) {
const root = createRoot(rootElement);
root.render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<ErrorBoundary>
<ToastProvider>
<ConfirmProvider>
<App />
</ConfirmProvider>
</ToastProvider>
</ErrorBoundary>
</QueryClientProvider>
</React.StrictMode>
);
} else {
console.error("CRITICAL: Root element #root not found. App could not be mounted.");
const errorDiv = document.getElementById('global-error-display');
if (errorDiv) {
errorDiv.style.display = 'block';
errorDiv.innerText = 'ERRO CRÍTICO: O ELEMENTO #ROOT NÃO FOI ENCONTRADO NO HTML.';
}
}