e95ed9b585
DB
- drop agenda_excecoes (substituida por financial_exceptions + lock-edit
baseado em financial_records)
- financial_records.payment_link (Asaas + link compartilhavel)
- financial_exceptions.consume_on_miss (rotular nao-show consome ou nao)
- billing_contracts.charging_style (upfront/saldo/per_session)
Payment refactor
- paymentSettlement -> paymentMethod (string) + markPaidNow (bool).
Handler aplica payment_method sempre; status='paid'+paid_at apenas
quando markPaidNow=true && method != 'link'. Asaas (link) sempre
liquida via webhook, nunca nasce paid.
- create_financial_record_for_session com pos-RPC patch pra payment_method
e (opcional) status='paid' quando user marca "ja recebi".
Indicadores visuais (3 canais distintos por estado)
- Paid: barra esquerda emerald-500 4px na agenda (MelissaAgenda),
pi-check-circle no popover/Resumo.
- Pending: badge \$ amber canto direito (mantido); linha amber no popover/
Resumo "A receber R\$ X (cobranca pendente)".
- Neutro: sem badge nem barra (compromisso pessoal, bloqueio, ou
ocorrencia virtual de pacote upfront/saldo).
- Bulk-load de paymentState em _reloadRange etapa 4 (1 query unica em
financial_records mapeada por agenda_evento_id).
- AgendaEventDialog Resumo lateral ganha linha entre pi-clock e
pi-map-marker via novo sessionPaymentRecord (sem guard de
occurrenceMode, contrario ao occFinancialRecord que continua so pra
Rail/Clinica). 5 estados: paid+paid_at, overdue+venceu, pending+vence,
sem cobranca c/ valor, sem cobranca s/ valor.
UX de convenio
- InsurancePlanServiceQuickCreateDialog novo: cadastra procedimento
POR CIMA do AgendaEventDialog sem sair da agenda. Auto-seleciona
novo procedimento so quando nada estava selecionado antes.
- Caixa cinza "Cadastrar procedimento" sempre visivel quando convenio
selecionado, com copy variavel (0 procedimentos: chamada urgente;
1+: "se quiser adicionar mais").
- "+ Novo convenio" toolbar em ConfiguracoesConveniosPage (botao
estava faltando, empty state mandava clicar em botao inexistente).
- Hint contextual abaixo do card Sessao/Honorarios: convenio = "N da
guia eh opcional", gratuito = "sem cobranca", particular = sem hint.
Label "N da Guia" tambem ganhou "(opcional)" no service-picker dialog.
Bug fixes
- pickDbFields whitelist faltando 'modalidade' (useMelissaAgenda.js:74)
— sessoes avulsas eram salvas como presencial independente da
escolha visual. Adicionado.
- goToConveniosConfig removida — fazia router.push("/therapist/
configuracoes/convenios") mas /configuracoes/* eh rota raiz, nao
filha. Substituida pelo quick-create inline (#1).
- bloqueioCobrindo + dialogBlockOverlap passados via deps em
_buildHandlers (refs do useMelissaAgenda nao sao acessiveis no
escopo de _buildHandlers).
Fase 5 (status change + edit cobrada)
- AgendaStatusChangeConfirmDialog: confirm dialog quando user muda
status pra realizada/faltou/cancelado, com opcoes de markPaid ou
gerar cobranca conforme o caso.
- useAgendaBloqueios novo composable: extrai logica de bloqueios
cinza (background events) do MelissaAgenda.
Doc viva
- src/docs/agenda-compromisso-financeiro-cenarios.html: 13 cenarios
de teste manual. C1-C4 ja validados. Cada teste validado vira parte
da doc final pra area de ajuda (pos-Fase 9).
Wiki/handoff
- agenda-compromisso-fluxo e agenda-billing-pesquisa-mercado (decisoes
arquiteturais sobre billing).
- HANDOFF.md atualizado.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.9 KiB
8.9 KiB
Schema Map — AgenciaPsi
Mapa completo do banco de dados PostgreSQL 17, extraído de schema.sql (2026-03-23).
84 tabelas no schema public + tabelas de infraestrutura (auth, storage, realtime).
Domínios
Core (11 tabelas)
| Tabela | Descrição |
|---|---|
profiles |
Perfil do usuário (role, account_type, full_name, platform_roles) |
tenants |
Organizações (clínicas, terapeutas solo, supervisores) |
tenant_members |
Vínculo usuário↔tenant com role (tenant_admin, therapist, secretary, etc.) |
tenant_invites |
Convites pendentes para ingressar em um tenant |
tenant_features |
Overrides de features por tenant (exceções comerciais) |
tenant_feature_exceptions_log |
Log de alterações em tenant_features |
saas_admins |
Administradores da plataforma |
owner_users |
Mapeamento owner_id→user_id para RLS |
user_settings |
Configurações pessoais do usuário |
company_profiles |
Perfil da empresa/clínica (logo, endereço, etc.) |
dev_user_credentials |
Credenciais de teste (apenas dev) |
Plans & Billing (20 tabelas)
| Tabela | Descrição |
|---|---|
plans |
Planos disponíveis (key, target, price_cents, max_supervisees) |
plan_prices |
Preços por intervalo (month/year) com versionamento |
plan_features |
Vínculo plano↔feature com limites (limits jsonb) |
plan_public |
Info pública dos planos (para página de preços) |
plan_public_bullets |
Bullets de marketing dos planos |
features |
Features do sistema (key, name, descricao) |
entitlements_invalidation |
Cache invalidation de entitlements |
subscriptions |
Assinaturas ativas (user_id XOR tenant_id) |
subscription_events |
Histórico de eventos de assinatura |
subscription_intents_personal |
Intenções de assinatura pessoal |
subscription_intents_tenant |
Intenções de assinatura de tenant |
subscription_intents_legacy |
Intenções legadas |
billing_contracts |
Contratos de cobrança |
addon_credits |
Créditos de add-ons por tenant |
addon_products |
Produtos add-on disponíveis |
addon_transactions |
Transações de add-ons |
modules |
Módulos do sistema |
module_features |
Features por módulo |
tenant_modules |
Módulos ativos por tenant |
Agenda (10 tabelas)
| Tabela | Descrição |
|---|---|
agenda_bloqueios |
Bloqueios de horário |
agenda_configuracoes |
Configurações da agenda por tenant_member |
agenda_eventos |
Eventos da agenda (sessões, bloqueios) |
agenda_online_slots |
Slots de agendamento online |
agenda_regras_semanais |
Regras semanais de disponibilidade |
agenda_slots_bloqueados_semanais |
Slots bloqueados na semana |
agenda_slots_regras |
Regras de slots |
recurrence_rules |
Regras de recorrência de sessões |
recurrence_exceptions |
Exceções a recorrências |
recurrence_rule_services |
Serviços vinculados a recorrências |
Agendador Online (2 tabelas)
| Tabela | Descrição |
|---|---|
agendador_configuracoes |
Configurações do agendador online público |
agendador_solicitacoes |
Solicitações de agendamento recebidas |
Pacientes (8 tabelas)
| Tabela | Descrição |
|---|---|
patients |
Pacientes vinculados a um tenant |
patient_groups |
Grupos de pacientes (sistema + customizados) |
patient_group_patient |
Vínculo paciente↔grupo |
patient_tags |
Tags personalizadas |
patient_patient_tag |
Vínculo paciente↔tag |
patient_intake_requests |
Solicitações de cadastro (triagem) |
patient_invites |
Convites para portal do paciente |
patient_discounts |
Descontos por paciente |
Compromissos Determinados (4 tabelas)
| Tabela | Descrição |
|---|---|
determined_commitments |
Tipos de compromisso (sessão, leitura, supervisão, etc.) |
determined_commitment_fields |
Campos customizados por tipo de compromisso |
commitment_services |
Serviços vinculados a compromissos |
commitment_time_logs |
Logs de tempo por compromisso |
Financeiro (9 tabelas)
| Tabela | Descrição |
|---|---|
financial_records |
Lançamentos financeiros (receita/despesa) |
financial_categories |
Categorias de lançamento |
financial_exceptions |
Exceções financeiras |
payment_settings |
Configurações de pagamento por tenant |
professional_pricing |
Precificação por profissional |
therapist_payouts |
Repasses a terapeutas |
therapist_payout_records |
Registros de repasse |
services |
Serviços oferecidos |
insurance_plans + insurance_plan_services |
Convênios e serviços por convênio |
Notificações (10 tabelas)
| Tabela | Descrição |
|---|---|
notification_channels |
Canais de notificação por tenant |
notification_logs |
Logs de envio |
notification_preferences |
Preferências do paciente (opt-in/out) |
notification_queue |
Fila de envio |
notification_schedules |
Agendamentos de notificação |
notification_templates |
Templates WhatsApp/SMS (default + tenant) |
notifications |
Notificações in-app |
email_templates_global |
Templates de email globais (plataforma) |
email_templates_tenant |
Overrides de templates por tenant |
email_layout_config |
Configuração de layout de email |
SaaS Admin / UI (8 tabelas)
| Tabela | Descrição |
|---|---|
saas_docs |
Documentação da plataforma |
saas_doc_votos |
Votos em docs |
saas_faq |
Categorias de FAQ |
saas_faq_itens |
Itens de FAQ |
feriados |
Feriados nacionais/regionais |
global_notices |
Avisos globais da plataforma |
login_carousel_slides |
Slides do carrossel de login |
notice_dismissals |
Dismissals de avisos por usuário |
Suporte (1 tabela)
| Tabela | Descrição |
|---|---|
support_sessions |
Sessões de suporte técnico |
Views Principais
| View | Descrição |
|---|---|
v_tenant_active_subscription |
Subscription ativa por tenant |
v_user_active_subscription |
Subscription ativa por user |
v_tenant_entitlements |
Features habilitadas por tenant (via plano) |
v_tenant_entitlements_full |
Entitlements + limits + plan info |
v_tenant_entitlements_json |
Entitlements agregados como JSON |
v_user_entitlements |
Features habilitadas por user (via plano) |
v_tenant_members_with_profiles |
Membros do tenant com dados do perfil |
v_tenant_staff |
Staff do tenant (membros + convites) |
v_tenant_people |
Todas as pessoas do tenant |
v_plan_active_prices |
Preços ativos dos planos |
v_public_pricing |
Preços públicos para página de marketing |
v_subscription_health |
Saúde das subscriptions |
v_cashflow_projection |
Projeção de fluxo de caixa |
v_commitment_totals |
Totais de compromissos |
v_patient_groups_with_counts |
Grupos com contagem de pacientes |
v_tag_patient_counts |
Tags com contagem de pacientes |
subscription_intents |
View unificada de intenções (com INSTEAD OF trigger) |
owner_feature_entitlements |
Entitlements por owner |
current_tenant_id |
Tenant ativo do usuário corrente |
Funções Críticas
| Função | Tipo | Descrição |
|---|---|---|
tenant_has_feature(uuid, text) |
Query | Verifica se tenant tem feature (plano + override) |
user_has_feature(uuid, text) |
Query | Verifica se user tem feature via plano pessoal |
has_feature(uuid, text) |
Query | Alias genérico |
seed_determined_commitments(uuid) |
Seed | Cria 5 tipos de compromisso nativos por tenant |
seed_default_patient_groups(uuid) |
Seed | Cria 3 grupos de pacientes padrão |
seed_default_financial_categories(uuid) |
Seed | Cria categorias financeiras padrão |
subscriptions_validate_scope() |
Trigger | Valida XOR (user_id vs tenant_id) por target |
activate_subscription_from_intent(uuid) |
RPC | Ativa subscription a partir de intent |
handle_new_user() |
Trigger | Cria profile + tenant pessoal ao cadastrar |
ensure_personal_tenant() |
RPC | Garante que o user tem um tenant pessoal |
populate_notification_queue() |
Cron | Popula fila de notificações |
agendador_slots_disponiveis(text, date) |
RPC | Retorna slots disponíveis para agendamento |
Enums (public schema)
| Tipo | Valores |
|---|---|
commitment_log_source |
manual, auto |
determined_field_type |
text, textarea, number, date, select, boolean |
financial_record_type |
receita, despesa |
recurrence_exception_type |
cancel_session, reschedule_session, patient_missed, therapist_canceled, holiday_block |
recurrence_type |
weekly, biweekly, monthly, yearly, custom_weekdays |
status_agenda_serie |
ativo, pausado, cancelado |
status_evento_agenda |
agendado, realizado, faltou, cancelado, remarcar |
status_excecao_agenda |
pendente, ativo, arquivado |
tipo_evento_agenda |
sessao, bloqueio |
tipo_excecao_agenda |
bloqueio, horario_extra |