3e64514b08
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>
41 lines
1.6 KiB
TypeScript
41 lines
1.6 KiB
TypeScript
export const ACTIVE_PLUGINS_KEY = 'SCOREODONTO_ACTIVE_PLUGINS';
|
|
export const PLUGIN_CONFIG_KEY = 'SCOREODONTO_PLUGIN_CONFIG';
|
|
|
|
// "Visualizar como" (superadmin) ativa todos os plugins para teste, sem depender
|
|
// do cache em localStorage (que é reconciliado/limpo em outros fluxos).
|
|
const PREVIEW_PLUGINS = ['rx-scoreodonto', 'locacao-salas', 'profissionais-marketplace'];
|
|
|
|
export const getActivePlugins = (): string[] => {
|
|
try {
|
|
if (localStorage.getItem('SCOREODONTO_PREVIEW_ROLE')) return [...PREVIEW_PLUGINS];
|
|
return JSON.parse(localStorage.getItem(ACTIVE_PLUGINS_KEY) || '[]');
|
|
} catch { return []; }
|
|
};
|
|
|
|
// Plugins sempre ligados (capability de plataforma, sem opção de desativar).
|
|
export const ALWAYS_ON_PLUGINS = ['locacao-salas'];
|
|
|
|
export const isPluginActive = (id: string): boolean => ALWAYS_ON_PLUGINS.includes(id) || getActivePlugins().includes(id);
|
|
|
|
export const togglePlugin = (id: string): boolean => {
|
|
const active = getActivePlugins();
|
|
const wasActive = active.includes(id);
|
|
const next = wasActive ? active.filter(p => p !== id) : [...active, id];
|
|
localStorage.setItem(ACTIVE_PLUGINS_KEY, JSON.stringify(next));
|
|
return !wasActive;
|
|
};
|
|
|
|
export const getPluginConfig = (id: string): Record<string, string> => {
|
|
try {
|
|
const all = JSON.parse(localStorage.getItem(PLUGIN_CONFIG_KEY) || '{}');
|
|
return all[id] || {};
|
|
} catch { return {}; }
|
|
};
|
|
|
|
export const savePluginConfig = (id: string, config: Record<string, string>) => {
|
|
try {
|
|
const all = JSON.parse(localStorage.getItem(PLUGIN_CONFIG_KEY) || '{}');
|
|
localStorage.setItem(PLUGIN_CONFIG_KEY, JSON.stringify({ ...all, [id]: config }));
|
|
} catch {}
|
|
};
|