7c20b518d4
Repositorio estava ha ~5 sessoes sem commit. Consolida tudo desde d088a89.
Ver commit.md na raiz para descricao completa por sessao.
# Numeros
- A# auditoria abertos: 0/30
- V# verificacoes abertos: 5/52 (todos adiados com plano)
- T# testes escritos: 10/10
- Vitest: 192/192
- SQL integration: 33/33
- E2E (Playwright, novo): 5/5
- Migrations: 17 (10 novas Sessao 6)
- Areas auditadas: 7 (+documentos com 10 V#)
# Highlights Sessao 6 (hoje)
- V#34/V#41 Opcao B2: tenant_features com plano + override (RPC SECURITY DEFINER, tela /saas/tenant-features)
- A#20 rev2 self-hosted: defesa em 5 camadas (honeypot + rate limit + math captcha condicional + paranoid mode + dashboard /saas/security)
- Documentos hardening (V#43-V#49): tenant scoping em storage policies (vazamento entre clinicas eliminado), RPC validate_share_token, signatures policy granular
- SaaS Twilio Config (/saas/twilio-config): UI editavel para SID/webhook/cotacao; AUTH_TOKEN permanece em env var
- T#9 + T#10: useAgendaEvents.spec.js + Playwright E2E (descobriu bug no front que foi corrigido)
# Sessoes anteriores (1-5) consolidadas
- Sessao 1: auth/router/session, normalizeRole extraido
- Sessao 2: agenda - composables/services consolidados
- Sessao 3: pacientes - tenant_id em todas queries
- Sessao 4: security review pagina publica - 14/15 vulnerabilidades corrigidas
- Sessao 5: SaaS - P0 (A#30: 7 tabelas com RLS off corrigidas)
# .gitignore ajustado
- supabase/* + !supabase/functions/ (mantem 10 edge functions, ignora .temp/migrations gerados pelo CLI)
- database-novo/backups/ (regeneravel via db.cjs backup)
- test-results/ + playwright-report/
- .claude/settings.local.json (config local com senha de dev removida do tracking)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
312 lines
100 KiB
HTML
312 lines
100 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="pt-BR">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>AgenciaPsi DB · 2026-04-17</title>
|
|
<style>
|
|
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=Space+Grotesk:wght@300;400;500;600;700&display=swap');
|
|
:root{--bg:#0b0d12;--bg2:#111520;--bg3:#181e2d;--border:#1e2740;--border2:#263050;--text:#e2e8f8;--text2:#7d8fb3;--text3:#4a5a80;--accent:#6366f1;--accent2:#6ee7b7;--pk:#fbbf24;--fk:#f472b6;--ok:#34d399;--warn:#fbbf24;--pend:#f87171;--leg:#94a3b8}
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
body{background:var(--bg);color:var(--text);font-family:'Space Grotesk',sans-serif;min-height:100vh;overflow-x:hidden}
|
|
|
|
.topbar{position:sticky;top:0;z-index:100;background:rgba(11,13,18,.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:0 28px;height:56px;display:flex;align-items:center;gap:20px}
|
|
.brand{font-weight:700;font-size:15px;letter-spacing:-.3px}.brand span{color:var(--accent)}
|
|
.gen{font-size:11px;color:var(--text3);font-family:'IBM Plex Mono',monospace}
|
|
.pills{display:flex;gap:10px;margin-left:auto}
|
|
.pill{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text2);background:var(--bg3);border:1px solid var(--border);border-radius:20px;padding:4px 12px}
|
|
.pill strong{color:var(--text);font-size:13px}
|
|
.search{background:var(--bg3);border:1px solid var(--border);border-radius:8px;padding:6px 12px;color:var(--text);font-family:'Space Grotesk',sans-serif;font-size:13px;outline:none;width:200px;transition:border-color .2s,width .2s}
|
|
.search:focus{border-color:var(--accent);width:280px}
|
|
.search::placeholder{color:var(--text3)}
|
|
|
|
.layout{display:flex;height:calc(100vh - 56px)}
|
|
|
|
.sidebar{width:260px;flex-shrink:0;background:var(--bg2);border-right:1px solid var(--border);overflow-y:auto;padding:16px 0}
|
|
.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:var(--border2);border-radius:2px}
|
|
.sb-h{font-size:10px;font-weight:600;letter-spacing:1px;text-transform:uppercase;color:var(--text3);padding:8px 20px 4px}
|
|
.sb-i{display:flex;align-items:center;gap:10px;padding:7px 20px;cursor:pointer;font-size:13px;color:var(--text2);border-left:2px solid transparent;transition:all .15s;user-select:none}
|
|
.sb-i:hover{color:var(--text);background:var(--bg3)}
|
|
.sb-i.active{color:var(--text);border-left-color:var(--accent);background:rgba(99,102,241,.08)}
|
|
.sb-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
|
|
.sb-c{margin-left:auto;font-size:11px;color:var(--text3);font-family:'IBM Plex Mono',monospace}
|
|
|
|
.main{flex:1;overflow-y:auto}
|
|
.main::-webkit-scrollbar{width:5px}.main::-webkit-scrollbar-thumb{background:var(--border2);border-radius:2px}
|
|
|
|
.overview{padding:32px 36px;border-bottom:1px solid var(--border)}
|
|
.ov-t{font-size:22px;font-weight:700;margin-bottom:6px}
|
|
.ov-s{font-size:14px;color:var(--text2);margin-bottom:28px}
|
|
.dgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px}
|
|
.dc{background:var(--bg3);border:1px solid var(--border);border-radius:12px;padding:16px 18px;cursor:pointer;transition:all .2s;position:relative;overflow:hidden}
|
|
.dc::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:var(--c)}
|
|
.dc:hover{border-color:var(--border2);transform:translateY(-1px)}
|
|
.dc-n{font-size:14px;font-weight:600;margin-bottom:6px}
|
|
.dc-m{font-size:12px;color:var(--text2);font-family:'IBM Plex Mono',monospace}
|
|
.dc-m span{font-weight:600}
|
|
|
|
.section{padding:28px 36px}
|
|
.sec-h{display:flex;align-items:center;gap:14px;margin-bottom:20px}
|
|
.sec-t{font-size:18px;font-weight:700}
|
|
.sec-b{font-size:11px;font-family:'IBM Plex Mono',monospace;background:var(--bg3);border:1px solid var(--border);border-radius:20px;padding:3px 10px;color:var(--text2)}
|
|
|
|
.tgrid{display:flex;flex-direction:column;gap:10px}
|
|
.tc{background:var(--bg3);border:1px solid var(--border);border-radius:10px;overflow:hidden;transition:border-color .15s}
|
|
.tc:hover{border-color:var(--border2)}.tc.hl{border-color:var(--accent)}
|
|
.tc-h{display:flex;align-items:center;gap:12px;padding:12px 16px;cursor:pointer;user-select:none}
|
|
.tc-n{font-family:'IBM Plex Mono',monospace;font-size:13px;font-weight:600}
|
|
.tc-m{font-size:11px;color:var(--text3);font-family:'IBM Plex Mono',monospace}
|
|
.tc-f{font-size:11px;color:var(--fk);font-family:'IBM Plex Mono',monospace;margin-left:4px}
|
|
.tc-tg{margin-left:auto;color:var(--text3);font-size:11px;transition:transform .2s}
|
|
.tc-tg.open{transform:rotate(180deg)}
|
|
.tc-b{display:none;border-top:1px solid var(--border)}.tc-b.open{display:block}
|
|
.cols{padding:6px 0}
|
|
.cr{display:flex;align-items:center;gap:10px;padding:5px 16px;font-size:12px;font-family:'IBM Plex Mono',monospace;color:var(--text2)}
|
|
.cr:hover{background:rgba(255,255,255,.02)}
|
|
.bdg{font-size:9px;font-weight:700;letter-spacing:.5px;padding:1px 5px;border-radius:3px;width:26px;text-align:center;flex-shrink:0}
|
|
.bdg.pk{background:rgba(251,191,36,.15);color:var(--pk)}.bdg.fk{background:rgba(244,114,182,.15);color:var(--fk)}.bdg.x{background:transparent}
|
|
.cn{color:var(--text)}.ct{color:var(--text3);margin-left:auto;font-size:11px}
|
|
.fksec{border-top:1px solid var(--border);padding:10px 16px}
|
|
.fkt{font-size:10px;font-weight:600;letter-spacing:1px;color:var(--text3);text-transform:uppercase;margin-bottom:8px}
|
|
.fkr{display:flex;align-items:center;gap:8px;font-size:12px;font-family:'IBM Plex Mono',monospace;color:var(--text2);padding:3px 0}
|
|
.fka{color:var(--fk)}.fkl{color:var(--accent);cursor:pointer}.fkl:hover{text-decoration:underline}
|
|
|
|
.vsec{padding:0 36px 32px}
|
|
.vgrid{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
|
|
.vc{background:rgba(110,231,183,.08);border:1px solid rgba(110,231,183,.2);border-radius:6px;padding:5px 12px;font-size:12px;font-family:'IBM Plex Mono',monospace;color:var(--accent2)}
|
|
.empty{padding:40px;text-align:center;color:var(--text3);font-size:14px}
|
|
mark{background:rgba(99,102,241,.3);color:#fff;border-radius:2px}
|
|
|
|
/* Infraestrutura */
|
|
.igroup{margin-bottom:28px}
|
|
.igroup-h{display:flex;align-items:center;gap:10px;margin-bottom:14px}
|
|
.igroup-t{font-size:15px;font-weight:600;letter-spacing:-.2px}
|
|
.igroup-c{width:10px;height:10px;border-radius:50%;flex-shrink:0}
|
|
.igrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px}
|
|
.ic{background:var(--bg3);border:1px solid var(--border);border-radius:10px;padding:16px 18px;transition:border-color .15s;position:relative;overflow:hidden}
|
|
.ic::before{content:'';position:absolute;top:0;left:0;bottom:0;width:3px;background:var(--c)}
|
|
.ic:hover{border-color:var(--border2)}
|
|
.ic-h{display:flex;align-items:center;gap:10px;margin-bottom:8px}
|
|
.ic-n{font-size:14px;font-weight:600;flex:1;min-width:0}
|
|
.ic-st{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;padding:2px 7px;border-radius:10px;flex-shrink:0;white-space:nowrap}
|
|
.ic-st.ativo{background:rgba(52,211,153,.15);color:var(--ok)}
|
|
.ic-st.pendente{background:rgba(248,113,113,.15);color:var(--pend)}
|
|
.ic-st.planejado{background:rgba(251,191,36,.15);color:var(--warn)}
|
|
.ic-st.legado{background:rgba(148,163,184,.2);color:var(--leg)}
|
|
.ic-r{font-size:12px;color:var(--text2);margin-bottom:8px;line-height:1.5}
|
|
.ic-e{font-size:10px;color:var(--text3);font-family:'IBM Plex Mono',monospace;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}
|
|
.ic-nt{font-size:11px;color:var(--text3);line-height:1.55;border-top:1px solid var(--border);padding-top:8px;margin-top:8px}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="topbar">
|
|
<div class="brand">Agência<span>Psi</span> DB</div>
|
|
<span class="gen">2026-04-17 · 17/04/2026, 09:29:14</span>
|
|
<input class="search" id="si" placeholder="Buscar tabela ou coluna..." oninput="search(this.value)">
|
|
<div class="pills">
|
|
<div class="pill"><strong>97</strong> tabelas</div>
|
|
<div class="pill"><strong>99</strong> FKs</div>
|
|
<div class="pill"><strong>24</strong> views</div>
|
|
<div class="pill"><strong>1307</strong> colunas</div>
|
|
<div class="pill"><strong>23</strong> infra</div>
|
|
</div>
|
|
</div>
|
|
<div class="layout">
|
|
<nav class="sidebar" id="sb"></nav>
|
|
<main class="main" id="mn"></main>
|
|
</div>
|
|
<script>
|
|
const D={"tables":{"subscriptions":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"user_id","type":"uuid","pk":false},{"name":"plan_id","type":"uuid","pk":false},{"name":"status","type":"text","pk":false},{"name":"current_period_start","type":"timestamp with time zone","pk":false},{"name":"current_period_end","type":"timestamp with time zone","pk":false},{"name":"cancel_at_period_end","type":"boolean","pk":false},{"name":"provider","type":"text","pk":false},{"name":"provider_customer_id","type":"text","pk":false},{"name":"provider_subscription_id","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"plan_key","type":"text","pk":false},{"name":"source","type":"text","pk":false},{"name":"started_at","type":"timestamp with time zone","pk":false},{"name":"canceled_at","type":"timestamp with time zone","pk":false},{"name":"activated_at","type":"timestamp with time zone","pk":false},{"name":"past_due_since","type":"timestamp with time zone","pk":false},{"name":"suspended_at","type":"timestamp with time zone","pk":false},{"name":"suspended_reason","type":"text","pk":false},{"name":"cancelled_at","type":"timestamp with time zone","pk":false},{"name":"cancel_reason","type":"text","pk":false},{"name":"expired_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"plan_id","to_table":"plans","to_col":"id"}]},"financial_records":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"amount","type":"numeric","pk":false},{"name":"description","type":"text","pk":false},{"name":"category","type":"text","pk":false},{"name":"payment_method","type":"text","pk":false},{"name":"paid_at","type":"timestamp with time zone","pk":false},{"name":"due_date","type":"date","pk":false},{"name":"installments","type":"smallint","pk":false},{"name":"installment_number","type":"smallint","pk":false},{"name":"installment_group","type":"uuid","pk":false},{"name":"agenda_evento_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"clinic_fee_pct","type":"numeric","pk":false},{"name":"clinic_fee_amount","type":"numeric","pk":false},{"name":"net_amount","type":"numeric","pk":false},{"name":"insurance_plan_id","type":"uuid","pk":false},{"name":"notes","type":"text","pk":false},{"name":"tags","type":"text[]","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"deleted_at","type":"timestamp with time zone","pk":false},{"name":"discount_amount","type":"numeric","pk":false},{"name":"final_amount","type":"numeric","pk":false},{"name":"status","type":"text","pk":false},{"name":"category_id","type":"uuid","pk":false}],"fks":[{"from_col":"agenda_evento_id","to_table":"agenda_eventos","to_col":"id"},{"from_col":"category_id","to_table":"financial_categories","to_col":"id"},{"from_col":"insurance_plan_id","to_table":"insurance_plans","to_col":"id"},{"from_col":"patient_id","to_table":"patients","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"therapist_payouts":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"period_start","type":"date","pk":false},{"name":"period_end","type":"date","pk":false},{"name":"total_sessions","type":"integer","pk":false},{"name":"gross_amount","type":"numeric","pk":false},{"name":"clinic_fee_total","type":"numeric","pk":false},{"name":"net_amount","type":"numeric","pk":false},{"name":"status","type":"text","pk":false},{"name":"paid_at","type":"timestamp with time zone","pk":false},{"name":"notes","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"tenant_members":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"user_id","type":"uuid","pk":false},{"name":"role","type":"text","pk":false},{"name":"status","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"_db_migrations":{"columns":[{"name":"id","type":"integer","pk":true},{"name":"filename","type":"text","pk":false},{"name":"hash","type":"text","pk":false},{"name":"category","type":"text","pk":false},{"name":"applied_at","type":"timestamp with time zone","pk":false}],"fks":[]},"addon_credits":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"addon_type","type":"text","pk":false},{"name":"balance","type":"integer","pk":false},{"name":"total_purchased","type":"integer","pk":false},{"name":"total_consumed","type":"integer","pk":false},{"name":"low_balance_threshold","type":"integer","pk":false},{"name":"low_balance_notified","type":"boolean","pk":false},{"name":"daily_limit","type":"integer","pk":false},{"name":"hourly_limit","type":"integer","pk":false},{"name":"daily_used","type":"integer","pk":false},{"name":"hourly_used","type":"integer","pk":false},{"name":"daily_reset_at","type":"timestamp with time zone","pk":false},{"name":"hourly_reset_at","type":"timestamp with time zone","pk":false},{"name":"from_number_override","type":"text","pk":false},{"name":"expires_at","type":"timestamp with time zone","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"addon_products":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"slug","type":"text","pk":false},{"name":"name","type":"text","pk":false},{"name":"description","type":"text","pk":false},{"name":"addon_type","type":"text","pk":false},{"name":"icon","type":"text","pk":false},{"name":"credits_amount","type":"integer","pk":false},{"name":"price_cents","type":"integer","pk":false},{"name":"currency","type":"text","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"is_visible","type":"boolean","pk":false},{"name":"sort_order","type":"integer","pk":false},{"name":"metadata","type":"jsonb","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"deleted_at","type":"timestamp with time zone","pk":false}],"fks":[]},"addon_transactions":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"addon_type","type":"text","pk":false},{"name":"type","type":"text","pk":false},{"name":"amount","type":"integer","pk":false},{"name":"balance_before","type":"integer","pk":false},{"name":"balance_after","type":"integer","pk":false},{"name":"product_id","type":"uuid","pk":false},{"name":"queue_id","type":"uuid","pk":false},{"name":"description","type":"text","pk":false},{"name":"admin_user_id","type":"uuid","pk":false},{"name":"payment_method","type":"text","pk":false},{"name":"payment_reference","type":"text","pk":false},{"name":"price_cents","type":"integer","pk":false},{"name":"currency","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"metadata","type":"jsonb","pk":false}],"fks":[{"from_col":"product_id","to_table":"addon_products","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agenda_bloqueios":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"tipo","type":"text","pk":false},{"name":"titulo","type":"text","pk":false},{"name":"data_inicio","type":"date","pk":false},{"name":"data_fim","type":"date","pk":false},{"name":"hora_inicio","type":"time without time zone","pk":false},{"name":"hora_fim","type":"time without time zone","pk":false},{"name":"recorrente","type":"boolean","pk":false},{"name":"dia_semana","type":"smallint","pk":false},{"name":"observacao","type":"text","pk":false},{"name":"origem","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agenda_configuracoes":{"columns":[{"name":"owner_id","type":"uuid","pk":false},{"name":"duracao_padrao_minutos","type":"integer","pk":false},{"name":"intervalo_padrao_minutos","type":"integer","pk":false},{"name":"timezone","type":"text","pk":false},{"name":"usar_horario_admin_custom","type":"boolean","pk":false},{"name":"admin_inicio_visualizacao","type":"time without time zone","pk":false},{"name":"admin_fim_visualizacao","type":"time without time zone","pk":false},{"name":"admin_slot_visual_minutos","type":"integer","pk":false},{"name":"online_ativo","type":"boolean","pk":false},{"name":"online_min_antecedencia_horas","type":"integer","pk":false},{"name":"online_max_dias_futuro","type":"integer","pk":false},{"name":"online_cancelar_ate_horas","type":"integer","pk":false},{"name":"online_reagendar_ate_horas","type":"integer","pk":false},{"name":"online_limite_agendamentos_futuros","type":"integer","pk":false},{"name":"online_modo","type":"text","pk":false},{"name":"online_buffer_antes_min","type":"integer","pk":false},{"name":"online_buffer_depois_min","type":"integer","pk":false},{"name":"online_modalidade","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"usar_granularidade_custom","type":"boolean","pk":false},{"name":"granularidade_min","type":"integer","pk":false},{"name":"setup_concluido","type":"boolean","pk":false},{"name":"setup_concluido_em","type":"timestamp with time zone","pk":false},{"name":"agenda_view_mode","type":"text","pk":false},{"name":"agenda_custom_start","type":"time without time zone","pk":false},{"name":"agenda_custom_end","type":"time without time zone","pk":false},{"name":"session_duration_min","type":"integer","pk":false},{"name":"session_break_min","type":"integer","pk":false},{"name":"pausas_semanais","type":"jsonb","pk":false},{"name":"setup_clinica_concluido","type":"boolean","pk":false},{"name":"setup_clinica_concluido_em","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"jornada_igual_todos","type":"boolean","pk":false},{"name":"slot_mode","type":"text","pk":false},{"name":"atendimento_mode","type":"text","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agenda_eventos":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"titulo","type":"text","pk":false},{"name":"observacoes","type":"text","pk":false},{"name":"inicio_em","type":"timestamp with time zone","pk":false},{"name":"fim_em","type":"timestamp with time zone","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"terapeuta_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"visibility_scope","type":"text","pk":false},{"name":"mirror_of_event_id","type":"uuid","pk":false},{"name":"mirror_source","type":"text","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"determined_commitment_id","type":"uuid","pk":false},{"name":"link_online","type":"text","pk":false},{"name":"titulo_custom","type":"text","pk":false},{"name":"extra_fields","type":"jsonb","pk":false},{"name":"recurrence_id","type":"uuid","pk":false},{"name":"recurrence_date","type":"date","pk":false},{"name":"modalidade","type":"text","pk":false},{"name":"price","type":"numeric","pk":false},{"name":"billing_contract_id","type":"uuid","pk":false},{"name":"billed","type":"boolean","pk":false},{"name":"services_customized","type":"boolean","pk":false},{"name":"insurance_plan_id","type":"uuid","pk":false},{"name":"insurance_guide_number","type":"text","pk":false},{"name":"insurance_value","type":"numeric","pk":false},{"name":"insurance_plan_service_id","type":"uuid","pk":false}],"fks":[{"from_col":"billing_contract_id","to_table":"billing_contracts","to_col":"id"},{"from_col":"determined_commitment_id","to_table":"determined_commitments","to_col":"id"},{"from_col":"insurance_plan_id","to_table":"insurance_plans","to_col":"id"},{"from_col":"insurance_plan_service_id","to_table":"insurance_plan_services","to_col":"id"},{"from_col":"patient_id","to_table":"patients","to_col":"id"},{"from_col":"recurrence_id","to_table":"recurrence_rules","to_col":"id"}]},"agenda_excecoes":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"data","type":"date","pk":false},{"name":"hora_inicio","type":"time without time zone","pk":false},{"name":"hora_fim","type":"time without time zone","pk":false},{"name":"motivo","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"fonte","type":"text","pk":false},{"name":"aplicavel_online","type":"boolean","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agenda_online_slots":{"columns":[{"name":"id","type":"bigint","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"weekday","type":"integer","pk":false},{"name":"enabled","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agenda_regras_semanais":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"dia_semana","type":"smallint","pk":false},{"name":"hora_inicio","type":"time without time zone","pk":false},{"name":"hora_fim","type":"time without time zone","pk":false},{"name":"modalidade","type":"text","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agenda_slots_bloqueados_semanais":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"dia_semana","type":"smallint","pk":false},{"name":"hora_inicio","type":"time without time zone","pk":false},{"name":"motivo","type":"text","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agenda_slots_regras":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"dia_semana","type":"smallint","pk":false},{"name":"passo_minutos","type":"integer","pk":false},{"name":"offset_minutos","type":"integer","pk":false},{"name":"buffer_antes_min","type":"integer","pk":false},{"name":"buffer_depois_min","type":"integer","pk":false},{"name":"min_antecedencia_horas","type":"integer","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agendador_configuracoes":{"columns":[{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"link_slug","type":"text","pk":false},{"name":"imagem_fundo_url","type":"text","pk":false},{"name":"imagem_header_url","type":"text","pk":false},{"name":"logomarca_url","type":"text","pk":false},{"name":"cor_primaria","type":"text","pk":false},{"name":"nome_exibicao","type":"text","pk":false},{"name":"endereco","type":"text","pk":false},{"name":"botao_como_chegar_ativo","type":"boolean","pk":false},{"name":"maps_url","type":"text","pk":false},{"name":"modo_aprovacao","type":"text","pk":false},{"name":"modalidade","type":"text","pk":false},{"name":"tipos_habilitados","type":"jsonb","pk":false},{"name":"duracao_sessao_min","type":"integer","pk":false},{"name":"antecedencia_minima_horas","type":"integer","pk":false},{"name":"prazo_resposta_horas","type":"integer","pk":false},{"name":"reserva_horas","type":"integer","pk":false},{"name":"pagamento_obrigatorio","type":"boolean","pk":false},{"name":"pix_chave","type":"text","pk":false},{"name":"pix_countdown_minutos","type":"integer","pk":false},{"name":"triagem_motivo","type":"boolean","pk":false},{"name":"triagem_como_conheceu","type":"boolean","pk":false},{"name":"verificacao_email","type":"boolean","pk":false},{"name":"exigir_aceite_lgpd","type":"boolean","pk":false},{"name":"mensagem_boas_vindas","type":"text","pk":false},{"name":"texto_como_se_preparar","type":"text","pk":false},{"name":"texto_termos_lgpd","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"pagamento_modo","type":"text","pk":false},{"name":"pagamento_metodos_visiveis","type":"text[]","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"agendador_solicitacoes":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"paciente_nome","type":"text","pk":false},{"name":"paciente_sobrenome","type":"text","pk":false},{"name":"paciente_email","type":"text","pk":false},{"name":"paciente_celular","type":"text","pk":false},{"name":"paciente_cpf","type":"text","pk":false},{"name":"tipo","type":"text","pk":false},{"name":"modalidade","type":"text","pk":false},{"name":"data_solicitada","type":"date","pk":false},{"name":"hora_solicitada","type":"time without time zone","pk":false},{"name":"reservado_ate","type":"timestamp with time zone","pk":false},{"name":"motivo","type":"text","pk":false},{"name":"como_conheceu","type":"text","pk":false},{"name":"pix_status","type":"text","pk":false},{"name":"pix_pago_em","type":"timestamp with time zone","pk":false},{"name":"status","type":"text","pk":false},{"name":"recusado_motivo","type":"text","pk":false},{"name":"autorizado_em","type":"timestamp with time zone","pk":false},{"name":"autorizado_por","type":"uuid","pk":false},{"name":"user_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"evento_id","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"billing_contracts":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"type","type":"text","pk":false},{"name":"total_sessions","type":"integer","pk":false},{"name":"sessions_used","type":"integer","pk":false},{"name":"package_price","type":"numeric","pk":false},{"name":"amount","type":"numeric","pk":false},{"name":"billing_interval","type":"text","pk":false},{"name":"active_from","type":"timestamp with time zone","pk":false},{"name":"active_to","type":"timestamp with time zone","pk":false},{"name":"status","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"patient_id","to_table":"patients","to_col":"id"}]},"commitment_services":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"commitment_id","type":"uuid","pk":false},{"name":"service_id","type":"uuid","pk":false},{"name":"quantity","type":"integer","pk":false},{"name":"unit_price","type":"numeric","pk":false},{"name":"discount_pct","type":"numeric","pk":false},{"name":"discount_flat","type":"numeric","pk":false},{"name":"final_price","type":"numeric","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"commitment_id","to_table":"agenda_eventos","to_col":"id"},{"from_col":"service_id","to_table":"services","to_col":"id"}]},"commitment_time_logs":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"commitment_id","type":"uuid","pk":false},{"name":"calendar_event_id","type":"uuid","pk":false},{"name":"started_at","type":"timestamp with time zone","pk":false},{"name":"ended_at","type":"timestamp with time zone","pk":false},{"name":"minutes","type":"integer","pk":false},{"name":"created_by","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"calendar_event_id","to_table":"agenda_eventos","to_col":"id"},{"from_col":"commitment_id","to_table":"determined_commitments","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"company_profiles":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"nome_fantasia","type":"text","pk":false},{"name":"razao_social","type":"text","pk":false},{"name":"tipo_empresa","type":"text","pk":false},{"name":"cnpj","type":"text","pk":false},{"name":"ie","type":"text","pk":false},{"name":"im","type":"text","pk":false},{"name":"cep","type":"text","pk":false},{"name":"logradouro","type":"text","pk":false},{"name":"numero","type":"text","pk":false},{"name":"complemento","type":"text","pk":false},{"name":"bairro","type":"text","pk":false},{"name":"cidade","type":"text","pk":false},{"name":"estado","type":"text","pk":false},{"name":"email","type":"text","pk":false},{"name":"telefone","type":"text","pk":false},{"name":"site","type":"text","pk":false},{"name":"logo_url","type":"text","pk":false},{"name":"redes_sociais","type":"jsonb","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"determined_commitment_fields":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"commitment_id","type":"uuid","pk":false},{"name":"key","type":"text","pk":false},{"name":"label","type":"text","pk":false},{"name":"required","type":"boolean","pk":false},{"name":"sort_order","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"commitment_id","to_table":"determined_commitments","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"determined_commitments":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"created_by","type":"uuid","pk":false},{"name":"is_native","type":"boolean","pk":false},{"name":"native_key","type":"text","pk":false},{"name":"is_locked","type":"boolean","pk":false},{"name":"active","type":"boolean","pk":false},{"name":"name","type":"text","pk":false},{"name":"description","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"bg_color","type":"text","pk":false},{"name":"text_color","type":"text","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"dev_user_credentials":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"user_id","type":"uuid","pk":false},{"name":"email","type":"text","pk":false},{"name":"password_dev","type":"text","pk":false},{"name":"kind","type":"text","pk":false},{"name":"note","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[]},"document_access_logs":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"documento_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"acao","type":"text","pk":false},{"name":"user_id","type":"uuid","pk":false},{"name":"ip","type":"inet","pk":false},{"name":"user_agent","type":"text","pk":false},{"name":"acessado_em","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"documento_id","to_table":"documents","to_col":"id"}]},"document_generated":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"template_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"dados_preenchidos","type":"jsonb","pk":false},{"name":"pdf_path","type":"text","pk":false},{"name":"storage_bucket","type":"text","pk":false},{"name":"documento_id","type":"uuid","pk":false},{"name":"gerado_por","type":"uuid","pk":false},{"name":"gerado_em","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"documento_id","to_table":"documents","to_col":"id"},{"from_col":"patient_id","to_table":"patients","to_col":"id"},{"from_col":"template_id","to_table":"document_templates","to_col":"id"}]},"document_share_links":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"documento_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"token","type":"text","pk":false},{"name":"expira_em","type":"timestamp with time zone","pk":false},{"name":"usos_max","type":"smallint","pk":false},{"name":"usos","type":"smallint","pk":false},{"name":"criado_por","type":"uuid","pk":false},{"name":"criado_em","type":"timestamp with time zone","pk":false},{"name":"ativo","type":"boolean","pk":false}],"fks":[{"from_col":"documento_id","to_table":"documents","to_col":"id"}]},"document_signatures":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"documento_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"signatario_tipo","type":"text","pk":false},{"name":"signatario_id","type":"uuid","pk":false},{"name":"signatario_nome","type":"text","pk":false},{"name":"signatario_email","type":"text","pk":false},{"name":"ordem","type":"smallint","pk":false},{"name":"status","type":"text","pk":false},{"name":"ip","type":"inet","pk":false},{"name":"user_agent","type":"text","pk":false},{"name":"assinado_em","type":"timestamp with time zone","pk":false},{"name":"hash_documento","type":"text","pk":false},{"name":"criado_em","type":"timestamp with time zone","pk":false},{"name":"atualizado_em","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"documento_id","to_table":"documents","to_col":"id"}]},"document_templates":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"nome_template","type":"text","pk":false},{"name":"tipo","type":"text","pk":false},{"name":"descricao","type":"text","pk":false},{"name":"corpo_html","type":"text","pk":false},{"name":"cabecalho_html","type":"text","pk":false},{"name":"rodape_html","type":"text","pk":false},{"name":"variaveis","type":"text[]","pk":false},{"name":"logo_url","type":"text","pk":false},{"name":"is_global","type":"boolean","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"documents":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"bucket_path","type":"text","pk":false},{"name":"storage_bucket","type":"text","pk":false},{"name":"nome_original","type":"text","pk":false},{"name":"mime_type","type":"text","pk":false},{"name":"tamanho_bytes","type":"bigint","pk":false},{"name":"tipo_documento","type":"text","pk":false},{"name":"categoria","type":"text","pk":false},{"name":"descricao","type":"text","pk":false},{"name":"tags","type":"text[]","pk":false},{"name":"agenda_evento_id","type":"uuid","pk":false},{"name":"session_note_id","type":"uuid","pk":false},{"name":"visibilidade","type":"text","pk":false},{"name":"compartilhado_portal","type":"boolean","pk":false},{"name":"compartilhado_supervisor","type":"boolean","pk":false},{"name":"compartilhado_em","type":"timestamp with time zone","pk":false},{"name":"expira_compartilhamento","type":"timestamp with time zone","pk":false},{"name":"enviado_pelo_paciente","type":"boolean","pk":false},{"name":"status_revisao","type":"text","pk":false},{"name":"revisado_por","type":"uuid","pk":false},{"name":"revisado_em","type":"timestamp with time zone","pk":false},{"name":"uploaded_by","type":"uuid","pk":false},{"name":"uploaded_at","type":"timestamp with time zone","pk":false},{"name":"deleted_at","type":"timestamp with time zone","pk":false},{"name":"deleted_by","type":"uuid","pk":false},{"name":"retencao_ate","type":"timestamp with time zone","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"agenda_evento_id","to_table":"agenda_eventos","to_col":"id"},{"from_col":"patient_id","to_table":"patients","to_col":"id"}]},"email_layout_config":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"header_config","type":"jsonb","pk":false},{"name":"footer_config","type":"jsonb","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"email_templates_global":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"key","type":"text","pk":false},{"name":"domain","type":"text","pk":false},{"name":"channel","type":"text","pk":false},{"name":"subject","type":"text","pk":false},{"name":"body_html","type":"text","pk":false},{"name":"body_text","type":"text","pk":false},{"name":"version","type":"integer","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"variables","type":"jsonb","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"email_templates_tenant":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"template_key","type":"text","pk":false},{"name":"subject","type":"text","pk":false},{"name":"body_html","type":"text","pk":false},{"name":"body_text","type":"text","pk":false},{"name":"enabled","type":"boolean","pk":false},{"name":"synced_version","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"entitlements_invalidation":{"columns":[{"name":"owner_id","type":"uuid","pk":false},{"name":"changed_at","type":"timestamp with time zone","pk":false}],"fks":[]},"features":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"key","type":"text","pk":false},{"name":"description","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"descricao","type":"text","pk":false},{"name":"name","type":"text","pk":false}],"fks":[]},"feriados":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"tipo","type":"text","pk":false},{"name":"nome","type":"text","pk":false},{"name":"data","type":"date","pk":false},{"name":"cidade","type":"text","pk":false},{"name":"estado","type":"text","pk":false},{"name":"observacao","type":"text","pk":false},{"name":"bloqueia_sessoes","type":"boolean","pk":false},{"name":"criado_em","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"financial_categories":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"user_id","type":"uuid","pk":false},{"name":"name","type":"text","pk":false},{"name":"color","type":"text","pk":false},{"name":"icon","type":"text","pk":false},{"name":"sort_order","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[]},"financial_exceptions":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"exception_type","type":"text","pk":false},{"name":"charge_mode","type":"text","pk":false},{"name":"charge_value","type":"numeric","pk":false},{"name":"charge_pct","type":"numeric","pk":false},{"name":"min_hours_notice","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"global_notices":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"title","type":"text","pk":false},{"name":"message","type":"text","pk":false},{"name":"variant","type":"text","pk":false},{"name":"roles","type":"text[]","pk":false},{"name":"contexts","type":"text[]","pk":false},{"name":"starts_at","type":"timestamp with time zone","pk":false},{"name":"ends_at","type":"timestamp with time zone","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"priority","type":"integer","pk":false},{"name":"dismissible","type":"boolean","pk":false},{"name":"persist_dismiss","type":"boolean","pk":false},{"name":"dismiss_scope","type":"text","pk":false},{"name":"show_once","type":"boolean","pk":false},{"name":"max_views","type":"integer","pk":false},{"name":"cooldown_minutes","type":"integer","pk":false},{"name":"version","type":"integer","pk":false},{"name":"action_type","type":"text","pk":false},{"name":"action_label","type":"text","pk":false},{"name":"action_url","type":"text","pk":false},{"name":"action_route","type":"text","pk":false},{"name":"views_count","type":"integer","pk":false},{"name":"clicks_count","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"created_by","type":"uuid","pk":false},{"name":"content_align","type":"text","pk":false},{"name":"link_target","type":"text","pk":false}],"fks":[]},"insurance_plan_services":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"insurance_plan_id","type":"uuid","pk":false},{"name":"name","type":"text","pk":false},{"name":"value","type":"numeric","pk":false},{"name":"active","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"insurance_plan_id","to_table":"insurance_plans","to_col":"id"}]},"insurance_plans":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"name","type":"text","pk":false},{"name":"notes","type":"text","pk":false},{"name":"default_value","type":"numeric","pk":false},{"name":"active","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"login_carousel_slides":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"title","type":"text","pk":false},{"name":"body","type":"text","pk":false},{"name":"icon","type":"text","pk":false},{"name":"ordem","type":"integer","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"medicos":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"nome","type":"text","pk":false},{"name":"crm","type":"text","pk":false},{"name":"especialidade","type":"text","pk":false},{"name":"telefone_profissional","type":"text","pk":false},{"name":"telefone_pessoal","type":"text","pk":false},{"name":"email","type":"text","pk":false},{"name":"clinica","type":"text","pk":false},{"name":"cidade","type":"text","pk":false},{"name":"estado","type":"text","pk":false},{"name":"observacoes","type":"text","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"module_features":{"columns":[{"name":"module_id","type":"uuid","pk":false},{"name":"feature_id","type":"uuid","pk":false},{"name":"enabled","type":"boolean","pk":false},{"name":"limits","type":"jsonb","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"feature_id","to_table":"features","to_col":"id"},{"from_col":"module_id","to_table":"modules","to_col":"id"}]},"modules":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"key","type":"text","pk":false},{"name":"name","type":"text","pk":false},{"name":"description","type":"text","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[]},"notice_dismissals":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"notice_id","type":"uuid","pk":false},{"name":"user_id","type":"uuid","pk":false},{"name":"version","type":"integer","pk":false},{"name":"dismissed_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"notice_id","to_table":"global_notices","to_col":"id"}]},"notification_channels":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"channel","type":"text","pk":false},{"name":"provider","type":"text","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"display_name","type":"text","pk":false},{"name":"sender_address","type":"text","pk":false},{"name":"credentials","type":"jsonb","pk":false},{"name":"connection_status","type":"text","pk":false},{"name":"last_health_check","type":"timestamp with time zone","pk":false},{"name":"metadata","type":"jsonb","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"deleted_at","type":"timestamp with time zone","pk":false},{"name":"twilio_subaccount_sid","type":"text","pk":false},{"name":"twilio_phone_number","type":"text","pk":false},{"name":"twilio_phone_sid","type":"text","pk":false},{"name":"webhook_url","type":"text","pk":false},{"name":"cost_per_message_usd","type":"numeric","pk":false},{"name":"price_per_message_brl","type":"numeric","pk":false},{"name":"provisioned_at","type":"timestamp with time zone","pk":false}],"fks":[]},"notification_logs":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"queue_id","type":"uuid","pk":false},{"name":"agenda_evento_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"channel","type":"text","pk":false},{"name":"template_key","type":"text","pk":false},{"name":"schedule_key","type":"text","pk":false},{"name":"recipient_address","type":"text","pk":false},{"name":"resolved_message","type":"text","pk":false},{"name":"resolved_vars","type":"jsonb","pk":false},{"name":"status","type":"text","pk":false},{"name":"provider","type":"text","pk":false},{"name":"provider_message_id","type":"text","pk":false},{"name":"provider_status","type":"text","pk":false},{"name":"provider_response","type":"jsonb","pk":false},{"name":"sent_at","type":"timestamp with time zone","pk":false},{"name":"delivered_at","type":"timestamp with time zone","pk":false},{"name":"read_at","type":"timestamp with time zone","pk":false},{"name":"failed_at","type":"timestamp with time zone","pk":false},{"name":"failure_reason","type":"text","pk":false},{"name":"estimated_cost_brl","type":"numeric","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"queue_id","to_table":"notification_queue","to_col":"id"}]},"notification_preferences":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"whatsapp_opt_in","type":"boolean","pk":false},{"name":"email_opt_in","type":"boolean","pk":false},{"name":"sms_opt_in","type":"boolean","pk":false},{"name":"preferred_time_start","type":"time without time zone","pk":false},{"name":"preferred_time_end","type":"time without time zone","pk":false},{"name":"lgpd_consent_given","type":"boolean","pk":false},{"name":"lgpd_consent_date","type":"timestamp with time zone","pk":false},{"name":"lgpd_consent_version","type":"text","pk":false},{"name":"lgpd_consent_ip","type":"inet","pk":false},{"name":"lgpd_opt_out_date","type":"timestamp with time zone","pk":false},{"name":"lgpd_opt_out_reason","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"deleted_at","type":"timestamp with time zone","pk":false}],"fks":[]},"notification_queue":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"agenda_evento_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"channel","type":"text","pk":false},{"name":"template_key","type":"text","pk":false},{"name":"schedule_key","type":"text","pk":false},{"name":"resolved_vars","type":"jsonb","pk":false},{"name":"recipient_address","type":"text","pk":false},{"name":"status","type":"text","pk":false},{"name":"scheduled_at","type":"timestamp with time zone","pk":false},{"name":"sent_at","type":"timestamp with time zone","pk":false},{"name":"next_retry_at","type":"timestamp with time zone","pk":false},{"name":"attempts","type":"integer","pk":false},{"name":"max_attempts","type":"integer","pk":false},{"name":"last_error","type":"text","pk":false},{"name":"idempotency_key","type":"text","pk":false},{"name":"provider_message_id","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"notification_schedules":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"schedule_key","type":"text","pk":false},{"name":"event_type","type":"text","pk":false},{"name":"trigger_type","type":"text","pk":false},{"name":"offset_minutes","type":"integer","pk":false},{"name":"whatsapp_enabled","type":"boolean","pk":false},{"name":"email_enabled","type":"boolean","pk":false},{"name":"sms_enabled","type":"boolean","pk":false},{"name":"allowed_time_start","type":"time without time zone","pk":false},{"name":"allowed_time_end","type":"time without time zone","pk":false},{"name":"skip_weekends","type":"boolean","pk":false},{"name":"skip_holidays","type":"boolean","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"sort_order","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"deleted_at","type":"timestamp with time zone","pk":false}],"fks":[]},"notification_templates":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"key","type":"text","pk":false},{"name":"domain","type":"text","pk":false},{"name":"channel","type":"text","pk":false},{"name":"event_type","type":"text","pk":false},{"name":"body_text","type":"text","pk":false},{"name":"meta_template_name","type":"text","pk":false},{"name":"meta_template_namespace","type":"text","pk":false},{"name":"meta_components","type":"jsonb","pk":false},{"name":"meta_status","type":"text","pk":false},{"name":"variables","type":"jsonb","pk":false},{"name":"version","type":"integer","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"is_default","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"deleted_at","type":"timestamp with time zone","pk":false}],"fks":[]},"notifications":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"type","type":"text","pk":false},{"name":"ref_id","type":"uuid","pk":false},{"name":"ref_table","type":"text","pk":false},{"name":"payload","type":"jsonb","pk":false},{"name":"read_at","type":"timestamp with time zone","pk":false},{"name":"archived","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[]},"plan_features":{"columns":[{"name":"plan_id","type":"uuid","pk":false},{"name":"feature_id","type":"uuid","pk":false},{"name":"enabled","type":"boolean","pk":false},{"name":"limits","type":"jsonb","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"feature_id","to_table":"features","to_col":"id"},{"from_col":"plan_id","to_table":"plans","to_col":"id"}]},"tenant_modules":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"module_id","type":"uuid","pk":false},{"name":"status","type":"text","pk":false},{"name":"settings","type":"jsonb","pk":false},{"name":"provider","type":"text","pk":false},{"name":"provider_item_id","type":"text","pk":false},{"name":"installed_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"module_id","to_table":"modules","to_col":"id"}]},"owner_users":{"columns":[{"name":"owner_id","type":"uuid","pk":false},{"name":"user_id","type":"uuid","pk":false},{"name":"role","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[]},"patient_contacts":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"patient_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"nome","type":"text","pk":false},{"name":"tipo","type":"text","pk":false},{"name":"relacao","type":"text","pk":false},{"name":"telefone","type":"text","pk":false},{"name":"email","type":"text","pk":false},{"name":"cpf","type":"text","pk":false},{"name":"especialidade","type":"text","pk":false},{"name":"registro_profissional","type":"text","pk":false},{"name":"is_primario","type":"boolean","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"patient_id","to_table":"patients","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"patient_discounts":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"discount_pct","type":"numeric","pk":false},{"name":"discount_flat","type":"numeric","pk":false},{"name":"reason","type":"text","pk":false},{"name":"active","type":"boolean","pk":false},{"name":"active_from","type":"timestamp with time zone","pk":false},{"name":"active_to","type":"timestamp with time zone","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"patient_id","to_table":"patients","to_col":"id"}]},"patient_group_patient":{"columns":[{"name":"patient_group_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"patient_id","to_table":"patients","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"patient_groups":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"nome","type":"text","pk":false},{"name":"descricao","type":"text","pk":false},{"name":"cor","type":"text","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"is_system","type":"boolean","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"therapist_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"patient_intake_requests":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"token","type":"text","pk":false},{"name":"consent","type":"boolean","pk":false},{"name":"status","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"converted_patient_id","type":"uuid","pk":false},{"name":"rejected_reason","type":"text","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"cpf","type":"text","pk":false},{"name":"rg","type":"text","pk":false},{"name":"cep","type":"text","pk":false},{"name":"nome_completo","type":"text","pk":false},{"name":"email_principal","type":"text","pk":false},{"name":"telefone","type":"text","pk":false},{"name":"pais","type":"text","pk":false},{"name":"cidade","type":"text","pk":false},{"name":"estado","type":"text","pk":false},{"name":"endereco","type":"text","pk":false},{"name":"numero","type":"text","pk":false},{"name":"bairro","type":"text","pk":false},{"name":"complemento","type":"text","pk":false},{"name":"data_nascimento","type":"date","pk":false},{"name":"naturalidade","type":"text","pk":false},{"name":"genero","type":"text","pk":false},{"name":"estado_civil","type":"text","pk":false},{"name":"onde_nos_conheceu","type":"text","pk":false},{"name":"encaminhado_por","type":"text","pk":false},{"name":"observacoes","type":"text","pk":false},{"name":"notas_internas","type":"text","pk":false},{"name":"email_alternativo","type":"text","pk":false},{"name":"telefone_alternativo","type":"text","pk":false},{"name":"profissao","type":"text","pk":false},{"name":"escolaridade","type":"text","pk":false},{"name":"nacionalidade","type":"text","pk":false},{"name":"avatar_url","type":"text","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"patient_invites":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"token","type":"text","pk":false},{"name":"active","type":"boolean","pk":false},{"name":"expires_at","type":"timestamp with time zone","pk":false},{"name":"max_uses","type":"integer","pk":false},{"name":"uses","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"patient_patient_tag":{"columns":[{"name":"owner_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"tag_id","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tag_id","to_table":"patient_tags","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"},{"from_col":"patient_id","to_table":"patients","to_col":"id"},{"from_col":"tag_id","to_table":"patient_tags","to_col":"id"}]},"patient_status_history":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"patient_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"status_anterior","type":"text","pk":false},{"name":"status_novo","type":"text","pk":false},{"name":"motivo","type":"text","pk":false},{"name":"encaminhado_para","type":"text","pk":false},{"name":"data_saida","type":"date","pk":false},{"name":"alterado_por","type":"uuid","pk":false},{"name":"alterado_em","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"patient_id","to_table":"patients","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"patient_support_contacts":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"patient_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"nome","type":"text","pk":false},{"name":"relacao","type":"text","pk":false},{"name":"tipo","type":"text","pk":false},{"name":"telefone","type":"text","pk":false},{"name":"email","type":"text","pk":false},{"name":"is_primario","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"patient_id","to_table":"patients","to_col":"id"}]},"patient_tags":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"nome","type":"text","pk":false},{"name":"cor","type":"text","pk":false},{"name":"is_padrao","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"patient_timeline":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"patient_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"evento_tipo","type":"text","pk":false},{"name":"titulo","type":"text","pk":false},{"name":"descricao","type":"text","pk":false},{"name":"icone_cor","type":"text","pk":false},{"name":"link_ref_tipo","type":"text","pk":false},{"name":"link_ref_id","type":"uuid","pk":false},{"name":"gerado_por","type":"uuid","pk":false},{"name":"ocorrido_em","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"patient_id","to_table":"patients","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"patients":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"nome_completo","type":"text","pk":false},{"name":"email_principal","type":"text","pk":false},{"name":"telefone","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"avatar_url","type":"text","pk":false},{"name":"status","type":"text","pk":false},{"name":"last_attended_at","type":"timestamp with time zone","pk":false},{"name":"is_native","type":"boolean","pk":false},{"name":"naturalidade","type":"text","pk":false},{"name":"data_nascimento","type":"date","pk":false},{"name":"rg","type":"text","pk":false},{"name":"cpf","type":"text","pk":false},{"name":"identification_color","type":"text","pk":false},{"name":"genero","type":"text","pk":false},{"name":"estado_civil","type":"text","pk":false},{"name":"email_alternativo","type":"text","pk":false},{"name":"pais","type":"text","pk":false},{"name":"cep","type":"text","pk":false},{"name":"cidade","type":"text","pk":false},{"name":"estado","type":"text","pk":false},{"name":"endereco","type":"text","pk":false},{"name":"numero","type":"text","pk":false},{"name":"bairro","type":"text","pk":false},{"name":"complemento","type":"text","pk":false},{"name":"escolaridade","type":"text","pk":false},{"name":"profissao","type":"text","pk":false},{"name":"nome_parente","type":"text","pk":false},{"name":"grau_parentesco","type":"text","pk":false},{"name":"telefone_alternativo","type":"text","pk":false},{"name":"onde_nos_conheceu","type":"text","pk":false},{"name":"encaminhado_por","type":"text","pk":false},{"name":"nome_responsavel","type":"text","pk":false},{"name":"telefone_responsavel","type":"text","pk":false},{"name":"cpf_responsavel","type":"text","pk":false},{"name":"observacao_responsavel","type":"text","pk":false},{"name":"cobranca_no_responsavel","type":"boolean","pk":false},{"name":"observacoes","type":"text","pk":false},{"name":"notas_internas","type":"text","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"telefone_parente","type":"text","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"responsible_member_id","type":"uuid","pk":false},{"name":"user_id","type":"uuid","pk":false},{"name":"patient_scope","type":"text","pk":false},{"name":"therapist_member_id","type":"uuid","pk":false},{"name":"nome_social","type":"text","pk":false},{"name":"pronomes","type":"text","pk":false},{"name":"etnia","type":"text","pk":false},{"name":"religiao","type":"text","pk":false},{"name":"faixa_renda","type":"text","pk":false},{"name":"canal_preferido","type":"text","pk":false},{"name":"horario_contato_inicio","type":"time without time zone","pk":false},{"name":"horario_contato_fim","type":"time without time zone","pk":false},{"name":"idioma","type":"text","pk":false},{"name":"origem","type":"text","pk":false},{"name":"metodo_pagamento_preferido","type":"text","pk":false},{"name":"motivo_saida","type":"text","pk":false},{"name":"data_saida","type":"date","pk":false},{"name":"encaminhado_para","type":"text","pk":false},{"name":"risco_elevado","type":"boolean","pk":false},{"name":"risco_nota","type":"text","pk":false},{"name":"risco_sinalizado_em","type":"timestamp with time zone","pk":false},{"name":"risco_sinalizado_por","type":"uuid","pk":false},{"name":"horario_contato","type":"text","pk":false},{"name":"convenio","type":"text","pk":false},{"name":"convenio_id","type":"uuid","pk":false}],"fks":[{"from_col":"convenio_id","to_table":"insurance_plans","to_col":"id"},{"from_col":"responsible_member_id","to_table":"tenant_members","to_col":"id"},{"from_col":"tenant_id","to_table":"tenants","to_col":"id"},{"from_col":"therapist_member_id","to_table":"tenant_members","to_col":"id"}]},"payment_settings":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"pix_ativo","type":"boolean","pk":false},{"name":"pix_tipo","type":"text","pk":false},{"name":"pix_chave","type":"text","pk":false},{"name":"pix_nome_titular","type":"text","pk":false},{"name":"deposito_ativo","type":"boolean","pk":false},{"name":"deposito_banco","type":"text","pk":false},{"name":"deposito_agencia","type":"text","pk":false},{"name":"deposito_conta","type":"text","pk":false},{"name":"deposito_tipo_conta","type":"text","pk":false},{"name":"deposito_titular","type":"text","pk":false},{"name":"deposito_cpf_cnpj","type":"text","pk":false},{"name":"dinheiro_ativo","type":"boolean","pk":false},{"name":"cartao_ativo","type":"boolean","pk":false},{"name":"cartao_instrucao","type":"text","pk":false},{"name":"convenio_ativo","type":"boolean","pk":false},{"name":"convenio_lista","type":"text","pk":false},{"name":"observacoes_pagamento","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"plan_prices":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"plan_id","type":"uuid","pk":false},{"name":"currency","type":"text","pk":false},{"name":"amount_cents","type":"integer","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"active_from","type":"timestamp with time zone","pk":false},{"name":"active_to","type":"timestamp with time zone","pk":false},{"name":"source","type":"text","pk":false},{"name":"provider","type":"text","pk":false},{"name":"provider_price_id","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"plan_id","to_table":"plans","to_col":"id"}]},"plan_public":{"columns":[{"name":"plan_id","type":"uuid","pk":false},{"name":"public_name","type":"text","pk":false},{"name":"public_description","type":"text","pk":false},{"name":"badge","type":"text","pk":false},{"name":"is_featured","type":"boolean","pk":false},{"name":"is_visible","type":"boolean","pk":false},{"name":"sort_order","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"plan_id","to_table":"plans","to_col":"id"}]},"plan_public_bullets":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"plan_id","type":"uuid","pk":false},{"name":"text","type":"text","pk":false},{"name":"sort_order","type":"integer","pk":false},{"name":"highlight","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"plan_id","to_table":"plans","to_col":"id"}]},"plans":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"key","type":"text","pk":false},{"name":"name","type":"text","pk":false},{"name":"description","type":"text","pk":false},{"name":"is_active","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"price_cents","type":"integer","pk":false},{"name":"currency","type":"text","pk":false},{"name":"billing_interval","type":"text","pk":false},{"name":"target","type":"text","pk":false},{"name":"max_supervisees","type":"integer","pk":false}],"fks":[]},"professional_pricing":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"determined_commitment_id","type":"uuid","pk":false},{"name":"price","type":"numeric","pk":false},{"name":"notes","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"profiles":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"role","type":"text","pk":false},{"name":"full_name","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"avatar_url","type":"text","pk":false},{"name":"phone","type":"text","pk":false},{"name":"bio","type":"text","pk":false},{"name":"language","type":"text","pk":false},{"name":"timezone","type":"text","pk":false},{"name":"notify_system_email","type":"boolean","pk":false},{"name":"notify_reminders","type":"boolean","pk":false},{"name":"notify_news","type":"boolean","pk":false},{"name":"account_type","type":"text","pk":false},{"name":"platform_roles","type":"text[]","pk":false},{"name":"nickname","type":"text","pk":false},{"name":"work_description","type":"text","pk":false},{"name":"work_description_other","type":"text","pk":false},{"name":"site_url","type":"text","pk":false},{"name":"social_instagram","type":"text","pk":false},{"name":"social_youtube","type":"text","pk":false},{"name":"social_facebook","type":"text","pk":false},{"name":"social_x","type":"text","pk":false},{"name":"social_custom","type":"jsonb","pk":false},{"name":"tenant_id","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"recurrence_exceptions":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"recurrence_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"original_date","type":"date","pk":false},{"name":"new_date","type":"date","pk":false},{"name":"new_start_time","type":"time without time zone","pk":false},{"name":"new_end_time","type":"time without time zone","pk":false},{"name":"modalidade","type":"text","pk":false},{"name":"observacoes","type":"text","pk":false},{"name":"titulo_custom","type":"text","pk":false},{"name":"extra_fields","type":"jsonb","pk":false},{"name":"reason","type":"text","pk":false},{"name":"agenda_evento_id","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"agenda_evento_id","to_table":"agenda_eventos","to_col":"id"},{"from_col":"recurrence_id","to_table":"recurrence_rules","to_col":"id"}]},"recurrence_rule_services":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"rule_id","type":"uuid","pk":false},{"name":"service_id","type":"uuid","pk":false},{"name":"quantity","type":"integer","pk":false},{"name":"unit_price","type":"numeric","pk":false},{"name":"discount_pct","type":"numeric","pk":false},{"name":"discount_flat","type":"numeric","pk":false},{"name":"final_price","type":"numeric","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"rule_id","to_table":"recurrence_rules","to_col":"id"},{"from_col":"service_id","to_table":"services","to_col":"id"}]},"recurrence_rules":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"therapist_id","type":"uuid","pk":false},{"name":"patient_id","type":"uuid","pk":false},{"name":"determined_commitment_id","type":"uuid","pk":false},{"name":"weekdays","type":"smallint[]","pk":false},{"name":"start_time","type":"time without time zone","pk":false},{"name":"end_time","type":"time without time zone","pk":false},{"name":"timezone","type":"text","pk":false},{"name":"duration_min","type":"smallint","pk":false},{"name":"start_date","type":"date","pk":false},{"name":"end_date","type":"date","pk":false},{"name":"max_occurrences","type":"integer","pk":false},{"name":"open_ended","type":"boolean","pk":false},{"name":"modalidade","type":"text","pk":false},{"name":"titulo_custom","type":"text","pk":false},{"name":"observacoes","type":"text","pk":false},{"name":"extra_fields","type":"jsonb","pk":false},{"name":"status","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"price","type":"numeric","pk":false},{"name":"insurance_plan_id","type":"uuid","pk":false},{"name":"insurance_guide_number","type":"text","pk":false},{"name":"insurance_value","type":"numeric","pk":false},{"name":"insurance_plan_service_id","type":"uuid","pk":false}],"fks":[{"from_col":"insurance_plan_id","to_table":"insurance_plans","to_col":"id"},{"from_col":"insurance_plan_service_id","to_table":"insurance_plan_services","to_col":"id"}]},"saas_admins":{"columns":[{"name":"user_id","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[]},"saas_doc_votos":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"doc_id","type":"uuid","pk":false},{"name":"user_id","type":"uuid","pk":false},{"name":"util","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"doc_id","to_table":"saas_docs","to_col":"id"}]},"saas_docs":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"titulo","type":"text","pk":false},{"name":"conteudo","type":"text","pk":false},{"name":"medias","type":"jsonb","pk":false},{"name":"tipo_acesso","type":"text","pk":false},{"name":"pagina_path","type":"text","pk":false},{"name":"docs_relacionados","type":"uuid[]","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"ordem","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"categoria","type":"text","pk":false},{"name":"exibir_no_faq","type":"boolean","pk":false},{"name":"votos_util","type":"integer","pk":false},{"name":"votos_nao_util","type":"integer","pk":false}],"fks":[]},"saas_faq":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"pergunta","type":"text","pk":false},{"name":"categoria","type":"text","pk":false},{"name":"publico","type":"boolean","pk":false},{"name":"votos","type":"integer","pk":false},{"name":"titulo","type":"text","pk":false},{"name":"conteudo","type":"text","pk":false},{"name":"tipo_acesso","type":"text","pk":false},{"name":"pagina_path","type":"text","pk":false},{"name":"pagina_label","type":"text","pk":false},{"name":"medias","type":"jsonb","pk":false},{"name":"faqs_relacionados","type":"uuid[]","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"ordem","type":"integer","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"saas_faq_itens":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"doc_id","type":"uuid","pk":false},{"name":"pergunta","type":"text","pk":false},{"name":"resposta","type":"text","pk":false},{"name":"ordem","type":"integer","pk":false},{"name":"ativo","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"doc_id","to_table":"saas_docs","to_col":"id"}]},"services":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"owner_id","type":"uuid","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"name","type":"text","pk":false},{"name":"description","type":"text","pk":false},{"name":"price","type":"numeric","pk":false},{"name":"duration_min","type":"integer","pk":false},{"name":"active","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[]},"subscription_events":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"subscription_id","type":"uuid","pk":false},{"name":"owner_id","type":"uuid","pk":false},{"name":"event_type","type":"text","pk":false},{"name":"old_plan_id","type":"uuid","pk":false},{"name":"new_plan_id","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"created_by","type":"uuid","pk":false},{"name":"source","type":"text","pk":false},{"name":"reason","type":"text","pk":false},{"name":"metadata","type":"jsonb","pk":false},{"name":"owner_type","type":"text","pk":false},{"name":"owner_ref","type":"uuid","pk":false}],"fks":[{"from_col":"subscription_id","to_table":"subscriptions","to_col":"id"}]},"subscription_intents_personal":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"user_id","type":"uuid","pk":false},{"name":"created_by_user_id","type":"uuid","pk":false},{"name":"email","type":"text","pk":false},{"name":"plan_id","type":"uuid","pk":false},{"name":"plan_key","type":"text","pk":false},{"name":"amount_cents","type":"integer","pk":false},{"name":"currency","type":"text","pk":false},{"name":"status","type":"text","pk":false},{"name":"source","type":"text","pk":false},{"name":"notes","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"paid_at","type":"timestamp with time zone","pk":false},{"name":"subscription_id","type":"uuid","pk":false}],"fks":[{"from_col":"subscription_id","to_table":"subscriptions","to_col":"id"},{"from_col":"plan_id","to_table":"plans","to_col":"id"}]},"subscription_intents_tenant":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"user_id","type":"uuid","pk":false},{"name":"created_by_user_id","type":"uuid","pk":false},{"name":"email","type":"text","pk":false},{"name":"plan_id","type":"uuid","pk":false},{"name":"plan_key","type":"text","pk":false},{"name":"amount_cents","type":"integer","pk":false},{"name":"currency","type":"text","pk":false},{"name":"status","type":"text","pk":false},{"name":"source","type":"text","pk":false},{"name":"notes","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"paid_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"subscription_id","type":"uuid","pk":false}],"fks":[{"from_col":"subscription_id","to_table":"subscriptions","to_col":"id"},{"from_col":"plan_id","to_table":"plans","to_col":"id"}]},"subscription_intents_legacy":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"user_id","type":"uuid","pk":false},{"name":"email","type":"text","pk":false},{"name":"plan_key","type":"text","pk":false},{"name":"amount_cents","type":"integer","pk":false},{"name":"currency","type":"text","pk":false},{"name":"status","type":"text","pk":false},{"name":"source","type":"text","pk":false},{"name":"notes","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"paid_at","type":"timestamp with time zone","pk":false},{"name":"tenant_id","type":"uuid","pk":false},{"name":"created_by_user_id","type":"uuid","pk":false}],"fks":[]},"support_sessions":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"admin_id","type":"uuid","pk":false},{"name":"token","type":"text","pk":false},{"name":"expires_at","type":"timestamp with time zone","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"tenant_feature_exceptions_log":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"feature_key","type":"text","pk":false},{"name":"enabled","type":"boolean","pk":false},{"name":"reason","type":"text","pk":false},{"name":"created_by","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[]},"tenant_features":{"columns":[{"name":"tenant_id","type":"uuid","pk":false},{"name":"feature_key","type":"text","pk":false},{"name":"enabled","type":"boolean","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"tenant_invites":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"email","type":"text","pk":false},{"name":"role","type":"text","pk":false},{"name":"token","type":"uuid","pk":false},{"name":"invited_by","type":"uuid","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"expires_at","type":"timestamp with time zone","pk":false},{"name":"accepted_at","type":"timestamp with time zone","pk":false},{"name":"accepted_by","type":"uuid","pk":false},{"name":"revoked_at","type":"timestamp with time zone","pk":false},{"name":"revoked_by","type":"uuid","pk":false}],"fks":[{"from_col":"tenant_id","to_table":"tenants","to_col":"id"}]},"tenants":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"name","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"kind","type":"text","pk":false},{"name":"papel_timbrado","type":"jsonb","pk":false}],"fks":[]},"therapist_payout_records":{"columns":[{"name":"payout_id","type":"uuid","pk":false},{"name":"financial_record_id","type":"uuid","pk":false}],"fks":[{"from_col":"financial_record_id","to_table":"financial_records","to_col":"id"},{"from_col":"payout_id","to_table":"therapist_payouts","to_col":"id"}]},"twilio_subaccount_usage":{"columns":[{"name":"id","type":"uuid","pk":true},{"name":"tenant_id","type":"uuid","pk":false},{"name":"channel_id","type":"uuid","pk":false},{"name":"twilio_subaccount_sid","type":"text","pk":false},{"name":"period_start","type":"date","pk":false},{"name":"period_end","type":"date","pk":false},{"name":"messages_sent","type":"integer","pk":false},{"name":"messages_delivered","type":"integer","pk":false},{"name":"messages_failed","type":"integer","pk":false},{"name":"cost_usd","type":"numeric","pk":false},{"name":"cost_brl","type":"numeric","pk":false},{"name":"revenue_brl","type":"numeric","pk":false},{"name":"margin_brl","type":"numeric","pk":false},{"name":"usd_brl_rate","type":"numeric","pk":false},{"name":"synced_at","type":"timestamp with time zone","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false}],"fks":[{"from_col":"channel_id","to_table":"notification_channels","to_col":"id"}]},"user_settings":{"columns":[{"name":"user_id","type":"uuid","pk":false},{"name":"theme_mode","type":"text","pk":false},{"name":"preset","type":"text","pk":false},{"name":"primary_color","type":"text","pk":false},{"name":"surface_color","type":"text","pk":false},{"name":"menu_mode","type":"text","pk":false},{"name":"created_at","type":"timestamp with time zone","pk":false},{"name":"updated_at","type":"timestamp with time zone","pk":false},{"name":"layout_variant","type":"text","pk":false}],"fks":[]}},"views":["current_tenant_id","owner_feature_entitlements","subscription_intents","v_auth_users_public","v_commitment_totals","v_patient_groups_with_counts","v_plan_active_prices","v_public_pricing","v_subscription_feature_mismatch","v_subscription_health","v_subscription_health_v2","v_tag_patient_counts","v_tenant_active_subscription","v_tenant_entitlements","v_tenant_entitlements_full","v_tenant_entitlements_json","v_tenant_feature_exceptions","v_tenant_feature_mismatch","v_tenant_members_with_profiles","v_tenant_people","v_tenant_staff","v_twilio_whatsapp_overview","v_user_active_subscription","v_user_entitlements"],"domains":{"SaaS / Planos":["plans","plan_features","plan_prices","plan_public","plan_public_bullets","features","modules","module_features","subscriptions","subscription_events","subscription_intents_legacy","subscription_intents_personal","subscription_intents_tenant","tenant_modules","tenant_features","tenant_feature_exceptions_log","billing_contracts","entitlements_invalidation"],"Addons / Créditos":["addon_products","addon_credits","addon_transactions"],"Tenants / Multi-tenant":["tenants","profiles","user_settings","tenant_invites","tenant_members","company_profiles","support_sessions","saas_admins","owner_users","dev_user_credentials"],"Pacientes":["patients","patient_contacts","patient_support_contacts","patient_groups","patient_group_patient","patient_tags","patient_patient_tag","patient_discounts","patient_intake_requests","patient_invites","patient_status_history","patient_timeline"],"Agenda / Agendamento":["agenda_eventos","agenda_bloqueios","agenda_configuracoes","agenda_excecoes","agenda_online_slots","agenda_regras_semanais","agenda_slots_bloqueados_semanais","agenda_slots_regras","agendador_configuracoes","agendador_solicitacoes"],"Financeiro":["financial_categories","financial_exceptions","financial_records","payment_settings","professional_pricing","therapist_payouts","therapist_payout_records","recurrence_rules","recurrence_exceptions","recurrence_rule_services"],"Serviços / Prontuários":["services","commitment_services","commitment_time_logs","determined_commitments","determined_commitment_fields","insurance_plans","insurance_plan_services","medicos"],"Documentos":["documents","document_templates","document_generated","document_access_logs","document_share_links","document_signatures"],"Comunicação / Notificações":["email_templates_global","email_templates_tenant","email_layout_config","notification_templates","notification_channels","notification_preferences","notification_logs","notification_schedules","notification_queue","notifications","notice_dismissals","global_notices","login_carousel_slides","twilio_subaccount_usage"],"Central SaaS (docs/FAQ)":["saas_docs","saas_doc_votos","saas_faq","saas_faq_itens"],"Estrutura / Calendário":["feriados"]},"slugs":{"SaaS / Planos":"saas-planos","Addons / Créditos":"addons-creditos","Tenants / Multi-tenant":"tenants-multi-tenant","Pacientes":"pacientes","Agenda / Agendamento":"agenda-agendamento","Financeiro":"financeiro","Serviços / Prontuários":"servicos-prontuarios","Documentos":"documentos","Comunicação / Notificações":"comunicacao-notificacoes","Central SaaS (docs/FAQ)":"central-saas-docs-faq","Estrutura / Calendário":"estrutura-calendario"}};
|
|
const C={"SaaS / Planos":"#4f8cff","Addons / Créditos":"#a78bfa","Tenants / Multi-tenant":"#6ee7b7","Pacientes":"#f472b6","Agenda / Agendamento":"#38bdf8","Financeiro":"#f87171","Serviços / Prontuários":"#34d399","Documentos":"#0ea5e9","Comunicação / Notificações":"#fbbf24","Central SaaS (docs/FAQ)":"#c084fc","Estrutura / Calendário":"#fb923c"};
|
|
const INFRA={"Banco & Backend":{"color":"#4f8cff","items":[{"name":"Supabase","role":"Postgres + Auth + Storage + Realtime + Edge Functions","env":"Local (Docker) + Cloud","status":"ativo","notes":"Stack principal. Migrations em database-novo/migrations/. Functions em supabase/functions/. CLI via npx supabase."},{"name":"PostgreSQL 15","role":"Banco de dados relacional (via container supabase_db_agenciapsi-primesakai)","env":"Local (Docker)","status":"ativo","notes":"RLS habilitada em todas as tabelas públicas. Multi-tenant via tenant_id. SECURITY DEFINER em RPCs sensíveis."},{"name":"Docker + Docker Compose","role":"Orquestração dos containers do stack Supabase local + Evolution API","env":"Local","status":"ativo","notes":"docker-compose.yml na raiz. Iniciado via npx supabase start."}]},"Email":{"color":"#fbbf24","items":[{"name":"Mailpit (Supabase inbucket)","role":"Inbox SMTP local para capturar emails de teste","env":"Local (Docker)","status":"ativo","notes":"Container supabase_inbucket. Usado em dev para validar templates sem enviar email real."},{"name":"SMTP produção","role":"Envio real de emails transacionais (faturas, convites, notificações)","env":"Cloud (pendente)","status":"pendente","notes":"Requer SMTP_HOST/PORT/USER/PASS/FROM nos secrets das edge functions."}]},"WhatsApp / SMS":{"color":"#34d399","items":[{"name":"Evolution API","role":"Integração WhatsApp Business (envio/recebimento)","env":"Local (Docker)","status":"ativo","notes":"Container via evolution-api/. whatsapp_instances e notification_channels já cadastrados. Integração real está sendo costurada."},{"name":"Twilio (SMS/Voz)","role":"Provedor de SMS e voz para notificações","env":"Cloud","status":"ativo","notes":"twilio_subaccount_usage rastreia consumo por tenant. SaasTwilioWhatsappPage gerencia contas."}]},"Geração de documentos":{"color":"#38bdf8","items":[{"name":"pdfmake 0.3.7","role":"Geração de PDF client-side (atestados, laudos, recibos)","env":"Browser","status":"ativo","notes":"UMD/webpack. Requer optimizeDeps.include explícito no vite.config.mjs."},{"name":"html-to-pdfmake / html2pdf.js / jsPDF","role":"Conversão HTML→PDF para documentos ricos","env":"Browser","status":"ativo","notes":"Usado em document_templates e documents gerados para pacientes."},{"name":"Jodit + Quill","role":"Editores de texto rico para templates de documentos","env":"Browser","status":"ativo","notes":"Jodit em DocumentTemplateEditor; Quill em páginas legadas. Migração em andamento."},{"name":"html2canvas-pro","role":"Captura de screenshots de DOM (preview/export)","env":"Browser","status":"ativo","notes":"Usado para thumbnails de templates e previews."}]},"Frontend":{"color":"#a78bfa","items":[{"name":"Vue 3 + Composition API","role":"Framework principal (script setup)","env":"Browser","status":"ativo","notes":"~487 componentes Vue. Pinia para state management."},{"name":"Vite 5","role":"Build tool e dev server","env":"Node.js","status":"ativo","notes":"vite-plugin-compression (Brotli/Gzip), unplugin-auto-import para PrimeVue e Vue. rollup-plugin-visualizer para análise de bundle."},{"name":"PrimeVue 4 (tema Sakai)","role":"Biblioteca de componentes UI","env":"Browser","status":"ativo","notes":"@primeuix/themes. auto-import-resolver. DataTable, Dialog, DatePicker, Popover, Toast, ConfirmDialog headless."},{"name":"Tailwind CSS v4","role":"Utility-first CSS","env":"Browser","status":"ativo","notes":"@tailwindcss/vite + tailwindcss-primeui. Surface tokens do PrimeVue (var(--surface-card), var(--text-color-secondary))."},{"name":"Vue Router","role":"Roteamento SPA com guards por role/tenant","env":"Browser","status":"ativo","notes":"Grupos de rota: therapist, admin, supervisor, saas, billing, account, configuracoes, features."},{"name":"FullCalendar 6","role":"Calendário para agenda de terapeutas","env":"Browser","status":"ativo","notes":"Plugins: daygrid, timegrid, interaction, list, resource, resource-timegrid."},{"name":"Chart.js 3","role":"Gráficos para dashboards (financeiro, KPIs)","env":"Browser","status":"ativo","notes":"Usado em dashboards do therapist e clinic."}]},"Dev / Tooling":{"color":"#94a3b8","items":[{"name":"Supabase CLI","role":"Gerencia ambiente local, migrations, edge functions","env":"Node.js","status":"ativo","notes":"Via npx supabase. Start/stop/status/db-push/functions-deploy."},{"name":"db.cjs (este projeto)","role":"CLI auxiliar pra setup/backup/restore/migrate/verify via docker exec","env":"Node.js","status":"ativo","notes":"Complementa o supabase CLI com fluxo schema + fixes + seeds + migrations. Encoding UTF-8 preservado."},{"name":"generate-dashboard.cjs","role":"Gera dashboard HTML estático do schema (tabelas, FKs, infra)","env":"Node.js","status":"ativo","notes":"Standalone, sem dependências externas. Lê config de db.config.json e schema do backup mais recente."},{"name":"Vitest 4","role":"Runner de testes unitários","env":"Node.js","status":"ativo","notes":"npm test / test:watch / test:ui. Bateria inicial em src/**/__tests__."},{"name":"ESLint + Prettier","role":"Lint + formatação automática","env":"Node.js","status":"ativo","notes":"@vue/eslint-config-prettier. Rodado via npm run lint."}]}};
|
|
const INFRA_GROUPS=6;
|
|
const INFRA_ITEMS=23;
|
|
const T2D={};
|
|
Object.entries(D.domains).forEach(([d,ts])=>ts.forEach(t=>T2D[t]=d));
|
|
let dom=null,view='overview',q='';
|
|
function gc(d){return C[d]||'#6b7280';}
|
|
function escapeHtml(s){return String(s||'').replace(/[&<>"']/g,m=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[m]));}
|
|
|
|
function buildSB(){
|
|
let h=`<div class="sb-h">Visão Geral</div>
|
|
<div class="sb-i ${view==='overview'&&!dom?'active':''}" onclick="selOverview()">
|
|
<div class="sb-dot" style="background:#6366f1"></div>Todos (tabelas)
|
|
<span class="sb-c">${Object.keys(D.tables).length}</span>
|
|
</div>
|
|
<div class="sb-i ${view==='infra'?'active':''}" onclick="selInfra()">
|
|
<div class="sb-dot" style="background:#fbbf24"></div>Infraestrutura
|
|
<span class="sb-c">${INFRA_ITEMS}</span>
|
|
</div>
|
|
<div class="sb-h" style="margin-top:8px">Domínios</div>`;
|
|
for(const[d,ts]of Object.entries(D.domains)){
|
|
h+=`<div class="sb-i ${dom===d?'active':''}" onclick="scrollToDomain(`+JSON.stringify(d)+`)">
|
|
<div class="sb-dot" style="background:${gc(d)}"></div>${escapeHtml(d)}
|
|
<span class="sb-c">${ts.length}</span>
|
|
</div>`;
|
|
}
|
|
h+=`<div class="sb-i" onclick="scrollToViews()">
|
|
<div class="sb-dot" style="background:#6ee7b7"></div>Views
|
|
<span class="sb-c">${D.views.length}</span>
|
|
</div>`;
|
|
document.getElementById('sb').innerHTML=h;
|
|
}
|
|
|
|
function buildMN(){
|
|
const mn=document.getElementById('mn');
|
|
let h='';
|
|
if(q){
|
|
const matches=Object.entries(D.tables).filter(([n,t])=>n.includes(q)||t.columns.some(c=>c.name.includes(q)));
|
|
h+=`<div class="section"><div class="sec-h"><div class="sec-t">"${escapeHtml(q)}"</div><div class="sec-b">${matches.length} tabelas</div></div><div class="tgrid">`;
|
|
h+=matches.length?matches.map(([n,t])=>card(n,t,q)).join(''):'<div class="empty">Nenhum resultado.</div>';
|
|
h+='</div></div>';
|
|
} else if(view==='infra'){
|
|
h+=`<div class="overview"><div class="ov-t">Infraestrutura</div>
|
|
<div class="ov-s">Serviços, bibliotecas e ferramentas que o sistema usa · ${INFRA_GROUPS} grupos · ${INFRA_ITEMS} itens</div></div>
|
|
<div class="section">`;
|
|
for(const[grupo,info]of Object.entries(INFRA)){
|
|
const color=info.color||'#6b7280';
|
|
h+=`<div class="igroup">
|
|
<div class="igroup-h">
|
|
<div class="igroup-c" style="background:${color}"></div>
|
|
<div class="igroup-t" style="color:${color}">${escapeHtml(grupo)}</div>
|
|
<div class="sec-b">${info.items.length} itens</div>
|
|
</div>
|
|
<div class="igrid">${info.items.map(item=>infraCard(item,color)).join('')}</div>
|
|
</div>`;
|
|
}
|
|
h+='</div>';
|
|
} else {
|
|
const ds=dom?{[dom]:D.domains[dom]}:D.domains;
|
|
if(!dom){
|
|
h+=`<div class="overview"><div class="ov-t">AgenciaPsi — Banco de Dados</div>
|
|
<div class="ov-s">Schema público · ${Object.keys(D.tables).length} tabelas · ${Object.values(D.tables).reduce((a,t)=>a+t.fks.length,0)} FKs · ${D.views.length} views</div>
|
|
<div class="dgrid">`;
|
|
for(const[d,ts]of Object.entries(D.domains)){
|
|
const fks=ts.reduce((a,t)=>a+(D.tables[t]?.fks?.length||0),0);
|
|
h+=`<div class="dc" style="--c:${gc(d)}" onclick="scrollToDomain(`+JSON.stringify(d)+`)">
|
|
<div class="dc-n">${escapeHtml(d)}</div>
|
|
<div class="dc-m"><span style="color:${gc(d)}">${ts.length}</span> tabelas · ${fks} FKs</div>
|
|
</div>`;
|
|
}
|
|
h+='</div></div>';
|
|
}
|
|
for(const[d,ts]of Object.entries(ds)){
|
|
h+=`<div class="section" id="dom-${D.slugs[d]||''}"><div class="sec-h">
|
|
<div class="sec-t" style="color:${gc(d)}">${escapeHtml(d)}</div>
|
|
<div class="sec-b">${ts.length} tabelas</div>
|
|
</div><div class="tgrid">`;
|
|
ts.forEach(n=>{if(D.tables[n])h+=card(n,D.tables[n],'');});
|
|
h+='</div></div>';
|
|
}
|
|
if(!dom){
|
|
h+=`<div class="vsec" id="dom-views"><div class="sec-h">
|
|
<div class="sec-t" style="color:#6ee7b7">Views</div>
|
|
<div class="sec-b">${D.views.length}</div>
|
|
</div><div class="vgrid">${D.views.map(v=>`<div class="vc">${v}</div>`).join('')}</div></div>`;
|
|
}
|
|
}
|
|
mn.innerHTML=h;
|
|
}
|
|
|
|
function infraCard(item,color){
|
|
const status=(item.status||'ativo').toLowerCase();
|
|
return `<div class="ic" style="--c:${color}">
|
|
<div class="ic-h">
|
|
<div class="ic-n">${escapeHtml(item.name)}</div>
|
|
<div class="ic-st ${status}">${escapeHtml(item.status||'ativo')}</div>
|
|
</div>
|
|
<div class="ic-r">${escapeHtml(item.role||'')}</div>
|
|
${item.env?`<div class="ic-e">${escapeHtml(item.env)}</div>`:''}
|
|
${item.notes?`<div class="ic-nt">${escapeHtml(item.notes)}</div>`:''}
|
|
</div>`;
|
|
}
|
|
|
|
function card(name,t,hl){
|
|
const fkCols=new Set(t.fks.map(f=>f.from_col));
|
|
const c=gc(T2D[name]);
|
|
const cols=t.columns.map(col=>{
|
|
let n=col.name;
|
|
if(hl&&n.includes(hl))n=n.replace(new RegExp(`(${hl})`,'gi'),'<mark>$1</mark>');
|
|
const b=col.pk?'pk':fkCols.has(col.name)?'fk':'x';
|
|
const l=col.pk?'PK':fkCols.has(col.name)?'FK':'';
|
|
return `<div class="cr"><span class="bdg ${b}">${l}</span><span class="cn">${n}</span><span class="ct">${col.type}</span></div>`;
|
|
}).join('');
|
|
const fks=t.fks.length?`<div class="fksec"><div class="fkt">Foreign Keys</div>${
|
|
t.fks.map(f=>`<div class="fkr"><span>${f.from_col}</span><span class="fka">→</span><span class="fkl" onclick="jump('${f.to_table}')">${f.to_table}.${f.to_col}</span></div>`).join('')
|
|
}</div>`:'';
|
|
return `<div class="tc ${hl&&name.includes(hl)?'hl':''}" id="tc-${name}">
|
|
<div class="tc-h" onclick="tog('${name}')">
|
|
<div style="width:8px;height:8px;border-radius:50%;background:${c};flex-shrink:0"></div>
|
|
<div class="tc-n">${name}</div>
|
|
<span class="tc-m">${t.columns.length} cols</span>
|
|
${t.fks.length?`<span class="tc-f">${t.fks.length} FK</span>`:''}
|
|
<span class="tc-tg" id="tg-${name}">▼</span>
|
|
</div>
|
|
<div class="tc-b" id="bd-${name}"><div class="cols">${cols}</div>${fks}</div>
|
|
</div>`;
|
|
}
|
|
|
|
function tog(n){
|
|
document.getElementById('bd-'+n)?.classList.toggle('open');
|
|
document.getElementById('tg-'+n)?.classList.toggle('open');
|
|
}
|
|
function sel(d){
|
|
dom=d;view='overview';q='';document.getElementById('si').value='';
|
|
buildSB();buildMN();document.getElementById('mn').scrollTop=0;
|
|
}
|
|
function scrollToDomain(d){
|
|
// Sempre ir pra overview (com todos os domínios visíveis) antes de scrollar
|
|
const needRebuild=view!=='overview'||dom!==null||q;
|
|
if(needRebuild){
|
|
dom=null;view='overview';q='';
|
|
document.getElementById('si').value='';
|
|
buildSB();buildMN();
|
|
}
|
|
setTimeout(()=>{
|
|
const el=document.getElementById('dom-'+(D.slugs[d]||''));
|
|
if(el) el.scrollIntoView({behavior:'smooth',block:'start'});
|
|
}, needRebuild?80:0);
|
|
}
|
|
function scrollToViews(){
|
|
const needRebuild=view!=='overview'||dom!==null||q;
|
|
if(needRebuild){
|
|
dom=null;view='overview';q='';
|
|
document.getElementById('si').value='';
|
|
buildSB();buildMN();
|
|
}
|
|
setTimeout(()=>{
|
|
const el=document.getElementById('dom-views');
|
|
if(el) el.scrollIntoView({behavior:'smooth',block:'start'});
|
|
}, needRebuild?80:0);
|
|
}
|
|
function selOverview(){
|
|
dom=null;view='overview';q='';document.getElementById('si').value='';
|
|
buildSB();buildMN();document.getElementById('mn').scrollTop=0;
|
|
}
|
|
function selInfra(){
|
|
dom=null;view='infra';q='';document.getElementById('si').value='';
|
|
buildSB();buildMN();document.getElementById('mn').scrollTop=0;
|
|
}
|
|
function jump(name){
|
|
dom=T2D[name]||null;view='overview';q='';document.getElementById('si').value='';
|
|
buildSB();buildMN();
|
|
setTimeout(()=>{
|
|
const el=document.getElementById('tc-'+name);
|
|
if(!el)return;
|
|
el.scrollIntoView({behavior:'smooth',block:'center'});
|
|
const bd=document.getElementById('bd-'+name);
|
|
const tg=document.getElementById('tg-'+name);
|
|
if(bd&&!bd.classList.contains('open')){bd.classList.add('open');tg?.classList.add('open');}
|
|
el.style.borderColor='#6366f1';
|
|
setTimeout(()=>el.style.borderColor='',2000);
|
|
},80);
|
|
}
|
|
let st;
|
|
function search(v){
|
|
clearTimeout(st);q=v.trim();
|
|
st=setTimeout(()=>{dom=null;view='overview';buildSB();buildMN();},200);
|
|
}
|
|
buildSB();buildMN();
|
|
</script>
|
|
</body>
|
|
</html> |