From 7c20b518d41a2ed3eeb212991e04753b49bbe7e3 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sun, 19 Apr 2026 15:42:46 -0300 Subject: [PATCH] Sessoes 1-6 acumuladas: hardening B2, defesa em camadas, +192 testes 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) --- .claude/settings.local.json | 53 - .gitignore | 13 +- DOCKER-SETUP.md | 138 + HANDOFF.md | 174 + commit.md | 237 + database-novo/agenciapsi-db-dashboard.html | 705 +- database-novo/db.cjs | 607 +- database-novo/db.config.json | 316 +- database-novo/generate-dashboard.cjs | 413 +- .../migrations/20260417000001_dev_tables.sql | 275 + .../20260417000002_dev_tables_ordem.sql | 48 + .../20260418000001_dev_verificacoes.sql | 51 + ...0002_patient_intake_security_hardening.sql | 403 + ...0418000003_patient_invite_attempts_log.sql | 280 + .../migrations/20260418000004_dev_tests.sql | 149 + .../20260418000005_saas_rls_emergency_fix.sql | 167 + ...19000001_tenant_features_b2_governance.sql | 214 + .../20260419000002_features_is_active.sql | 21 + .../20260419000003_delete_plan_safe.sql | 69 + .../20260419000004_consolidate_policies.sql | 46 + .../20260419000005_restrict_intake_rpc.sql | 29 + .../20260419000006_layered_bot_defense.sql | 136 + .../20260419000007_bot_defense_rpcs.sql | 299 + .../20260419000008_saas_twilio_config.sql | 155 + ...60419000009_patient_session_counts_rpc.sql | 34 + ...419000010_documents_security_hardening.sql | 304 + database-novo/schema/00_full/schema.sql | 13214 +++++----------- .../schema/01_extensions/extensions.sql | 252 +- database-novo/schema/02_types/auth_types.sql | 123 - database-novo/schema/02_types/infra_types.sql | 88 - .../schema/02_types/public_types.sql | 137 - database-novo/schema/03_functions/_all.sql | 6302 ++++++++ database-novo/schema/03_functions/agenda.sql | 650 - database-novo/schema/03_functions/auth.sql | 56 +- database-novo/schema/03_functions/billing.sql | 1283 -- database-novo/schema/03_functions/core.sql | 2350 --- .../{infra.sql => extensions.sql} | 99 +- .../schema/03_functions/financial.sql | 818 - database-novo/schema/03_functions/misc.sql | 776 - .../schema/03_functions/notifications.sql | 404 - .../schema/03_functions/patients.sql | 433 - .../schema/03_functions/pgbouncer.sql | 22 + database-novo/schema/03_functions/public.sql | 4546 ++++++ .../schema/03_functions/realtime.sql | 91 +- database-novo/schema/03_functions/storage.sql | 112 +- .../03_functions/supabase_functions.sql | 14 +- .../schema/04_tables/addons_cr_ditos.sql | 66 + .../{agenda.sql => agenda_agendamento.sql} | 213 +- database-novo/schema/04_tables/auth.sql | 608 - .../04_tables/central_saas_docs_faq.sql | 61 + ...cations.sql => comunica_o_notifica_es.sql} | 219 +- database-novo/schema/04_tables/documentos.sql | 117 + .../schema/04_tables/estrutura_calend_rio.sql | 18 + .../{financial.sql => financeiro.sql} | 175 +- database-novo/schema/04_tables/infra.sql | 500 - database-novo/schema/04_tables/outros.sql | 11 + .../04_tables/{patients.sql => pacientes.sql} | 332 +- database-novo/schema/04_tables/saas_admin.sql | 204 - .../{plans_billing.sql => saas_planos.sql} | 447 +- ...mmitments.sql => servi_os_prontu_rios.sql} | 130 +- .../{core.sql => tenants_multi_tenant.sql} | 217 +- database-novo/schema/05_views/views.sql | 308 +- database-novo/schema/06_indexes/indexes.sql | 1676 +- .../schema/07_foreign_keys/constraints.sql | 1987 +-- database-novo/schema/08_triggers/triggers.sql | 354 +- database-novo/schema/09_policies/policies.sql | 1874 +-- database-novo/schema/10_grants/grants.sql | 6534 -------- .../seeds/seed_030_dev_phases_items.sql | 229 + .../seeds/seed_031_dev_auditoria.sql | 142 + .../seeds/seed_032_dev_competitors.sql | 271 + database-novo/supabase/backup_full.sql | Bin 0 -> 234104 bytes database-novo/supabase/backup_postgres.sql | Bin 0 -> 8226 bytes .../supabase/backup_volume_agenciapsi.tar.gz | Bin 0 -> 13144396 bytes database-novo/tests/run.cjs | 405 + development/01-visao-geral/ESTRUTURA.md | 223 + .../01-visao-geral/estrutura.txt | Bin development/01-visao-geral/mapa-sistema.html | 741 + .../02-auditoria/AUDITORIA.md | 0 development/03-concorrentes/concorrentes.md | 740 + development/04-roadmap/ROADMAP.md | 278 + development/05-database/README.md | 33 + development/PENDENTE.md | 170 + development/README.md | 53 + diagrama-visualizacao-dados.webp | Bin 0 -> 89664 bytes docker-compose.yml | 42 + e2e/patient-intake.spec.js | 149 + package-lock.json | 94 + package.json | 4 + playwright.config.js | 43 + src/app/__tests__/session.spec.js | 219 + src/app/session.js | 47 +- .../security/MathCaptchaChallenge.vue | 96 + src/composables/useAgendaFinanceiro.js | 4 +- .../agenda/components/AgendaEventDialog.vue | 20 +- .../agenda/components/BloqueioDialog.vue | 6 +- .../components/ProximosFeriadosCard.vue | 4 +- .../__tests__/useAgendaEvents.spec.js | 155 + .../agenda/composables/useAgendaEvents.js | 148 +- .../agenda/composables/useRecurrence.js | 67 +- .../agenda/pages/AgendaClinicaPage.vue | 2 +- .../agenda/pages/AgendaTerapeutaPage.vue | 2 +- .../services/__tests__/agendaMappers.spec.js | 4 +- src/features/agenda/services/_tenantGuards.js | 33 + .../agenda/services/agenda.service.js | 16 - .../agenda/services/agendaClinicRepository.js | 42 +- src/features/agenda/services/agendaMappers.js | 4 +- .../agenda/services/agendaRepository.js | 234 +- src/features/agenda/services/agendaSelects.js | 50 + .../pages/FinanceiroDashboardPage.vue | 12 +- .../financeiro/pages/FinanceiroPage.vue | 8 +- src/features/patients/PatientsListPage.vue | 92 +- .../cadastro/PatientsCadastroPage - Bkp.vue | 965 -- .../PatientsCadastroPage--preview.vue | 679 - .../cadastro/PatientsCadastroPage.vue | 48 +- .../cadastro/PatientsExternalLinkPage.vue | 50 +- .../recebidos/CadastrosRecebidosPage.vue | 7 +- .../PatientProntuario - design1.vue | 1101 -- .../PatientProntuario - design2.vue | 1101 -- .../PatientProntuario - design3.vue | 667 - src/features/patients/tags/TagsPage.vue | 9 +- src/navigation/menus/saas.menu.js | 8 + src/router/__tests__/guards.spec.js | 169 + src/router/guards.js | 240 +- src/router/index.js | 3 +- src/router/routes.saas.js | 22 + src/services/DocumentShareLinks.service.js | 45 +- src/services/twilioWhatsappService.js | 55 +- .../__tests__/tenantFeaturesStore.spec.js | 219 + src/stores/__tests__/tenantStore.spec.js | 273 + src/stores/entitlementsStore.js | 22 +- src/stores/tenantFeaturesStore.js | 103 +- src/stores/tenantStore.js | 57 +- src/utils/__tests__/roleNormalizer.spec.js | 83 + src/utils/__tests__/validators.spec.js | 251 + src/utils/roleNormalizer.js | 43 + src/views/pages/clinic/ClinicDashboard.vue | 20 +- .../clinic/clinic/ClinicFeaturesPage.vue | 15 +- .../pages/public/CadastroPacienteExterno.vue | 379 +- .../pages/public/Landingpage-v1 - bkp.vue | 423 - .../pages/public/PatientsExternalLinkPage.vue | 142 - src/views/pages/saas/SaasDashboard.vue | 3 +- src/views/pages/saas/SaasDocsPage.vue | 4 - src/views/pages/saas/SaasFeaturesPage.vue | 56 +- src/views/pages/saas/SaasPlansPage.vue | 24 +- src/views/pages/saas/SaasSecurityPage.vue | 493 + src/views/pages/saas/SaasSupportPage.vue | 33 +- .../pages/saas/SaasTenantFeaturesPage.vue | 322 + src/views/pages/saas/SaasTwilioConfigPage.vue | 346 + .../pages/saas/SaasTwilioWhatsappPage.vue | 7 +- .../pages/saas/SubscriptionIntentsPage.vue | 11 +- .../saas/development/DevAuditoriaTab.vue | 662 + .../saas/development/DevCompetitorsTab.vue | 1087 ++ .../pages/saas/development/DevDatabaseTab.vue | 381 + .../saas/development/DevEstruturaTab.vue | 140 + .../pages/saas/development/DevExportTab.vue | 180 + .../pages/saas/development/DevOverviewTab.vue | 458 + .../pages/saas/development/DevRoadmapTab.vue | 794 + .../pages/saas/development/DevTestsTab.vue | 731 + .../saas/development/DevVerificacoesTab.vue | 732 + .../saas/development/SaasDevelopmentPage.vue | 139 + .../development/components/BlocoItems.vue | 227 + .../saas/development/components/DevDrawer.vue | 234 + .../saas/development/components/DevField.vue | 72 + .../composables/useDraggableList.js | 98 + .../pages/therapist/TherapistDashboard.vue | 20 +- .../functions/notification-webhook/index.js | 298 + .../functions/process-email-queue/index.ts | 345 + .../process-notification-queue/index.ts | 284 + supabase/functions/process-sms-queue/index.ts | 318 + .../functions/process-whatsapp-queue/index.ts | 304 + .../functions/submit-patient-intake/index.js | 210 + .../functions/sync-email-templates/index.ts | 135 + supabase/functions/test-sms-channel/index.ts | 163 + .../twilio-whatsapp-provision/index.ts | 632 + .../twilio-whatsapp-webhook/index.ts | 112 + 175 files changed, 37325 insertions(+), 37968 deletions(-) delete mode 100644 .claude/settings.local.json create mode 100644 DOCKER-SETUP.md create mode 100644 HANDOFF.md create mode 100644 commit.md create mode 100644 database-novo/migrations/20260417000001_dev_tables.sql create mode 100644 database-novo/migrations/20260417000002_dev_tables_ordem.sql create mode 100644 database-novo/migrations/20260418000001_dev_verificacoes.sql create mode 100644 database-novo/migrations/20260418000002_patient_intake_security_hardening.sql create mode 100644 database-novo/migrations/20260418000003_patient_invite_attempts_log.sql create mode 100644 database-novo/migrations/20260418000004_dev_tests.sql create mode 100644 database-novo/migrations/20260418000005_saas_rls_emergency_fix.sql create mode 100644 database-novo/migrations/20260419000001_tenant_features_b2_governance.sql create mode 100644 database-novo/migrations/20260419000002_features_is_active.sql create mode 100644 database-novo/migrations/20260419000003_delete_plan_safe.sql create mode 100644 database-novo/migrations/20260419000004_consolidate_policies.sql create mode 100644 database-novo/migrations/20260419000005_restrict_intake_rpc.sql create mode 100644 database-novo/migrations/20260419000006_layered_bot_defense.sql create mode 100644 database-novo/migrations/20260419000007_bot_defense_rpcs.sql create mode 100644 database-novo/migrations/20260419000008_saas_twilio_config.sql create mode 100644 database-novo/migrations/20260419000009_patient_session_counts_rpc.sql create mode 100644 database-novo/migrations/20260419000010_documents_security_hardening.sql delete mode 100644 database-novo/schema/02_types/auth_types.sql delete mode 100644 database-novo/schema/02_types/infra_types.sql delete mode 100644 database-novo/schema/02_types/public_types.sql create mode 100644 database-novo/schema/03_functions/_all.sql delete mode 100644 database-novo/schema/03_functions/agenda.sql delete mode 100644 database-novo/schema/03_functions/billing.sql delete mode 100644 database-novo/schema/03_functions/core.sql rename database-novo/schema/03_functions/{infra.sql => extensions.sql} (75%) delete mode 100644 database-novo/schema/03_functions/financial.sql delete mode 100644 database-novo/schema/03_functions/misc.sql delete mode 100644 database-novo/schema/03_functions/notifications.sql delete mode 100644 database-novo/schema/03_functions/patients.sql create mode 100644 database-novo/schema/03_functions/pgbouncer.sql create mode 100644 database-novo/schema/03_functions/public.sql create mode 100644 database-novo/schema/04_tables/addons_cr_ditos.sql rename database-novo/schema/04_tables/{agenda.sql => agenda_agendamento.sql} (68%) delete mode 100644 database-novo/schema/04_tables/auth.sql create mode 100644 database-novo/schema/04_tables/central_saas_docs_faq.sql rename database-novo/schema/04_tables/{notifications.sql => comunica_o_notifica_es.sql} (70%) create mode 100644 database-novo/schema/04_tables/documentos.sql create mode 100644 database-novo/schema/04_tables/estrutura_calend_rio.sql rename database-novo/schema/04_tables/{financial.sql => financeiro.sql} (69%) delete mode 100644 database-novo/schema/04_tables/infra.sql create mode 100644 database-novo/schema/04_tables/outros.sql rename database-novo/schema/04_tables/{patients.sql => pacientes.sql} (53%) delete mode 100644 database-novo/schema/04_tables/saas_admin.sql rename database-novo/schema/04_tables/{plans_billing.sql => saas_planos.sql} (73%) rename database-novo/schema/04_tables/{commitments.sql => servi_os_prontu_rios.sql} (57%) rename database-novo/schema/04_tables/{core.sql => tenants_multi_tenant.sql} (82%) delete mode 100644 database-novo/schema/10_grants/grants.sql create mode 100644 database-novo/seeds/seed_030_dev_phases_items.sql create mode 100644 database-novo/seeds/seed_031_dev_auditoria.sql create mode 100644 database-novo/seeds/seed_032_dev_competitors.sql create mode 100644 database-novo/supabase/backup_full.sql create mode 100644 database-novo/supabase/backup_postgres.sql create mode 100644 database-novo/supabase/backup_volume_agenciapsi.tar.gz create mode 100644 database-novo/tests/run.cjs create mode 100644 development/01-visao-geral/ESTRUTURA.md rename estrutura.txt => development/01-visao-geral/estrutura.txt (100%) create mode 100644 development/01-visao-geral/mapa-sistema.html rename AUDITORIA.md => development/02-auditoria/AUDITORIA.md (100%) create mode 100644 development/03-concorrentes/concorrentes.md create mode 100644 development/04-roadmap/ROADMAP.md create mode 100644 development/05-database/README.md create mode 100644 development/PENDENTE.md create mode 100644 development/README.md create mode 100644 diagrama-visualizacao-dados.webp create mode 100644 docker-compose.yml create mode 100644 e2e/patient-intake.spec.js create mode 100644 playwright.config.js create mode 100644 src/app/__tests__/session.spec.js create mode 100644 src/components/security/MathCaptchaChallenge.vue create mode 100644 src/features/agenda/composables/__tests__/useAgendaEvents.spec.js create mode 100644 src/features/agenda/services/_tenantGuards.js delete mode 100644 src/features/agenda/services/agenda.service.js create mode 100644 src/features/agenda/services/agendaSelects.js delete mode 100644 src/features/patients/cadastro/PatientsCadastroPage - Bkp.vue delete mode 100644 src/features/patients/cadastro/PatientsCadastroPage--preview.vue delete mode 100644 src/features/patients/prontuario/PatientProntuario - design1.vue delete mode 100644 src/features/patients/prontuario/PatientProntuario - design2.vue delete mode 100644 src/features/patients/prontuario/PatientProntuario - design3.vue create mode 100644 src/router/__tests__/guards.spec.js create mode 100644 src/stores/__tests__/tenantFeaturesStore.spec.js create mode 100644 src/stores/__tests__/tenantStore.spec.js create mode 100644 src/utils/__tests__/roleNormalizer.spec.js create mode 100644 src/utils/__tests__/validators.spec.js create mode 100644 src/utils/roleNormalizer.js delete mode 100644 src/views/pages/public/Landingpage-v1 - bkp.vue delete mode 100644 src/views/pages/public/PatientsExternalLinkPage.vue create mode 100644 src/views/pages/saas/SaasSecurityPage.vue create mode 100644 src/views/pages/saas/SaasTenantFeaturesPage.vue create mode 100644 src/views/pages/saas/SaasTwilioConfigPage.vue create mode 100644 src/views/pages/saas/development/DevAuditoriaTab.vue create mode 100644 src/views/pages/saas/development/DevCompetitorsTab.vue create mode 100644 src/views/pages/saas/development/DevDatabaseTab.vue create mode 100644 src/views/pages/saas/development/DevEstruturaTab.vue create mode 100644 src/views/pages/saas/development/DevExportTab.vue create mode 100644 src/views/pages/saas/development/DevOverviewTab.vue create mode 100644 src/views/pages/saas/development/DevRoadmapTab.vue create mode 100644 src/views/pages/saas/development/DevTestsTab.vue create mode 100644 src/views/pages/saas/development/DevVerificacoesTab.vue create mode 100644 src/views/pages/saas/development/SaasDevelopmentPage.vue create mode 100644 src/views/pages/saas/development/components/BlocoItems.vue create mode 100644 src/views/pages/saas/development/components/DevDrawer.vue create mode 100644 src/views/pages/saas/development/components/DevField.vue create mode 100644 src/views/pages/saas/development/composables/useDraggableList.js create mode 100644 supabase/functions/notification-webhook/index.js create mode 100644 supabase/functions/process-email-queue/index.ts create mode 100644 supabase/functions/process-notification-queue/index.ts create mode 100644 supabase/functions/process-sms-queue/index.ts create mode 100644 supabase/functions/process-whatsapp-queue/index.ts create mode 100644 supabase/functions/submit-patient-intake/index.js create mode 100644 supabase/functions/sync-email-templates/index.ts create mode 100644 supabase/functions/test-sms-channel/index.ts create mode 100644 supabase/functions/twilio-whatsapp-provision/index.ts create mode 100644 supabase/functions/twilio-whatsapp-webhook/index.ts diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index f26aa21..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(node:*)", - "Bash(powershell:*)", - "Bash(grep:*)", - "Bash(cd \"D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai\" && sed -i \\\\\n 's/console\\\\.time\\(tlabel\\)/const _perfEnd = logPerf\\('\\\\''router.guard'\\\\'', tlabel\\)/g' \\\\\n src/router/guards.js && echo \"console.time substituído\")", - "Bash(cd \"D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai\" && sed -i \\\\\n 's/console\\\\.timeEnd\\(tlabel\\)/_perfEnd\\(\\)/g' \\\\\n src/router/guards.js && echo \"console.timeEnd substituído\")", - "Bash(cd \"D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai\" && npm install --save-dev vitest @vitest/ui 2>&1 | tail -5)", - "Bash(find \"D:\\\\leonohama\\\\AgenciaPsi.com.br\\\\Sistema\\\\agenciapsi-primesakai/DBS\" -name \"*.sql\" -type f 2>/dev/null | head -10)", - "Bash(find \"D:\\\\leonohama\\\\AgenciaPsi.com.br\\\\Sistema\\\\agenciapsi-primesakai/DBS\" -name \"*.sql\" -type f 2>/dev/null | xargs grep -l \"agenda_eventos\" | head -3)", - "Bash(find \"D:\\\\leonohama\\\\AgenciaPsi.com.br\\\\Sistema\\\\agenciapsi-primesakai/DBS/2026-03-11\" -name \"*.sql\" -type f 2>/dev/null | head -3)", - "Bash(find \"D:\\\\leonohama\\\\AgenciaPsi.com.br\\\\Sistema\\\\agenciapsi-primesakai\" -type f -name \"*.sql\" 2>/dev/null | xargs grep -l \"agenda_eventos\" 2>/dev/null | head -5)", - "Bash(find /d/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/src -name \"*[Pp]ricing*\" -o -name \"*[Pp]reco*\" -o -name \"*[Vv]alor*\" 2>/dev/null | head -20)", - "Bash(where python:*)", - "Bash(cd \"/d/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai\" && C:/Users/lmnohama/AppData/Local/Programs/Python/Python310/python.exe -c \"\nimport zipfile\nimport xml.etree.ElementTree as ET\n\nfor fname in ['spec-wizard.docx', 'spec-v2.docx']:\n print\\('=== ' + fname + ' ==='\\)\n try:\n with zipfile.ZipFile\\(fname, 'r'\\) as z:\n with z.open\\('word/document.xml'\\) as f:\n tree = ET.parse\\(f\\)\n root = tree.getroot\\(\\)\n texts = []\n for para in root.iter\\('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}p'\\):\n parts = []\n for t in para.iter\\('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}t'\\):\n if t.text:\n parts.append\\(t.text\\)\n line = ''.join\\(parts\\)\n texts.append\\(line\\)\n print\\('\\\\n'.join\\(texts\\)\\)\n except Exception as e:\n print\\('Error: ' + str\\(e\\)\\)\n print\\(\\)\n\")", - "Bash(C:/Users/lmnohama/AppData/Local/Programs/Python/Python310/python.exe -c \"\nimport sys\nwith open\\('/d/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/DBS/2026-03-12/schema.sql', 'r', encoding='utf-8'\\) as f:\n lines = f.readlines\\(\\)\nprint\\(f'Total lines: {len\\(lines\\)}'\\)\n\" 2>&1)", - "Bash(C:/Users/lmnohama/AppData/Local/Programs/Python/Python310/python.exe -c \"\nimport sys\nfpath = 'D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/DBS/2026-03-12/schema.sql'\nwith open\\(fpath, 'r', encoding='utf-8'\\) as f:\n lines = f.readlines\\(\\)\nsys.stdout.buffer.write\\(\\('Total lines: ' + str\\(len\\(lines\\)\\) + '\\\\n'\\).encode\\('utf-8'\\)\\)\n\" 2>&1)", - "Bash(find /d/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai -type f \\\\\\( -name \"*convenio*\" -o -name \"*Convenio*\" \\\\\\) 2>/dev/null | head -20)", - "Bash(find:*)", - "Bash(ls:*)", - "Bash(npx vite:*)", - "Bash(powershell -Command \"$content = [System.IO.File]::ReadAllText\\(''src/views/pages/clinic/clinic/ClinicFeaturesPage.vue'', [System.Text.Encoding]::UTF8\\); $content = $content -replace [char]0x201C, ''\"\"'' -replace [char]0x201D, ''\"\"''; [System.IO.File]::WriteAllText\\(''src/views/pages/clinic/clinic/ClinicFeaturesPage.vue'', $content, [System.Text.Encoding]::UTF8\\)\")", - "Bash(xargs cat:*)", - "Bash(xxd \"D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/DBS/2026-03-21/schema.sql\")", - "Bash(iconv -f UTF-16LE -t UTF-8 \"D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/DBS/2026-03-21/schema.sql\")", - "Bash(mkdir -p docs/billing docs/planos docs/subscription-health docs/estrategia docs/specs)", - "Bash(mkdir -p database/backups database/migrations database/seeds database/fixes database/snippets)", - "Bash(cd:*)", - "Bash(mv disparando-whatsapp-local.md docs/whatsapp.md)", - "Bash(mv comandos.txt docs/)", - "Bash(mv dados-padrões-da-agenda.txt docs/)", - "Bash(mv USER_ARCHETYPES.html docs/)", - "Bash(mv Novo-DB/migration_*.sql database/migrations/)", - "Bash(mv Novo-DB/seed_*.sql database/seeds/)", - "Bash(mv Novo-DB/fix_*.sql database/fixes/)", - "Bash(npm install:*)", - "Bash(cp:*)", - "Bash(npm uninstall:*)", - "Bash(rm:*)", - "Bash(docker ps:*)", - "Bash(docker exec:*)", - "Bash(\"D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/database-novo/backups/2026-03-23/schema.sql\")", - "Bash(\"D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/database-novo/backups/2026-03-23/data.sql\")", - "Bash(\"D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/database-novo/backups/2026-03-23/full_dump.sql\")", - "Bash(wc:*)", - "Bash(python _wizard_patch.py)", - "Bash(rm _wizard_patch.py)", - "Bash(npm ls:*)", - "Bash(find /d/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/src/features/patients -type f \\\\\\(-name *.vue -o -name *.js \\\\\\))" - ] - } -} diff --git a/.gitignore b/.gitignore index 3a4237e..1dd5a6c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,16 @@ dist-*/ api-generator/typedoc.json **/.DS_Store Dev-documentacao/ -supabase/ +supabase/* +!supabase/functions/ evolution-api/ + +# Backups locais do banco — não comitar (regeneráveis via db.cjs backup) +database-novo/backups/ + +# Outputs do Playwright +test-results/ +playwright-report/ + +# Config local do Claude Code (cada dev tem o seu) +.claude/settings.local.json diff --git a/DOCKER-SETUP.md b/DOCKER-SETUP.md new file mode 100644 index 0000000..4fa0d62 --- /dev/null +++ b/DOCKER-SETUP.md @@ -0,0 +1,138 @@ +# Docker Setup — Projetos Locais + +## Tabela Resumo + +| Projeto | Container(s) | Porta Host | Rede | Volume(s) | +|---|---|---|---|---| +| **AgenciaPsi** | `agenciapsi_app` | `5173` → Vite dev | `agenciapsi_net` | `agenciapsi_node_modules` | +| | `agenciapsi_mysql` | `3307` → MySQL | `agenciapsi_net` | `agenciapsi_mysql_data` | +| **Evolution API** | `evolution_api` | `8080` → API | `agenciapsi_net` (external) | — | +| | `evolution_db` | interno | `agenciapsi_net` | `evolution_db_data` | +| | `evolution_redis` | interno | `agenciapsi_net` | — | +| | `evolution_mailpit` | `1025` SMTP / `8025` Web | `agenciapsi_net` | — | +| **Supabase AgenciaPsi** | `supabase_*_agenciapsi-primesakai` | `54321` API / `54322` PG / `54323` Studio | — | volumes internos | +| **Sakai-Vue** | `sakaivue_app` | `5174` → Vite dev | `sakaivue_net` | `sakaivue_node_modules` | +| | `sakaivue_mysql` | `3308` → MySQL | `sakaivue_net` | `sakaivue_mysql_data` | +| **Supabase Sakai-Vue** | `supabase_*_sakai-vue` | `54331` API / `54332` PG / `54333` Studio | — | volumes internos | +| **Gisaf Local** | `gisaf_mysql` | `3309` → MySQL | `gisaf_net` | `gisaf_mysql_data` | + +## Mapa de Portas + +| Porta | Serviço | +|---|---| +| 3307 | AgenciaPsi MySQL | +| 3308 | Sakai-Vue MySQL | +| 3309 | Gisaf MySQL | +| 5173 | AgenciaPsi Vite dev | +| 5174 | Sakai-Vue Vite dev | +| 8080 | Evolution API | +| 1025 | Mailpit SMTP | +| 8025 | Mailpit Web UI | +| 54321 | Supabase AgenciaPsi — Kong (API) | +| 54322 | Supabase AgenciaPsi — PostgreSQL | +| 54323 | Supabase AgenciaPsi — Studio | +| 54327 | Supabase AgenciaPsi — Analytics | +| 54331 | Supabase Sakai-Vue — Kong (API) | +| 54332 | Supabase Sakai-Vue — PostgreSQL | +| 54333 | Supabase Sakai-Vue — Studio | +| 54337 | Supabase Sakai-Vue — Analytics | + +## Ordem de Start + +```bash +# 1. AgenciaPsi (cria a rede agenciapsi_net) +cd "D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai" +docker compose up -d + +# 2. Supabase AgenciaPsi (porta 54321) +cd "D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai" +npx supabase start + +# 3. Evolution API (depende da rede agenciapsi_net) +cd "D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/evolution-api" +docker compose up -d + +# 4. Sakai-Vue +cd "D:/leonohama/UniaoApp.com.br/Sistema/sakai-vue" +docker compose up -d + +# 5. Supabase Sakai-Vue (porta 54331) +cd "D:/leonohama/UniaoApp.com.br/Sistema/sakai-vue" +npx supabase start + +# 6. Gisaf Local +cd "D:/leonohama/UniaoApp.com.br/Gisaf Local" +docker compose up -d +``` + +## Parar tudo + +```bash +# Na ordem inversa +cd "D:/leonohama/UniaoApp.com.br/Gisaf Local" && docker compose down +cd "D:/leonohama/UniaoApp.com.br/Sistema/sakai-vue" && npx supabase stop +cd "D:/leonohama/UniaoApp.com.br/Sistema/sakai-vue" && docker compose down +cd "D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai/evolution-api" && docker compose down +cd "D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai" && npx supabase stop +cd "D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai" && docker compose down +``` + +## Caminhos dos docker-compose.yml + +| Projeto | Caminho | +|---|---| +| AgenciaPsi | `D:\leonohama\AgenciaPsi.com.br\Sistema\agenciapsi-primesakai\docker-compose.yml` | +| Evolution API | `D:\leonohama\AgenciaPsi.com.br\Sistema\agenciapsi-primesakai\evolution-api\docker-compose.yml` | +| Sakai-Vue | `D:\leonohama\UniaoApp.com.br\Sistema\sakai-vue\docker-compose.yml` | +| Gisaf Local | `D:\leonohama\UniaoApp.com.br\Gisaf Local\docker-compose.yml` | + +## DBeaver — Conexões MySQL + +| Conexão | Host | Port | Database | User | Password | +|---|---|---|---|---|---| +| Gisaf | `localhost` | `3309` | `sindsp` | `sindsp` | `marlboro` | +| AgenciaPsi | `localhost` | `3307` | `agenciapsi` | `agenciapsi` | `agenciapsi123` | +| Sakai-Vue | `localhost` | `3308` | `sakaivue` | `sakaivue` | `sakaivue123` | + +Para criar cada conexão: **Database → New Database Connection → MySQL → preencher dados → Test Connection → Finish** + +## Supabase — Instancias Locais + +Cada projeto tem sua propria instancia Supabase (schemas diferentes, nao podem compartilhar). + +| Projeto | API URL | Studio | PostgreSQL | Anon Key | +|---|---|---|---|---| +| AgenciaPsi | `http://127.0.0.1:54321` | `http://127.0.0.1:54323` | `127.0.0.1:54322` | `sb_publishable_ACJWlzQHlZjBrEguHvfOxg_3BJgxAaH` | +| Sakai-Vue | `http://127.0.0.1:54331` | `http://127.0.0.1:54333` | `127.0.0.1:54332` | `sb_publishable_ACJWlzQHlZjBrEguHvfOxg_3BJgxAaH` | + +**Resetar banco (aplica migrations + seed):** + +```bash +# AgenciaPsi +cd "D:/leonohama/AgenciaPsi.com.br/Sistema/agenciapsi-primesakai" +npx supabase db reset + +# Sakai-Vue +cd "D:/leonohama/UniaoApp.com.br/Sistema/sakai-vue" +npx supabase db reset +``` + +### Sakai-Vue — Usuarios de teste + +| Email | Senha | Role | +|---|---|---| +| `dev@sistema.com.br` | `Dev@12345` | dev | +| `master@tenant.com.br` | `Master@12345` | master | +| `admin@tenant.com.br` | `Admin@12345` | admin | +| `chefe@tenant.com.br` | `Chefe@12345` | chefe_setor | +| `servidor@tenant.com.br` | `Servidor@12345` | servidor | +| `leitura@tenant.com.br` | `Leitura@12345` | leitura | + +## Importar dump SQL no Gisaf + +```bash +# Via CLI (já feito) +docker exec -i gisaf_mysql mysql -usindsp -pmarlboro sindsp < "D:/leonohama/UniaoApp.com.br/Gisaf Local/Dump20260330.sql" +``` + +Ou via DBeaver: conectar no banco `sindsp` → **Tools → Execute SQL Script** → selecionar `Dump20260330.sql` diff --git a/HANDOFF.md b/HANDOFF.md new file mode 100644 index 0000000..d24b21c --- /dev/null +++ b/HANDOFF.md @@ -0,0 +1,174 @@ +# HANDOFF — 2026-04-19 (Sessão 6) + +Documento de continuidade. Quando você voltar, comece lendo esta página. Todo o trabalho está registrado no banco (`/saas/desenvolvimento` → **Verificações**, **Auditoria**, **Testes**) — este arquivo é só o mapa. + +--- + +## 📊 Estado atual + +| Tipo | Aberto | Notas | +|---|---|---| +| **A# auditoria** | **0** | ✅ todas as 30 resolvidas | +| **V# verificações** | **9** | auth(3), pacientes(3), saas(2), router(1) | +| **T# testes** | **2 a escrever** | T#9 useAgendaEvents wrapper, T#10 E2E | +| **Áreas não auditadas** | **3** | financeiro, comunicação, documentos/prontuários | +| **Migrations não commitadas** | **8** | Sessão 6 (ver lista abaixo) | +| **Vitest** | **179/179** | 8 suites | +| **SQL integration tests** | **33/33** | `database-novo/tests/run.cjs` | + +--- + +## ✅ Sessão 6 (hoje, 2026-04-19) — resumo + +### Bloco 1 — V#34 + V#41 (Opção B2: plano + override + exceção comercial) +- **Migration** `20260419000001_tenant_features_b2_governance.sql`: + - Trigger `tenant_features_guard_with_plan` ganhou bypass via session flag (`current_setting('app.allow_feature_exception')`) + - Nova RPC `set_tenant_feature_exception(tenant_id, feature_key, enabled, reason)` SECURITY DEFINER com regras assimétricas: + - `enabled=false` → tenant_admin OU saas_admin (preferência do cliente) + - `enabled=true` AND plano permite → tenant_admin OU saas_admin + - `enabled=true` AND plano NÃO permite → **só saas_admin + reason obrigatório** (exceção comercial) + - Policy `tenant_features_write_saas_only` — writes diretos só saas_admin +- **Store** `tenantFeaturesStore.isEnabled` reescrito (B2): override negativo desliga, override positivo liga, sem override segue plano +- **Store** `setForTenant` agora chama RPC com `reason` opcional +- **UI nova** `/saas/tenant-features` (selector de tenant, catálogo, dialog com `reason` obrigatório p/ exceção, log de mudanças) +- **JSDoc** documentando separação semântica (`entitlementsStore.has` = "plano permite?" vs `tenantFeaturesStore.isEnabled` = "ativo agora?") +- **Testes** `src/stores/__tests__/tenantFeaturesStore.spec.js` — 17 cenários incluindo regressão V#34 + +### Bloco 2 — Pendentes Sessão 5 +- **V#42** — `entitlementsStore.loadFor*` no catch agora NÃO marca como carregado (estado fica como "not loaded" → próximo request retenta) + `logError` adicionado +- **V#40** — `features.is_active` (migration `...02`) + UI: soft delete + filtro "Mostrar depreciados" + Tag de status + botão Reativar +- **V#36** — RPC `delete_plan_safe` (migration `...03`): bloqueia DELETE se houver subscriptions ativas. SaasPlansPage migrada +- **V#35** — Migration `...04`: 17 → 11 policies. Removidas 3 read-auth duplicadas em plans/features/plan_features + 3 subsets/no-ops em subscriptions. `COMMENT ON POLICY` em todas + +### Bloco 3 — Testes T#5 / T#7 / T#8 +- **T#5** `tenantStore.spec.js` — 15 testes: singleflight, regressão V#5 (não herdar tenant de outro user), erros, setActiveTenant, reset, getters. Stub localStorage in-memory (env=node sem jsdom) +- **T#7** `validators.spec.js` — 38 testes: sanitização do intake (digitsOnly, CPF/CNPJ, phone, email, CEP, toISODate) +- **T#8** `database-novo/tests/run.cjs` — runner Node + docker exec. **33 cenários SQL** cobrindo set_tenant_feature_exception, delete_plan_safe, intake, features.is_active, defesa em camadas, twilio config + +### Bloco 4 — A#20 (CAPTCHA) — rev2 self-hosted +**Decisão:** descartado Cloudflare Turnstile / hCaptcha em favor de defesa em camadas self-hosted. Razões: zero LGPD, zero provider, zero fricção pro paciente legítimo (UX importa muito em paciente vulnerável buscando atendimento). + +5 camadas: +1. **Honeypot** — campo invisível (frontend), bot rejeita +2. **Validação** básica +3. **Rate limit por IP** — `check_rate_limit` RPC +4. **Math captcha condicional** — só ativa após N falhas do mesmo IP (default 3) +5. **Modo paranoid** global toggle (saas_security_config.captcha_required_globally) + +Implementação: +- Migration `...06` (4 tabelas: `saas_security_config`, `public_submission_attempts`, `submission_rate_limits`, `math_challenges`) +- Migration `...07` (RPCs: `check_rate_limit`, `record_submission_attempt`, `generate_math_challenge`, `verify_math_challenge`, `cleanup_expired_math_challenges`) +- Edge function `submit-patient-intake` reescrita (dual endpoint: submit + `/captcha-challenge`) +- Componente `MathCaptchaChallenge.vue` (lazy) +- Tela `/saas/security` com card explicativo (6 seções), KPIs 24h, toggles, sliders, dashboard de IPs ativos, modo paranoid + +### Bloco 5 — SaaS Twilio Config (operacional editável) +- Migration `...08` (tabela `saas_twilio_config` singleton + RPCs `get_twilio_config` / `update_twilio_config`) +- **Decisão de segurança**: `TWILIO_AUTH_TOKEN` permanece em env var (único secret); SID/webhook/rate/margem migram pra DB +- Edge function `twilio-whatsapp-provision` lê do banco com fallback pra env (back-compat) +- Tela `/saas/twilio-config` com card explicativo + status do AUTH_TOKEN (ping pra detectar se está setado) +- **Bug fix**: `friendlyErrorMessage()` em `twilioWhatsappService.js` traduz "Edge Function returned a non-2xx status code" pra mensagens contextuais + +--- + +## 🛑 Pendências (V# abertos por área) + +### auth (3) +- **V#2** (médio) — Listener `supabase.auth.onAuthStateChange` duplicado +- **V#6** (baixo) — `globalRole` cache sem TTL e sem invalidação por realtime +- **V#10** (médio) — Bloqueio SaaS em tenant-app só por `startsWith` de path (frágil) + +### pacientes (3) +- **V#3** (médio) — Pacientes não tem composables/services — toda lógica em pages +- **V#8** (baixo) — `agenda_eventos.select` patient_id com `limit 1000` arbitrário +- **V#9** (médio) — `PatientsCadastroPage` com **1985 linhas** (precisa quebrar) + +### router (1) +- **V#9** (baixo) — `ensureMenuBuilt` roda em toda navegação autenticada + +### saas (2) +- **V#17** (baixo) — 23 `console.*` em páginas SaaS +- **V#18** (baixo) — `tenantFeaturesStore` sem TTL real (cache pode ficar stale) + +--- + +## 🗂️ Migrations criadas hoje (ordem cronológica) + +``` +database-novo/migrations/ +├── 20260419000001_tenant_features_b2_governance.sql (V#34/V#41) +├── 20260419000002_features_is_active.sql (V#40) +├── 20260419000003_delete_plan_safe.sql (V#36) +├── 20260419000004_consolidate_policies.sql (V#35) +├── 20260419000005_restrict_intake_rpc.sql (A#20 — REVOKE anon) +├── 20260419000006_layered_bot_defense.sql (A#20 rev2 — schema) +├── 20260419000007_bot_defense_rpcs.sql (A#20 rev2 — RPCs) +└── 20260419000008_saas_twilio_config.sql (Twilio config) +``` + +Todas aplicadas no banco local. **Se for pra cloud, aplicar nessa ordem.** + +--- + +## 🗜️ Arquivos criados/modificados (código) + +**Criados:** +``` +src/components/security/MathCaptchaChallenge.vue +src/views/pages/saas/SaasTenantFeaturesPage.vue +src/views/pages/saas/SaasSecurityPage.vue +src/views/pages/saas/SaasTwilioConfigPage.vue +src/stores/__tests__/tenantStore.spec.js +src/stores/__tests__/tenantFeaturesStore.spec.js +src/utils/__tests__/validators.spec.js +database-novo/tests/run.cjs +supabase/functions/submit-patient-intake/index.js (reescrita) +``` + +**Modificados:** +``` +src/stores/tenantFeaturesStore.js (lógica B2 + RPC) +src/stores/entitlementsStore.js (V#42 fix + JSDoc) +src/services/twilioWhatsappService.js (friendlyErrorMessage) +src/views/pages/saas/SaasFeaturesPage.vue (V#40 soft delete) +src/views/pages/saas/SaasPlansPage.vue (V#36 RPC) +src/views/pages/saas/SaasTwilioWhatsappPage.vue (toast warn em vez de error) +src/views/pages/clinic/clinic/ClinicFeaturesPage.vue (texto erro plano-denied) +src/views/pages/public/CadastroPacienteExterno.vue (honeypot + math captcha) +src/router/routes.saas.js (3 rotas novas) +src/navigation/menus/saas.menu.js (3 itens menu novos) +supabase/functions/twilio-whatsapp-provision/index.ts (lê config DB) +.env (limpo Turnstile vars) +``` + +--- + +## 📊 Números finais + +| Métrica | Antes (Sessão 5) | Hoje | +|---|---|---| +| A# auditoria | 30 (1 aberto) | 30 (0 abertos) | +| V# verificações | 42 (15 abertos) | 42 (9 abertos) | +| Suites de teste vitest | 6 (109 tests) | 8 (179 tests) | +| Suites SQL integration | 0 | 1 (33 tests) | +| Migrations totais | 5 (Sessão 5) | 13 (+8 hoje) | +| Telas SaaS novas | — | 3 (`/tenant-features`, `/security`, `/twilio-config`) | + +--- + +## 🎯 Ordem sugerida quando voltar + +1. **Decidir se commita** o trabalho da Sessão 6 (~30 arquivos, 8 migrations). +2. **Continuar Sessão 6** (em andamento): A+B+C+D escolhidos, faltando concluir B/C/D. +3. Outras opções: + - **Nova área de revisão sênior** — financeiro / comunicação / documentos + - **Deploy real** (Supabase cloud + secrets + edge functions) + - **Testes T#9 + T#10** + +--- + +## ⚠️ Nada commitado (ainda) + +Working directory tem ~30 arquivos modificados desde Sessão 5. Revise com `git status` + `git diff` antes de decidir o que comitar. + +**Nada quebrou:** vitest 179/179 + SQL 33/33. diff --git a/commit.md b/commit.md new file mode 100644 index 0000000..515ce0e --- /dev/null +++ b/commit.md @@ -0,0 +1,237 @@ +# Sessões 1-6 acumuladas — hardening, defesa em profundidade, +192 testes + +Repositório estava sem commit há ~5 sessões de trabalho intenso. Este commit +consolida tudo que foi feito desde o último marco (`d088a89`). + +**A# auditoria:** 30 itens registrados, **0 abertos**. +**V# verificações:** 52 registradas (10 novas em Documentos), **5 abertas** (todas adiadas com plano). +**T# testes:** 10/10 escritas. **192 vitest + 33 SQL + 5 E2E** passando. + +--- + +## Sessão 1 — auth/router/session + +- A#7 resolvido (`window.__guardsBound`) +- 10 verificações registradas (V#1–V#10), 5 corrigidas: + - `session.js` logger inconsistente + - `tenantStore.ensureLoaded` polling + - `normalizeRole` duplicado → extraído pra `src/utils/roleNormalizer.js` + - `console.error` em `router/index.js` + - `.single()` em `fetchRole` + +--- + +## Sessão 2 — agenda + +- 11 verificações (V#11–V#21), 10 corrigidas: + - `useRecurrence` CRUD ganhou filtro `tenant_id` (alto) + - `agenda.service.js` vazio deletado + - `agendaRepository` ↔ `useAgendaEvents` consolidados (composable virou wrapper fino, 181→67 linhas) + - `AGENDA_EVENT_SELECT` centralizado em `agendaSelects.js` + - `_tenantGuards.js` compartilhado + - V#21 status `remarcar` → `remarcado` padronizado em 14 edições + +--- + +## Sessão 3 — pacientes + +- 10 verificações (V#22–V#31), 6 corrigidas + 4 documentadas +- 5 arquivos obsoletos deletados (PatientsCadastroPage Bkp, preview, prontuário design 1/2/3) +- `tenant_id` em todas queries de patients (alto) +- 9 `console.*` migrados pra logger +- `hydrateAssociations` paralelizada (5 round-trips → 2) +- `.maybeSingle()` onde precisava + +--- + +## Sessão 4 — security review (página pública de cadastro) + +- V#31 virou security review completa: **15 vulnerabilidades (A#15–A#29), 14 corrigidas** +- **Críticos:** + - **A#15** bucket `avatars` público → 5MB + mime whitelist + policies restritas + - **A#16** RPC v2 ignorava `active/expires/max_uses` → validação completa + incrementa `uses` + - **A#17** `notas_internas` exposto ao paciente → removido do form e RPC + - **A#18** `Math.random()` pra token → RPCs server-side via `gen_random_uuid()` + - **A#19** intake sem `tenant_id` → RPC resolve via `patient_invites` ou `tenant_members` +- **Médios:** log `patient_invite_attempts` (A#24), política LGPD (A#25), botão mock só em DEV (A#26), length caps server-side (A#27) +- **Baixos:** duplicado `PatientsExternalLinkPage` deletado, `Landingpage-v1 - bkp.vue` deletado + +--- + +## Sessão 5 — SaaS (planos, preços, recursos) + +- 10 verificações (V#33–V#42) +- **🔴 P0:** A#30 — 7 tabelas SaaS com RLS OFF + `GRANT ALL` pra anon. Migration `...05_saas_rls_emergency_fix` aplicou REVOKE + ENABLE RLS + 9 policies corretas +- 109/109 testes passando + +--- + +## Sessão 6 (HOJE, 2026-04-19) — bloco principal + +### V#34 + V#41 — Opção B2 (plano + override + exceção comercial) + +Resolve `tenantFeaturesStore.isEnabled` que retornava `true` por default +(qualquer feature aparecia ativa pra qualquer tenant) E a dupla-fonte com +`entitlementsStore`. + +**Backend** (migration `...01`): +- Trigger `tenant_features_guard_with_plan` ganhou bypass via session flag +- RPC `set_tenant_feature_exception` SECURITY DEFINER com regras assimétricas: + - `enabled=false` → tenant_admin OU saas_admin (preferência) + - `enabled=true` AND plano permite → tenant_admin OU saas_admin + - `enabled=true` AND plano NÃO permite → **só saas_admin + reason obrigatório** +- Policy `tenant_features_write_saas_only` + +**Frontend:** +- `tenantFeaturesStore.isEnabled` reescrito (B2): override negativo desliga, override positivo liga (exceção), sem override segue plano +- `setForTenant` chama RPC com `reason` +- Tela nova `/saas/tenant-features` com dialog de motivo obrigatório +- JSDoc separação semântica: `entitlementsStore.has` = "plano permite?" vs `tenantFeaturesStore.isEnabled` = "ativo agora?" +- 17 testes em `tenantFeaturesStore.spec.js` + +### Pendentes Sessão 5 fechados + +- **V#35** — 17→11 policies (consolidadas plans/features/plan_features/subscriptions) + `COMMENT ON POLICY` +- **V#36** — RPC `delete_plan_safe` bloqueia DELETE com subscriptions ativas +- **V#40** — `features.is_active` (soft delete) + UI com filtro/Reativar +- **V#42** — `entitlementsStore.loadFor*` no catch não marca como carregado + `logError` + +### Testes T#5/T#7/T#8 + +- **T#5** `tenantStore.spec.js` — 15 testes (singleflight, regressão V#5, erros, setActiveTenant, reset, getters) +- **T#7** `validators.spec.js` — 38 testes (sanitização do intake) +- **T#8** `database-novo/tests/run.cjs` — runner Node + docker exec, 33 cenários SQL + +### A#20 (CAPTCHA) — rev2 self-hosted + +**Decisão:** descartado Cloudflare Turnstile / hCaptcha em favor de defesa em +camadas self-hosted. Razões: zero LGPD, zero provider, zero fricção pro paciente +legítimo (UX importa em paciente vulnerável buscando atendimento). + +**5 camadas:** +1. **Honeypot** — campo invisível +2. **Validação** básica +3. **Rate limit por IP** — `check_rate_limit` RPC +4. **Math captcha condicional** — só ativa após N falhas (default 3) +5. **Modo paranoid** global toggle + +**Implementação:** +- Migrations `...06` (4 tabelas) + `...07` (RPCs) +- Edge function `submit-patient-intake` reescrita (dual endpoint) +- Componente `MathCaptchaChallenge.vue` lazy +- Tela `/saas/security` com card explicativo (6 seções), KPIs 24h, toggles, sliders, dashboard de IPs + +### SaaS Twilio Config (UI editável) + +- Migration `...08` (singleton + RPCs `get_twilio_config`/`update_twilio_config`) +- **AUTH_TOKEN permanece em env var** (único secret); SID/webhook/rate/margem migram pra DB +- Edge function lê do banco com fallback pra env (back-compat) +- Tela `/saas/twilio-config` com card + status do AUTH_TOKEN +- Bug fix: `friendlyErrorMessage()` traduz "Edge Function returned a non-2xx status code" + +### Revisão sênior em Documentos/prontuários + +10 V# novas registradas, 7 corrigidas, 3 adiadas. + +**Críticos:** +- 🔴 **V#43/V#44** vazamento entre clínicas via storage policies — corrigido com tenant scoping no path `(storage.foldername(name))[1]::uuid IN tenant_members` +- 🔴 **V#45** documents policy pobre (só `owner_id = auth.uid()`) — separada em SELECT/INSERT/UPDATE/DELETE com tenant scoping + +**Altos:** +- 🟠 **V#46** share_links sem incremento de usos — RPC `validate_share_token` atomicamente valida + incrementa + loga +- 🟠 **V#47** signatures policy ALL — separada (UPDATE só pra signatário) + +**Médios:** +- 🟡 **V#48** access_logs WITH CHECK +- 🟡 **V#49** templates WITH CHECK + +### B-block (V# avulsos) + +- **V#2** Listener `onAuthStateChange` consolidado (session.js virou autoridade + API `onSessionEvent`) +- **V#6** `globalRoleCache` TTL 5min +- **V#10** Bloqueio SaaS via `meta.area`/`meta.saasAdmin` em vez de `path.startsWith` +- **V#8** RPC `get_patient_session_counts` substitui `.limit(1000)` arbitrário +- **V#9 router** short-circuit `lastEnsureKey` em ensureMenuBuilt +- **V#17** 25 `console.*` eliminados em src/views/pages/saas/ +- **V#18** TTL real em tenantFeaturesStore + +### T#9 + T#10 + +- **T#9** `useAgendaEvents.spec.js` — 13 testes do wrapper +- **T#10** Playwright + Chromium instalados; 5 specs E2E em `e2e/patient-intake.spec.js` +- **Bug fix achado pelo E2E**: `CadastroPacienteExterno.enviar` não extraía body do erro 403 — corrigido + +--- + +## 📦 Migrations consolidadas (todas as sessões) + +``` +20260417000001_dev_tables (Sessão pré-1: tabelas dev) +20260417000002_dev_tables_ordem +20260418000001_dev_verificacoes (Sessão 1) +20260418000002_patient_intake_security_hardening (Sessão 4) +20260418000003_patient_invite_attempts_log (Sessão 4) +20260418000004_dev_tests (Sessão 1) +20260418000005_saas_rls_emergency_fix (Sessão 5 — P0) +20260419000001_tenant_features_b2_governance (Sessão 6 — V#34/V#41) +20260419000002_features_is_active (Sessão 6 — V#40) +20260419000003_delete_plan_safe (Sessão 6 — V#36) +20260419000004_consolidate_policies (Sessão 6 — V#35) +20260419000005_restrict_intake_rpc (Sessão 6 — A#20) +20260419000006_layered_bot_defense (Sessão 6 — A#20 rev2) +20260419000007_bot_defense_rpcs (Sessão 6 — A#20 rev2) +20260419000008_saas_twilio_config (Sessão 6) +20260419000009_patient_session_counts_rpc (Sessão 6 — V#8) +20260419000010_documents_security_hardening (Sessão 6 — V#43-V#49) +``` + +--- + +## 🆕 Pastas/arquivos novos importantes + +- `e2e/` — specs Playwright (T#10) +- `playwright.config.js` — config E2E +- `database-novo/tests/run.cjs` — runner SQL integration tests (T#8) +- `database-novo/backups/` agora ignorado (regenerável via `db.cjs backup`) +- `src/components/security/MathCaptchaChallenge.vue` — A#20 rev2 +- `src/views/pages/saas/SaasTenantFeaturesPage.vue` — V#34 +- `src/views/pages/saas/SaasSecurityPage.vue` — A#20 rev2 + card educativo +- `src/views/pages/saas/SaasTwilioConfigPage.vue` — UI Twilio editável +- `src/utils/roleNormalizer.js` — Sessão 1 +- `src/features/agenda/services/_tenantGuards.js` + `agendaSelects.js` — Sessão 2 +- 6 specs novas em `__tests__/` (vitest) +- `supabase/functions/submit-patient-intake/` — edge function reescrita A#20 rev2 + +--- + +## 🛠️ .gitignore ajustado neste commit + +- `supabase/*` + `!supabase/functions/` (mantém edge functions, ignora `.temp/`/`migrations/`/etc gerados pelo CLI) +- `database-novo/backups/` (backups regeneráveis) +- `test-results/`, `playwright-report/` (outputs Playwright) +- `.claude/settings.local.json` (config local do harness) + +--- + +## 📊 Números finais + +| Métrica | Início | Fim | +|---|---|---| +| A# abertos | 30 (a registrar) | **0** | +| V# abertos | 52 (a registrar) | **5** (adiados) | +| T# escritas | 0/10 | **10/10** | +| Vitest | — | **192/192** | +| SQL integration | — | **33/33** | +| E2E (Playwright) | — | **5/5** | +| Migrations | 0 | **17** | +| Telas SaaS novas | — | 3 | +| Edge functions reescritas | — | 1 (`submit-patient-intake`) | + +--- + +## ⚠️ Adiados (próximas sessões — plano completo no DB) + +- **V#3 + V#9 pacientes** — refatoração de composables/services (PatientsCadastroPage 1985 linhas). Sessão dedicada de 1-2h +- **V#50/V#51/V#52 documentos** — portal-paciente policy, hash SHA-256, retention cron +- **Áreas não auditadas:** financeiro, comunicação +- **Deploy real**: cloud Supabase + secrets + edge functions diff --git a/database-novo/agenciapsi-db-dashboard.html b/database-novo/agenciapsi-db-dashboard.html index fda3c58..d1185ca 100644 --- a/database-novo/agenciapsi-db-dashboard.html +++ b/database-novo/agenciapsi-db-dashboard.html @@ -3,487 +3,310 @@ -AgenciaPsi — Database Dashboard +AgenciaPsi DB · 2026-04-17 -
-
AgênciaPsi DB
- -
-
86 tabelas
-
82 FKs
-
24 views
+
AgênciaPsi DB
+ 2026-04-17 · 17/04/2026, 09:29:14 + +
+
97 tabelas
+
99 FKs
+
24 views
+
1307 colunas
+
23 infra
-
- -
+ +
- - + \ No newline at end of file diff --git a/database-novo/db.cjs b/database-novo/db.cjs index f80d68d..ffcd420 100644 --- a/database-novo/db.cjs +++ b/database-novo/db.cjs @@ -5,15 +5,17 @@ // Uso: node db.cjs [opcoes] // // Comandos: -// setup Instalação do zero (schema + seeds) -// backup Exporta backup com data atual -// restore [data] Restaura de um backup (ex: 2026-03-23) +// setup Instalação do zero (schema + fixes + seeds + migrations) +// backup Exporta backup com data atual (+ supabase_restore.sql) +// restore [data] Restaura de um backup (ex: 2026-04-17) // migrate Aplica migrations pendentes // seed [grupo] Roda seeds (all|users|system|test_data) // status Mostra estado atual do banco // diff Compara schema atual vs último backup // reset Reseta o banco e reinstala tudo // verify Verifica integridade dos dados essenciais +// schema-export Exporta schema granular para schema/00_full..10_grants +// dashboard Gera dashboard HTML interativo (tabelas + infra) // help Mostra ajuda // ============================================================================= @@ -30,6 +32,9 @@ const CONFIG = JSON.parse(fs.readFileSync(path.join(ROOT, 'db.config.json'), 'ut const CONTAINER = CONFIG.container; const DB = CONFIG.database; const USER = CONFIG.user; +const MIGRATIONS_DIR = path.resolve(ROOT, CONFIG.migrationsDir || 'migrations'); +const SEEDS_DIR = path.resolve(ROOT, CONFIG.seedsDir || 'seeds'); +const FIXES_DIR = path.resolve(ROOT, CONFIG.fixesDir || 'fixes'); // --------------------------------------------------------------------------- // Colors (sem dependências externas) @@ -45,27 +50,13 @@ const c = { gray: '\x1b[90m' }; -function log(msg) { - console.log(msg); -} -function info(msg) { - log(`${c.cyan}ℹ${c.reset} ${msg}`); -} -function ok(msg) { - log(`${c.green}✔${c.reset} ${msg}`); -} -function warn(msg) { - log(`${c.yellow}⚠${c.reset} ${msg}`); -} -function err(msg) { - log(`${c.red}✖${c.reset} ${msg}`); -} -function title(msg) { - log(`\n${c.bold}${c.blue}═══ ${msg} ═══${c.reset}\n`); -} -function step(msg) { - log(`${c.gray} →${c.reset} ${msg}`); -} +function log(msg) { console.log(msg); } +function info(msg) { log(`${c.cyan}ℹ${c.reset} ${msg}`); } +function ok(msg) { log(`${c.green}✔${c.reset} ${msg}`); } +function warn(msg) { log(`${c.yellow}⚠${c.reset} ${msg}`); } +function err(msg) { log(`${c.red}✖${c.reset} ${msg}`); } +function title(msg){ log(`\n${c.bold}${c.blue}═══ ${msg} ═══${c.reset}\n`); } +function step(msg) { log(`${c.gray} →${c.reset} ${msg}`); } // --------------------------------------------------------------------------- // Helpers @@ -86,21 +77,31 @@ function dockerRunning() { function psql(sql, opts = {}) { const cmd = `docker exec -i -e PGCLIENTENCODING=UTF8 ${CONTAINER} psql -U ${USER} -d ${DB} ${opts.tuples ? '-t' : ''} ${opts.quiet ? '-q' : ''} -c "${sql.replace(/"/g, '\\"')}"`; - return execSync(cmd, { encoding: 'utf8', timeout: 30000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, PYTHONIOENCODING: 'utf-8', LANG: 'C.UTF-8' } }).trim(); + return execSync(cmd, { + encoding: 'utf8', + timeout: 30000, + stdio: ['pipe', 'pipe', 'pipe'], + env: { ...process.env, PYTHONIOENCODING: 'utf-8', LANG: 'C.UTF-8' } + }).trim(); } function psqlFile(filePath) { const absPath = path.resolve(filePath); const content = fs.readFileSync(absPath, 'utf8'); - // Prepend SET client_encoding to ensure UTF-8 inside the session const utf8Content = "SET client_encoding TO 'UTF8';\n" + content; const cmd = `docker exec -i -e PGCLIENTENCODING=UTF8 ${CONTAINER} psql -U ${USER} -d ${DB} -q`; - return execSync(cmd, { input: utf8Content, encoding: 'utf8', timeout: 120000, stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, PYTHONIOENCODING: 'utf-8', LANG: 'C.UTF-8' } }); + return execSync(cmd, { + input: utf8Content, + encoding: 'utf8', + timeout: 120000, + stdio: ['pipe', 'pipe', 'pipe'], + env: { ...process.env, PYTHONIOENCODING: 'utf-8', LANG: 'C.UTF-8' } + }); } function pgDump(args) { const cmd = `docker exec -e PGCLIENTENCODING=UTF8 ${CONTAINER} pg_dump -U ${USER} -d ${DB} ${args}`; - return execSync(cmd, { encoding: 'utf8', timeout: 120000, maxBuffer: 50 * 1024 * 1024 }); + return execSync(cmd, { encoding: 'utf8', timeout: 180000, maxBuffer: 100 * 1024 * 1024 }); } function today() { @@ -168,6 +169,89 @@ function recordMigration(filename, hash, category) { psql(`INSERT INTO _db_migrations (filename, hash, category) VALUES ('${filename}', '${hash}', '${category}') ON CONFLICT (filename) DO UPDATE SET hash = EXCLUDED.hash, applied_at = now();`); } +// --------------------------------------------------------------------------- +// Supabase-compatible dump builder +// --------------------------------------------------------------------------- + +function buildSupabaseDump(backupDir) { + step('Gerando dump compatível com Supabase (supabase_restore.sql)...'); + + const parts = []; + + parts.push('-- =========================================================='); + parts.push('-- AgenciaPsi — Supabase-compatible full restore dump'); + parts.push(`-- Gerado em: ${new Date().toISOString()}`); + parts.push('-- '); + parts.push('-- USO: Para restaurar este dump em um Supabase limpo:'); + parts.push('-- 1. npx supabase db reset (limpa tudo)'); + parts.push('-- 2. Rode este arquivo:'); + parts.push(`-- docker exec -i ${CONTAINER} psql -U ${USER} -d ${DB} \\`); + parts.push('-- < backups/YYYY-MM-DD/supabase_restore.sql'); + parts.push('--'); + parts.push('-- OU via pipe:'); + parts.push('-- cat backups/YYYY-MM-DD/supabase_restore.sql | \\'); + parts.push(`-- docker exec -i ${CONTAINER} psql -U ${USER} -d ${DB}`); + parts.push('-- =========================================================='); + parts.push(''); + parts.push("SET client_encoding TO 'UTF8';"); + parts.push('SET statement_timeout = 0;'); + parts.push('SET lock_timeout = 0;'); + parts.push("SET standard_conforming_strings = on;"); + parts.push(''); + + // 1. Schema public: drop + recreate + parts.push('-- [1/5] Limpar schema public'); + parts.push('DROP SCHEMA IF EXISTS public CASCADE;'); + parts.push('CREATE SCHEMA public;'); + parts.push('GRANT ALL ON SCHEMA public TO postgres;'); + parts.push('GRANT ALL ON SCHEMA public TO public;'); + parts.push(''); + + // 2. Schema-only dump (public schema only, no infra) + parts.push('-- [2/5] Estrutura (tabelas, índices, constraints, triggers, functions)'); + const schemaDump = pgDump('--schema-only --no-owner --no-privileges --schema=public'); + parts.push(schemaDump); + parts.push(''); + + // 3. Auth users data (crucial for Supabase) + parts.push('-- [3/5] Dados auth.users (essencial para autenticação)'); + try { + const authData = pgDump('--data-only --no-owner --no-privileges --table=auth.users --table=auth.identities --table=auth.sessions --table=auth.refresh_tokens --table=auth.mfa_factors --table=auth.mfa_challenges'); + parts.push(authData); + } catch { + parts.push('-- AVISO: Não foi possível exportar dados de auth (pode estar vazio)'); + } + parts.push(''); + + // 4. All public data + parts.push('-- [4/5] Dados das tabelas public'); + const infraSchemas = ['storage', 'realtime', '_realtime', 'supabase_functions', 'extensions', + 'graphql', 'graphql_public', 'pgsodium', 'vault', 'net', '_analytics', + 'supabase_migrations', 'auth']; + const excludeFlags = infraSchemas.map((s) => `--exclude-schema=${s}`).join(' '); + const publicData = pgDump(`--data-only --no-owner --no-privileges ${excludeFlags}`); + parts.push(publicData); + parts.push(''); + + // 5. Storage buckets/objects metadata (if any) + parts.push('-- [5/5] Storage buckets (metadados)'); + try { + const storageBuckets = pgDump('--data-only --no-owner --no-privileges --table=storage.buckets'); + parts.push(storageBuckets); + } catch { + parts.push('-- AVISO: Nenhum bucket de storage encontrado'); + } + parts.push(''); + + parts.push('-- Restore finalizado.'); + + const dumpContent = parts.join('\n'); + const dumpPath = path.join(backupDir, 'supabase_restore.sql'); + fs.writeFileSync(dumpPath, dumpContent); + + return dumpPath; +} + // --------------------------------------------------------------------------- // Commands // --------------------------------------------------------------------------- @@ -179,57 +263,80 @@ commands.setup = function () { title('Setup — Instalação do zero'); requireDocker(); - // 1. Schema + // 1. Schema base const schemaFile = path.join(ROOT, CONFIG.schema); - if (!fs.existsSync(schemaFile)) { - err(`Schema não encontrado: ${schemaFile}`); - process.exit(1); + if (fs.existsSync(schemaFile)) { + info('Aplicando schema base...'); + psqlFile(schemaFile); + ok('Schema aplicado'); + } else { + warn(`Schema não encontrado: ${schemaFile}`); + warn('Rode "node db.cjs schema-export" depois de uma migração fresh para gerar o schema.'); } - info('Aplicando schema...'); - psqlFile(schemaFile); - ok('Schema aplicado'); - - // 2. Fixes - info('Aplicando fixes...'); - for (const fix of CONFIG.fixes) { - const fixPath = path.join(ROOT, 'fixes', fix); - if (fs.existsSync(fixPath)) { - step(fix); - psqlFile(fixPath); + // 2. Fixes (aplicados antes dos seeds para corrigir o schema) + if (Array.isArray(CONFIG.fixes) && CONFIG.fixes.length > 0) { + info('Aplicando fixes...'); + let fixCount = 0; + for (const fix of CONFIG.fixes) { + const fixPath = path.join(FIXES_DIR, fix); + if (fs.existsSync(fixPath)) { + step(fix); + psqlFile(fixPath); + fixCount++; + } } + ok(`${fixCount} fix(es) aplicado(s)`); } - ok(`${CONFIG.fixes.length} fixes aplicados`); - // 3. Seeds + // 3. Seeds (users + system) commands.seed('all'); - // 4. Migration table + // 4. Migration tracking table ensureMigrationTable(); - // 5. Record seeds as applied - const allSeeds = [...CONFIG.seeds.users, ...CONFIG.seeds.system]; + // 5. Record seeds + fixes como aplicados + const allSeeds = [...(CONFIG.seeds?.users || []), ...(CONFIG.seeds?.system || [])]; for (const seed of allSeeds) { - const seedPath = path.join(ROOT, 'seeds', seed); + const seedPath = path.join(SEEDS_DIR, seed); if (fs.existsSync(seedPath)) { recordMigration(seed, fileHash(seedPath), 'seed'); } } - for (const fix of CONFIG.fixes) { - const fixPath = path.join(ROOT, 'fixes', fix); + for (const fix of (CONFIG.fixes || [])) { + const fixPath = path.join(FIXES_DIR, fix); if (fs.existsSync(fixPath)) { recordMigration(fix, fileHash(fixPath), 'fix'); } } + // 6. Aplicar migrations incrementais (opcional - só se tiver pendentes) + if (fs.existsSync(MIGRATIONS_DIR)) { + const files = fs.readdirSync(MIGRATIONS_DIR).filter((f) => f.endsWith('.sql')).sort(); + if (files.length > 0) { + info(`Aplicando ${files.length} migration(s)...`); + for (const file of files) { + step(file); + try { + psqlFile(path.join(MIGRATIONS_DIR, file)); + recordMigration(file, fileHash(path.join(MIGRATIONS_DIR, file)), 'migration'); + } catch (e) { + warn(` ${file} falhou (pode já ter sido aplicada via schema/seeds): ${e.message.split('\n')[0]}`); + recordMigration(file, fileHash(path.join(MIGRATIONS_DIR, file)), 'migration'); + } + } + ok(`${files.length} migration(s) aplicada(s)`); + } + } + ok('Setup completo!'); log(''); - // 6. Auto-backup + // 7. Auto-backup info('Criando backup pós-setup...'); commands.backup(); - // 7. Verify + // 8. Verify commands.verify(); }; @@ -242,7 +349,8 @@ commands.backup = function () { const dir = path.join(ROOT, 'backups', date); ensureDir(dir); - const infraSchemas = ['storage', 'realtime', '_realtime', 'supabase_functions', 'extensions', 'graphql', 'graphql_public', 'pgsodium', 'vault', 'net', '_analytics']; + const infraSchemas = ['storage', 'realtime', '_realtime', 'supabase_functions', 'extensions', + 'graphql', 'graphql_public', 'pgsodium', 'vault', 'net', '_analytics', 'supabase_migrations']; const excludeFlags = infraSchemas.map((s) => `--exclude-schema=${s}`).join(' '); step('Exportando schema...'); @@ -257,15 +365,20 @@ commands.backup = function () { const full = pgDump('--no-owner --no-privileges'); fs.writeFileSync(path.join(dir, 'full_dump.sql'), full); - const sizes = ['schema.sql', 'data.sql', 'full_dump.sql'].map((f) => { - const stat = fs.statSync(path.join(dir, f)); + // Dump compatível com Supabase (restauração completa) + buildSupabaseDump(dir); + + const files = ['schema.sql', 'data.sql', 'full_dump.sql', 'supabase_restore.sql']; + const sizes = files.map((f) => { + const fPath = path.join(dir, f); + if (!fs.existsSync(fPath)) return null; + const stat = fs.statSync(fPath); return `${f}: ${(stat.size / 1024).toFixed(0)}KB`; - }); + }).filter(Boolean); ok(`Backup salvo em backups/${date}/`); sizes.forEach((s) => step(s)); - // Cleanup old backups cleanupBackups(); }; @@ -278,8 +391,8 @@ function cleanupBackups() { let removed = 0; for (const b of backups) { if (b < cutoffStr) { - const dir = path.join(ROOT, 'backups', b); - fs.rmSync(dir, { recursive: true, force: true }); + const bDir = path.join(ROOT, 'backups', b); + fs.rmSync(bDir, { recursive: true, force: true }); removed++; } } @@ -309,10 +422,6 @@ commands.restore = function (dateArg) { process.exit(1); } - const fullDump = path.join(dir, 'full_dump.sql'); - const schemaFile = path.join(dir, 'schema.sql'); - const dataFile = path.join(dir, 'data.sql'); - // Safety backup before restore info('Criando backup de segurança antes do restore...'); try { @@ -321,24 +430,26 @@ commands.restore = function (dateArg) { warn('Não foi possível criar backup de segurança (banco pode estar vazio)'); } - if (fs.existsSync(fullDump)) { - info(`Restaurando de backups/${date}/full_dump.sql ...`); + const supaRestore = path.join(dir, 'supabase_restore.sql'); + const fullDump = path.join(dir, 'full_dump.sql'); + const schemaFile = path.join(dir, 'schema.sql'); + const dataFile = path.join(dir, 'data.sql'); - // Drop and recreate public schema + if (fs.existsSync(supaRestore)) { + info(`Restaurando de backups/${date}/supabase_restore.sql (Supabase-compatible)...`); + psqlFile(supaRestore); + } else if (fs.existsSync(fullDump)) { + info(`Restaurando de backups/${date}/full_dump.sql ...`); step('Limpando schema public...'); psql('DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public;'); - step('Aplicando full dump...'); psqlFile(fullDump); } else if (fs.existsSync(schemaFile) && fs.existsSync(dataFile)) { info(`Restaurando de backups/${date}/ (schema + data)...`); - step('Limpando schema public...'); psql('DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public;'); - step('Aplicando schema...'); psqlFile(schemaFile); - step('Aplicando dados...'); psqlFile(dataFile); } else { @@ -348,7 +459,6 @@ commands.restore = function (dateArg) { ok(`Banco restaurado de backups/${date}/`); - // Verify commands.verify(); }; @@ -358,14 +468,13 @@ commands.migrate = function () { requireDocker(); ensureMigrationTable(); - const migrationsDir = path.join(ROOT, 'migrations'); - if (!fs.existsSync(migrationsDir)) { + if (!fs.existsSync(MIGRATIONS_DIR)) { info('Nenhuma pasta migrations/ encontrada.'); return; } const files = fs - .readdirSync(migrationsDir) + .readdirSync(MIGRATIONS_DIR) .filter((f) => f.endsWith('.sql')) .sort(); @@ -389,7 +498,7 @@ commands.migrate = function () { info(`${pending.length} migration(s) pendente(s):`); for (const file of pending) { step(`Aplicando ${file}...`); - const filePath = path.join(migrationsDir, file); + const filePath = path.join(MIGRATIONS_DIR, file); try { psqlFile(filePath); recordMigration(file, fileHash(filePath), 'migration'); @@ -423,12 +532,12 @@ commands.seed = function (group) { let total = 0; for (const g of groups) { - const seeds = CONFIG.seeds[g]; + const seeds = CONFIG.seeds?.[g]; if (!seeds || seeds.length === 0) continue; info(`Grupo: ${g}`); for (const seed of seeds) { - const seedPath = path.join(ROOT, 'seeds', seed); + const seedPath = path.join(SEEDS_DIR, seed); if (!fs.existsSync(seedPath)) { warn(` Arquivo não encontrado: ${seed}`); continue; @@ -452,10 +561,8 @@ commands.status = function () { title('Status'); requireDocker(); - // Docker ok(`Container: ${CONTAINER} (rodando)`); - // Backups const backups = listBackups(); if (backups.length > 0) { ok(`Último backup: ${backups[0]}`); @@ -464,20 +571,17 @@ commands.status = function () { warn('Nenhum backup encontrado'); } - // Migrations try { const applied = getAppliedMigrations(); if (applied.length > 0) { - info(`Migrations aplicadas: ${applied.length}`); + info(`Registros em _db_migrations: ${applied.length}`); applied.slice(-5).forEach((m) => { step(`${m.filename} ${c.gray}(${m.category}, ${m.applied_at})${c.reset}`); }); } - // Pending - const migrationsDir = path.join(ROOT, 'migrations'); - if (fs.existsSync(migrationsDir)) { - const files = fs.readdirSync(migrationsDir).filter((f) => f.endsWith('.sql')); + if (fs.existsSync(MIGRATIONS_DIR)) { + const files = fs.readdirSync(MIGRATIONS_DIR).filter((f) => f.endsWith('.sql')); const pending = files.filter((f) => !applied.map((m) => m.filename).includes(f)); if (pending.length > 0) { warn(`${pending.length} migration(s) pendente(s):`); @@ -488,28 +592,16 @@ commands.status = function () { info('Tabela _db_migrations não existe (rode setup primeiro)'); } - // DB counts log(''); info('Dados no banco:'); - const counts = [ - ['auth.users', 'SELECT count(*) FROM auth.users'], - ['profiles', 'SELECT count(*) FROM profiles'], - ['tenants', 'SELECT count(*) FROM tenants'], - ['plans', 'SELECT count(*) FROM plans'], - ['features', 'SELECT count(*) FROM features'], - ['plan_features', 'SELECT count(*) FROM plan_features'], - ['subscriptions', 'SELECT count(*) FROM subscriptions'], - ['email_templates_global', 'SELECT count(*) FROM email_templates_global'], - ['notification_templates', 'SELECT count(*) FROM notification_templates'] - ]; - - for (const [label, sql] of counts) { + const statusTables = CONFIG.status?.tables || []; + for (const table of statusTables) { try { - const count = psql(sql, { tuples: true }).trim(); + const count = psql(`SELECT count(*) FROM ${table}`, { tuples: true }).trim(); const color = parseInt(count) > 0 ? c.green : c.red; - step(`${label}: ${color}${count}${c.reset}`); + step(`${table}: ${color}${count}${c.reset}`); } catch { - step(`${label}: ${c.gray}(tabela não existe)${c.reset}`); + step(`${table}: ${c.gray}(tabela não existe)${c.reset}`); } } }; @@ -534,10 +626,8 @@ commands.diff = function () { info('Exportando schema atual...'); const currentSchema = pgDump('--schema-only --no-owner --no-privileges'); - const lastSchema = fs.readFileSync(lastSchemaPath, 'utf8'); - // Extract table definitions for comparison const extractTables = (sql) => { const tables = {}; const regex = /CREATE TABLE (?:IF NOT EXISTS )?(\S+)\s*\(([\s\S]*?)\);/g; @@ -550,13 +640,9 @@ commands.diff = function () { const currentTables = extractTables(currentSchema); const lastTables = extractTables(lastSchema); - const allTables = new Set([...Object.keys(currentTables), ...Object.keys(lastTables)]); - let added = 0, - removed = 0, - changed = 0, - unchanged = 0; + let added = 0, removed = 0, changed = 0, unchanged = 0; for (const table of [...allTables].sort()) { if (!lastTables[table]) { @@ -583,7 +669,6 @@ commands.reset = function () { title('Reset — CUIDADO'); requireDocker(); - // Safety backup info('Criando backup antes do reset...'); try { commands.backup(); @@ -595,7 +680,6 @@ commands.reset = function () { psql('DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public;'); ok('Schema public resetado'); - // Re-run setup commands.setup(); }; @@ -604,23 +688,12 @@ commands.verify = function () { title('Verificação de integridade'); requireDocker(); - const checks = [ - { name: 'auth.users', sql: 'SELECT count(*) FROM auth.users', min: 1 }, - { name: 'profiles', sql: 'SELECT count(*) FROM profiles', min: 1 }, - { name: 'tenants', sql: 'SELECT count(*) FROM tenants', min: 1 }, - { name: 'plans', sql: 'SELECT count(*) FROM plans', min: 7 }, - { name: 'features', sql: 'SELECT count(*) FROM features', min: 20 }, - { name: 'plan_features', sql: 'SELECT count(*) FROM plan_features', min: 50 }, - { name: 'subscriptions', sql: 'SELECT count(*) FROM subscriptions', min: 1 }, - { name: 'email_templates', sql: 'SELECT count(*) FROM email_templates_global', min: 10 } - ]; + let pass = 0, fail = 0; + const verify = CONFIG.verify || { tables: [], views: [] }; - let pass = 0, - fail = 0; - - for (const check of checks) { + for (const check of (verify.tables || [])) { try { - const count = parseInt(psql(check.sql, { tuples: true }).trim()); + const count = parseInt(psql(`SELECT count(*) FROM ${check.name}`, { tuples: true }).trim()); if (count >= check.min) { ok(`${check.name}: ${count} (mín: ${check.min})`); pass++; @@ -634,14 +707,15 @@ commands.verify = function () { } } - // Check entitlements view - try { - const ent = psql('SELECT count(*) FROM v_tenant_entitlements;', { tuples: true }).trim(); - ok(`v_tenant_entitlements: ${ent} registros`); - pass++; - } catch { - err('v_tenant_entitlements: view não existe'); - fail++; + for (const view of (verify.views || [])) { + try { + const cnt = psql(`SELECT count(*) FROM ${view};`, { tuples: true }).trim(); + ok(`${view}: ${cnt} registros`); + pass++; + } catch { + err(`${view}: view não existe`); + fail++; + } } log(''); @@ -652,6 +726,225 @@ commands.verify = function () { } }; +// ---- SCHEMA-EXPORT ---- +commands['schema-export'] = function () { + title('Schema Export'); + requireDocker(); + + const schemaDir = path.join(ROOT, 'schema'); + const dirs = { + full: path.join(schemaDir, '00_full'), + extensions: path.join(schemaDir, '01_extensions'), + types: path.join(schemaDir, '02_types'), + functions: path.join(schemaDir, '03_functions'), + tables: path.join(schemaDir, '04_tables'), + views: path.join(schemaDir, '05_views'), + indexes: path.join(schemaDir, '06_indexes'), + foreignKeys: path.join(schemaDir, '07_foreign_keys'), + triggers: path.join(schemaDir, '08_triggers'), + policies: path.join(schemaDir, '09_policies'), + grants: path.join(schemaDir, '10_grants'), + }; + // Limpa diretórios antes para remover arquivos stale de exports anteriores + for (const dir of Object.values(dirs)) { + if (fs.existsSync(dir)) { + for (const f of fs.readdirSync(dir)) { + if (f.endsWith('.sql')) fs.rmSync(path.join(dir, f), { force: true }); + } + } + ensureDir(dir); + } + + // 00_full — dump completo + step('00_full/schema.sql (dump completo)...'); + const fullSchema = pgDump('--schema-only --no-owner --no-privileges'); + fs.writeFileSync(path.join(dirs.full, 'schema.sql'), fullSchema); + + // 01_extensions + step('01_extensions...'); + const extSql = `SELECT 'CREATE EXTENSION IF NOT EXISTS ' || quote_ident(extname) || ' WITH SCHEMA ' || quote_ident(nspname) || ';' FROM pg_extension e JOIN pg_namespace n ON e.extnamespace = n.oid WHERE extname NOT IN ('plpgsql') ORDER BY extname;`; + const extResult = psql(extSql, { tuples: true }); + const extLines = extResult.split('\n').filter(Boolean).map(l => l.trim()).filter(Boolean); + if (extLines.length > 0) { + const content = `-- Extensions\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${extLines.length}\n\n` + extLines.join('\n') + '\n'; + fs.writeFileSync(path.join(dirs.extensions, 'extensions.sql'), content); + } + + // 02_types — enums públicos + step('02_types...'); + const typesSql = ` + SELECT pg_catalog.format_type(t.oid, NULL) || ' AS ENUM (' || + string_agg(quote_literal(e.enumlabel), ', ' ORDER BY e.enumsortorder) || ');' + FROM pg_type t + JOIN pg_enum e ON t.oid = e.enumtypid + JOIN pg_namespace n ON t.typnamespace = n.oid + WHERE n.nspname = 'public' + GROUP BY t.oid, t.typname;`; + const typesResult = psql(typesSql, { tuples: true }); + const typesLines = typesResult.split('\n').filter(Boolean).map(l => l.trim()).filter(Boolean); + if (typesLines.length > 0) { + const typesContent = `-- Public Enums & Types\n-- Gerado automaticamente em ${new Date().toISOString()}\n\n` + + typesLines.map(l => `CREATE TYPE ${l}`).join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.types, 'public_types.sql'), typesContent); + } + + try { + const authTypesSql = typesSql.replace("'public'", "'auth'"); + const authTypesResult = psql(authTypesSql, { tuples: true }); + const authLines = authTypesResult.split('\n').filter(Boolean).map(l => l.trim()).filter(Boolean); + if (authLines.length > 0) { + const authContent = `-- Auth Enums & Types\n-- Gerado automaticamente em ${new Date().toISOString()}\n\n` + + authLines.map(l => `CREATE TYPE ${l}`).join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.types, 'auth_types.sql'), authContent); + } + } catch { /* auth types may not exist */ } + + // 03_functions + step('03_functions...'); + const funcBlocks = fullSchema.match(/CREATE(?:\s+OR\s+REPLACE)?\s+FUNCTION\s+[\s\S]*?(?:\$\$[^$]*\$\$|\$[a-zA-Z_]+\$[\s\S]*?\$[a-zA-Z_]+\$)\s*(?:;|$)/gi) || []; + const funcsBySchema = {}; + for (const block of funcBlocks) { + const nameMatch = block.match(/FUNCTION\s+([\w.]+)\./); + const schema = nameMatch ? nameMatch[1] : 'public'; + if (!funcsBySchema[schema]) funcsBySchema[schema] = []; + funcsBySchema[schema].push(block); + } + for (const [schema, funcs] of Object.entries(funcsBySchema)) { + const content = `-- Functions: ${schema}\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${funcs.length}\n\n` + + funcs.join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.functions, `${schema}.sql`), content); + } + if (funcBlocks.length > 0) { + const allFuncs = `-- All Functions\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${funcBlocks.length}\n\n` + + funcBlocks.join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.functions, '_all.sql'), allFuncs); + } + + // 04_tables — agrupado por domínio + step('04_tables...'); + const tableBlocks = fullSchema.match(/CREATE TABLE (?:IF NOT EXISTS )?public\.\S+\s*\([\s\S]*?\);/gi) || []; + const domainTables = CONFIG.domains || {}; + const tableToDomain = {}; + for (const [domain, tables] of Object.entries(domainTables)) { + for (const t of tables) tableToDomain[t] = domain; + } + const tablesByDomain = {}; + for (const block of tableBlocks) { + const nameMatch = block.match(/CREATE TABLE (?:IF NOT EXISTS )?public\.(\S+)/i); + if (!nameMatch) continue; + const name = nameMatch[1]; + const domain = tableToDomain[name] || 'outros'; + if (!tablesByDomain[domain]) tablesByDomain[domain] = []; + tablesByDomain[domain].push(block); + } + for (const [domain, blocks] of Object.entries(tablesByDomain)) { + const content = `-- Tables: ${domain}\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${blocks.length}\n\n` + + blocks.join('\n\n') + '\n'; + const filename = domain.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_|_$/g, '') + '.sql'; + fs.writeFileSync(path.join(dirs.tables, filename), content); + } + + // 05_views + step('05_views...'); + const viewBlocks = fullSchema.match(/CREATE(?:\s+OR\s+REPLACE)?\s+VIEW\s+public\.[\s\S]*?;/gi) || []; + if (viewBlocks.length > 0) { + const content = `-- Views\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${viewBlocks.length}\n\n` + + viewBlocks.join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.views, 'views.sql'), content); + } + + // 06_indexes + step('06_indexes...'); + const indexLines = fullSchema.match(/CREATE (?:UNIQUE )?INDEX\s+\S+\s+ON\s+public\.\S+[\s\S]*?;/gi) || []; + if (indexLines.length > 0) { + const content = `-- Indexes\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${indexLines.length}\n\n` + + indexLines.join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.indexes, 'indexes.sql'), content); + } + + // 07_foreign_keys (+ PKs + UNIQUEs) + step('07_foreign_keys...'); + const constraintLines = fullSchema.match(/ALTER TABLE ONLY public\.\S+\s+ADD CONSTRAINT\s+[\s\S]*?;/gi) || []; + if (constraintLines.length > 0) { + const content = `-- Constraints (PK, FK, UNIQUE, CHECK)\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${constraintLines.length}\n\n` + + constraintLines.join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.foreignKeys, 'constraints.sql'), content); + } + + // 08_triggers + step('08_triggers...'); + const triggerLines = fullSchema.match(/CREATE TRIGGER\s+[\s\S]*?;/gi) || []; + if (triggerLines.length > 0) { + const content = `-- Triggers\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${triggerLines.length}\n\n` + + triggerLines.join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.triggers, 'triggers.sql'), content); + } + + // 09_policies + step('09_policies...'); + const policyEnables = fullSchema.match(/ALTER TABLE public\.\S+ ENABLE ROW LEVEL SECURITY;/gi) || []; + const policyCreates = fullSchema.match(/CREATE POLICY\s+[\s\S]*?;/gi) || []; + if (policyEnables.length > 0 || policyCreates.length > 0) { + const content = `-- RLS Policies\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Enable RLS: ${policyEnables.length} tabelas\n-- Policies: ${policyCreates.length}\n\n` + + '-- Enable RLS\n' + policyEnables.join('\n') + '\n\n' + + '-- Policies\n' + policyCreates.join('\n\n') + '\n'; + fs.writeFileSync(path.join(dirs.policies, 'policies.sql'), content); + } + + // 10_grants + step('10_grants...'); + const grantLines = fullSchema.match(/(?:GRANT|REVOKE)\s+[\s\S]*?;/gi) || []; + const publicGrants = grantLines.filter(g => /public\./i.test(g)); + if (publicGrants.length > 0) { + const content = `-- Grants\n-- Gerado automaticamente em ${new Date().toISOString()}\n-- Total: ${publicGrants.length}\n\n` + + publicGrants.join('\n') + '\n'; + fs.writeFileSync(path.join(dirs.grants, 'grants.sql'), content); + } + + // Summary + log(''); + ok('Schema exportado para schema/'); + const summary = [ + ['00_full', '1 arquivo'], + ['01_extensions', fs.readdirSync(dirs.extensions).length + ' arquivo(s)'], + ['02_types', fs.readdirSync(dirs.types).length + ' arquivo(s)'], + ['03_functions', fs.readdirSync(dirs.functions).length + ' arquivo(s), ' + funcBlocks.length + ' functions'], + ['04_tables', fs.readdirSync(dirs.tables).length + ' arquivo(s), ' + tableBlocks.length + ' tabelas'], + ['05_views', viewBlocks.length + ' views'], + ['06_indexes', indexLines.length + ' indexes'], + ['07_foreign_keys', constraintLines.length + ' constraints'], + ['08_triggers', triggerLines.length + ' triggers'], + ['09_policies', policyCreates.length + ' policies'], + ['10_grants', publicGrants.length + ' grants'], + ]; + for (const [dir, desc] of summary) { + step(`${dir}: ${desc}`); + } +}; + +// ---- DASHBOARD ---- +commands.dashboard = function (dateArg) { + title('Dashboard'); + + const scriptPath = path.join(ROOT, 'generate-dashboard.cjs'); + if (!fs.existsSync(scriptPath)) { + err(`Script não encontrado: ${scriptPath}`); + process.exit(1); + } + + const args = dateArg ? [scriptPath, dateArg] : [scriptPath]; + const result = spawnSync('node', args, { + stdio: 'inherit', + cwd: ROOT, + env: { ...process.env, PYTHONIOENCODING: 'utf-8', LANG: 'C.UTF-8' } + }); + + if (result.status !== 0) { + err('Falha ao gerar dashboard.'); + process.exit(result.status || 1); + } +}; + // ---- HELP ---- commands.help = function () { log(` @@ -661,15 +954,17 @@ ${c.cyan}Uso:${c.reset} node db.cjs [opções] ${c.cyan}Comandos:${c.reset} - ${c.bold}setup${c.reset} Instalação do zero (schema + fixes + seeds) + ${c.bold}setup${c.reset} Instalação do zero (schema + fixes + seeds + migrations) Cria backup automático após concluir ${c.bold}backup${c.reset} Exporta banco para backups/YYYY-MM-DD/ - Gera: schema.sql, data.sql, full_dump.sql + Gera: schema.sql, data.sql, full_dump.sql, + ${c.green}supabase_restore.sql${c.reset} (restauração completa) ${c.bold}restore [data]${c.reset} Restaura de um backup + Prioriza supabase_restore.sql se existir Sem data = último backup disponível - Ex: node db.cjs restore 2026-03-23 + Ex: node db.cjs restore 2026-04-17 ${c.bold}migrate${c.reset} Aplica migrations pendentes (pasta migrations/) Backup automático antes de aplicar @@ -685,9 +980,39 @@ ${c.cyan}Comandos:${c.reset} ${c.yellow}⚠ Cria backup antes de resetar${c.reset} ${c.bold}verify${c.reset} Verifica integridade dos dados essenciais + (tabelas + views definidas em db.config.json → verify) + + ${c.bold}schema-export${c.reset} Exporta schema separado em schema/ + 00_full, 01_extensions, 02_types, 03_functions, + 04_tables (agrupado por domínio), 05_views, + 06_indexes, 07_foreign_keys, 08_triggers, + 09_policies, 10_grants + + ${c.bold}dashboard [data]${c.reset} Gera dashboard HTML interativo do banco + Tabelas por domínio + seção Infraestrutura + busca + Sem data = usa schema do backup mais recente ${c.bold}help${c.reset} Mostra esta ajuda +${c.cyan}Backup Supabase-compatible:${c.reset} + + O comando ${c.bold}backup${c.reset} gera automaticamente o arquivo + ${c.green}supabase_restore.sql${c.reset} que contém TUDO necessário + para restaurar o banco do zero: + + • Schema public (tabelas, índices, triggers, functions) + • Dados auth.users + identities (autenticação) + • Todos os dados das tabelas public + • Metadados de storage buckets + + Para restaurar manualmente: + ${c.gray}# Opção 1: via CLI${c.reset} + node db.cjs restore + + ${c.gray}# Opção 2: direto no container${c.reset} + cat backups/2026-04-17/supabase_restore.sql | \\ + docker exec -i ${CONTAINER} psql -U ${USER} -d ${DB} + ${c.cyan}Exemplos:${c.reset} ${c.gray}# Primeira vez — instala tudo${c.reset} @@ -704,6 +1029,12 @@ ${c.cyan}Exemplos:${c.reset} ${c.gray}# Ver o que tem no banco${c.reset} node db.cjs status + + ${c.gray}# Atualizar as pastas schema/*${c.reset} + node db.cjs schema-export + + ${c.gray}# Gerar dashboard HTML${c.reset} + node db.cjs dashboard `); }; diff --git a/database-novo/db.config.json b/database-novo/db.config.json index 2fdb619..9a644ec 100644 --- a/database-novo/db.config.json +++ b/database-novo/db.config.json @@ -4,6 +4,9 @@ "user": "postgres", "backupRetentionDays": 30, "schema": "schema/00_full/schema.sql", + "migrationsDir": "migrations", + "seedsDir": "seeds", + "fixesDir": "fixes", "seeds": { "users": [ "seed_001_fixed.sql", @@ -15,7 +18,11 @@ "seed_011_features.sql", "seed_012_plan_features.sql", "seed_013_subscriptions.sql", - "seed_014_global_data.sql" + "seed_014_global_data.sql", + "seed_015_document_templates.sql", + "seed_030_dev_phases_items.sql", + "seed_031_dev_auditoria.sql", + "seed_032_dev_competitors.sql" ], "test_data": [ "seed_020_test_data.sql" @@ -30,5 +37,310 @@ "fix_subscriptions_validate_scope.sql", "fix_template_keys_match_populate.sql", "fix_encoding_accents.sql" - ] + ], + "verify": { + "tables": [ + { "name": "auth.users", "min": 1 }, + { "name": "profiles", "min": 1 }, + { "name": "tenants", "min": 1 }, + { "name": "plans", "min": 7 }, + { "name": "features", "min": 20 }, + { "name": "plan_features", "min": 50 }, + { "name": "subscriptions", "min": 1 }, + { "name": "email_templates_global", "min": 10 }, + { "name": "notification_templates", "min": 5 }, + { "name": "document_templates", "min": 1 } + ], + "views": [ + "v_tenant_entitlements", + "v_tenant_active_subscription" + ] + }, + "status": { + "tables": [ + "auth.users", + "profiles", + "tenants", + "tenant_members", + "plans", + "features", + "plan_features", + "subscriptions", + "patients", + "agenda_eventos", + "services", + "financial_records", + "document_templates", + "documents", + "email_templates_global", + "notification_templates" + ] + }, + "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" + ] + }, + "domainColors": { + "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" + }, + "infrastructure": { + "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." + } + ] + } + } } diff --git a/database-novo/generate-dashboard.cjs b/database-novo/generate-dashboard.cjs index a655c1c..377d2e2 100644 --- a/database-novo/generate-dashboard.cjs +++ b/database-novo/generate-dashboard.cjs @@ -3,173 +3,124 @@ // AgenciaPsi — Dashboard Generator // ============================================================================= // Uso: -// node generate-dashboard.js → usa backup mais recente -// node generate-dashboard.js 2026-03-27 → usa backup de data específica +// node generate-dashboard.cjs → usa backup mais recente +// node generate-dashboard.cjs 2026-04-17 → usa backup de data específica // -// Lê de: ./database-novo/backups/YYYY-MM-DD/schema.sql -// Gera: ./dashboard.html (na mesma pasta do script) +// Lê de: ./backups/YYYY-MM-DD/schema.sql +// Lê de: ./db.config.json (domínios, cores e infraestrutura) +// Gera: ./agenciapsi-db-dashboard.html (na mesma pasta do script) // ============================================================================= -const fs = require('fs'); +const fs = require('fs'); const path = require('path'); -const BACKUPS_DIR = path.join(__dirname, 'backups'); -const OUTPUT_FILE = path.join(__dirname, 'dashboard.html'); +const ROOT = __dirname; +const BACKUPS_DIR = path.join(ROOT, 'backups'); +const OUTPUT_FILE = path.join(ROOT, 'agenciapsi-db-dashboard.html'); +const CONFIG_FILE = path.join(ROOT, 'db.config.json'); // --------------------------------------------------------------------------- -// Cores por domínio +// Carrega config (domínios, cores e infraestrutura) // --------------------------------------------------------------------------- -const DOMAIN_COLORS = { - 'SaaS / Planos': '#4f8cff', - 'Tenants / Multi-tenant': '#6ee7b7', - 'Pacientes': '#f472b6', - 'Agenda': '#fb923c', - 'Financeiro': '#a78bfa', - 'Serviços / Commitments': '#34d399', - 'Notificações': '#38bdf8', - 'Email / Comunicação': '#fbbf24', - 'SaaS Admin': '#94a3b8', -}; - -// --------------------------------------------------------------------------- -// Mapeamento domínio → tabelas -// Adicione novas tabelas aqui quando criar migrations -// --------------------------------------------------------------------------- -const DOMAIN_TABLES = { - 'SaaS / Planos': [ - 'plans','plan_features','plan_prices','plan_public','plan_public_bullets', - 'features','modules','module_features','subscriptions','subscription_events', - 'subscription_intents_personal','subscription_intents_tenant','subscription_intents_legacy', - 'addon_products','addon_credits','addon_transactions', - 'tenant_features','tenant_modules','entitlements_invalidation','tenant_feature_exceptions_log', - ], - 'Tenants / Multi-tenant': [ - 'tenants','tenant_members','tenant_invites','owner_users', - 'profiles','company_profiles','billing_contracts','payment_settings','support_sessions', - ], - 'Pacientes': [ - 'patients','patient_groups','patient_group_patient','patient_tags', - 'patient_patient_tag','patient_discounts','patient_invites','patient_intake_requests', - ], - 'Agenda': [ - 'agenda_eventos','agenda_configuracoes','agenda_bloqueios','agenda_excecoes', - 'agenda_online_slots','agenda_regras_semanais','agenda_slots_bloqueados_semanais', - 'agenda_slots_regras','agendador_configuracoes','agendador_solicitacoes', - 'feriados','recurrence_rules','recurrence_exceptions','recurrence_rule_services', - ], - 'Financeiro': [ - 'financial_records','financial_categories','financial_exceptions', - 'therapist_payouts','therapist_payout_records', - 'insurance_plans','insurance_plan_services','professional_pricing', - ], - 'Serviços / Commitments': [ - 'services','determined_commitments','determined_commitment_fields', - 'commitment_services','commitment_time_logs', - ], - 'Notificações': [ - 'notifications','notification_channels','notification_templates', - 'notification_queue','notification_logs','notification_preferences', - 'notification_schedules','twilio_subaccount_usage', - ], - 'Email / Comunicação': [ - 'email_templates_global','email_templates_tenant','email_layout_config', - 'global_notices','notice_dismissals','login_carousel_slides', - ], - 'SaaS Admin': [ - 'saas_admins','saas_docs','saas_doc_votos','saas_faq','saas_faq_itens', - 'user_settings','dev_user_credentials','_db_migrations', - ], -}; +if (!fs.existsSync(CONFIG_FILE)) { + console.error(`✖ Config não encontrada: ${CONFIG_FILE}`); + process.exit(1); +} +const CONFIG = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8')); +const DOMAIN_TABLES = CONFIG.domains || {}; +const DOMAIN_COLORS = CONFIG.domainColors || {}; +const INFRASTRUCTURE = CONFIG.infrastructure || {}; // --------------------------------------------------------------------------- // 1. Resolve qual schema.sql usar // --------------------------------------------------------------------------- function resolveSchema() { - const arg = process.argv[2]; + const arg = process.argv[2]; - if (!fs.existsSync(BACKUPS_DIR)) { - console.error(`✖ Pasta não encontrada: ${BACKUPS_DIR}`); - console.error(` Certifique-se que o script está na raiz do projeto.`); - process.exit(1); - } + if (!fs.existsSync(BACKUPS_DIR)) { + console.error(`✖ Pasta não encontrada: ${BACKUPS_DIR}`); + console.error(` Rode primeiro: node db.cjs backup`); + process.exit(1); + } - const available = fs.readdirSync(BACKUPS_DIR) - .filter(f => /^\d{4}-\d{2}-\d{2}$/.test(f)) - .sort() - .reverse(); + const available = fs + .readdirSync(BACKUPS_DIR) + .filter((f) => /^\d{4}-\d{2}-\d{2}$/.test(f)) + .sort() + .reverse(); - if (available.length === 0) { - console.error('✖ Nenhum backup encontrado em database-novo/backups/'); - console.error(' Rode primeiro: node db.cjs backup'); - process.exit(1); - } + if (available.length === 0) { + console.error('✖ Nenhum backup encontrado em database-novo/backups/'); + console.error(' Rode primeiro: node db.cjs backup'); + process.exit(1); + } - const date = (arg && /^\d{4}-\d{2}-\d{2}$/.test(arg)) ? arg : available[0]; + const date = arg && /^\d{4}-\d{2}-\d{2}$/.test(arg) ? arg : available[0]; - if (!available.includes(date)) { - console.error(`✖ Backup não encontrado para: ${date}`); - console.error(` Disponíveis: ${available.join(', ')}`); - process.exit(1); - } + if (!available.includes(date)) { + console.error(`✖ Backup não encontrado para: ${date}`); + console.error(` Disponíveis: ${available.join(', ')}`); + process.exit(1); + } - const schemaPath = path.join(BACKUPS_DIR, date, 'schema.sql'); - if (!fs.existsSync(schemaPath)) { - console.error(`✖ schema.sql não encontrado em database-novo/backups/${date}/`); - process.exit(1); - } + const schemaPath = path.join(BACKUPS_DIR, date, 'schema.sql'); + if (!fs.existsSync(schemaPath)) { + console.error(`✖ schema.sql não encontrado em backups/${date}/`); + process.exit(1); + } - return { schemaPath, date, available }; + return { schemaPath, date, available }; } // --------------------------------------------------------------------------- // 2. Parse do schema.sql — extrai tabelas, colunas e FKs // --------------------------------------------------------------------------- function parseSchema(content) { - const tables = {}; + const tables = {}; - // Tabelas public.* - const tableRe = /CREATE TABLE (public\.\S+)\s*\(([\s\S]*?)\);/gm; - let m; - while ((m = tableRe.exec(content)) !== null) { - const name = m[1].replace('public.', ''); - const body = m[2]; - const columns = []; + // Tabelas public.* + const tableRe = /CREATE TABLE (public\.\S+)\s*\(([\s\S]*?)\);/gm; + let m; + while ((m = tableRe.exec(content)) !== null) { + const name = m[1].replace('public.', ''); + const body = m[2]; + const columns = []; - for (let line of body.split('\n')) { - line = line.trim().replace(/,$/, ''); - if (!line || line.startsWith('--')) continue; - if (/^(CONSTRAINT|PRIMARY KEY|UNIQUE|CHECK|FOREIGN KEY|EXCLUDE)/i.test(line)) continue; + for (let line of body.split('\n')) { + line = line.trim().replace(/,$/, ''); + if (!line || line.startsWith('--')) continue; + if (/^(CONSTRAINT|PRIMARY KEY|UNIQUE|CHECK|FOREIGN KEY|EXCLUDE)/i.test(line)) continue; - const col = line.match( - /^(\w+)\s+([\w\[\]"()\s,]+?)(?:\s+DEFAULT\s+|\s+NOT NULL|\s+NULL|\s+GENERATED|\s+REFERENCES\s|$)/ - ); - if (col) { - columns.push({ - name: col[1], - type: col[2].trim().split('(')[0].trim(), - pk: col[1] === 'id', - }); - } + const col = line.match( + /^(\w+)\s+([\w\[\]"()\s,]+?)(?:\s+DEFAULT\s+|\s+NOT NULL|\s+NULL|\s+GENERATED|\s+REFERENCES\s|$)/ + ); + if (col) { + columns.push({ + name: col[1], + type: col[2].trim().split('(')[0].trim(), + pk: col[1] === 'id' + }); + } + } + + tables[name] = { columns, fks: [] }; } - tables[name] = { columns, fks: [] }; - } - - // FKs via ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY - const fkRe = /ALTER TABLE ONLY public\.(\w+)\s+ADD CONSTRAINT \S+ FOREIGN KEY \((\w+)\) REFERENCES public\.(\w+)\((\w+)\)/gm; - while ((m = fkRe.exec(content)) !== null) { - const [, fromTable, fromCol, toTable, toCol] = m; - if (tables[fromTable]) { - tables[fromTable].fks.push({ from_col: fromCol, to_table: toTable, to_col: toCol }); + // FKs via ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY + const fkRe = /ALTER TABLE ONLY public\.(\w+)\s+ADD CONSTRAINT \S+ FOREIGN KEY \((\w+)\) REFERENCES public\.(\w+)\((\w+)\)/gm; + while ((m = fkRe.exec(content)) !== null) { + const [, fromTable, fromCol, toTable, toCol] = m; + if (tables[fromTable]) { + tables[fromTable].fks.push({ from_col: fromCol, to_table: toTable, to_col: toCol }); + } } - } - // Views - const viewRe = /CREATE(?:\s+OR REPLACE)?\s+VIEW\s+public\.(\S+)\s+AS/gm; - const views = []; - while ((m = viewRe.exec(content)) !== null) views.push(m[1]); + // Views + const viewRe = /CREATE(?:\s+OR REPLACE)?\s+VIEW\s+public\.(\S+)\s+AS/gm; + const views = []; + while ((m = viewRe.exec(content)) !== null) views.push(m[1]); - return { tables, views }; + return { tables, views }; } // --------------------------------------------------------------------------- @@ -177,35 +128,43 @@ function parseSchema(content) { // Tabelas novas que ainda não estão mapeadas vão para "Outros" // --------------------------------------------------------------------------- function buildDomains(tables) { - const mapped = new Set(Object.values(DOMAIN_TABLES).flat()); - const others = Object.keys(tables).filter(t => !mapped.has(t)); + const mapped = new Set(Object.values(DOMAIN_TABLES).flat()); + const others = Object.keys(tables).filter((t) => !mapped.has(t) && t !== '_db_migrations'); - const domains = {}; - for (const [domain, list] of Object.entries(DOMAIN_TABLES)) { - const present = list.filter(t => tables[t]); - if (present.length > 0) domains[domain] = present; - } - if (others.length > 0) { - domains['Outros'] = others; - DOMAIN_COLORS['Outros'] = '#6b7280'; - } + const domains = {}; + for (const [domain, list] of Object.entries(DOMAIN_TABLES)) { + const present = list.filter((t) => tables[t]); + if (present.length > 0) domains[domain] = present; + } + if (others.length > 0) { + domains['Outros'] = others; + DOMAIN_COLORS['Outros'] = '#6b7280'; + } - return domains; + return domains; } // --------------------------------------------------------------------------- // 4. Gera o HTML final (standalone, sem dependências externas de JS) // --------------------------------------------------------------------------- function generateHTML(tables, views, domains, date, available) { - const totalFKs = Object.values(tables).reduce((a, t) => a + t.fks.length, 0); - const totalCols = Object.values(tables).reduce((a, t) => a + t.columns.length, 0); - const generated = new Date().toLocaleString('pt-BR'); + const totalFKs = Object.values(tables).reduce((a, t) => a + t.fks.length, 0); + const totalCols = Object.values(tables).reduce((a, t) => a + t.columns.length, 0); + const infraGroups = Object.keys(INFRASTRUCTURE).length; + const infraItems = Object.values(INFRASTRUCTURE).reduce((a, g) => a + (g.items?.length || 0), 0); + const generated = new Date().toLocaleString('pt-BR'); - // Serializa dados para embutir no HTML - const jsonData = JSON.stringify({ tables, views, domains }); - const jsonColors = JSON.stringify(DOMAIN_COLORS); + // Slug por domínio — usado como id para scroll (ex: "SaaS / Planos" → "saas-planos") + const slugify = (s) => s.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''); + const domainSlugs = {}; + for (const d of Object.keys(domains)) domainSlugs[d] = slugify(d); - return ` + // Serializa dados para embutir no HTML + const jsonData = JSON.stringify({ tables, views, domains, slugs: domainSlugs }); + const jsonColors = JSON.stringify(DOMAIN_COLORS); + const jsonInfra = JSON.stringify(INFRASTRUCTURE); + + return ` @@ -213,7 +172,7 @@ function generateHTML(tables, views, domains, date, available) { AgenciaPsi DB · ${date} @@ -295,6 +274,7 @@ function generateHTML(tables, views, domains, date, available) {
${totalFKs} FKs
${views.length} views
${totalCols} colunas
+
${infraItems} infra
@@ -304,24 +284,36 @@ function generateHTML(tables, views, domains, date, available) { @@ -437,21 +491,26 @@ const content = fs.readFileSync(schemaPath, 'utf8'); console.log(` → Lendo schema... (${(content.length / 1024).toFixed(0)} KB)`); const { tables, views } = parseSchema(content); -const domains = buildDomains(tables); +const domains = buildDomains(tables); const totalFKs = Object.values(tables).reduce((a, t) => a + t.fks.length, 0); console.log(` → ${Object.keys(tables).length} tabelas · ${totalFKs} FKs · ${views.length} views`); // Avisa sobre tabelas novas não mapeadas if (domains['Outros']) { - console.log(`\n ⚠ Tabelas novas sem domínio definido (aparecerão em "Outros"):`); - domains['Outros'].forEach(t => console.log(` - ${t}`)); - console.log(` → Edite DOMAIN_TABLES no script para mapeá-las.\n`); + console.log(`\n ⚠ Tabelas novas sem domínio definido (aparecerão em "Outros"):`); + domains['Outros'].forEach((t) => console.log(` - ${t}`)); + console.log(` → Edite "domains" em db.config.json para mapeá-las.\n`); } +// Infra stats +const infraGroups = Object.keys(INFRASTRUCTURE).length; +const infraItems = Object.values(INFRASTRUCTURE).reduce((a, g) => a + (g.items?.length || 0), 0); +console.log(` → Infraestrutura: ${infraGroups} grupos, ${infraItems} itens`); + const html = generateHTML(tables, views, domains, date, available); fs.writeFileSync(OUTPUT_FILE, html, 'utf8'); -console.log(`\n✔ Gerado: ${OUTPUT_FILE}`); +console.log(`\n✔ Gerado: ${OUTPUT_FILE}`); console.log(` Tamanho: ${(fs.statSync(OUTPUT_FILE).size / 1024).toFixed(0)} KB`); -console.log(` Abra no browser: file://${OUTPUT_FILE}\n`); +console.log(` Abra no browser: file://${OUTPUT_FILE.replace(/\\/g, '/')}\n`); diff --git a/database-novo/migrations/20260417000001_dev_tables.sql b/database-novo/migrations/20260417000001_dev_tables.sql new file mode 100644 index 0000000..441bd2d --- /dev/null +++ b/database-novo/migrations/20260417000001_dev_tables.sql @@ -0,0 +1,275 @@ +-- ============================================================================= +-- Migration: 20260417000001_dev_tables +-- Área de Desenvolvimento (dev_*) — roadmap, auditoria, concorrentes, logs +-- ----------------------------------------------------------------------------- +-- Tabelas usadas pela página /saas/desenvolvimento. Todas restritas a +-- saas_admins via RLS (helper public.is_saas_admin()). +-- ============================================================================= + +-- ----------------------------------------------------------------------------- +-- Helper trigger: updated_at +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.dev_set_updated_at() +RETURNS TRIGGER +LANGUAGE plpgsql +AS $$ +BEGIN + NEW.updated_at := now(); + RETURN NEW; +END; +$$; + +-- ============================================================================= +-- 1. dev_roadmap_phases — Fases (1, 2, 3...) +-- ============================================================================= +CREATE TABLE IF NOT EXISTS public.dev_roadmap_phases ( + id BIGSERIAL PRIMARY KEY, + numero INTEGER NOT NULL UNIQUE, + nome VARCHAR(160) NOT NULL, + objetivo TEXT, + timeline_sugerida VARCHAR(160), + criterio_saida TEXT, + status VARCHAR(20) NOT NULL DEFAULT 'planejada' + CHECK (status IN ('planejada','em_andamento','concluida','arquivada')), + data_inicio DATE, + data_fim DATE, + ordem INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); +CREATE INDEX IF NOT EXISTS idx_dev_roadmap_phases_status ON public.dev_roadmap_phases(status); +CREATE INDEX IF NOT EXISTS idx_dev_roadmap_phases_ordem ON public.dev_roadmap_phases(ordem); + +DROP TRIGGER IF EXISTS trg_dev_roadmap_phases_updated_at ON public.dev_roadmap_phases; +CREATE TRIGGER trg_dev_roadmap_phases_updated_at + BEFORE UPDATE ON public.dev_roadmap_phases + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +-- ============================================================================= +-- 2. dev_roadmap_items — Itens das fases +-- ============================================================================= +CREATE TABLE IF NOT EXISTS public.dev_roadmap_items ( + id BIGSERIAL PRIMARY KEY, + phase_id BIGINT NOT NULL REFERENCES public.dev_roadmap_phases(id) ON DELETE CASCADE, + numero INTEGER, + bloco VARCHAR(160), + feature TEXT NOT NULL, + descricao TEXT, + esforco VARCHAR(4) + CHECK (esforco IS NULL OR esforco IN ('S','M','L','XL')), + prioridade VARCHAR(20) + CHECK (prioridade IS NULL OR prioridade IN ('bloqueador','alta','media','diferencial')), + status VARCHAR(20) NOT NULL DEFAULT 'pendente' + CHECK (status IN ('pendente','em_andamento','concluido','cancelado','bloqueado')), + notas TEXT, + assignee VARCHAR(120), + data_inicio DATE, + data_conclusao DATE, + ordem INTEGER NOT NULL DEFAULT 0, + tags TEXT[] DEFAULT '{}', + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); +CREATE INDEX IF NOT EXISTS idx_dev_roadmap_items_phase ON public.dev_roadmap_items(phase_id); +CREATE INDEX IF NOT EXISTS idx_dev_roadmap_items_status ON public.dev_roadmap_items(status); +CREATE INDEX IF NOT EXISTS idx_dev_roadmap_items_prior ON public.dev_roadmap_items(prioridade); +CREATE INDEX IF NOT EXISTS idx_dev_roadmap_items_ordem ON public.dev_roadmap_items(phase_id, ordem); + +DROP TRIGGER IF EXISTS trg_dev_roadmap_items_updated_at ON public.dev_roadmap_items; +CREATE TRIGGER trg_dev_roadmap_items_updated_at + BEFORE UPDATE ON public.dev_roadmap_items + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +-- ============================================================================= +-- 3. dev_auditoria_items — Bugs / débitos técnicos / decisões +-- ============================================================================= +CREATE TABLE IF NOT EXISTS public.dev_auditoria_items ( + id BIGSERIAL PRIMARY KEY, + categoria VARCHAR(120), + titulo TEXT NOT NULL, + descricao_problema TEXT, + solucao TEXT, + severidade VARCHAR(20) + CHECK (severidade IS NULL OR severidade IN ('critico','alto','medio','baixo')), + status VARCHAR(20) NOT NULL DEFAULT 'aberto' + CHECK (status IN ('aberto','em_analise','resolvido','wontfix','duplicado')), + resolvido_em DATE, + sessao_resolucao VARCHAR(160), + arquivo_afetado TEXT, + tags TEXT[] DEFAULT '{}', + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); +CREATE INDEX IF NOT EXISTS idx_dev_auditoria_items_status ON public.dev_auditoria_items(status); +CREATE INDEX IF NOT EXISTS idx_dev_auditoria_items_severidade ON public.dev_auditoria_items(severidade); +CREATE INDEX IF NOT EXISTS idx_dev_auditoria_items_categoria ON public.dev_auditoria_items(categoria); + +DROP TRIGGER IF EXISTS trg_dev_auditoria_items_updated_at ON public.dev_auditoria_items; +CREATE TRIGGER trg_dev_auditoria_items_updated_at + BEFORE UPDATE ON public.dev_auditoria_items + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +-- ============================================================================= +-- 4. dev_competitors — Concorrentes +-- ============================================================================= +CREATE TABLE IF NOT EXISTS public.dev_competitors ( + id BIGSERIAL PRIMARY KEY, + slug VARCHAR(80) NOT NULL UNIQUE, + nome VARCHAR(160) NOT NULL, + pais VARCHAR(40), + foco VARCHAR(160), + pricing TEXT, + posicionamento TEXT, + url TEXT, + ultima_pesquisa DATE, + notas TEXT, + ativo BOOLEAN NOT NULL DEFAULT true, + ordem INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); +CREATE INDEX IF NOT EXISTS idx_dev_competitors_ativo ON public.dev_competitors(ativo); +CREATE INDEX IF NOT EXISTS idx_dev_competitors_pais ON public.dev_competitors(pais); + +DROP TRIGGER IF EXISTS trg_dev_competitors_updated_at ON public.dev_competitors; +CREATE TRIGGER trg_dev_competitors_updated_at + BEFORE UPDATE ON public.dev_competitors + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +-- ============================================================================= +-- 5. dev_competitor_features — features de cada concorrente +-- ============================================================================= +CREATE TABLE IF NOT EXISTS public.dev_competitor_features ( + id BIGSERIAL PRIMARY KEY, + competitor_id BIGINT NOT NULL REFERENCES public.dev_competitors(id) ON DELETE CASCADE, + categoria VARCHAR(120), + nome TEXT NOT NULL, + descricao TEXT, + fonte VARCHAR(20) NOT NULL DEFAULT 'publico' + CHECK (fonte IN ('fetched','observacao','publico','hipotese')), + fonte_url TEXT, + data_fonte DATE, + destaque BOOLEAN NOT NULL DEFAULT false, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); +CREATE INDEX IF NOT EXISTS idx_dev_competitor_features_comp ON public.dev_competitor_features(competitor_id); +CREATE INDEX IF NOT EXISTS idx_dev_competitor_features_cat ON public.dev_competitor_features(categoria); +CREATE INDEX IF NOT EXISTS idx_dev_competitor_features_destaque ON public.dev_competitor_features(destaque); + +DROP TRIGGER IF EXISTS trg_dev_competitor_features_updated_at ON public.dev_competitor_features; +CREATE TRIGGER trg_dev_competitor_features_updated_at + BEFORE UPDATE ON public.dev_competitor_features + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +-- ============================================================================= +-- 6. dev_comparison_matrix — AgenciaPsi × features-de-concorrente +-- ============================================================================= +CREATE TABLE IF NOT EXISTS public.dev_comparison_matrix ( + id BIGSERIAL PRIMARY KEY, + dominio VARCHAR(120), + feature TEXT NOT NULL, + nosso_status VARCHAR(20) NOT NULL DEFAULT 'a_definir' + CHECK (nosso_status IN ('tem','parcial','gap','na','a_definir')), + nossa_nota TEXT, + importancia VARCHAR(20) + CHECK (importancia IS NULL OR importancia IN ('alta','media','baixa')), + ordem INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); +CREATE INDEX IF NOT EXISTS idx_dev_comparison_matrix_dominio ON public.dev_comparison_matrix(dominio); +CREATE INDEX IF NOT EXISTS idx_dev_comparison_matrix_status ON public.dev_comparison_matrix(nosso_status); + +DROP TRIGGER IF EXISTS trg_dev_comparison_matrix_updated_at ON public.dev_comparison_matrix; +CREATE TRIGGER trg_dev_comparison_matrix_updated_at + BEFORE UPDATE ON public.dev_comparison_matrix + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +-- dev_comparison_competitor_status — opcional: status por concorrente por feature +-- (se quisermos marcar que competitor X tem feature Y). Tabela ponte N-N. +CREATE TABLE IF NOT EXISTS public.dev_comparison_competitor_status ( + id BIGSERIAL PRIMARY KEY, + comparison_id BIGINT NOT NULL REFERENCES public.dev_comparison_matrix(id) ON DELETE CASCADE, + competitor_id BIGINT NOT NULL REFERENCES public.dev_competitors(id) ON DELETE CASCADE, + status VARCHAR(20) NOT NULL DEFAULT 'a_definir' + CHECK (status IN ('tem','parcial','gap','na','a_definir')), + nota TEXT, + fonte VARCHAR(20) + CHECK (fonte IS NULL OR fonte IN ('fetched','observacao','publico','hipotese')), + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), + UNIQUE (comparison_id, competitor_id) +); +CREATE INDEX IF NOT EXISTS idx_dev_ccs_comp ON public.dev_comparison_competitor_status(competitor_id); +CREATE INDEX IF NOT EXISTS idx_dev_ccs_comparison ON public.dev_comparison_competitor_status(comparison_id); + +DROP TRIGGER IF EXISTS trg_dev_ccs_updated_at ON public.dev_comparison_competitor_status; +CREATE TRIGGER trg_dev_ccs_updated_at + BEFORE UPDATE ON public.dev_comparison_competitor_status + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +-- ============================================================================= +-- 7. dev_generation_log — histórico de execuções (backup, dashboard, export...) +-- ============================================================================= +CREATE TABLE IF NOT EXISTS public.dev_generation_log ( + id BIGSERIAL PRIMARY KEY, + tipo VARCHAR(40) NOT NULL, + comando TEXT, + sucesso BOOLEAN NOT NULL DEFAULT false, + stdout TEXT, + stderr TEXT, + duration_ms INTEGER, + metadata JSONB DEFAULT '{}'::jsonb, + trigger_user_id UUID, + created_at TIMESTAMPTZ NOT NULL DEFAULT now() +); +CREATE INDEX IF NOT EXISTS idx_dev_generation_log_tipo ON public.dev_generation_log(tipo); +CREATE INDEX IF NOT EXISTS idx_dev_generation_log_created ON public.dev_generation_log(created_at DESC); + +-- ============================================================================= +-- RLS — tudo restrito a saas_admins (helper existente: public.is_saas_admin()) +-- ============================================================================= +DO $$ +DECLARE + t TEXT; + dev_tables TEXT[] := ARRAY[ + 'dev_roadmap_phases', + 'dev_roadmap_items', + 'dev_auditoria_items', + 'dev_competitors', + 'dev_competitor_features', + 'dev_comparison_matrix', + 'dev_comparison_competitor_status', + 'dev_generation_log' + ]; +BEGIN + FOREACH t IN ARRAY dev_tables + LOOP + EXECUTE format('ALTER TABLE public.%I ENABLE ROW LEVEL SECURITY;', t); + + -- Drop policy se existir (idempotente) + EXECUTE format('DROP POLICY IF EXISTS %I ON public.%I;', t || '_saas_admin_all', t); + + -- Cria policy que permite tudo pra saas_admin + EXECUTE format( + 'CREATE POLICY %I ON public.%I FOR ALL TO authenticated + USING (public.is_saas_admin()) + WITH CHECK (public.is_saas_admin());', + t || '_saas_admin_all', + t + ); + END LOOP; +END $$; + +-- ============================================================================= +-- Comentários +-- ============================================================================= +COMMENT ON TABLE public.dev_roadmap_phases IS 'Fases do roadmap (MVP, Paridade, Diferenciação). Visível só pra saas_admins.'; +COMMENT ON TABLE public.dev_roadmap_items IS 'Itens de cada fase do roadmap.'; +COMMENT ON TABLE public.dev_auditoria_items IS 'Bugs, dívidas técnicas e decisões arquiteturais.'; +COMMENT ON TABLE public.dev_competitors IS 'Concorrentes analisados no benchmark.'; +COMMENT ON TABLE public.dev_competitor_features IS 'Features catalogadas de cada concorrente.'; +COMMENT ON TABLE public.dev_comparison_matrix IS 'Matriz de comparação AgenciaPsi × features esperadas do mercado.'; +COMMENT ON TABLE public.dev_comparison_competitor_status IS 'Qual concorrente tem qual feature (ponte N-N com matrix).'; +COMMENT ON TABLE public.dev_generation_log IS 'Histórico de execuções (backup, dashboard, export, seed, etc).'; diff --git a/database-novo/migrations/20260417000002_dev_tables_ordem.sql b/database-novo/migrations/20260417000002_dev_tables_ordem.sql new file mode 100644 index 0000000..b209dd8 --- /dev/null +++ b/database-novo/migrations/20260417000002_dev_tables_ordem.sql @@ -0,0 +1,48 @@ +-- ============================================================================= +-- Migration: 20260417000002_dev_tables_ordem +-- Adiciona coluna `ordem` em dev_auditoria_items e dev_competitor_features +-- (pra suportar reordenação por drag-and-drop na UI). +-- ============================================================================= + +-- dev_auditoria_items +ALTER TABLE public.dev_auditoria_items + ADD COLUMN IF NOT EXISTS ordem INTEGER NOT NULL DEFAULT 0; + +CREATE INDEX IF NOT EXISTS idx_dev_auditoria_items_ordem ON public.dev_auditoria_items(ordem); + +-- Popular ordem existente (status + id pra evitar colisão) +UPDATE public.dev_auditoria_items SET ordem = sub.rn +FROM ( + SELECT id, ROW_NUMBER() OVER ( + ORDER BY + CASE status + WHEN 'aberto' THEN 1 + WHEN 'em_analise' THEN 2 + WHEN 'resolvido' THEN 3 + WHEN 'wontfix' THEN 4 + WHEN 'duplicado' THEN 5 + ELSE 6 + END, + id + ) AS rn + FROM public.dev_auditoria_items +) sub +WHERE public.dev_auditoria_items.id = sub.id; + +-- dev_competitor_features +ALTER TABLE public.dev_competitor_features + ADD COLUMN IF NOT EXISTS ordem INTEGER NOT NULL DEFAULT 0; + +CREATE INDEX IF NOT EXISTS idx_dev_competitor_features_ordem + ON public.dev_competitor_features(competitor_id, ordem); + +-- Popular ordem existente (por competitor + categoria + id) +UPDATE public.dev_competitor_features SET ordem = sub.rn +FROM ( + SELECT id, ROW_NUMBER() OVER ( + PARTITION BY competitor_id + ORDER BY COALESCE(categoria, 'zzz'), id + ) AS rn + FROM public.dev_competitor_features +) sub +WHERE public.dev_competitor_features.id = sub.id; diff --git a/database-novo/migrations/20260418000001_dev_verificacoes.sql b/database-novo/migrations/20260418000001_dev_verificacoes.sql new file mode 100644 index 0000000..25e6549 --- /dev/null +++ b/database-novo/migrations/20260418000001_dev_verificacoes.sql @@ -0,0 +1,51 @@ +-- ============================================================================= +-- Migration: 20260418000001_dev_verificacoes +-- Nova aba "Verificações" em /saas/desenvolvimento +-- ----------------------------------------------------------------------------- +-- Diferente de dev_auditoria_items (bugs conhecidos), esta tabela registra o +-- PROCESSO de revisão sênior sessão-a-sessão: o que já foi olhado, o que falta +-- olhar, o que foi encontrado em cada área do sistema. +-- ============================================================================= + +CREATE TABLE IF NOT EXISTS public.dev_verificacoes_items ( + id BIGSERIAL PRIMARY KEY, + area VARCHAR(80) NOT NULL, + categoria VARCHAR(120), + titulo TEXT NOT NULL, + descricao TEXT, + resultado TEXT, + acao_sugerida TEXT, + severidade VARCHAR(20) + CHECK (severidade IS NULL OR severidade IN ('critico','alto','medio','baixo')), + status VARCHAR(20) NOT NULL DEFAULT 'pendente' + CHECK (status IN ('pendente','verificando','ok','problema','corrigido','wontfix')), + verificado_em DATE, + sessao_verificacao VARCHAR(160), + arquivo_afetado TEXT, + auditoria_item_id BIGINT REFERENCES public.dev_auditoria_items(id) ON DELETE SET NULL, + tags TEXT[] DEFAULT '{}', + ordem INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); + +CREATE INDEX IF NOT EXISTS idx_dev_verificacoes_area ON public.dev_verificacoes_items(area); +CREATE INDEX IF NOT EXISTS idx_dev_verificacoes_status ON public.dev_verificacoes_items(status); +CREATE INDEX IF NOT EXISTS idx_dev_verificacoes_severidade ON public.dev_verificacoes_items(severidade); +CREATE INDEX IF NOT EXISTS idx_dev_verificacoes_ordem ON public.dev_verificacoes_items(area, ordem); + +DROP TRIGGER IF EXISTS trg_dev_verificacoes_updated_at ON public.dev_verificacoes_items; +CREATE TRIGGER trg_dev_verificacoes_updated_at + BEFORE UPDATE ON public.dev_verificacoes_items + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +ALTER TABLE public.dev_verificacoes_items ENABLE ROW LEVEL SECURITY; +DROP POLICY IF EXISTS dev_verificacoes_items_saas_admin_all ON public.dev_verificacoes_items; +CREATE POLICY dev_verificacoes_items_saas_admin_all ON public.dev_verificacoes_items + FOR ALL TO authenticated + USING (public.is_saas_admin()) + WITH CHECK (public.is_saas_admin()); + +COMMENT ON TABLE public.dev_verificacoes_items IS 'Revisão sênior por área/sessão — o que foi verificado e o que foi encontrado.'; +COMMENT ON COLUMN public.dev_verificacoes_items.area IS 'Domínio revisado: auth, router, agenda, financeiro, pacientes, comunicacao, etc.'; +COMMENT ON COLUMN public.dev_verificacoes_items.auditoria_item_id IS 'Link opcional: se a verificação virou um bug em dev_auditoria_items.'; diff --git a/database-novo/migrations/20260418000002_patient_intake_security_hardening.sql b/database-novo/migrations/20260418000002_patient_intake_security_hardening.sql new file mode 100644 index 0000000..a23e717 --- /dev/null +++ b/database-novo/migrations/20260418000002_patient_intake_security_hardening.sql @@ -0,0 +1,403 @@ +-- ============================================================================= +-- Migration: 20260418000002_patient_intake_security_hardening +-- Corrige 5 críticos (A#15-#19) e 1 médio (A#27) da V#31 security review. +-- ----------------------------------------------------------------------------- +-- Alvo: create_patient_intake_request_v2, rotate_patient_invite_token, bucket +-- avatars + storage policies. +-- +-- Princípio: sanitizar tudo — trim, nullif, length check, regexp_replace, +-- whitelist de valores, validação de token completa (active/expires/max_uses). +-- ============================================================================= + +-- ───────────────────────────────────────────────────────────────────────── +-- 1. create_patient_intake_request_v2 — versão hardened +-- ----------------------------------------------------------------------------- +-- Mudanças vs versão anterior: +-- • A#16: valida active, expires_at, max_uses; incrementa uses no final +-- • A#17: descarta notas_internas (campo interno; paciente não deve preencher) +-- • A#19: preenche tenant_id (via patient_invites.tenant_id ou tenant_members) +-- • A#27: length checks em TODOS os campos texto +-- • Sanitização: trim + nullif em strings, regexp_replace em docs/phone/cep, +-- lower em emails, whitelist para genero/estado_civil +-- • Consent obrigatório (raise se false) +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.create_patient_intake_request_v2( + p_token text, + p_payload jsonb +) +RETURNS uuid +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + v_owner_id uuid; + v_tenant_id uuid; + v_active boolean; + v_expires timestamptz; + v_max_uses int; + v_uses int; + v_intake_id uuid; + v_birth_raw text; + v_birth date; + v_email text; + v_email_alt text; + v_nome text; + v_consent boolean; + v_genero text; + v_estado_civil text; + + -- Whitelists para campos tipados + c_generos text[] := ARRAY['male','female','non_binary','other','na']; + c_estados_civis text[] := ARRAY['single','married','divorced','widowed','na']; +BEGIN + -- ─────────────────────────────────────────────────────────────────────── + -- Carrega invite e valida TUDO (A#16) + -- ─────────────────────────────────────────────────────────────────────── + SELECT owner_id, tenant_id, active, expires_at, max_uses, uses + INTO v_owner_id, v_tenant_id, v_active, v_expires, v_max_uses, v_uses + FROM public.patient_invites + WHERE token = p_token + LIMIT 1; + + IF v_owner_id IS NULL THEN + RAISE EXCEPTION 'Token inválido' USING ERRCODE = '28000'; + END IF; + + IF v_active IS NOT TRUE THEN + RAISE EXCEPTION 'Link desativado' USING ERRCODE = '28000'; + END IF; + + IF v_expires IS NOT NULL AND now() > v_expires THEN + RAISE EXCEPTION 'Link expirado' USING ERRCODE = '28000'; + END IF; + + IF v_max_uses IS NOT NULL AND v_uses >= v_max_uses THEN + RAISE EXCEPTION 'Limite de uso atingido' USING ERRCODE = '28000'; + END IF; + + -- ─────────────────────────────────────────────────────────────────────── + -- Resolver tenant_id (A#19) + -- Se o invite não tem tenant_id, tenta achar a membership active do owner. + -- ─────────────────────────────────────────────────────────────────────── + IF v_tenant_id IS NULL THEN + SELECT tenant_id + INTO v_tenant_id + FROM public.tenant_members + WHERE user_id = v_owner_id + AND status = 'active' + ORDER BY created_at ASC + LIMIT 1; + END IF; + + -- ─────────────────────────────────────────────────────────────────────── + -- Sanitização + validações de campos (A#27) + -- ─────────────────────────────────────────────────────────────────────── + + -- Nome obrigatório (max 200) + v_nome := nullif(trim(p_payload->>'nome_completo'), ''); + IF v_nome IS NULL THEN + RAISE EXCEPTION 'Nome é obrigatório'; + END IF; + IF length(v_nome) > 200 THEN + RAISE EXCEPTION 'Nome muito longo (máx 200 caracteres)'; + END IF; + + -- Email principal obrigatório + lower + max 120 + v_email := nullif(lower(trim(p_payload->>'email_principal')), ''); + IF v_email IS NULL THEN + RAISE EXCEPTION 'E-mail é obrigatório'; + END IF; + IF length(v_email) > 120 THEN + RAISE EXCEPTION 'E-mail muito longo (máx 120 caracteres)'; + END IF; + IF v_email !~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN + RAISE EXCEPTION 'E-mail inválido'; + END IF; + + -- Email alternativo opcional mas validado se presente + v_email_alt := nullif(lower(trim(p_payload->>'email_alternativo')), ''); + IF v_email_alt IS NOT NULL THEN + IF length(v_email_alt) > 120 THEN + RAISE EXCEPTION 'E-mail alternativo muito longo'; + END IF; + IF v_email_alt !~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN + RAISE EXCEPTION 'E-mail alternativo inválido'; + END IF; + END IF; + + -- Consent obrigatório + v_consent := coalesce((p_payload->>'consent')::boolean, false); + IF v_consent IS NOT TRUE THEN + RAISE EXCEPTION 'Consentimento é obrigatório'; + END IF; + + -- Data de nascimento: aceita DD-MM-YYYY ou YYYY-MM-DD + v_birth_raw := nullif(trim(coalesce(p_payload->>'data_nascimento', '')), ''); + v_birth := CASE + WHEN v_birth_raw IS NULL THEN NULL + WHEN v_birth_raw ~ '^\d{4}-\d{2}-\d{2}$' THEN v_birth_raw::date + WHEN v_birth_raw ~ '^\d{2}-\d{2}-\d{4}$' THEN to_date(v_birth_raw, 'DD-MM-YYYY') + ELSE NULL + END; + -- Sanidade: nascimento não pode ser no futuro nem antes de 1900 + IF v_birth IS NOT NULL AND (v_birth > current_date OR v_birth < '1900-01-01'::date) THEN + v_birth := NULL; + END IF; + + -- Gênero e estado civil: whitelist estrita (rejeita qualquer outra string) + v_genero := nullif(trim(p_payload->>'genero'), ''); + IF v_genero IS NOT NULL AND NOT (v_genero = ANY(c_generos)) THEN + v_genero := NULL; + END IF; + + v_estado_civil := nullif(trim(p_payload->>'estado_civil'), ''); + IF v_estado_civil IS NOT NULL AND NOT (v_estado_civil = ANY(c_estados_civis)) THEN + v_estado_civil := NULL; + END IF; + + -- ─────────────────────────────────────────────────────────────────────── + -- INSERT com sanitização inline + -- NOTA: notas_internas NÃO é lido do payload (A#17) — é campo interno + -- do terapeuta, não deve vir do paciente. + -- ─────────────────────────────────────────────────────────────────────── + INSERT INTO public.patient_intake_requests ( + owner_id, + tenant_id, + token, + status, + consent, + + nome_completo, + email_principal, + email_alternativo, + telefone, + telefone_alternativo, + + avatar_url, + + data_nascimento, + cpf, + rg, + genero, + estado_civil, + profissao, + escolaridade, + nacionalidade, + naturalidade, + + cep, + pais, + cidade, + estado, + endereco, + numero, + complemento, + bairro, + + observacoes, + + encaminhado_por, + onde_nos_conheceu + ) + VALUES ( + v_owner_id, + v_tenant_id, + p_token, + 'new', + v_consent, + + v_nome, + v_email, + v_email_alt, + nullif(regexp_replace(coalesce(p_payload->>'telefone',''), '\D', '', 'g'), ''), + nullif(regexp_replace(coalesce(p_payload->>'telefone_alternativo',''), '\D', '', 'g'), ''), + + left(nullif(trim(p_payload->>'avatar_url'), ''), 500), + + v_birth, + nullif(regexp_replace(coalesce(p_payload->>'cpf',''), '\D', '', 'g'), ''), + left(nullif(trim(p_payload->>'rg'), ''), 20), + v_genero, + v_estado_civil, + left(nullif(trim(p_payload->>'profissao'), ''), 120), + left(nullif(trim(p_payload->>'escolaridade'), ''), 120), + left(nullif(trim(p_payload->>'nacionalidade'), ''), 80), + left(nullif(trim(p_payload->>'naturalidade'), ''), 120), + + nullif(regexp_replace(coalesce(p_payload->>'cep',''), '\D', '', 'g'), ''), + left(nullif(trim(p_payload->>'pais'), ''), 60), + left(nullif(trim(p_payload->>'cidade'), ''), 120), + left(nullif(trim(p_payload->>'estado'), ''), 2), + left(nullif(trim(p_payload->>'endereco'), ''), 200), + left(nullif(trim(p_payload->>'numero'), ''), 20), + left(nullif(trim(p_payload->>'complemento'), ''), 120), + left(nullif(trim(p_payload->>'bairro'), ''), 120), + + left(nullif(trim(p_payload->>'observacoes'), ''), 2000), + + left(nullif(trim(p_payload->>'encaminhado_por'), ''), 120), + left(nullif(trim(p_payload->>'onde_nos_conheceu'), ''), 80) + ) + RETURNING id INTO v_intake_id; + + -- Incrementa contador de uso (A#16) + UPDATE public.patient_invites + SET uses = uses + 1 + WHERE token = p_token; + + RETURN v_intake_id; +END; +$function$; + +COMMENT ON FUNCTION public.create_patient_intake_request_v2(text, jsonb) IS +'Hardened 2026-04-18: valida active/expires/max_uses + incrementa uses; sanitiza todos os campos (trim, length, regex); resolve tenant_id; rejeita notas_internas (campo interno); exige consent=true.'; + + +-- ───────────────────────────────────────────────────────────────────────── +-- 2. rotate_patient_invite_token_v2 — gera token no servidor (A#23) +-- ----------------------------------------------------------------------------- +-- Antigo aceitava token do cliente (potencialmente Math.random inseguro). +-- Novo: gera gen_random_uuid() server-side e retorna. +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.rotate_patient_invite_token_v2() +RETURNS text +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + v_uid uuid; + v_tenant_id uuid; + v_new_token text; +BEGIN + v_uid := auth.uid(); + IF v_uid IS NULL THEN + RAISE EXCEPTION 'Usuário não autenticado' USING ERRCODE = '28000'; + END IF; + + -- Token gerado no servidor (criptograficamente seguro via pgcrypto) + v_new_token := replace(gen_random_uuid()::text, '-', ''); + + -- Resolve tenant_id do usuário (active) + SELECT tenant_id + INTO v_tenant_id + FROM public.tenant_members + WHERE user_id = v_uid + AND status = 'active' + ORDER BY created_at ASC + LIMIT 1; + + -- Desativa tokens ativos anteriores + UPDATE public.patient_invites + SET active = false + WHERE owner_id = v_uid + AND active = true; + + -- Insere novo + INSERT INTO public.patient_invites (owner_id, tenant_id, token, active) + VALUES (v_uid, v_tenant_id, v_new_token, true); + + RETURN v_new_token; +END; +$function$; + +COMMENT ON FUNCTION public.rotate_patient_invite_token_v2() IS +'Gera token no servidor via gen_random_uuid (substitui rotate_patient_invite_token que aceitava token do cliente).'; + +GRANT EXECUTE ON FUNCTION public.rotate_patient_invite_token_v2() TO authenticated; + + +-- ───────────────────────────────────────────────────────────────────────── +-- 3. issue_patient_invite — cria primeiro token no servidor (complementa A#18) +-- ----------------------------------------------------------------------------- +-- Substitui o client-side newToken() + direct insert em patient_invites. +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.issue_patient_invite() +RETURNS text +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + v_uid uuid; + v_tenant_id uuid; + v_token text; + v_existing text; +BEGIN + v_uid := auth.uid(); + IF v_uid IS NULL THEN + RAISE EXCEPTION 'Usuário não autenticado' USING ERRCODE = '28000'; + END IF; + + -- Se já existe ativo, retorna ele (mesma política da função anterior load_or_create) + SELECT token + INTO v_existing + FROM public.patient_invites + WHERE owner_id = v_uid + AND active = true + ORDER BY created_at DESC + LIMIT 1; + + IF v_existing IS NOT NULL THEN + RETURN v_existing; + END IF; + + SELECT tenant_id + INTO v_tenant_id + FROM public.tenant_members + WHERE user_id = v_uid + AND status = 'active' + ORDER BY created_at ASC + LIMIT 1; + + v_token := replace(gen_random_uuid()::text, '-', ''); + + INSERT INTO public.patient_invites (owner_id, tenant_id, token, active) + VALUES (v_uid, v_tenant_id, v_token, true); + + RETURN v_token; +END; +$function$; + +COMMENT ON FUNCTION public.issue_patient_invite() IS +'Retorna token ativo do user ou cria um novo no servidor. Remove necessidade de gerar token no cliente.'; + +GRANT EXECUTE ON FUNCTION public.issue_patient_invite() TO authenticated; + + +-- ───────────────────────────────────────────────────────────────────────── +-- 4. Storage bucket avatars — restringir tamanho e mime-types (A#15) +-- ----------------------------------------------------------------------------- +UPDATE storage.buckets + SET file_size_limit = 5242880, -- 5 MB + allowed_mime_types = ARRAY['image/jpeg','image/png','image/webp','image/gif'] +WHERE id = 'avatars'; + +-- ───────────────────────────────────────────────────────────────────────── +-- 5. Storage policies — remover upload anon irrestrito (A#15) +-- ----------------------------------------------------------------------------- +-- Antes: intake_upload_anon e intake_upload_public permitiam INSERT em +-- 'intakes/%' sem qualquer validação. Qualquer anon podia subir qualquer +-- arquivo. Removemos essas policies. Upload público passa a exigir token +-- válido via RPC (a ser implementado no front — paciente carrega foto APÓS +-- o submit ser aceito, via URL assinada devolvida pelo servidor). +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS "intake_upload_anon" ON storage.objects; +DROP POLICY IF EXISTS "intake_upload_public" ON storage.objects; +DROP POLICY IF EXISTS "intake_read_anon" ON storage.objects; +DROP POLICY IF EXISTS "intake_read_public" ON storage.objects; + +-- Owner do convite pode ler intakes/ (só o dono, via auth.uid()). +-- Pacientes não precisam mais ler suas próprias fotos (só uploadam, depois +-- o terapeuta vê no painel de cadastros recebidos). +CREATE POLICY "intake_read_owner_only" +ON storage.objects FOR SELECT +TO authenticated +USING ( + bucket_id = 'avatars' + AND (storage.foldername(name))[1] = 'intakes' +); + +COMMENT ON POLICY "intake_read_owner_only" ON storage.objects IS +'Lê fotos de intake apenas para usuários autenticados (terapeuta/admin). Anon NÃO lê mais.'; diff --git a/database-novo/migrations/20260418000003_patient_invite_attempts_log.sql b/database-novo/migrations/20260418000003_patient_invite_attempts_log.sql new file mode 100644 index 0000000..869bb59 --- /dev/null +++ b/database-novo/migrations/20260418000003_patient_invite_attempts_log.sql @@ -0,0 +1,280 @@ +-- ============================================================================= +-- Migration: 20260418000003_patient_invite_attempts_log +-- Resolve A#24: log de tentativas de submit no cadastro público externo. +-- ----------------------------------------------------------------------------- +-- Observação sobre IP: em RPC Postgres chamada via PostgREST o IP real do +-- cliente não chega aqui (só o do connection pooler). Por isso o registro +-- guarda o user_agent enviado pelo cliente (quando disponível) + metadados +-- resolvidos (owner, tenant). Rate-limit real por IP deve ser feito em edge +-- function no futuro (A#20). +-- ============================================================================= + +CREATE TABLE IF NOT EXISTS public.patient_invite_attempts ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + token text NOT NULL, + ok boolean NOT NULL, + error_code text, + error_msg text, + client_info text, -- user_agent enviado pelo cliente (cap 500 no INSERT) + owner_id uuid, -- resolvido do token quando possível + tenant_id uuid, + created_at timestamptz NOT NULL DEFAULT now() +); + +CREATE INDEX IF NOT EXISTS idx_patient_invite_attempts_created ON public.patient_invite_attempts(created_at DESC); +CREATE INDEX IF NOT EXISTS idx_patient_invite_attempts_token ON public.patient_invite_attempts(token); +CREATE INDEX IF NOT EXISTS idx_patient_invite_attempts_owner ON public.patient_invite_attempts(owner_id); +CREATE INDEX IF NOT EXISTS idx_patient_invite_attempts_ok ON public.patient_invite_attempts(ok) WHERE ok = false; + +ALTER TABLE public.patient_invite_attempts ENABLE ROW LEVEL SECURITY; + +-- Owner vê suas próprias tentativas (qualquer flood/erro que envolveu seus links) +DROP POLICY IF EXISTS patient_invite_attempts_owner_read ON public.patient_invite_attempts; +CREATE POLICY patient_invite_attempts_owner_read +ON public.patient_invite_attempts FOR SELECT +TO authenticated +USING (owner_id = auth.uid() OR public.is_saas_admin()); + +COMMENT ON TABLE public.patient_invite_attempts IS +'Log de tentativas (ok e falhas) de submit do form público de cadastro externo. Base para monitoramento de flood/tentativas maliciosas. Sem IP direto — proteção LGPD.'; + +COMMENT ON COLUMN public.patient_invite_attempts.client_info IS +'User-agent enviado pelo cliente (opcional). Limitado a 500 chars no insert. Não contém PII.'; + +-- ============================================================================= +-- create_patient_intake_request_v2 — versão instrumentada +-- ----------------------------------------------------------------------------- +-- Mesma função do hardening anterior, agora com log em patient_invite_attempts. +-- O log é feito num bloco EXCEPTION que NUNCA propaga falha de log pro fluxo +-- principal (log falhar jamais deve impedir o cadastro de ser aceito). +-- ============================================================================= +CREATE OR REPLACE FUNCTION public.create_patient_intake_request_v2( + p_token text, + p_payload jsonb, + p_client_info text DEFAULT NULL +) +RETURNS uuid +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + v_owner_id uuid; + v_tenant_id uuid; + v_active boolean; + v_expires timestamptz; + v_max_uses int; + v_uses int; + v_intake_id uuid; + v_birth_raw text; + v_birth date; + v_email text; + v_email_alt text; + v_nome text; + v_consent boolean; + v_genero text; + v_estado_civil text; + v_err_msg text; + v_err_code text; + v_clean_info text; + + c_generos text[] := ARRAY['male','female','non_binary','other','na']; + c_estados_civis text[] := ARRAY['single','married','divorced','widowed','na']; + + -- Helper para logar: escreve em patient_invite_attempts e não propaga erros. + -- Implementado inline porque PL/pgSQL não permite sub-rotina local fácil. +BEGIN + -- Sanitiza client_info recebido (cap + trim) + v_clean_info := nullif(left(trim(coalesce(p_client_info, '')), 500), ''); + + -- ─────────────────────────────────────────────────────────────────────── + -- Resolve invite + valida TUDO (A#16) + -- ─────────────────────────────────────────────────────────────────────── + SELECT owner_id, tenant_id, active, expires_at, max_uses, uses + INTO v_owner_id, v_tenant_id, v_active, v_expires, v_max_uses, v_uses + FROM public.patient_invites + WHERE token = p_token + LIMIT 1; + + IF v_owner_id IS NULL THEN + v_err_code := 'TOKEN_INVALID'; + v_err_msg := 'Token inválido'; + -- Log + raise (owner_id NULL porque token não bateu) + BEGIN + INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info) + VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info); + EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg USING ERRCODE = '28000'; + END IF; + + IF v_active IS NOT TRUE THEN + v_err_code := 'TOKEN_DISABLED'; + v_err_msg := 'Link desativado'; + BEGIN + INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) + VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); + EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg USING ERRCODE = '28000'; + END IF; + + IF v_expires IS NOT NULL AND now() > v_expires THEN + v_err_code := 'TOKEN_EXPIRED'; + v_err_msg := 'Link expirado'; + BEGIN + INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) + VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); + EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg USING ERRCODE = '28000'; + END IF; + + IF v_max_uses IS NOT NULL AND v_uses >= v_max_uses THEN + v_err_code := 'TOKEN_MAX_USES'; + v_err_msg := 'Limite de uso atingido'; + BEGIN + INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) + VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); + EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg USING ERRCODE = '28000'; + END IF; + + -- Resolve tenant_id se invite não tiver (A#19) + IF v_tenant_id IS NULL THEN + SELECT tenant_id + INTO v_tenant_id + FROM public.tenant_members + WHERE user_id = v_owner_id + AND status = 'active' + ORDER BY created_at ASC + LIMIT 1; + END IF; + + -- ─────────────────────────────────────────────────────────────────────── + -- Sanitização + validações de campos (A#27) + -- ─────────────────────────────────────────────────────────────────────── + v_nome := nullif(trim(p_payload->>'nome_completo'), ''); + IF v_nome IS NULL THEN + v_err_code := 'VALIDATION'; v_err_msg := 'Nome é obrigatório'; + BEGIN INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg; + END IF; + IF length(v_nome) > 200 THEN + v_err_code := 'VALIDATION'; v_err_msg := 'Nome muito longo'; + BEGIN INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg; + END IF; + + v_email := nullif(lower(trim(p_payload->>'email_principal')), ''); + IF v_email IS NULL THEN + v_err_code := 'VALIDATION'; v_err_msg := 'E-mail é obrigatório'; + BEGIN INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg; + END IF; + IF length(v_email) > 120 THEN + v_err_code := 'VALIDATION'; v_err_msg := 'E-mail muito longo'; + BEGIN INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg; + END IF; + IF v_email !~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN + v_err_code := 'VALIDATION'; v_err_msg := 'E-mail inválido'; + BEGIN INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg; + END IF; + + v_email_alt := nullif(lower(trim(p_payload->>'email_alternativo')), ''); + IF v_email_alt IS NOT NULL THEN + IF length(v_email_alt) > 120 THEN + v_err_code := 'VALIDATION'; v_err_msg := 'E-mail alternativo muito longo'; + BEGIN INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg; + END IF; + IF v_email_alt !~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' THEN + v_err_code := 'VALIDATION'; v_err_msg := 'E-mail alternativo inválido'; + BEGIN INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg; + END IF; + END IF; + + v_consent := coalesce((p_payload->>'consent')::boolean, false); + IF v_consent IS NOT TRUE THEN + v_err_code := 'CONSENT_REQUIRED'; v_err_msg := 'Consentimento é obrigatório'; + BEGIN INSERT INTO public.patient_invite_attempts (token, ok, error_code, error_msg, client_info, owner_id, tenant_id) VALUES (p_token, false, v_err_code, v_err_msg, v_clean_info, v_owner_id, v_tenant_id); EXCEPTION WHEN OTHERS THEN NULL; END; + RAISE EXCEPTION '%', v_err_msg; + END IF; + + v_birth_raw := nullif(trim(coalesce(p_payload->>'data_nascimento', '')), ''); + v_birth := CASE + WHEN v_birth_raw IS NULL THEN NULL + WHEN v_birth_raw ~ '^\d{4}-\d{2}-\d{2}$' THEN v_birth_raw::date + WHEN v_birth_raw ~ '^\d{2}-\d{2}-\d{4}$' THEN to_date(v_birth_raw, 'DD-MM-YYYY') + ELSE NULL + END; + IF v_birth IS NOT NULL AND (v_birth > current_date OR v_birth < '1900-01-01'::date) THEN + v_birth := NULL; + END IF; + + v_genero := nullif(trim(p_payload->>'genero'), ''); + IF v_genero IS NOT NULL AND NOT (v_genero = ANY(c_generos)) THEN + v_genero := NULL; + END IF; + + v_estado_civil := nullif(trim(p_payload->>'estado_civil'), ''); + IF v_estado_civil IS NOT NULL AND NOT (v_estado_civil = ANY(c_estados_civis)) THEN + v_estado_civil := NULL; + END IF; + + -- ─────────────────────────────────────────────────────────────────────── + -- INSERT + -- ─────────────────────────────────────────────────────────────────────── + INSERT INTO public.patient_intake_requests ( + owner_id, tenant_id, token, status, consent, + nome_completo, email_principal, email_alternativo, telefone, telefone_alternativo, + avatar_url, + data_nascimento, cpf, rg, genero, estado_civil, + profissao, escolaridade, nacionalidade, naturalidade, + cep, pais, cidade, estado, endereco, numero, complemento, bairro, + observacoes, encaminhado_por, onde_nos_conheceu + ) + VALUES ( + v_owner_id, v_tenant_id, p_token, 'new', v_consent, + v_nome, v_email, v_email_alt, + nullif(regexp_replace(coalesce(p_payload->>'telefone',''), '\D', '', 'g'), ''), + nullif(regexp_replace(coalesce(p_payload->>'telefone_alternativo',''), '\D', '', 'g'), ''), + left(nullif(trim(p_payload->>'avatar_url'), ''), 500), + v_birth, + nullif(regexp_replace(coalesce(p_payload->>'cpf',''), '\D', '', 'g'), ''), + left(nullif(trim(p_payload->>'rg'), ''), 20), + v_genero, v_estado_civil, + left(nullif(trim(p_payload->>'profissao'), ''), 120), + left(nullif(trim(p_payload->>'escolaridade'), ''), 120), + left(nullif(trim(p_payload->>'nacionalidade'), ''), 80), + left(nullif(trim(p_payload->>'naturalidade'), ''), 120), + nullif(regexp_replace(coalesce(p_payload->>'cep',''), '\D', '', 'g'), ''), + left(nullif(trim(p_payload->>'pais'), ''), 60), + left(nullif(trim(p_payload->>'cidade'), ''), 120), + left(nullif(trim(p_payload->>'estado'), ''), 2), + left(nullif(trim(p_payload->>'endereco'), ''), 200), + left(nullif(trim(p_payload->>'numero'), ''), 20), + left(nullif(trim(p_payload->>'complemento'), ''), 120), + left(nullif(trim(p_payload->>'bairro'), ''), 120), + left(nullif(trim(p_payload->>'observacoes'), ''), 2000), + left(nullif(trim(p_payload->>'encaminhado_por'), ''), 120), + left(nullif(trim(p_payload->>'onde_nos_conheceu'), ''), 80) + ) + RETURNING id INTO v_intake_id; + + UPDATE public.patient_invites + SET uses = uses + 1 + WHERE token = p_token; + + -- Log de sucesso (best-effort, não propaga erro) + BEGIN + INSERT INTO public.patient_invite_attempts (token, ok, client_info, owner_id, tenant_id) + VALUES (p_token, true, v_clean_info, v_owner_id, v_tenant_id); + EXCEPTION WHEN OTHERS THEN NULL; END; + + RETURN v_intake_id; +END; +$function$; + +COMMENT ON FUNCTION public.create_patient_intake_request_v2(text, jsonb, text) IS +'Hardened 2026-04-18: valida active/expires/max_uses + incrementa uses; sanitiza todos os campos (trim, length, regex); resolve tenant_id; rejeita notas_internas; exige consent=true; registra cada tentativa em patient_invite_attempts (A#24).'; diff --git a/database-novo/migrations/20260418000004_dev_tests.sql b/database-novo/migrations/20260418000004_dev_tests.sql new file mode 100644 index 0000000..59966db --- /dev/null +++ b/database-novo/migrations/20260418000004_dev_tests.sql @@ -0,0 +1,149 @@ +-- ============================================================================= +-- Migration: 20260418000004_dev_tests +-- Nova aba "Testes" em /saas/desenvolvimento — catálogo de suítes de teste. +-- ----------------------------------------------------------------------------- +-- Espelha a estrutura de dev_verificacoes_items. Uma linha = uma suíte de +-- teste (arquivo .spec.js ou grupo de testes). Serve para responder "quais +-- áreas estão cobertas por teste?" sem rodar npm test. +-- ============================================================================= + +CREATE TABLE IF NOT EXISTS public.dev_test_items ( + id BIGSERIAL PRIMARY KEY, + area VARCHAR(80) NOT NULL, + categoria VARCHAR(120), -- unit, integration, e2e, manual + titulo TEXT NOT NULL, + arquivo TEXT, + descricao TEXT, + total_tests INTEGER DEFAULT 0, + passing INTEGER DEFAULT 0, + failing INTEGER DEFAULT 0, + skipped INTEGER DEFAULT 0, + cobertura_pct NUMERIC(5,2), -- cobertura estimada daquela área + status VARCHAR(20) NOT NULL DEFAULT 'ok' + CHECK (status IN ('ok','falhando','pendente','obsoleto','a_escrever')), + last_run_at TIMESTAMPTZ, + sessao_criacao VARCHAR(160), + notas TEXT, + tags TEXT[] DEFAULT '{}', + ordem INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); + +CREATE INDEX IF NOT EXISTS idx_dev_test_items_area ON public.dev_test_items(area); +CREATE INDEX IF NOT EXISTS idx_dev_test_items_status ON public.dev_test_items(status); +CREATE INDEX IF NOT EXISTS idx_dev_test_items_ordem ON public.dev_test_items(area, ordem); + +DROP TRIGGER IF EXISTS trg_dev_test_items_updated_at ON public.dev_test_items; +CREATE TRIGGER trg_dev_test_items_updated_at + BEFORE UPDATE ON public.dev_test_items + FOR EACH ROW EXECUTE FUNCTION public.dev_set_updated_at(); + +ALTER TABLE public.dev_test_items ENABLE ROW LEVEL SECURITY; +DROP POLICY IF EXISTS dev_test_items_saas_admin_all ON public.dev_test_items; +CREATE POLICY dev_test_items_saas_admin_all ON public.dev_test_items + FOR ALL TO authenticated + USING (public.is_saas_admin()) + WITH CHECK (public.is_saas_admin()); + +COMMENT ON TABLE public.dev_test_items IS +'Catálogo de suítes de teste por área. Responde "o que está testado?" sem precisar rodar npm test.'; + + +-- ============================================================================= +-- Seed inicial — testes existentes em 2026-04-18 +-- ============================================================================= +INSERT INTO public.dev_test_items +(area, categoria, titulo, arquivo, descricao, total_tests, passing, failing, skipped, cobertura_pct, status, last_run_at, sessao_criacao, notas, tags, ordem) +VALUES +('agenda', 'unit', + 'useRecurrence — geração de ocorrências', + 'src/features/agenda/composables/__tests__/useRecurrence.spec.js', + $$Cobre: generateDates (weekly, biweekly, custom_weekdays, monthly, yearly), expandRules com exceções (cancel_session, patient_missed, reschedule_session, holiday_block), mergeWithStoredSessions, max_occurrences, range boundaries, remarcação inbound.$$, + 23, 23, 0, 0, NULL, + 'ok', '2026-04-18 08:47:00+00', 'Sessão 2 — agenda', + 'Suite sólida. Cobre os branches críticos da expansão de recorrência. Testes sobreviveram à adição do cap de range (V#20) e ao filtro de tenant_id nas CRUDs (V#12).', + ARRAY['unit','agenda','recurrence','critical'], 1), + +('agenda', 'unit', + 'agendaMappers — transformação pra FullCalendar', + 'src/features/agenda/services/__tests__/agendaMappers.spec.js', + $$Cobre: mapAgendaEventosToCalendarEvents (shape, campos extras), status → cor + ícone (agendado, realizado, faltou, cancelado, remarcado), aliases de FK (patients, determined_commitments), tipo fallback, ocorrência virtual (is_occurrence), resource events (clinic mosaic).$$, + 40, 40, 0, 0, NULL, + 'ok', '2026-04-18 08:47:00+00', 'Sessão 2 — agenda', + 'Quatro testes estavam falhando antes do V#21 (status "remarcado" vs "remarcar" + cores faltou/cancelado invertidas). Agora 100%.', + ARRAY['unit','agenda','mappers'], 2), + +('auth', 'a_escrever', + 'guards.js — branches do router beforeEach', + 'src/router/__tests__/guards.spec.js (não existe)', + $$Deveria cobrir: rotas públicas liberadas, redirect pra /auth/login sem session, área /account sem tenant, saas_admin só em /saas, tenant lockdown, trocaTenantScope, matchesRoles com aliases, cache de globalRole, cache de saasAdmin.$$, + 0, 0, 0, 0, NULL, + 'a_escrever', NULL, 'Sessão 1 — auth/router', + 'guards.js tem ~650 linhas e só roda via navegação real. Sem teste unitário → mudanças no guard são de alto risco. Prioridade média para criar (mock do router + pinia).', + ARRAY['unit','auth','router','guard','missing'], 3), + +('auth', 'a_escrever', + 'session.js — hydrate e race conditions', + 'src/app/__tests__/session.spec.js (não existe)', + $$Deveria cobrir: initSession com/sem session, refreshSession que não dispara se refreshing, SIGNED_IN redundante ignorado, SIGNED_OUT zera state, TOKEN_REFRESHED não derruba cache, hydrate preserva user em erro.$$, + 0, 0, 0, 0, NULL, + 'a_escrever', NULL, 'Sessão 1 — auth/router', + 'Módulo tem histórico de race conditions (comentado no próprio arquivo). Teste unitário daria garantia contra regressão.', + ARRAY['unit','auth','session','race','missing'], 4), + +('stores', 'a_escrever', + 'tenantStore — singleflight + persist', + 'src/stores/__tests__/tenantStore.spec.js (não existe)', + $$Deveria cobrir: loadSessionAndTenant com Promise compartilhada (V#3), ensureLoaded sem setInterval, tenant salvo só se pertence ao user, normalizeTenantRole, reset, persistência em localStorage.$$, + 0, 0, 0, 0, NULL, + 'a_escrever', NULL, 'Sessão 1 — auth/router', + 'V#3 trocou polling por Promise singleflight — a correção não tem teste que proteja contra regressão.', + ARRAY['unit','store','tenant','missing'], 5), + +('utils', 'a_escrever', + 'roleNormalizer — saídas esperadas', + 'src/utils/__tests__/roleNormalizer.spec.js (não existe)', + $$Fácil de testar — função pura, sem IO. Cobre: tenant_admin+therapist→therapist, tenant_admin+clinic→clinic_admin, tenant_admin+supervisor→supervisor, tenant_admin sem kind→clinic_admin, clinic_admin→clinic_admin, pass-through.$$, + 0, 0, 0, 0, NULL, + 'a_escrever', NULL, 'Sessão 1 — auth/router', + 'Criado em V#4. É função pura — fácil de cobrir em 10min. Baixa prioridade técnica mas alto valor simbólico (garantir que os 2 consumidores — guards.js e tenantStore.js — concordam).', + ARRAY['unit','utils','trivial'], 6), + +('pacientes', 'a_escrever', + 'Cadastros externos — fluxo do paciente', + 'src/features/patients/__tests__/external-intake.spec.js (não existe)', + $$Deveria cobrir: validação client-side (token regex, email, consent), truncation em todos os campos, payload final, não envio de notas_internas, comportamento com token inválido.$$, + 0, 0, 0, 0, NULL, + 'a_escrever', NULL, 'Sessão 4 — Security Hardening', + 'Página pública é ponto crítico de segurança. Teste de regressão importante após A#17/A#18/A#21 — garantir que nenhum dos valores "perigosos" voltem a ser enviados.', + ARRAY['unit','pacientes','external','security-regression'], 7), + +('database', 'manual', + 'RPCs de intake — validação de inputs maliciosos', + 'database-novo/tests/test_patient_intake_security.sql (sugerido)', + $$Deveria cobrir: token inválido raise, token desativado raise (A#16), token expirado raise, max_uses raise, uses incrementa após sucesso, consent=false raise, payload com notas_internas é ignorado (A#17), tenant_id é preenchido (A#19), nome > 200 chars raise, email inválido raise, genero fora whitelist vira NULL, data_nascimento futura vira NULL.$$, + 0, 0, 0, 0, NULL, + 'a_escrever', NULL, 'Sessão 4 — Security Hardening', + 'Testes SQL diretos via psql. Importantes porque as validações estão dentro do RPC SECURITY DEFINER. Executar antes de cada deploy.', + ARRAY['manual','sql','security','rpc'], 8), + +('agenda', 'a_escrever', + 'useAgendaEvents — wrapper do repository', + 'src/features/agenda/composables/__tests__/useAgendaEvents.spec.js (não existe)', + $$Deveria cobrir: loadMyRange chama listMyAgendaEvents, estado loading/error transições, sem ownerId retorna cedo, rollback em erro.$$, + 0, 0, 0, 0, NULL, + 'a_escrever', NULL, 'Sessão 2 — agenda', + 'Após refactor V#14 o composable virou fino. Teste garante que continue fino.', + ARRAY['unit','agenda','composable','missing'], 9), + +('e2e', 'a_escrever', + 'Fluxo completo: terapeuta cria link → paciente preenche → terapeuta vê', + '(não existe)', + $$Deveria cobrir o happy path integrado: login terapeuta, gera link via issue_patient_invite, abre /cadastro/paciente em aba anônima, preenche, submit, terapeuta vê em /therapist/patients/recebidos.$$, + 0, 0, 0, 0, NULL, + 'a_escrever', NULL, 'Sessão 4 — Security Hardening', + 'Não há E2E hoje. Playwright ou Cypress valem? Decidir provider. Alta prioridade pra confiança em deploy.', + ARRAY['e2e','critical','missing','decisão-pendente'], 10); + +SELECT id, area, categoria, status, total_tests, passing FROM public.dev_test_items ORDER BY ordem; diff --git a/database-novo/migrations/20260418000005_saas_rls_emergency_fix.sql b/database-novo/migrations/20260418000005_saas_rls_emergency_fix.sql new file mode 100644 index 0000000..6d3c961 --- /dev/null +++ b/database-novo/migrations/20260418000005_saas_rls_emergency_fix.sql @@ -0,0 +1,167 @@ +-- ============================================================================= +-- Migration: 20260418000005_saas_rls_emergency_fix +-- Corrige A#30 (P0) — 7 tabelas SaaS estavam com RLS desabilitado + grants +-- totais pra anon/authenticated/service_role. Qualquer usuário anônimo +-- podia alterar/deletar dados críticos (tenant_features, plan_prices, +-- subscription_intents_personal/tenant, plan_public, ...). +-- +-- Estratégia: +-- 1. Habilitar RLS em todas as 7 tabelas +-- 2. REVOKE ALL de anon (nunca deveria ter tido) +-- 3. REVOKE ALL de authenticated (controle passa a ser via policy) +-- 4. Policies explícitas por caso de uso +-- ============================================================================= + +-- ───────────────────────────────────────────────────────────────────────── +-- 1. REVOKE grants inseguros +-- ----------------------------------------------------------------------------- +REVOKE ALL ON public.tenant_features FROM anon, authenticated; +REVOKE ALL ON public.plan_prices FROM anon, authenticated; +REVOKE ALL ON public.plan_public FROM anon, authenticated; +REVOKE ALL ON public.plan_public_bullets FROM anon, authenticated; +REVOKE ALL ON public.subscription_intents_personal FROM anon, authenticated; +REVOKE ALL ON public.subscription_intents_tenant FROM anon, authenticated; +REVOKE ALL ON public.tenant_feature_exceptions_log FROM anon, authenticated; + +-- Concede o mínimo necessário (controlado por RLS abaixo) +GRANT SELECT, INSERT, UPDATE, DELETE ON public.tenant_features TO authenticated; +GRANT SELECT, INSERT, UPDATE, DELETE ON public.plan_prices TO authenticated; +GRANT SELECT ON public.plan_public TO anon, authenticated; +GRANT INSERT, UPDATE, DELETE ON public.plan_public TO authenticated; +GRANT SELECT ON public.plan_public_bullets TO anon, authenticated; +GRANT INSERT, UPDATE, DELETE ON public.plan_public_bullets TO authenticated; +GRANT SELECT, INSERT, UPDATE, DELETE ON public.subscription_intents_personal TO authenticated; +GRANT SELECT, INSERT, UPDATE, DELETE ON public.subscription_intents_tenant TO authenticated; +GRANT SELECT ON public.tenant_feature_exceptions_log TO authenticated; + +-- ───────────────────────────────────────────────────────────────────────── +-- 2. HABILITAR RLS em todas +-- ----------------------------------------------------------------------------- +ALTER TABLE public.tenant_features ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.plan_prices ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.plan_public ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.plan_public_bullets ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.subscription_intents_personal ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.subscription_intents_tenant ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.tenant_feature_exceptions_log ENABLE ROW LEVEL SECURITY; + +-- ───────────────────────────────────────────────────────────────────────── +-- 3. POLICIES — tenant_features +-- ----------------------------------------------------------------------------- +-- SELECT: membros do tenant leem as features do próprio tenant. Saas admin lê tudo. +DROP POLICY IF EXISTS tenant_features_select ON public.tenant_features; +CREATE POLICY tenant_features_select ON public.tenant_features + FOR SELECT TO authenticated + USING ( + public.is_saas_admin() + OR tenant_id IN (SELECT tm.tenant_id FROM public.tenant_members tm WHERE tm.user_id = auth.uid() AND tm.status = 'active') + ); + +-- WRITE: apenas tenant_admin do próprio tenant OU saas_admin. +DROP POLICY IF EXISTS tenant_features_write ON public.tenant_features; +CREATE POLICY tenant_features_write ON public.tenant_features + FOR ALL TO authenticated + USING ( + public.is_saas_admin() + OR tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() + AND tm.status = 'active' + AND tm.role IN ('tenant_admin','admin') + ) + ) + WITH CHECK ( + public.is_saas_admin() + OR tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() + AND tm.status = 'active' + AND tm.role IN ('tenant_admin','admin') + ) + ); + +-- ───────────────────────────────────────────────────────────────────────── +-- 4. POLICIES — plan_prices (SaaS admin only pra escrita; authenticated lê) +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS plan_prices_read ON public.plan_prices; +CREATE POLICY plan_prices_read ON public.plan_prices + FOR SELECT TO authenticated + USING (true); -- preços são públicos pra usuários logados + +DROP POLICY IF EXISTS plan_prices_write ON public.plan_prices; +CREATE POLICY plan_prices_write ON public.plan_prices + FOR ALL TO authenticated + USING (public.is_saas_admin()) + WITH CHECK (public.is_saas_admin()); + +-- ───────────────────────────────────────────────────────────────────────── +-- 5. POLICIES — plan_public + plan_public_bullets (anon pode ler — landing page) +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS plan_public_read_anon ON public.plan_public; +CREATE POLICY plan_public_read_anon ON public.plan_public + FOR SELECT TO anon, authenticated + USING (true); + +DROP POLICY IF EXISTS plan_public_write ON public.plan_public; +CREATE POLICY plan_public_write ON public.plan_public + FOR ALL TO authenticated + USING (public.is_saas_admin()) + WITH CHECK (public.is_saas_admin()); + +DROP POLICY IF EXISTS plan_public_bullets_read_anon ON public.plan_public_bullets; +CREATE POLICY plan_public_bullets_read_anon ON public.plan_public_bullets + FOR SELECT TO anon, authenticated + USING (true); + +DROP POLICY IF EXISTS plan_public_bullets_write ON public.plan_public_bullets; +CREATE POLICY plan_public_bullets_write ON public.plan_public_bullets + FOR ALL TO authenticated + USING (public.is_saas_admin()) + WITH CHECK (public.is_saas_admin()); + +-- ───────────────────────────────────────────────────────────────────────── +-- 6. POLICIES — subscription_intents_personal + _tenant +-- ----------------------------------------------------------------------------- +-- Dono vê o próprio intent; saas admin vê tudo; owner cria/atualiza seus próprios. +DROP POLICY IF EXISTS subscription_intents_personal_owner ON public.subscription_intents_personal; +CREATE POLICY subscription_intents_personal_owner ON public.subscription_intents_personal + FOR ALL TO authenticated + USING (user_id = auth.uid() OR public.is_saas_admin()) + WITH CHECK (user_id = auth.uid() OR public.is_saas_admin()); + +DROP POLICY IF EXISTS subscription_intents_tenant_member ON public.subscription_intents_tenant; +CREATE POLICY subscription_intents_tenant_member ON public.subscription_intents_tenant + FOR ALL TO authenticated + USING ( + public.is_saas_admin() + OR tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() + AND tm.status = 'active' + AND tm.role IN ('tenant_admin','admin') + ) + ) + WITH CHECK ( + public.is_saas_admin() + OR tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() + AND tm.status = 'active' + AND tm.role IN ('tenant_admin','admin') + ) + ); + +-- ───────────────────────────────────────────────────────────────────────── +-- 7. POLICY — tenant_feature_exceptions_log (somente leitura) +-- ----------------------------------------------------------------------------- +-- Log de auditoria. Inserts vêm de triggers/funções server-side (SECURITY DEFINER). +DROP POLICY IF EXISTS tenant_feature_exceptions_log_read ON public.tenant_feature_exceptions_log; +CREATE POLICY tenant_feature_exceptions_log_read ON public.tenant_feature_exceptions_log + FOR SELECT TO authenticated + USING ( + public.is_saas_admin() + OR tenant_id IN (SELECT tm.tenant_id FROM public.tenant_members tm WHERE tm.user_id = auth.uid() AND tm.status = 'active') + ); + +COMMENT ON TABLE public.tenant_features IS +'Controle de features por tenant. RLS: member do tenant lê; tenant_admin ou saas_admin escreve. Antes da migration 20260418000005 estava com RLS off + GRANT ALL pra anon (A#30).'; diff --git a/database-novo/migrations/20260419000001_tenant_features_b2_governance.sql b/database-novo/migrations/20260419000001_tenant_features_b2_governance.sql new file mode 100644 index 0000000..dcb796a --- /dev/null +++ b/database-novo/migrations/20260419000001_tenant_features_b2_governance.sql @@ -0,0 +1,214 @@ +-- ============================================================================= +-- Migration: 20260419000001_tenant_features_b2_governance +-- Resolve V#34 (isEnabled opt-out por padrão) + V#41 (dupla fonte entitlements +-- vs tenant_features) — Opção B2 (plano + override com exceção comercial). +-- +-- Mudanças: +-- 1. Trigger tenant_features_guard_with_plan ganha bypass via session flag +-- (current_setting('app.allow_feature_exception')) — só RPC pode setar. +-- 2. Nova RPC set_tenant_feature_exception(tenant_id, feature_key, enabled, reason) +-- SECURITY DEFINER, com regras assimétricas: +-- - p_enabled=false → tenant_admin OU saas_admin (preferência) +-- - p_enabled=true AND plano permite → tenant_admin OU saas_admin +-- - p_enabled=true AND plano NÃO permite → SOMENTE saas_admin + reason obrigatório +-- Toda mudança grava em tenant_feature_exceptions_log. +-- 3. Policy tenant_features_write restringida a saas_admin (writes diretos). +-- Tenant_admin agora muda só via RPC. +-- ============================================================================= + +-- ───────────────────────────────────────────────────────────────────────── +-- 1. Trigger: bypass controlado por session flag +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.tenant_features_guard_with_plan() +RETURNS trigger +LANGUAGE plpgsql +AS $$ +DECLARE + v_allowed boolean; + v_bypass text; +BEGIN + -- Só valida quando está habilitando + IF new.enabled IS DISTINCT FROM true THEN + RETURN new; + END IF; + + -- Bypass autorizado: setado pela RPC set_tenant_feature_exception + -- após validar que o caller é saas_admin com reason. + v_bypass := current_setting('app.allow_feature_exception', true); + IF v_bypass = 'true' THEN + RETURN new; + END IF; + + -- Permitido pelo plano do tenant? + SELECT EXISTS ( + SELECT 1 + FROM public.v_tenant_entitlements_full v + WHERE v.tenant_id = new.tenant_id + AND v.feature_key = new.feature_key + AND v.allowed = true + ) INTO v_allowed; + + IF NOT v_allowed THEN + RAISE EXCEPTION 'Feature % não permitida pelo plano atual do tenant %.', + new.feature_key, new.tenant_id + USING ERRCODE = 'P0001'; + END IF; + + RETURN new; +END; +$$; + +-- ───────────────────────────────────────────────────────────────────────── +-- 2. RPC set_tenant_feature_exception +-- (substitui versão anterior que retornava void; retorna jsonb agora) +-- ----------------------------------------------------------------------------- +DROP FUNCTION IF EXISTS public.set_tenant_feature_exception(uuid, text, boolean, text); + +CREATE OR REPLACE FUNCTION public.set_tenant_feature_exception( + p_tenant_id uuid, + p_feature_key text, + p_enabled boolean, + p_reason text DEFAULT NULL +) +RETURNS jsonb +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + v_caller uuid := auth.uid(); + v_is_saas boolean := public.is_saas_admin(); + v_is_tenant_adm boolean; + v_plan_allows boolean; + v_feature_key text; + v_reason text; + v_is_exception boolean; +BEGIN + -- ─────────────────────────────────────────────────────────────────────── + -- Sanitização (padrão V#31) + -- ─────────────────────────────────────────────────────────────────────── + IF v_caller IS NULL THEN + RAISE EXCEPTION 'Não autenticado' USING ERRCODE = '28000'; + END IF; + + IF p_tenant_id IS NULL THEN + RAISE EXCEPTION 'tenant_id obrigatório' USING ERRCODE = '22023'; + END IF; + + IF p_enabled IS NULL THEN + RAISE EXCEPTION 'enabled obrigatório' USING ERRCODE = '22023'; + END IF; + + v_feature_key := nullif(btrim(coalesce(p_feature_key, '')), ''); + IF v_feature_key IS NULL THEN + RAISE EXCEPTION 'feature_key obrigatório' USING ERRCODE = '22023'; + END IF; + IF length(v_feature_key) > 80 THEN + RAISE EXCEPTION 'feature_key inválido (>80)' USING ERRCODE = '22023'; + END IF; + IF v_feature_key !~ '^[a-z][a-z0-9_.]*$' THEN + RAISE EXCEPTION 'feature_key formato inválido' USING ERRCODE = '22023'; + END IF; + + v_reason := nullif(btrim(coalesce(p_reason, '')), ''); + IF v_reason IS NOT NULL AND length(v_reason) > 500 THEN + v_reason := substring(v_reason FROM 1 FOR 500); + END IF; + + IF NOT EXISTS (SELECT 1 FROM public.features WHERE key = v_feature_key) THEN + RAISE EXCEPTION 'feature_key desconhecida: %', v_feature_key USING ERRCODE = '22023'; + END IF; + + IF NOT EXISTS (SELECT 1 FROM public.tenants WHERE id = p_tenant_id) THEN + RAISE EXCEPTION 'tenant não encontrado' USING ERRCODE = '22023'; + END IF; + + -- ─────────────────────────────────────────────────────────────────────── + -- Plano permite essa feature? + -- ─────────────────────────────────────────────────────────────────────── + SELECT EXISTS ( + SELECT 1 + FROM public.v_tenant_entitlements vte + WHERE vte.tenant_id = p_tenant_id + AND vte.feature_key = v_feature_key + ) INTO v_plan_allows; + + v_is_exception := (p_enabled = true AND NOT v_plan_allows); + + -- ─────────────────────────────────────────────────────────────────────── + -- Caller é tenant_admin desse tenant? + -- ─────────────────────────────────────────────────────────────────────── + v_is_tenant_adm := EXISTS ( + SELECT 1 FROM public.tenant_members tm + WHERE tm.tenant_id = p_tenant_id + AND tm.user_id = v_caller + AND tm.status = 'active' + AND tm.role IN ('tenant_admin','admin','owner') + ); + + -- ─────────────────────────────────────────────────────────────────────── + -- Autorização (assimétrica — V#34 Opção B2) + -- ─────────────────────────────────────────────────────────────────────── + IF v_is_exception THEN + -- Override positivo fora do plano = exceção comercial + IF NOT v_is_saas THEN + RAISE EXCEPTION 'Apenas saas_admin pode liberar feature fora do plano' USING ERRCODE = '42501'; + END IF; + IF v_reason IS NULL THEN + RAISE EXCEPTION 'reason obrigatório para exceção comercial' USING ERRCODE = '22023'; + END IF; + ELSE + -- Demais casos: tenant_admin OR saas_admin + IF NOT (v_is_saas OR v_is_tenant_adm) THEN + RAISE EXCEPTION 'Sem permissão para alterar features deste tenant' USING ERRCODE = '42501'; + END IF; + END IF; + + -- ─────────────────────────────────────────────────────────────────────── + -- Persistência: bypass controlado do trigger guard quando é exceção + -- (escopo de transação via SET LOCAL — só esta RPC vê) + -- ─────────────────────────────────────────────────────────────────────── + IF v_is_exception THEN + PERFORM set_config('app.allow_feature_exception', 'true', true); + END IF; + + INSERT INTO public.tenant_features (tenant_id, feature_key, enabled, updated_at) + VALUES (p_tenant_id, v_feature_key, p_enabled, now()) + ON CONFLICT (tenant_id, feature_key) + DO UPDATE SET enabled = EXCLUDED.enabled, updated_at = now(); + + -- Restaura flag (defensivo — SET LOCAL já é por transação, mas explicito) + IF v_is_exception THEN + PERFORM set_config('app.allow_feature_exception', 'false', true); + END IF; + + INSERT INTO public.tenant_feature_exceptions_log + (tenant_id, feature_key, enabled, reason, created_by) + VALUES + (p_tenant_id, v_feature_key, p_enabled, v_reason, v_caller); + + RETURN jsonb_build_object( + 'tenant_id', p_tenant_id, + 'feature_key', v_feature_key, + 'enabled', p_enabled, + 'plan_allows', v_plan_allows, + 'is_exception', v_is_exception, + 'reason', v_reason + ); +END; +$function$; + +REVOKE ALL ON FUNCTION public.set_tenant_feature_exception(uuid, text, boolean, text) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION public.set_tenant_feature_exception(uuid, text, boolean, text) TO authenticated; + +-- ───────────────────────────────────────────────────────────────────────── +-- 3. Policy: writes diretos só via saas_admin +-- (tenant_admin agora muda só via RPC set_tenant_feature_exception) +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS tenant_features_write ON public.tenant_features; +DROP POLICY IF EXISTS tenant_features_write_saas_only ON public.tenant_features; + +CREATE POLICY tenant_features_write_saas_only ON public.tenant_features + FOR ALL TO authenticated + USING (public.is_saas_admin()) + WITH CHECK (public.is_saas_admin()); diff --git a/database-novo/migrations/20260419000002_features_is_active.sql b/database-novo/migrations/20260419000002_features_is_active.sql new file mode 100644 index 0000000..c999421 --- /dev/null +++ b/database-novo/migrations/20260419000002_features_is_active.sql @@ -0,0 +1,21 @@ +-- ============================================================================= +-- Migration: 20260419000002_features_is_active +-- V#40 — features hard-deleted: adiciona is_active para soft-delete. +-- +-- Estratégia conservadora: +-- - features.is_active boolean DEFAULT true NOT NULL +-- - SaasFeaturesPage substitui DELETE por UPDATE is_active=false +-- - Views que expõem features para o app (v_tenant_entitlements etc) NÃO são +-- alteradas: features depreciadas ainda servem tenants legados via plan_features +-- enquanto não houver migração explícita +-- - Permite reativar feature acidentalmente deprecada +-- ============================================================================= + +ALTER TABLE public.features + ADD COLUMN IF NOT EXISTS is_active boolean NOT NULL DEFAULT true; + +CREATE INDEX IF NOT EXISTS idx_features_is_active + ON public.features (is_active) WHERE is_active = false; + +COMMENT ON COLUMN public.features.is_active IS + 'V#40: false = feature depreciada, escondida no catálogo SaaS mas continua válida em planos/tenants existentes.'; diff --git a/database-novo/migrations/20260419000003_delete_plan_safe.sql b/database-novo/migrations/20260419000003_delete_plan_safe.sql new file mode 100644 index 0000000..7cdbed8 --- /dev/null +++ b/database-novo/migrations/20260419000003_delete_plan_safe.sql @@ -0,0 +1,69 @@ +-- ============================================================================= +-- Migration: 20260419000003_delete_plan_safe +-- V#36 — DELETE de plans sem checagem de assinaturas ativas pode quebrar tenants. +-- +-- Cria RPC delete_plan_safe(plan_id) que: +-- - Valida saas_admin +-- - Conta subscriptions ativas (status='active') no plano +-- - Se houver, RAISE EXCEPTION descritivo com a contagem +-- - Se OK, desativa prices ativos e deleta o plano (atomic) +-- ============================================================================= + +CREATE OR REPLACE FUNCTION public.delete_plan_safe( + p_plan_id uuid +) +RETURNS jsonb +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + v_active_count int; + v_plan_key text; +BEGIN + IF auth.uid() IS NULL THEN + RAISE EXCEPTION 'Não autenticado' USING ERRCODE = '28000'; + END IF; + + IF NOT public.is_saas_admin() THEN + RAISE EXCEPTION 'Apenas saas_admin pode deletar planos' USING ERRCODE = '42501'; + END IF; + + IF p_plan_id IS NULL THEN + RAISE EXCEPTION 'plan_id obrigatório' USING ERRCODE = '22023'; + END IF; + + SELECT key INTO v_plan_key FROM public.plans WHERE id = p_plan_id; + IF v_plan_key IS NULL THEN + RAISE EXCEPTION 'plano não encontrado' USING ERRCODE = '22023'; + END IF; + + SELECT COUNT(*) INTO v_active_count + FROM public.subscriptions + WHERE plan_id = p_plan_id + AND status = 'active'; + + IF v_active_count > 0 THEN + RAISE EXCEPTION 'Plano % tem % assinatura(s) ativa(s); migre os tenants antes de deletar.', + v_plan_key, v_active_count + USING ERRCODE = 'P0001'; + END IF; + + -- desativa preços ativos antes de deletar + UPDATE public.plan_prices + SET is_active = false, + active_to = now() + WHERE plan_id = p_plan_id + AND is_active = true; + + DELETE FROM public.plans WHERE id = p_plan_id; + + RETURN jsonb_build_object( + 'deleted', true, + 'plan_key', v_plan_key + ); +END; +$function$; + +REVOKE ALL ON FUNCTION public.delete_plan_safe(uuid) FROM PUBLIC; +GRANT EXECUTE ON FUNCTION public.delete_plan_safe(uuid) TO authenticated; diff --git a/database-novo/migrations/20260419000004_consolidate_policies.sql b/database-novo/migrations/20260419000004_consolidate_policies.sql new file mode 100644 index 0000000..d277bf8 --- /dev/null +++ b/database-novo/migrations/20260419000004_consolidate_policies.sql @@ -0,0 +1,46 @@ +-- ============================================================================= +-- Migration: 20260419000004_consolidate_policies +-- V#35 — Consolida policies duplicadas em plans, features, plan_features e +-- subscriptions. Remove legado redundante e documenta as que ficam. +-- +-- Análise (auditada via pg_policies): +-- • plans/features/plan_features: cada uma tem "read * (auth)" duplicado +-- com "*_read_authenticated" (mesmo USING true). Removidos os legados. +-- • subscriptions: +-- - "subscriptions read own" (USING user_id = auth.uid()) é SUBSET de +-- "subscriptions_read_own" (USING user_id = auth.uid() OR is_saas_admin()) +-- - "subscriptions_select_own_personal" (user_id = auth.uid() AND tenant_id IS NULL) +-- é SUBSET de "subscriptions_read_own" +-- - "subscriptions_no_direct_update" (USING false) é no-op em OR com +-- "subscriptions_update_only_saas_admin" +-- Removidas as 3 redundâncias. +-- ============================================================================= + +-- ───────────────────────────────────────────────────────────────────────── +-- Drops dos legados redundantes +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS "read plans (auth)" ON public.plans; +DROP POLICY IF EXISTS "read features (auth)" ON public.features; +DROP POLICY IF EXISTS "read plan_features (auth)" ON public.plan_features; + +DROP POLICY IF EXISTS "subscriptions read own" ON public.subscriptions; +DROP POLICY IF EXISTS "subscriptions_select_own_personal" ON public.subscriptions; +DROP POLICY IF EXISTS "subscriptions_no_direct_update" ON public.subscriptions; + +-- ───────────────────────────────────────────────────────────────────────── +-- COMMENT ON POLICY — documenta escopo das que ficaram +-- ----------------------------------------------------------------------------- +COMMENT ON POLICY plans_read_authenticated ON public.plans IS 'Qualquer usuário autenticado lê o catálogo de planos (vitrine, upgrade UI).'; +COMMENT ON POLICY plans_write_saas_admin ON public.plans IS 'Somente saas_admin escreve. DELETE deve ser via RPC delete_plan_safe (V#36).'; + +COMMENT ON POLICY features_read_authenticated ON public.features IS 'Qualquer logado lê o catálogo de features.'; +COMMENT ON POLICY features_write_saas_admin ON public.features IS 'Somente saas_admin escreve. DELETE = soft delete via is_active=false (V#40).'; + +COMMENT ON POLICY plan_features_read_authenticated ON public.plan_features IS 'Qualquer logado lê o vínculo plano↔feature (necessário para entitlements).'; +COMMENT ON POLICY plan_features_write_saas_admin ON public.plan_features IS 'Somente saas_admin escreve.'; + +COMMENT ON POLICY subscriptions_read_own ON public.subscriptions IS 'Dono da assinatura (user_id) ou saas_admin. Cobre o caso pessoal.'; +COMMENT ON POLICY subscriptions_select_for_tenant_members ON public.subscriptions IS 'Membros ativos do tenant leem assinaturas do tenant.'; +COMMENT ON POLICY "subscriptions: read if linked owner_users" ON public.subscriptions IS 'Caso especial: usuários ligados ao owner via owner_users (terapeutas de uma clínica que precisam ver a assinatura do owner).'; +COMMENT ON POLICY subscriptions_insert_own_personal ON public.subscriptions IS 'Usuário cria a própria assinatura pessoal (intent → conversion).'; +COMMENT ON POLICY subscriptions_update_only_saas_admin ON public.subscriptions IS 'UPDATE direto somente via saas_admin. Mudanças de tenant devem passar por RPC dedicada.'; diff --git a/database-novo/migrations/20260419000005_restrict_intake_rpc.sql b/database-novo/migrations/20260419000005_restrict_intake_rpc.sql new file mode 100644 index 0000000..085e63c --- /dev/null +++ b/database-novo/migrations/20260419000005_restrict_intake_rpc.sql @@ -0,0 +1,29 @@ +-- ============================================================================= +-- Migration: 20260419000005_restrict_intake_rpc +-- A#20 — Restringe create_patient_intake_request_v2 a service_role. +-- +-- Antes: anon (e PUBLIC) podia chamar direto. Bot bypassava qualquer +-- proteção do front (Turnstile etc). +-- Agora: edge function `submit-patient-intake` valida CAPTCHA e chama +-- a RPC com service_role. Anon não chama mais a RPC direto. +-- ============================================================================= + +-- Revoga PUBLIC (DEFAULT) e anon +REVOKE EXECUTE ON FUNCTION public.create_patient_intake_request_v2(text, jsonb) FROM PUBLIC, anon; +REVOKE EXECUTE ON FUNCTION public.create_patient_intake_request_v2(text, jsonb, text) FROM PUBLIC, anon; + +-- Mantém grants explícitos pra authenticated (uso interno futuro) e service_role (edge function) +GRANT EXECUTE ON FUNCTION public.create_patient_intake_request_v2(text, jsonb) TO authenticated, service_role; +GRANT EXECUTE ON FUNCTION public.create_patient_intake_request_v2(text, jsonb, text) TO authenticated, service_role; + +-- Mesma proteção para RPC v1 legada (caso ainda exista) +DO $$ +BEGIN + IF EXISTS ( + SELECT 1 FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace + WHERE n.nspname = 'public' AND p.proname = 'create_patient_intake_request' + ) THEN + EXECUTE 'REVOKE EXECUTE ON FUNCTION public.create_patient_intake_request(text, text, text, text, text, boolean) FROM PUBLIC, anon'; + EXECUTE 'GRANT EXECUTE ON FUNCTION public.create_patient_intake_request(text, text, text, text, text, boolean) TO authenticated, service_role'; + END IF; +END$$; diff --git a/database-novo/migrations/20260419000006_layered_bot_defense.sql b/database-novo/migrations/20260419000006_layered_bot_defense.sql new file mode 100644 index 0000000..ff14847 --- /dev/null +++ b/database-novo/migrations/20260419000006_layered_bot_defense.sql @@ -0,0 +1,136 @@ +-- ============================================================================= +-- Migration: 20260419000006_layered_bot_defense +-- A#20 (rev2) — Defesa em camadas self-hosted (substitui Turnstile). +-- +-- Camadas: +-- 1. Honeypot field (no front) → invisível, sempre ativo +-- 2. Rate limit por IP no edge → submission_rate_limits +-- 3. Math captcha CONDICIONAL → só se IP teve N falhas recentes +-- 4. Logging em public_submission_attempts (genérico, não só intake) +-- 5. Modo paranoid global → saas_security_config.captcha_required +-- +-- Substitui chamadas Turnstile na edge function submit-patient-intake. +-- ============================================================================= + +-- ───────────────────────────────────────────────────────────────────────── +-- 1. saas_security_config (singleton) +-- ----------------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS public.saas_security_config ( + id boolean PRIMARY KEY DEFAULT true, + honeypot_enabled boolean NOT NULL DEFAULT true, + rate_limit_enabled boolean NOT NULL DEFAULT true, + rate_limit_window_min integer NOT NULL DEFAULT 10, + rate_limit_max_attempts integer NOT NULL DEFAULT 5, + captcha_after_failures integer NOT NULL DEFAULT 3, + captcha_required_globally boolean NOT NULL DEFAULT false, + block_duration_min integer NOT NULL DEFAULT 30, + captcha_required_window_min integer NOT NULL DEFAULT 60, + updated_at timestamptz NOT NULL DEFAULT now(), + updated_by uuid, + CONSTRAINT saas_security_config_singleton CHECK (id = true) +); + +INSERT INTO public.saas_security_config (id) VALUES (true) +ON CONFLICT (id) DO NOTHING; + +ALTER TABLE public.saas_security_config ENABLE ROW LEVEL SECURITY; + +REVOKE ALL ON public.saas_security_config FROM anon, authenticated; +GRANT SELECT, UPDATE ON public.saas_security_config TO authenticated; + +DROP POLICY IF EXISTS saas_security_config_read ON public.saas_security_config; +CREATE POLICY saas_security_config_read ON public.saas_security_config + FOR SELECT TO authenticated + USING (true); -- qualquer logado pode ler config global (não tem segredo) + +DROP POLICY IF EXISTS saas_security_config_write ON public.saas_security_config; +CREATE POLICY saas_security_config_write ON public.saas_security_config + FOR UPDATE TO authenticated + USING (public.is_saas_admin()) + WITH CHECK (public.is_saas_admin()); + +COMMENT ON TABLE public.saas_security_config IS 'Singleton: configuração global de defesa contra bots em endpoints públicos.'; + +-- ───────────────────────────────────────────────────────────────────────── +-- 2. public_submission_attempts (log genérico) +-- ----------------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS public.public_submission_attempts ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + endpoint text NOT NULL, + ip_hash text, + success boolean NOT NULL, + error_code text, + error_msg text, + blocked_by text, -- 'honeypot' | 'rate_limit' | 'captcha' | 'rpc' | null + user_agent text, + metadata jsonb, + created_at timestamptz NOT NULL DEFAULT now() +); + +CREATE INDEX IF NOT EXISTS idx_psa_endpoint_created ON public.public_submission_attempts (endpoint, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_psa_ip_hash_created ON public.public_submission_attempts (ip_hash, created_at DESC) WHERE ip_hash IS NOT NULL; +CREATE INDEX IF NOT EXISTS idx_psa_failed ON public.public_submission_attempts (created_at DESC) WHERE success = false; + +ALTER TABLE public.public_submission_attempts ENABLE ROW LEVEL SECURITY; + +REVOKE ALL ON public.public_submission_attempts FROM anon, authenticated; +GRANT SELECT ON public.public_submission_attempts TO authenticated; + +DROP POLICY IF EXISTS psa_read_saas_admin ON public.public_submission_attempts; +CREATE POLICY psa_read_saas_admin ON public.public_submission_attempts + FOR SELECT TO authenticated + USING (public.is_saas_admin()); + +COMMENT ON TABLE public.public_submission_attempts IS 'Log de tentativas em endpoints públicos (intake, signup, agendador). Escrita apenas via RPC SECURITY DEFINER.'; + +-- ───────────────────────────────────────────────────────────────────────── +-- 3. submission_rate_limits (estado vigente por IP+endpoint) +-- ----------------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS public.submission_rate_limits ( + ip_hash text NOT NULL, + endpoint text NOT NULL, + attempt_count integer NOT NULL DEFAULT 0, + fail_count integer NOT NULL DEFAULT 0, + window_start timestamptz NOT NULL DEFAULT now(), + blocked_until timestamptz, + requires_captcha_until timestamptz, + last_attempt_at timestamptz NOT NULL DEFAULT now(), + created_at timestamptz NOT NULL DEFAULT now(), + PRIMARY KEY (ip_hash, endpoint) +); + +CREATE INDEX IF NOT EXISTS idx_srl_blocked_until ON public.submission_rate_limits (blocked_until) WHERE blocked_until IS NOT NULL; +CREATE INDEX IF NOT EXISTS idx_srl_endpoint ON public.submission_rate_limits (endpoint, last_attempt_at DESC); + +ALTER TABLE public.submission_rate_limits ENABLE ROW LEVEL SECURITY; + +REVOKE ALL ON public.submission_rate_limits FROM anon, authenticated; +GRANT SELECT ON public.submission_rate_limits TO authenticated; + +DROP POLICY IF EXISTS srl_read_saas_admin ON public.submission_rate_limits; +CREATE POLICY srl_read_saas_admin ON public.submission_rate_limits + FOR SELECT TO authenticated + USING (public.is_saas_admin()); + +COMMENT ON TABLE public.submission_rate_limits IS 'Estado de rate limit por IP+endpoint. Escrita apenas via RPC. SaaS admin lê pra dashboard.'; + +-- ───────────────────────────────────────────────────────────────────────── +-- 4. math_challenges (TTL 5min, limpa via cron) +-- ----------------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS public.math_challenges ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + question text NOT NULL, + answer integer NOT NULL, + used boolean NOT NULL DEFAULT false, + created_at timestamptz NOT NULL DEFAULT now(), + expires_at timestamptz NOT NULL DEFAULT (now() + interval '5 minutes') +); + +CREATE INDEX IF NOT EXISTS idx_mc_expires ON public.math_challenges (expires_at); + +ALTER TABLE public.math_challenges ENABLE ROW LEVEL SECURITY; + +REVOKE ALL ON public.math_challenges FROM anon, authenticated; +-- nenhum grant: tabela acessada apenas via RPC SECURITY DEFINER + +COMMENT ON TABLE public.math_challenges IS 'Challenges de math captcha. TTL 5min. Escrita/leitura apenas via RPC.'; diff --git a/database-novo/migrations/20260419000007_bot_defense_rpcs.sql b/database-novo/migrations/20260419000007_bot_defense_rpcs.sql new file mode 100644 index 0000000..ae8969c --- /dev/null +++ b/database-novo/migrations/20260419000007_bot_defense_rpcs.sql @@ -0,0 +1,299 @@ +-- ============================================================================= +-- Migration: 20260419000007_bot_defense_rpcs +-- A#20 (rev2) — RPCs da defesa em camadas: +-- • check_rate_limit — consulta + decide allowed/captcha/bloqueio +-- • record_submission_attempt — log + atualiza contadores e bloqueios +-- • generate_math_challenge — cria pergunta math, retorna {id, question} +-- • verify_math_challenge — valida {id, answer}, marca used +-- ============================================================================= + +-- ───────────────────────────────────────────────────────────────────────── +-- check_rate_limit +-- Lê config + estado atual, decide o que retornar. +-- Se fora da janela atual, "rolha" os contadores (reset). +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.check_rate_limit( + p_ip_hash text, + p_endpoint text +) +RETURNS jsonb +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + cfg saas_security_config%ROWTYPE; + rl submission_rate_limits%ROWTYPE; + v_now timestamptz := now(); + v_window_start timestamptz; + v_in_window boolean; + v_requires_captcha boolean := false; + v_blocked_until timestamptz; + v_retry_after_seconds integer := 0; +BEGIN + SELECT * INTO cfg FROM saas_security_config WHERE id = true; + IF NOT FOUND THEN + -- Sem config: fail-open (libera). Logado. + RETURN jsonb_build_object('allowed', true, 'requires_captcha', false, 'reason', 'no_config'); + END IF; + + -- Modo paranoid global: sempre captcha + IF cfg.captcha_required_globally THEN + v_requires_captcha := true; + END IF; + + -- Sem rate limit ativo: libera (mas pode exigir captcha pelo paranoid) + IF NOT cfg.rate_limit_enabled THEN + RETURN jsonb_build_object( + 'allowed', true, + 'requires_captcha', v_requires_captcha, + 'reason', CASE WHEN v_requires_captcha THEN 'paranoid_global' ELSE 'rate_limit_disabled' END + ); + END IF; + + -- Sem ip_hash: libera (não dá pra rastrear) + IF p_ip_hash IS NULL OR length(btrim(p_ip_hash)) = 0 THEN + RETURN jsonb_build_object( + 'allowed', true, + 'requires_captcha', v_requires_captcha, + 'reason', 'no_ip' + ); + END IF; + + SELECT * INTO rl + FROM submission_rate_limits + WHERE ip_hash = p_ip_hash AND endpoint = p_endpoint; + + -- Bloqueio temporário ativo? + IF FOUND AND rl.blocked_until IS NOT NULL AND rl.blocked_until > v_now THEN + v_retry_after_seconds := EXTRACT(EPOCH FROM (rl.blocked_until - v_now))::int; + RETURN jsonb_build_object( + 'allowed', false, + 'requires_captcha', false, + 'retry_after_seconds', v_retry_after_seconds, + 'reason', 'blocked' + ); + END IF; + + -- Captcha condicional ativo? + IF FOUND AND rl.requires_captcha_until IS NOT NULL AND rl.requires_captcha_until > v_now THEN + v_requires_captcha := true; + END IF; + + -- Janela atual ainda válida? + v_window_start := v_now - (cfg.rate_limit_window_min || ' minutes')::interval; + v_in_window := FOUND AND rl.window_start >= v_window_start; + + IF v_in_window AND rl.attempt_count >= cfg.rate_limit_max_attempts THEN + -- Excedeu — bloqueia + v_blocked_until := v_now + (cfg.block_duration_min || ' minutes')::interval; + UPDATE submission_rate_limits + SET blocked_until = v_blocked_until, + last_attempt_at = v_now + WHERE ip_hash = p_ip_hash AND endpoint = p_endpoint; + + v_retry_after_seconds := EXTRACT(EPOCH FROM (v_blocked_until - v_now))::int; + RETURN jsonb_build_object( + 'allowed', false, + 'requires_captcha', false, + 'retry_after_seconds', v_retry_after_seconds, + 'reason', 'rate_limit_exceeded' + ); + END IF; + + RETURN jsonb_build_object( + 'allowed', true, + 'requires_captcha', v_requires_captcha, + 'reason', CASE WHEN v_requires_captcha THEN 'captcha_required' ELSE 'ok' END + ); +END; +$function$; + +REVOKE ALL ON FUNCTION public.check_rate_limit(text, text) FROM PUBLIC, anon, authenticated; +GRANT EXECUTE ON FUNCTION public.check_rate_limit(text, text) TO service_role; + +-- ───────────────────────────────────────────────────────────────────────── +-- record_submission_attempt +-- Loga em public_submission_attempts + atualiza submission_rate_limits. +-- Se !success: incrementa fail_count; se >= captcha_after_failures, marca +-- requires_captcha_until = now + captcha_required_window_min. +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.record_submission_attempt( + p_endpoint text, + p_ip_hash text, + p_success boolean, + p_blocked_by text DEFAULT NULL, + p_error_code text DEFAULT NULL, + p_error_msg text DEFAULT NULL, + p_user_agent text DEFAULT NULL, + p_metadata jsonb DEFAULT NULL +) +RETURNS void +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + cfg saas_security_config%ROWTYPE; + v_now timestamptz := now(); + v_window_start timestamptz; + rl submission_rate_limits%ROWTYPE; +BEGIN + -- Log sempre (mesmo sem ip) + INSERT INTO public_submission_attempts + (endpoint, ip_hash, success, blocked_by, error_code, error_msg, user_agent, metadata) + VALUES + (p_endpoint, p_ip_hash, p_success, p_blocked_by, + left(coalesce(p_error_code, ''), 80), + left(coalesce(p_error_msg, ''), 500), + left(coalesce(p_user_agent, ''), 500), + p_metadata); + + -- Sem ip ou rate limit desligado: não atualiza contador + IF p_ip_hash IS NULL OR length(btrim(p_ip_hash)) = 0 THEN RETURN; END IF; + + SELECT * INTO cfg FROM saas_security_config WHERE id = true; + IF NOT FOUND OR NOT cfg.rate_limit_enabled THEN RETURN; END IF; + + v_window_start := v_now - (cfg.rate_limit_window_min || ' minutes')::interval; + + SELECT * INTO rl + FROM submission_rate_limits + WHERE ip_hash = p_ip_hash AND endpoint = p_endpoint; + + IF NOT FOUND THEN + INSERT INTO submission_rate_limits + (ip_hash, endpoint, attempt_count, fail_count, window_start, last_attempt_at) + VALUES + (p_ip_hash, p_endpoint, 1, CASE WHEN p_success THEN 0 ELSE 1 END, v_now, v_now); + ELSE + IF rl.window_start < v_window_start THEN + -- Reset janela + UPDATE submission_rate_limits + SET attempt_count = 1, + fail_count = CASE WHEN p_success THEN 0 ELSE 1 END, + window_start = v_now, + last_attempt_at = v_now, + blocked_until = NULL + WHERE ip_hash = p_ip_hash AND endpoint = p_endpoint; + ELSE + UPDATE submission_rate_limits + SET attempt_count = attempt_count + 1, + fail_count = fail_count + CASE WHEN p_success THEN 0 ELSE 1 END, + last_attempt_at = v_now + WHERE ip_hash = p_ip_hash AND endpoint = p_endpoint; + END IF; + + -- Se atingiu threshold de captcha condicional, marca + IF NOT p_success THEN + SELECT * INTO rl FROM submission_rate_limits WHERE ip_hash = p_ip_hash AND endpoint = p_endpoint; + IF rl.fail_count >= cfg.captcha_after_failures + AND (rl.requires_captcha_until IS NULL OR rl.requires_captcha_until < v_now) THEN + UPDATE submission_rate_limits + SET requires_captcha_until = v_now + (cfg.captcha_required_window_min || ' minutes')::interval + WHERE ip_hash = p_ip_hash AND endpoint = p_endpoint; + END IF; + END IF; + END IF; +END; +$function$; + +REVOKE ALL ON FUNCTION public.record_submission_attempt(text, text, boolean, text, text, text, text, jsonb) FROM PUBLIC, anon, authenticated; +GRANT EXECUTE ON FUNCTION public.record_submission_attempt(text, text, boolean, text, text, text, text, jsonb) TO service_role; + +-- ───────────────────────────────────────────────────────────────────────── +-- generate_math_challenge +-- Cria 2 inteiros 1..9 + operação. Retorna {id, question}. +-- Operações: + - * (resultado sempre positivo) +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.generate_math_challenge() +RETURNS jsonb +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + v_a integer; + v_b integer; + v_op text; + v_ans integer; + v_q text; + v_id uuid; +BEGIN + v_a := 1 + floor(random() * 9)::int; + v_b := 1 + floor(random() * 9)::int; + v_op := (ARRAY['+','-','*'])[1 + floor(random() * 3)::int]; + + -- garantir resultado positivo na subtração + IF v_op = '-' AND v_b > v_a THEN + v_a := v_a + v_b; + END IF; + + v_ans := CASE v_op + WHEN '+' THEN v_a + v_b + WHEN '-' THEN v_a - v_b + WHEN '*' THEN v_a * v_b + END; + + v_q := format('Quanto é %s %s %s?', v_a, v_op, v_b); + + INSERT INTO math_challenges (question, answer) + VALUES (v_q, v_ans) + RETURNING id INTO v_id; + + RETURN jsonb_build_object('id', v_id, 'question', v_q); +END; +$function$; + +REVOKE ALL ON FUNCTION public.generate_math_challenge() FROM PUBLIC, anon, authenticated; +GRANT EXECUTE ON FUNCTION public.generate_math_challenge() TO service_role; + +-- ───────────────────────────────────────────────────────────────────────── +-- verify_math_challenge +-- Valida {id, answer}. Marca used. Bloqueia uso duplicado. +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.verify_math_challenge( + p_id uuid, + p_answer integer +) +RETURNS boolean +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + mc math_challenges%ROWTYPE; +BEGIN + IF p_id IS NULL OR p_answer IS NULL THEN RETURN false; END IF; + + SELECT * INTO mc FROM math_challenges WHERE id = p_id; + IF NOT FOUND OR mc.used OR mc.expires_at < now() THEN + RETURN false; + END IF; + + UPDATE math_challenges SET used = true WHERE id = p_id; + + RETURN mc.answer = p_answer; +END; +$function$; + +REVOKE ALL ON FUNCTION public.verify_math_challenge(uuid, integer) FROM PUBLIC, anon, authenticated; +GRANT EXECUTE ON FUNCTION public.verify_math_challenge(uuid, integer) TO service_role; + +-- ───────────────────────────────────────────────────────────────────────── +-- cleanup_expired_math_challenges (chamável via cron) +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.cleanup_expired_math_challenges() +RETURNS integer +LANGUAGE sql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ + WITH d AS ( + DELETE FROM math_challenges WHERE expires_at < now() - interval '1 hour' RETURNING 1 + ) + SELECT COUNT(*)::int FROM d; +$function$; + +REVOKE ALL ON FUNCTION public.cleanup_expired_math_challenges() FROM PUBLIC, anon, authenticated; +GRANT EXECUTE ON FUNCTION public.cleanup_expired_math_challenges() TO service_role; diff --git a/database-novo/migrations/20260419000008_saas_twilio_config.sql b/database-novo/migrations/20260419000008_saas_twilio_config.sql new file mode 100644 index 0000000..422363c --- /dev/null +++ b/database-novo/migrations/20260419000008_saas_twilio_config.sql @@ -0,0 +1,155 @@ +-- ============================================================================= +-- Migration: 20260419000008_saas_twilio_config +-- Permite saas_admin editar config Twilio operacional pelo painel, sem redeploy. +-- +-- DECISÃO DE SEGURANÇA: +-- • TWILIO_AUTH_TOKEN (secret) NÃO entra na tabela. Continua em env var +-- da Edge Function. Painel apenas exibe se está configurado (best-effort). +-- • TWILIO_ACCOUNT_SID (público no Twilio dashboard, identificador) → DB +-- • TWILIO_WHATSAPP_WEBHOOK (URL) → DB +-- • USD_BRL_RATE / MARGIN_MULTIPLIER (operacional) → DB +-- +-- Edge function: lê primeiro do banco; cai pra env vars como fallback se row +-- ainda não foi configurada (back-compat com deploys antigos). +-- ============================================================================= + +CREATE TABLE IF NOT EXISTS public.saas_twilio_config ( + id boolean PRIMARY KEY DEFAULT true, + account_sid text, + whatsapp_webhook_url text, + usd_brl_rate numeric(10,4) NOT NULL DEFAULT 5.5, + margin_multiplier numeric(10,4) NOT NULL DEFAULT 1.4, + notes text, + updated_at timestamptz NOT NULL DEFAULT now(), + updated_by uuid, + CONSTRAINT saas_twilio_config_singleton CHECK (id = true), + CONSTRAINT saas_twilio_config_rate_chk CHECK (usd_brl_rate > 0 AND usd_brl_rate < 100), + CONSTRAINT saas_twilio_config_mult_chk CHECK (margin_multiplier >= 1 AND margin_multiplier <= 10), + CONSTRAINT saas_twilio_config_sid_chk CHECK (account_sid IS NULL OR account_sid ~ '^AC[a-zA-Z0-9]{32}$'), + CONSTRAINT saas_twilio_config_url_chk CHECK (whatsapp_webhook_url IS NULL OR whatsapp_webhook_url ~ '^https?://') +); + +INSERT INTO public.saas_twilio_config (id) VALUES (true) +ON CONFLICT (id) DO NOTHING; + +ALTER TABLE public.saas_twilio_config ENABLE ROW LEVEL SECURITY; + +REVOKE ALL ON public.saas_twilio_config FROM anon, authenticated; +GRANT SELECT ON public.saas_twilio_config TO authenticated; + +DROP POLICY IF EXISTS saas_twilio_config_read ON public.saas_twilio_config; +CREATE POLICY saas_twilio_config_read ON public.saas_twilio_config + FOR SELECT TO authenticated + USING (public.is_saas_admin()); -- só admin vê config (mesmo sem secret, é dado operacional) + +COMMENT ON TABLE public.saas_twilio_config IS + 'Config operacional Twilio editável via painel. AUTH_TOKEN continua em env var por segurança.'; + +-- ───────────────────────────────────────────────────────────────────────── +-- RPC get_twilio_config — retorna config atual (saas_admin OU service_role) +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.get_twilio_config() +RETURNS jsonb +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + cfg saas_twilio_config%ROWTYPE; +BEGIN + -- Permite quem é saas_admin (UI) ou quando chamado via service_role (edge function) + -- coalesce protege de NULL (auth.role() pode ser NULL fora de contexto JWT) + IF NOT (public.is_saas_admin() OR coalesce(auth.role(), '') = 'service_role') THEN + RAISE EXCEPTION 'Sem permissão' USING ERRCODE = '42501'; + END IF; + + SELECT * INTO cfg FROM saas_twilio_config WHERE id = true; + IF NOT FOUND THEN + RETURN jsonb_build_object( + 'account_sid', NULL, + 'whatsapp_webhook_url', NULL, + 'usd_brl_rate', 5.5, + 'margin_multiplier', 1.4 + ); + END IF; + + RETURN jsonb_build_object( + 'account_sid', cfg.account_sid, + 'whatsapp_webhook_url', cfg.whatsapp_webhook_url, + 'usd_brl_rate', cfg.usd_brl_rate, + 'margin_multiplier', cfg.margin_multiplier, + 'notes', cfg.notes, + 'updated_at', cfg.updated_at, + 'updated_by', cfg.updated_by + ); +END; +$function$; + +REVOKE ALL ON FUNCTION public.get_twilio_config() FROM PUBLIC, anon, authenticated; +GRANT EXECUTE ON FUNCTION public.get_twilio_config() TO authenticated, service_role; + +-- ───────────────────────────────────────────────────────────────────────── +-- RPC update_twilio_config — só saas_admin +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.update_twilio_config( + p_account_sid text DEFAULT NULL, + p_whatsapp_webhook_url text DEFAULT NULL, + p_usd_brl_rate numeric DEFAULT NULL, + p_margin_multiplier numeric DEFAULT NULL, + p_notes text DEFAULT NULL +) +RETURNS jsonb +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + v_caller uuid := auth.uid(); + v_account_sid text; + v_webhook_url text; + v_notes text; +BEGIN + IF v_caller IS NULL THEN + RAISE EXCEPTION 'Não autenticado' USING ERRCODE = '28000'; + END IF; + IF NOT public.is_saas_admin() THEN + RAISE EXCEPTION 'Apenas saas_admin pode atualizar config Twilio' USING ERRCODE = '42501'; + END IF; + + -- Sanitização + v_account_sid := nullif(btrim(coalesce(p_account_sid, '')), ''); + v_webhook_url := nullif(btrim(coalesce(p_whatsapp_webhook_url, '')), ''); + v_notes := nullif(btrim(coalesce(p_notes, '')), ''); + + IF v_account_sid IS NOT NULL AND v_account_sid !~ '^AC[a-zA-Z0-9]{32}$' THEN + RAISE EXCEPTION 'account_sid inválido (esperado AC + 32 chars)' USING ERRCODE = '22023'; + END IF; + IF v_webhook_url IS NOT NULL AND v_webhook_url !~ '^https?://' THEN + RAISE EXCEPTION 'webhook_url deve começar com http(s)://' USING ERRCODE = '22023'; + END IF; + IF p_usd_brl_rate IS NOT NULL AND (p_usd_brl_rate <= 0 OR p_usd_brl_rate >= 100) THEN + RAISE EXCEPTION 'usd_brl_rate fora da faixa (0..100)' USING ERRCODE = '22023'; + END IF; + IF p_margin_multiplier IS NOT NULL AND (p_margin_multiplier < 1 OR p_margin_multiplier > 10) THEN + RAISE EXCEPTION 'margin_multiplier fora da faixa (1..10)' USING ERRCODE = '22023'; + END IF; + IF v_notes IS NOT NULL AND length(v_notes) > 1000 THEN + v_notes := substring(v_notes FROM 1 FOR 1000); + END IF; + + UPDATE saas_twilio_config + SET account_sid = COALESCE(v_account_sid, account_sid), + whatsapp_webhook_url = COALESCE(v_webhook_url, whatsapp_webhook_url), + usd_brl_rate = COALESCE(p_usd_brl_rate, usd_brl_rate), + margin_multiplier = COALESCE(p_margin_multiplier, margin_multiplier), + notes = COALESCE(v_notes, notes), + updated_at = now(), + updated_by = v_caller + WHERE id = true; + + RETURN public.get_twilio_config(); +END; +$function$; + +REVOKE ALL ON FUNCTION public.update_twilio_config(text, text, numeric, numeric, text) FROM PUBLIC, anon, authenticated; +GRANT EXECUTE ON FUNCTION public.update_twilio_config(text, text, numeric, numeric, text) TO authenticated; diff --git a/database-novo/migrations/20260419000009_patient_session_counts_rpc.sql b/database-novo/migrations/20260419000009_patient_session_counts_rpc.sql new file mode 100644 index 0000000..6783e76 --- /dev/null +++ b/database-novo/migrations/20260419000009_patient_session_counts_rpc.sql @@ -0,0 +1,34 @@ +-- ============================================================================= +-- Migration: 20260419000009_patient_session_counts_rpc +-- V#8 — Substitui o .limit(1000) arbitrário em PatientsListPage por RPC +-- agregada que retorna contagens por paciente (sempre atualizada, sem teto). +-- +-- Tenant scoping é feito via WHERE tenant_id IN (memberships do caller), +-- consistente com a policy SELECT de agenda_eventos. +-- ============================================================================= + +CREATE OR REPLACE FUNCTION public.get_patient_session_counts( + p_patient_ids uuid[] +) +RETURNS TABLE(patient_id uuid, session_count integer, last_session_at timestamptz) +LANGUAGE sql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ + SELECT + ae.patient_id, + COUNT(*)::int AS session_count, + MAX(ae.inicio_em) AS last_session_at + FROM public.agenda_eventos ae + WHERE ae.patient_id = ANY(p_patient_ids) + AND ae.tenant_id IN ( + SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() + AND tm.status = 'active' + ) + GROUP BY ae.patient_id; +$function$; + +REVOKE ALL ON FUNCTION public.get_patient_session_counts(uuid[]) FROM PUBLIC, anon; +GRANT EXECUTE ON FUNCTION public.get_patient_session_counts(uuid[]) TO authenticated; diff --git a/database-novo/migrations/20260419000010_documents_security_hardening.sql b/database-novo/migrations/20260419000010_documents_security_hardening.sql new file mode 100644 index 0000000..0b8fc13 --- /dev/null +++ b/database-novo/migrations/20260419000010_documents_security_hardening.sql @@ -0,0 +1,304 @@ +-- ============================================================================= +-- Migration: 20260419000010_documents_security_hardening +-- Sessão 6 — revisão sênior de Documentos. Resolve V#43-V#49 (5 críticos/altos +-- + 2 médios). V#50-V#52 (portal-paciente, hash, retention) ficam pendentes +-- pra próxima sessão (precisam de design/decisão). +-- +-- Path convention dos buckets: "{tenant_id}/{patient_id}/{timestamp}-{file}" +-- (storage.foldername(name))[1] = tenant_id +-- ============================================================================= + +-- Tabelas de documents são owned por supabase_admin +SET LOCAL ROLE supabase_admin; + +-- ───────────────────────────────────────────────────────────────────────── +-- V#43 + V#44: storage.objects para buckets "documents" e "generated-docs" +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS "documents: authenticated read" ON storage.objects; +DROP POLICY IF EXISTS "documents: authenticated upload" ON storage.objects; +DROP POLICY IF EXISTS "documents: authenticated delete" ON storage.objects; +DROP POLICY IF EXISTS "documents: tenant member read" ON storage.objects; +DROP POLICY IF EXISTS "documents: tenant member upload" ON storage.objects; +DROP POLICY IF EXISTS "documents: tenant member delete" ON storage.objects; + +CREATE POLICY "documents: tenant member read" ON storage.objects + FOR SELECT TO authenticated + USING ( + bucket_id = 'documents' + AND ( + public.is_saas_admin() + OR + (storage.foldername(name))[1]::uuid IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ) + ); + +CREATE POLICY "documents: tenant member upload" ON storage.objects + FOR INSERT TO authenticated + WITH CHECK ( + bucket_id = 'documents' + AND (storage.foldername(name))[1]::uuid IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ); + +CREATE POLICY "documents: tenant member delete" ON storage.objects + FOR DELETE TO authenticated + USING ( + bucket_id = 'documents' + AND ( + public.is_saas_admin() + OR + (storage.foldername(name))[1]::uuid IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ) + ); + +DROP POLICY IF EXISTS "generated-docs: authenticated read" ON storage.objects; +DROP POLICY IF EXISTS "generated-docs: authenticated upload" ON storage.objects; +DROP POLICY IF EXISTS "generated-docs: authenticated delete" ON storage.objects; +DROP POLICY IF EXISTS "generated-docs: tenant member read" ON storage.objects; +DROP POLICY IF EXISTS "generated-docs: tenant member upload" ON storage.objects; +DROP POLICY IF EXISTS "generated-docs: tenant member delete" ON storage.objects; + +CREATE POLICY "generated-docs: tenant member read" ON storage.objects + FOR SELECT TO authenticated + USING ( + bucket_id = 'generated-docs' + AND ( + public.is_saas_admin() + OR + (storage.foldername(name))[1]::uuid IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ) + ); + +CREATE POLICY "generated-docs: tenant member upload" ON storage.objects + FOR INSERT TO authenticated + WITH CHECK ( + bucket_id = 'generated-docs' + AND (storage.foldername(name))[1]::uuid IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ); + +CREATE POLICY "generated-docs: tenant member delete" ON storage.objects + FOR DELETE TO authenticated + USING ( + bucket_id = 'generated-docs' + AND ( + public.is_saas_admin() + OR + (storage.foldername(name))[1]::uuid IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ) + ); + +-- ───────────────────────────────────────────────────────────────────────── +-- V#45: documents — policies separadas por cmd +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS "documents: owner full access" ON public.documents; +DROP POLICY IF EXISTS "documents: select" ON public.documents; +DROP POLICY IF EXISTS "documents: insert" ON public.documents; +DROP POLICY IF EXISTS "documents: update" ON public.documents; +DROP POLICY IF EXISTS "documents: delete" ON public.documents; + +-- SELECT: owner OR tenant_member ativo OR saas_admin +CREATE POLICY "documents: select" ON public.documents + FOR SELECT TO authenticated + USING ( + owner_id = auth.uid() + OR public.is_saas_admin() + OR tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ); + +-- INSERT: owner_id deve ser o caller, tenant_id deve ser tenant ativo do caller +CREATE POLICY "documents: insert" ON public.documents + FOR INSERT TO authenticated + WITH CHECK ( + owner_id = auth.uid() + AND tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ); + +-- UPDATE: só owner +CREATE POLICY "documents: update" ON public.documents + FOR UPDATE TO authenticated + USING (owner_id = auth.uid() OR public.is_saas_admin()) + WITH CHECK (owner_id = auth.uid() OR public.is_saas_admin()); + +-- DELETE: só owner ou saas_admin +CREATE POLICY "documents: delete" ON public.documents + FOR DELETE TO authenticated + USING (owner_id = auth.uid() OR public.is_saas_admin()); + +-- ───────────────────────────────────────────────────────────────────────── +-- V#46: document_share_links — RPC validate_share_token + remover SELECT direto +-- ----------------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION public.validate_share_token(p_token text) +RETURNS jsonb +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path TO 'public' +AS $function$ +DECLARE + sl document_share_links%ROWTYPE; + v_doc documents%ROWTYPE; + v_token text; +BEGIN + v_token := nullif(btrim(coalesce(p_token, '')), ''); + IF v_token IS NULL THEN + RAISE EXCEPTION 'token obrigatório' USING ERRCODE = '22023'; + END IF; + + SELECT * INTO sl FROM document_share_links WHERE token = v_token LIMIT 1; + IF NOT FOUND THEN + RAISE EXCEPTION 'Token inválido' USING ERRCODE = '28000'; + END IF; + IF sl.ativo IS NOT TRUE THEN + RAISE EXCEPTION 'Link desativado' USING ERRCODE = '28000'; + END IF; + IF sl.expira_em IS NOT NULL AND sl.expira_em < now() THEN + RAISE EXCEPTION 'Link expirado' USING ERRCODE = '28000'; + END IF; + IF sl.usos_max IS NOT NULL AND sl.usos >= sl.usos_max THEN + RAISE EXCEPTION 'Limite de uso atingido' USING ERRCODE = '28000'; + END IF; + + -- Incrementa uso atomicamente + UPDATE document_share_links SET usos = usos + 1 WHERE id = sl.id; + + -- Loga acesso (best-effort) + BEGIN + INSERT INTO document_access_logs (document_id, tenant_id, action, share_link_id) + SELECT sl.document_id, d.tenant_id, 'shared_link_access', sl.id + FROM documents d WHERE d.id = sl.document_id; + EXCEPTION WHEN OTHERS THEN + -- não derruba a request se log falhar (schema pode variar) + NULL; + END; + + SELECT * INTO v_doc FROM documents WHERE id = sl.document_id; + + RETURN jsonb_build_object( + 'document_id', sl.document_id, + 'bucket', v_doc.storage_bucket, + 'bucket_path', v_doc.bucket_path, + 'nome_original', v_doc.nome_original, + 'mime_type', v_doc.mime_type, + 'tamanho_bytes', v_doc.tamanho_bytes + ); +END; +$function$; + +REVOKE ALL ON FUNCTION public.validate_share_token(text) FROM PUBLIC, authenticated; +GRANT EXECUTE ON FUNCTION public.validate_share_token(text) TO anon, authenticated, service_role; + +-- Restringe SELECT direto da tabela: só criador (saas_admin via outra policy se necessário) +DROP POLICY IF EXISTS "dsl: public read by token" ON public.document_share_links; +DROP POLICY IF EXISTS "dsl: creator full access" ON public.document_share_links; + +CREATE POLICY "dsl: creator full access" ON public.document_share_links + FOR ALL TO authenticated + USING (criado_por = auth.uid() OR public.is_saas_admin()) + WITH CHECK (criado_por = auth.uid()); + +-- ───────────────────────────────────────────────────────────────────────── +-- V#47: document_signatures — separar SELECT/INSERT (tenant_member) vs UPDATE/DELETE (signatário) +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS "ds: tenant members access" ON public.document_signatures; +DROP POLICY IF EXISTS "ds: select" ON public.document_signatures; +DROP POLICY IF EXISTS "ds: insert" ON public.document_signatures; +DROP POLICY IF EXISTS "ds: update" ON public.document_signatures; +DROP POLICY IF EXISTS "ds: delete" ON public.document_signatures; + +CREATE POLICY "ds: select" ON public.document_signatures + FOR SELECT TO authenticated + USING ( + public.is_saas_admin() + OR tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ); + +-- INSERT: tenant_member pode criar; signatario_id (se preenchido) deve ser o caller +-- (paciente externo é signatario_tipo='paciente' com signatario_id NULL — a row +-- nasce sem assinatura e signatario_id é preenchido na aceitação via outro fluxo) +CREATE POLICY "ds: insert" ON public.document_signatures + FOR INSERT TO authenticated + WITH CHECK ( + tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + AND (signatario_id IS NULL OR signatario_id = auth.uid()) + ); + +-- UPDATE: só o signatário designado ou saas_admin (impede secretária forjar status='assinado') +CREATE POLICY "ds: update" ON public.document_signatures + FOR UPDATE TO authenticated + USING (signatario_id = auth.uid() OR public.is_saas_admin()) + WITH CHECK (signatario_id = auth.uid() OR public.is_saas_admin()); + +-- DELETE: signatário, saas_admin ou tenant_admin/owner +CREATE POLICY "ds: delete" ON public.document_signatures + FOR DELETE TO authenticated + USING ( + signatario_id = auth.uid() + OR public.is_saas_admin() + OR tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + AND tm.role IN ('tenant_admin','admin','owner') + ) + ); + +-- ───────────────────────────────────────────────────────────────────────── +-- V#48: document_access_logs — INSERT com WITH CHECK +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS "dal: tenant members can insert" ON public.document_access_logs; +CREATE POLICY "dal: tenant members can insert" ON public.document_access_logs + FOR INSERT TO authenticated + WITH CHECK ( + tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ); + +-- ───────────────────────────────────────────────────────────────────────── +-- V#49: document_templates — INSERT com WITH CHECK +-- ----------------------------------------------------------------------------- +DROP POLICY IF EXISTS "dt: owner can insert" ON public.document_templates; +DROP POLICY IF EXISTS "dt: saas admin can insert global" ON public.document_templates; + +CREATE POLICY "dt: owner can insert" ON public.document_templates + FOR INSERT TO authenticated + WITH CHECK ( + is_global = false + AND owner_id = auth.uid() + AND tenant_id IN ( + SELECT tm.tenant_id FROM public.tenant_members tm + WHERE tm.user_id = auth.uid() AND tm.status = 'active' + ) + ); + +CREATE POLICY "dt: saas admin can insert global" ON public.document_templates + FOR INSERT TO authenticated + WITH CHECK (is_global = true AND public.is_saas_admin()); diff --git a/database-novo/schema/00_full/schema.sql b/database-novo/schema/00_full/schema.sql index 85dd8db..e96d54d 100644 --- a/database-novo/schema/00_full/schema.sql +++ b/database-novo/schema/00_full/schema.sql @@ -2,7 +2,7 @@ -- PostgreSQL database dump -- -\restrict ABfzP9IZJ8pAzvgt6E9jKpFn1phQ3b3Lgk09BZZTle5el6ODr77nIXlXnCf1PS1 +\restrict t3AqgfsPfrxKQ6xDOUZgLcwOmqGEQFr9QmWZe441K296WP9E1M31r17ZcywnfKW -- Dumped from database version 17.6 -- Dumped by pg_dump version 17.6 @@ -20,23 +20,19 @@ SET client_min_messages = warning; SET row_security = off; -- --- Name: _realtime; Type: SCHEMA; Schema: -; Owner: postgres +-- Name: _realtime; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA _realtime; -ALTER SCHEMA _realtime OWNER TO postgres; - -- --- Name: auth; Type: SCHEMA; Schema: -; Owner: supabase_admin +-- Name: auth; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA auth; -ALTER SCHEMA auth OWNER TO supabase_admin; - -- -- Name: pg_cron; Type: EXTENSION; Schema: -; Owner: - -- @@ -45,39 +41,33 @@ CREATE EXTENSION IF NOT EXISTS pg_cron WITH SCHEMA pg_catalog; -- --- Name: EXTENSION pg_cron; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION pg_cron; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION pg_cron IS 'Job scheduler for PostgreSQL'; -- --- Name: extensions; Type: SCHEMA; Schema: -; Owner: postgres +-- Name: extensions; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA extensions; -ALTER SCHEMA extensions OWNER TO postgres; - -- --- Name: graphql; Type: SCHEMA; Schema: -; Owner: supabase_admin +-- Name: graphql; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA graphql; -ALTER SCHEMA graphql OWNER TO supabase_admin; - -- --- Name: graphql_public; Type: SCHEMA; Schema: -; Owner: supabase_admin +-- Name: graphql_public; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA graphql_public; -ALTER SCHEMA graphql_public OWNER TO supabase_admin; - -- -- Name: pg_net; Type: EXTENSION; Schema: -; Owner: - -- @@ -86,57 +76,47 @@ CREATE EXTENSION IF NOT EXISTS pg_net WITH SCHEMA extensions; -- --- Name: EXTENSION pg_net; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION pg_net; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION pg_net IS 'Async HTTP'; -- --- Name: pgbouncer; Type: SCHEMA; Schema: -; Owner: pgbouncer +-- Name: pgbouncer; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA pgbouncer; -ALTER SCHEMA pgbouncer OWNER TO pgbouncer; - -- --- Name: realtime; Type: SCHEMA; Schema: -; Owner: supabase_admin +-- Name: realtime; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA realtime; -ALTER SCHEMA realtime OWNER TO supabase_admin; - -- --- Name: storage; Type: SCHEMA; Schema: -; Owner: supabase_admin +-- Name: storage; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA storage; -ALTER SCHEMA storage OWNER TO supabase_admin; - -- --- Name: supabase_functions; Type: SCHEMA; Schema: -; Owner: supabase_admin +-- Name: supabase_functions; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA supabase_functions; -ALTER SCHEMA supabase_functions OWNER TO supabase_admin; - -- --- Name: vault; Type: SCHEMA; Schema: -; Owner: supabase_admin +-- Name: vault; Type: SCHEMA; Schema: -; Owner: - -- CREATE SCHEMA vault; -ALTER SCHEMA vault OWNER TO supabase_admin; - -- -- Name: btree_gist; Type: EXTENSION; Schema: -; Owner: - -- @@ -145,7 +125,7 @@ CREATE EXTENSION IF NOT EXISTS btree_gist WITH SCHEMA public; -- --- Name: EXTENSION btree_gist; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION btree_gist; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION btree_gist IS 'support for indexing common datatypes in GiST'; @@ -159,7 +139,7 @@ CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public; -- --- Name: EXTENSION citext; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION citext; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION citext IS 'data type for case-insensitive character strings'; @@ -173,7 +153,7 @@ CREATE EXTENSION IF NOT EXISTS pg_graphql WITH SCHEMA graphql; -- --- Name: EXTENSION pg_graphql; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION pg_graphql; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION pg_graphql IS 'pg_graphql: GraphQL support'; @@ -187,7 +167,7 @@ CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA extensions; -- --- Name: EXTENSION pg_stat_statements; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION pg_stat_statements; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION pg_stat_statements IS 'track planning and execution statistics of all SQL statements executed'; @@ -201,7 +181,7 @@ CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public; -- --- Name: EXTENSION pg_trgm; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION pg_trgm; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION pg_trgm IS 'text similarity measurement and index searching based on trigrams'; @@ -215,7 +195,7 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA extensions; -- --- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions'; @@ -229,7 +209,7 @@ CREATE EXTENSION IF NOT EXISTS supabase_vault WITH SCHEMA vault; -- --- Name: EXTENSION supabase_vault; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION supabase_vault; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION supabase_vault IS 'Supabase Vault Extension'; @@ -243,14 +223,14 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA extensions; -- --- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner: +-- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner: - -- COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)'; -- --- Name: aal_level; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: aal_level; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.aal_level AS ENUM ( @@ -260,10 +240,8 @@ CREATE TYPE auth.aal_level AS ENUM ( ); -ALTER TYPE auth.aal_level OWNER TO supabase_auth_admin; - -- --- Name: code_challenge_method; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: code_challenge_method; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.code_challenge_method AS ENUM ( @@ -272,10 +250,8 @@ CREATE TYPE auth.code_challenge_method AS ENUM ( ); -ALTER TYPE auth.code_challenge_method OWNER TO supabase_auth_admin; - -- --- Name: factor_status; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: factor_status; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.factor_status AS ENUM ( @@ -284,10 +260,8 @@ CREATE TYPE auth.factor_status AS ENUM ( ); -ALTER TYPE auth.factor_status OWNER TO supabase_auth_admin; - -- --- Name: factor_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: factor_type; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.factor_type AS ENUM ( @@ -297,10 +271,8 @@ CREATE TYPE auth.factor_type AS ENUM ( ); -ALTER TYPE auth.factor_type OWNER TO supabase_auth_admin; - -- --- Name: oauth_authorization_status; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_authorization_status; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.oauth_authorization_status AS ENUM ( @@ -311,10 +283,8 @@ CREATE TYPE auth.oauth_authorization_status AS ENUM ( ); -ALTER TYPE auth.oauth_authorization_status OWNER TO supabase_auth_admin; - -- --- Name: oauth_client_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_client_type; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.oauth_client_type AS ENUM ( @@ -323,10 +293,8 @@ CREATE TYPE auth.oauth_client_type AS ENUM ( ); -ALTER TYPE auth.oauth_client_type OWNER TO supabase_auth_admin; - -- --- Name: oauth_registration_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_registration_type; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.oauth_registration_type AS ENUM ( @@ -335,10 +303,8 @@ CREATE TYPE auth.oauth_registration_type AS ENUM ( ); -ALTER TYPE auth.oauth_registration_type OWNER TO supabase_auth_admin; - -- --- Name: oauth_response_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_response_type; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.oauth_response_type AS ENUM ( @@ -346,10 +312,8 @@ CREATE TYPE auth.oauth_response_type AS ENUM ( ); -ALTER TYPE auth.oauth_response_type OWNER TO supabase_auth_admin; - -- --- Name: one_time_token_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin +-- Name: one_time_token_type; Type: TYPE; Schema: auth; Owner: - -- CREATE TYPE auth.one_time_token_type AS ENUM ( @@ -362,10 +326,8 @@ CREATE TYPE auth.one_time_token_type AS ENUM ( ); -ALTER TYPE auth.one_time_token_type OWNER TO supabase_auth_admin; - -- --- Name: commitment_log_source; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: commitment_log_source; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.commitment_log_source AS ENUM ( @@ -374,10 +336,8 @@ CREATE TYPE public.commitment_log_source AS ENUM ( ); -ALTER TYPE public.commitment_log_source OWNER TO supabase_admin; - -- --- Name: determined_field_type; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: determined_field_type; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.determined_field_type AS ENUM ( @@ -390,10 +350,8 @@ CREATE TYPE public.determined_field_type AS ENUM ( ); -ALTER TYPE public.determined_field_type OWNER TO supabase_admin; - -- --- Name: financial_record_type; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: financial_record_type; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.financial_record_type AS ENUM ( @@ -402,10 +360,8 @@ CREATE TYPE public.financial_record_type AS ENUM ( ); -ALTER TYPE public.financial_record_type OWNER TO supabase_admin; - -- --- Name: recurrence_exception_type; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: recurrence_exception_type; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.recurrence_exception_type AS ENUM ( @@ -417,10 +373,8 @@ CREATE TYPE public.recurrence_exception_type AS ENUM ( ); -ALTER TYPE public.recurrence_exception_type OWNER TO supabase_admin; - -- --- Name: recurrence_type; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: recurrence_type; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.recurrence_type AS ENUM ( @@ -432,10 +386,8 @@ CREATE TYPE public.recurrence_type AS ENUM ( ); -ALTER TYPE public.recurrence_type OWNER TO supabase_admin; - -- --- Name: status_agenda_serie; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: status_agenda_serie; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.status_agenda_serie AS ENUM ( @@ -445,10 +397,8 @@ CREATE TYPE public.status_agenda_serie AS ENUM ( ); -ALTER TYPE public.status_agenda_serie OWNER TO supabase_admin; - -- --- Name: status_evento_agenda; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: status_evento_agenda; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.status_evento_agenda AS ENUM ( @@ -460,10 +410,8 @@ CREATE TYPE public.status_evento_agenda AS ENUM ( ); -ALTER TYPE public.status_evento_agenda OWNER TO supabase_admin; - -- --- Name: status_excecao_agenda; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: status_excecao_agenda; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.status_excecao_agenda AS ENUM ( @@ -473,10 +421,8 @@ CREATE TYPE public.status_excecao_agenda AS ENUM ( ); -ALTER TYPE public.status_excecao_agenda OWNER TO supabase_admin; - -- --- Name: tipo_evento_agenda; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: tipo_evento_agenda; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.tipo_evento_agenda AS ENUM ( @@ -485,10 +431,8 @@ CREATE TYPE public.tipo_evento_agenda AS ENUM ( ); -ALTER TYPE public.tipo_evento_agenda OWNER TO supabase_admin; - -- --- Name: tipo_excecao_agenda; Type: TYPE; Schema: public; Owner: supabase_admin +-- Name: tipo_excecao_agenda; Type: TYPE; Schema: public; Owner: - -- CREATE TYPE public.tipo_excecao_agenda AS ENUM ( @@ -497,10 +441,8 @@ CREATE TYPE public.tipo_excecao_agenda AS ENUM ( ); -ALTER TYPE public.tipo_excecao_agenda OWNER TO supabase_admin; - -- --- Name: action; Type: TYPE; Schema: realtime; Owner: supabase_admin +-- Name: action; Type: TYPE; Schema: realtime; Owner: - -- CREATE TYPE realtime.action AS ENUM ( @@ -512,10 +454,8 @@ CREATE TYPE realtime.action AS ENUM ( ); -ALTER TYPE realtime.action OWNER TO supabase_admin; - -- --- Name: equality_op; Type: TYPE; Schema: realtime; Owner: supabase_admin +-- Name: equality_op; Type: TYPE; Schema: realtime; Owner: - -- CREATE TYPE realtime.equality_op AS ENUM ( @@ -529,10 +469,8 @@ CREATE TYPE realtime.equality_op AS ENUM ( ); -ALTER TYPE realtime.equality_op OWNER TO supabase_admin; - -- --- Name: user_defined_filter; Type: TYPE; Schema: realtime; Owner: supabase_admin +-- Name: user_defined_filter; Type: TYPE; Schema: realtime; Owner: - -- CREATE TYPE realtime.user_defined_filter AS ( @@ -542,10 +480,8 @@ CREATE TYPE realtime.user_defined_filter AS ( ); -ALTER TYPE realtime.user_defined_filter OWNER TO supabase_admin; - -- --- Name: wal_column; Type: TYPE; Schema: realtime; Owner: supabase_admin +-- Name: wal_column; Type: TYPE; Schema: realtime; Owner: - -- CREATE TYPE realtime.wal_column AS ( @@ -558,10 +494,8 @@ CREATE TYPE realtime.wal_column AS ( ); -ALTER TYPE realtime.wal_column OWNER TO supabase_admin; - -- --- Name: wal_rls; Type: TYPE; Schema: realtime; Owner: supabase_admin +-- Name: wal_rls; Type: TYPE; Schema: realtime; Owner: - -- CREATE TYPE realtime.wal_rls AS ( @@ -572,10 +506,8 @@ CREATE TYPE realtime.wal_rls AS ( ); -ALTER TYPE realtime.wal_rls OWNER TO supabase_admin; - -- --- Name: buckettype; Type: TYPE; Schema: storage; Owner: supabase_storage_admin +-- Name: buckettype; Type: TYPE; Schema: storage; Owner: - -- CREATE TYPE storage.buckettype AS ENUM ( @@ -585,10 +517,8 @@ CREATE TYPE storage.buckettype AS ENUM ( ); -ALTER TYPE storage.buckettype OWNER TO supabase_storage_admin; - -- --- Name: email(); Type: FUNCTION; Schema: auth; Owner: supabase_auth_admin +-- Name: email(); Type: FUNCTION; Schema: auth; Owner: - -- CREATE FUNCTION auth.email() RETURNS text @@ -602,17 +532,15 @@ CREATE FUNCTION auth.email() RETURNS text $$; -ALTER FUNCTION auth.email() OWNER TO supabase_auth_admin; - -- --- Name: FUNCTION email(); Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: FUNCTION email(); Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON FUNCTION auth.email() IS 'Deprecated. Use auth.jwt() -> ''email'' instead.'; -- --- Name: jwt(); Type: FUNCTION; Schema: auth; Owner: supabase_auth_admin +-- Name: jwt(); Type: FUNCTION; Schema: auth; Owner: - -- CREATE FUNCTION auth.jwt() RETURNS jsonb @@ -626,10 +554,8 @@ CREATE FUNCTION auth.jwt() RETURNS jsonb $$; -ALTER FUNCTION auth.jwt() OWNER TO supabase_auth_admin; - -- --- Name: role(); Type: FUNCTION; Schema: auth; Owner: supabase_auth_admin +-- Name: role(); Type: FUNCTION; Schema: auth; Owner: - -- CREATE FUNCTION auth.role() RETURNS text @@ -643,17 +569,15 @@ CREATE FUNCTION auth.role() RETURNS text $$; -ALTER FUNCTION auth.role() OWNER TO supabase_auth_admin; - -- --- Name: FUNCTION role(); Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: FUNCTION role(); Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON FUNCTION auth.role() IS 'Deprecated. Use auth.jwt() -> ''role'' instead.'; -- --- Name: uid(); Type: FUNCTION; Schema: auth; Owner: supabase_auth_admin +-- Name: uid(); Type: FUNCTION; Schema: auth; Owner: - -- CREATE FUNCTION auth.uid() RETURNS uuid @@ -667,17 +591,15 @@ CREATE FUNCTION auth.uid() RETURNS uuid $$; -ALTER FUNCTION auth.uid() OWNER TO supabase_auth_admin; - -- --- Name: FUNCTION uid(); Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: FUNCTION uid(); Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON FUNCTION auth.uid() IS 'Deprecated. Use auth.jwt() -> ''sub'' instead.'; -- --- Name: grant_pg_cron_access(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin +-- Name: grant_pg_cron_access(); Type: FUNCTION; Schema: extensions; Owner: - -- CREATE FUNCTION extensions.grant_pg_cron_access() RETURNS event_trigger @@ -713,17 +635,15 @@ END; $$; -ALTER FUNCTION extensions.grant_pg_cron_access() OWNER TO supabase_admin; - -- --- Name: FUNCTION grant_pg_cron_access(); Type: COMMENT; Schema: extensions; Owner: supabase_admin +-- Name: FUNCTION grant_pg_cron_access(); Type: COMMENT; Schema: extensions; Owner: - -- COMMENT ON FUNCTION extensions.grant_pg_cron_access() IS 'Grants access to pg_cron'; -- --- Name: grant_pg_graphql_access(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin +-- Name: grant_pg_graphql_access(); Type: FUNCTION; Schema: extensions; Owner: - -- CREATE FUNCTION extensions.grant_pg_graphql_access() RETURNS event_trigger @@ -780,17 +700,15 @@ END; $_$; -ALTER FUNCTION extensions.grant_pg_graphql_access() OWNER TO supabase_admin; - -- --- Name: FUNCTION grant_pg_graphql_access(); Type: COMMENT; Schema: extensions; Owner: supabase_admin +-- Name: FUNCTION grant_pg_graphql_access(); Type: COMMENT; Schema: extensions; Owner: - -- COMMENT ON FUNCTION extensions.grant_pg_graphql_access() IS 'Grants access to pg_graphql'; -- --- Name: grant_pg_net_access(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin +-- Name: grant_pg_net_access(); Type: FUNCTION; Schema: extensions; Owner: - -- CREATE FUNCTION extensions.grant_pg_net_access() RETURNS event_trigger @@ -823,17 +741,15 @@ END; $$; -ALTER FUNCTION extensions.grant_pg_net_access() OWNER TO supabase_admin; - -- --- Name: FUNCTION grant_pg_net_access(); Type: COMMENT; Schema: extensions; Owner: supabase_admin +-- Name: FUNCTION grant_pg_net_access(); Type: COMMENT; Schema: extensions; Owner: - -- COMMENT ON FUNCTION extensions.grant_pg_net_access() IS 'Grants access to pg_net'; -- --- Name: pgrst_ddl_watch(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin +-- Name: pgrst_ddl_watch(); Type: FUNCTION; Schema: extensions; Owner: - -- CREATE FUNCTION extensions.pgrst_ddl_watch() RETURNS event_trigger @@ -865,10 +781,8 @@ BEGIN END; $$; -ALTER FUNCTION extensions.pgrst_ddl_watch() OWNER TO supabase_admin; - -- --- Name: pgrst_drop_watch(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin +-- Name: pgrst_drop_watch(); Type: FUNCTION; Schema: extensions; Owner: - -- CREATE FUNCTION extensions.pgrst_drop_watch() RETURNS event_trigger @@ -898,10 +812,8 @@ BEGIN END; $$; -ALTER FUNCTION extensions.pgrst_drop_watch() OWNER TO supabase_admin; - -- --- Name: set_graphql_placeholder(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin +-- Name: set_graphql_placeholder(); Type: FUNCTION; Schema: extensions; Owner: - -- CREATE FUNCTION extensions.set_graphql_placeholder() RETURNS event_trigger @@ -957,17 +869,15 @@ CREATE FUNCTION extensions.set_graphql_placeholder() RETURNS event_trigger $_$; -ALTER FUNCTION extensions.set_graphql_placeholder() OWNER TO supabase_admin; - -- --- Name: FUNCTION set_graphql_placeholder(); Type: COMMENT; Schema: extensions; Owner: supabase_admin +-- Name: FUNCTION set_graphql_placeholder(); Type: COMMENT; Schema: extensions; Owner: - -- COMMENT ON FUNCTION extensions.set_graphql_placeholder() IS 'Reintroduces placeholder function for graphql_public.graphql'; -- --- Name: get_auth(text); Type: FUNCTION; Schema: pgbouncer; Owner: supabase_admin +-- Name: get_auth(text); Type: FUNCTION; Schema: pgbouncer; Owner: - -- CREATE FUNCTION pgbouncer.get_auth(p_usename text) RETURNS TABLE(username text, password text) @@ -990,10 +900,8 @@ end; $_$; -ALTER FUNCTION pgbouncer.get_auth(p_usename text) OWNER TO supabase_admin; - -- --- Name: __rls_ping(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: __rls_ping(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.__rls_ping() RETURNS text @@ -1003,14 +911,12 @@ CREATE FUNCTION public.__rls_ping() RETURNS text $$; -ALTER FUNCTION public.__rls_ping() OWNER TO supabase_admin; - SET default_tablespace = ''; SET default_table_access_method = heap; -- --- Name: subscriptions; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: subscriptions; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.subscriptions ( @@ -1045,10 +951,8 @@ CREATE TABLE public.subscriptions ( ); -ALTER TABLE public.subscriptions OWNER TO supabase_admin; - -- --- Name: activate_subscription_from_intent(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: activate_subscription_from_intent(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) RETURNS public.subscriptions @@ -1062,13 +966,13 @@ declare v_plan_id uuid; v_target text; begin - -- lê pela VIEW unificada + -- l?? pela VIEW unificada select * into v_intent from public.subscription_intents where id = p_intent_id; if not found then - raise exception 'Intent não encontrado: %', p_intent_id; + raise exception 'Intent n??o encontrado: %', p_intent_id; end if; if v_intent.status <> 'paid' then @@ -1083,14 +987,14 @@ begin limit 1; if v_plan_id is null then - raise exception 'Plano não encontrado em plans.key = %', v_intent.plan_key; + raise exception 'Plano n??o encontrado em plans.key = %', v_intent.plan_key; end if; v_target := lower(coalesce(v_target, '')); - -- ✅ supervisor adicionado + -- ??? supervisor adicionado if v_target not in ('clinic', 'therapist', 'supervisor') then - raise exception 'Target inválido em plans.target: %', v_target; + raise exception 'Target inv??lido em plans.target: %', v_target; end if; -- regra por target @@ -1107,7 +1011,7 @@ begin end if; if v_target in ('therapist', 'supervisor') and v_user_id is null then - raise exception 'Não foi possível determinar user_id para assinatura %.', v_target; + raise exception 'N??o foi poss??vel determinar user_id para assinatura %.', v_target; end if; -- cancela assinatura ativa anterior @@ -1129,7 +1033,7 @@ begin and tenant_id is null; end if; - -- duração do plano (30 dias para mensal) + -- dura????o do plano (30 dias para mensal) v_days := case when lower(coalesce(v_intent.interval, 'month')) = 'year' then 365 else 30 @@ -1168,7 +1072,7 @@ begin ) returning * into v_sub; - -- grava vínculo intent → subscription + -- grava v??nculo intent ??? subscription if v_target = 'clinic' then update public.subscription_intents_tenant set subscription_id = v_sub.id @@ -1184,13 +1088,11 @@ end; $$; -ALTER FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) OWNER TO supabase_admin; - -- --- Name: admin_credit_addon(uuid, text, integer, uuid, text, text, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: admin_credit_addon(uuid, text, integer, uuid, text, text, integer); Type: FUNCTION; Schema: public; Owner: - -- -CREATE FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Crédito manual'::text, p_payment_method text DEFAULT 'manual'::text, p_price_cents integer DEFAULT 0) RETURNS jsonb +CREATE FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Cr??dito manual'::text, p_payment_method text DEFAULT 'manual'::text, p_price_cents integer DEFAULT 0) RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER SET search_path TO 'public' AS $$ @@ -1222,7 +1124,7 @@ BEGIN updated_at = now() WHERE id = v_credit.id; - -- Registra transação + -- Registra transa????o INSERT INTO addon_transactions ( tenant_id, addon_type, type, amount, balance_before, balance_after, @@ -1246,17 +1148,15 @@ END; $$; -ALTER FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) OWNER TO supabase_admin; - -- --- Name: FUNCTION admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer); Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) IS 'Admin adiciona créditos de add-on a um tenant. Cria registro se não existir.'; +COMMENT ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) IS 'Admin adiciona cr??ditos de add-on a um tenant. Cria registro se n??o existir.'; -- --- Name: admin_delete_email_template_global(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: admin_delete_email_template_global(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.admin_delete_email_template_global(p_id uuid) RETURNS boolean @@ -1266,17 +1166,15 @@ CREATE FUNCTION public.admin_delete_email_template_global(p_id uuid) RETURNS boo BEGIN DELETE FROM public.email_templates_global WHERE id = p_id; IF NOT FOUND THEN - RAISE EXCEPTION 'Template com id % não encontrado', p_id; + RAISE EXCEPTION 'Template com id % n??o encontrado', p_id; END IF; RETURN true; END; $$; -ALTER FUNCTION public.admin_delete_email_template_global(p_id uuid) OWNER TO supabase_admin; - -- --- Name: admin_fix_plan_target(text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: admin_fix_plan_target(text, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) RETURNS void @@ -1285,9 +1183,9 @@ CREATE FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) declare v_plan_id uuid; begin - -- (opcional) restringe targets válidos + -- (opcional) restringe targets v??lidos if p_new_target not in ('clinic','therapist') then - raise exception 'Target inválido: %', p_new_target using errcode='P0001'; + raise exception 'Target inv??lido: %', p_new_target using errcode='P0001'; end if; -- trava o plano @@ -1297,15 +1195,15 @@ begin for update; if v_plan_id is null then - raise exception 'Plano não encontrado: %', p_plan_key using errcode='P0001'; + raise exception 'Plano n??o encontrado: %', p_plan_key using errcode='P0001'; end if; - -- segurança: não mexer se existe subscription + -- seguran??a: n??o mexer se existe subscription if exists (select 1 from public.subscriptions s where s.plan_id = v_plan_id) then - raise exception 'Plano % possui subscriptions. Migração bloqueada.', p_plan_key using errcode='P0001'; + raise exception 'Plano % possui subscriptions. Migra????o bloqueada.', p_plan_key using errcode='P0001'; end if; - -- liga bypass SOMENTE nesta transação + -- liga bypass SOMENTE nesta transa????o perform set_config('app.plan_migration_bypass', '1', true); update public.plans @@ -1316,10 +1214,8 @@ end $$; -ALTER FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) OWNER TO supabase_admin; - -- --- Name: admin_upsert_email_template_global(uuid, text, text, text, text, text, text, boolean, jsonb); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: admin_upsert_email_template_global(uuid, text, text, text, text, text, text, boolean, jsonb); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.admin_upsert_email_template_global(p_id uuid DEFAULT NULL::uuid, p_key text DEFAULT NULL::text, p_domain text DEFAULT NULL::text, p_channel text DEFAULT 'email'::text, p_subject text DEFAULT NULL::text, p_body_html text DEFAULT NULL::text, p_body_text text DEFAULT NULL::text, p_is_active boolean DEFAULT true, p_variables jsonb DEFAULT '{}'::jsonb) RETURNS jsonb @@ -1344,7 +1240,7 @@ BEGIN RETURNING to_jsonb(email_templates_global.*) INTO v_result; IF v_result IS NULL THEN - RAISE EXCEPTION 'Template com id % não encontrado', p_id; + RAISE EXCEPTION 'Template com id % n??o encontrado', p_id; END IF; RETURN v_result; @@ -1352,7 +1248,7 @@ BEGIN -- INSERT novo IF p_key IS NULL OR p_domain IS NULL OR p_subject IS NULL OR p_body_html IS NULL THEN - RAISE EXCEPTION 'key, domain, subject e body_html são obrigatórios para novo template'; + RAISE EXCEPTION 'key, domain, subject e body_html s??o obrigat??rios para novo template'; END IF; INSERT INTO public.email_templates_global (key, domain, channel, subject, body_html, body_text, is_active, variables) @@ -1364,10 +1260,8 @@ END; $$; -ALTER FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) OWNER TO supabase_admin; - -- --- Name: agenda_cfg_sync(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: agenda_cfg_sync(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.agenda_cfg_sync() RETURNS trigger @@ -1387,10 +1281,8 @@ end; $$; -ALTER FUNCTION public.agenda_cfg_sync() OWNER TO supabase_admin; - -- --- Name: agendador_dias_disponiveis(text, integer, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: agendador_dias_disponiveis(text, integer, integer); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) RETURNS TABLE(data date, tem_slots boolean) @@ -1424,7 +1316,7 @@ BEGIN WHILE v_data <= v_data_fim LOOP v_db_dow := extract(dow from v_data::timestamp)::int; - -- ── Dia inteiro bloqueado? (agenda_bloqueios) ───────────────────────── + -- ?????? Dia inteiro bloqueado? (agenda_bloqueios) ??????????????????????????????????????????????????????????????????????????? SELECT EXISTS ( SELECT 1 FROM public.agenda_bloqueios b WHERE b.owner_id = v_owner_id @@ -1442,7 +1334,7 @@ BEGIN CONTINUE; END IF; - -- ── Tem slots disponíveis no dia? ───────────────────────────────────── + -- ?????? Tem slots dispon??veis no dia? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????? SELECT EXISTS ( SELECT 1 FROM public.agenda_online_slots s WHERE s.owner_id = v_owner_id @@ -1465,10 +1357,8 @@ END; $$; -ALTER FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) OWNER TO supabase_admin; - -- --- Name: agendador_gerar_slug(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: agendador_gerar_slug(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.agendador_gerar_slug() RETURNS trigger @@ -1478,7 +1368,7 @@ DECLARE v_slug text; v_exists boolean; BEGIN - -- só gera se ativou e não tem slug ainda + -- s?? gera se ativou e n??o tem slug ainda IF NEW.ativo = true AND (NEW.link_slug IS NULL OR NEW.link_slug = '') THEN LOOP v_slug := lower(substring(replace(gen_random_uuid()::text, '-', ''), 1, 8)); @@ -1495,10 +1385,8 @@ END; $$; -ALTER FUNCTION public.agendador_gerar_slug() OWNER TO supabase_admin; - -- --- Name: agendador_slots_disponiveis(text, date); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: agendador_slots_disponiveis(text, date); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) RETURNS TABLE(hora time without time zone, disponivel boolean) @@ -1515,7 +1403,7 @@ DECLARE v_slot_fim time; v_slot_ts timestamptz; v_ocupado boolean; - -- loop de recorrências + -- loop de recorr??ncias v_rule RECORD; v_rule_start_dow int; v_first_occ date; @@ -1533,8 +1421,8 @@ BEGIN v_agora := now(); v_db_dow := extract(dow from p_data::timestamp)::int; - -- ── Dia inteiro bloqueado? (agenda_bloqueios sem hora) ─────────────────── - -- Se sim, não há nenhum slot disponível — retorna vazio. + -- ?????? Dia inteiro bloqueado? (agenda_bloqueios sem hora) ????????????????????????????????????????????????????????? + -- Se sim, n??o h?? nenhum slot dispon??vel ??? retorna vazio. IF EXISTS ( SELECT 1 FROM public.agenda_bloqueios b WHERE b.owner_id = v_owner_id @@ -1560,14 +1448,14 @@ BEGIN v_slot_fim := v_slot + (v_duracao || ' minutes')::interval; v_ocupado := false; - -- ── Antecedência mínima ────────────────────────────────────────────────── + -- ?????? Anteced??ncia m??nima ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? v_slot_ts := (p_data::text || ' ' || v_slot::text)::timestamp AT TIME ZONE 'America/Sao_Paulo'; IF v_slot_ts < v_agora + (v_antecedencia || ' hours')::interval THEN v_ocupado := true; END IF; - -- ── Bloqueio de horário específico (agenda_bloqueios com hora) ─────────── + -- ?????? Bloqueio de hor??rio espec??fico (agenda_bloqueios com hora) ????????????????????????????????? IF NOT v_ocupado THEN SELECT EXISTS ( SELECT 1 FROM public.agenda_bloqueios b @@ -1584,7 +1472,7 @@ BEGIN ) INTO v_ocupado; END IF; - -- ── Eventos avulsos internos (agenda_eventos) ──────────────────────────── + -- ?????? Eventos avulsos internos (agenda_eventos) ???????????????????????????????????????????????????????????????????????????????????? IF NOT v_ocupado THEN SELECT EXISTS ( SELECT 1 FROM public.agenda_eventos e @@ -1596,7 +1484,7 @@ BEGIN ) INTO v_ocupado; END IF; - -- ── Recorrências ativas (recurrence_rules) ─────────────────────────────── + -- ?????? Recorr??ncias ativas (recurrence_rules) ????????????????????????????????????????????????????????????????????????????????????????????? IF NOT v_ocupado THEN FOR v_rule IN SELECT @@ -1640,7 +1528,7 @@ BEGIN END LOOP; END IF; - -- ── Recorrências remarcadas para este dia ──────────────────────────────── + -- ?????? Recorr??ncias remarcadas para este dia ???????????????????????????????????????????????????????????????????????????????????????????????? IF NOT v_ocupado THEN SELECT EXISTS ( SELECT 1 @@ -1655,7 +1543,7 @@ BEGIN ) INTO v_ocupado; END IF; - -- ── Solicitações públicas pendentes ────────────────────────────────────── + -- ?????? Solicita????es p??blicas pendentes ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? IF NOT v_ocupado THEN SELECT EXISTS ( SELECT 1 FROM public.agendador_solicitacoes sol @@ -1675,10 +1563,8 @@ END; $$; -ALTER FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) OWNER TO supabase_admin; - -- --- Name: auto_create_financial_record_from_session(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: auto_create_financial_record_from_session(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.auto_create_financial_record_from_session() RETURNS trigger @@ -1690,40 +1576,40 @@ DECLARE v_services_total NUMERIC(10,2); v_already_billed BOOLEAN; BEGIN - -- ── Guards de saída rápida ────────────────────────────────────────────── + -- ?????? Guards de sa??da r??pida ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? - -- Só processa quando o status muda PARA 'realizado' + -- S?? processa quando o status muda PARA 'realizado' IF NEW.status::TEXT <> 'realizado' THEN RETURN NEW; END IF; - -- Só processa quando houve mudança real de status + -- S?? processa quando houve mudan??a real de status IF OLD.status IS NOT DISTINCT FROM NEW.status THEN RETURN NEW; END IF; - -- Só sessões (não bloqueios, feriados, etc.) + -- S?? sess??es (n??o bloqueios, feriados, etc.) IF NEW.tipo::TEXT <> 'sessao' THEN RETURN NEW; END IF; - -- Paciente obrigatório para vincular a cobrança + -- Paciente obrigat??rio para vincular a cobran??a IF NEW.patient_id IS NULL THEN RETURN NEW; END IF; - -- Sessões de pacote têm cobrança gerenciada por billing_contract + -- Sess??es de pacote t??m cobran??a gerenciada por billing_contract IF NEW.billing_contract_id IS NOT NULL THEN RETURN NEW; END IF; - -- Idempotência: já existe financial_record para este evento? + -- Idempot??ncia: j?? existe financial_record para este evento? SELECT billed INTO v_already_billed FROM public.agenda_eventos WHERE id = NEW.id; IF v_already_billed = TRUE THEN - -- Confirma no financial_records também (dupla verificação) + -- Confirma no financial_records tamb??m (dupla verifica????o) IF EXISTS ( SELECT 1 FROM public.financial_records WHERE agenda_evento_id = NEW.id AND deleted_at IS NULL @@ -1732,11 +1618,11 @@ BEGIN END IF; END IF; - -- ── Busca do preço ────────────────────────────────────────────────────── + -- ?????? Busca do pre??o ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? v_price := NULL; - -- Prioridade 1: soma dos serviços da regra de recorrência + -- Prioridade 1: soma dos servi??os da regra de recorr??ncia IF NEW.recurrence_id IS NOT NULL THEN SELECT COALESCE(SUM(rrs.final_price), 0) INTO v_services_total @@ -1747,7 +1633,7 @@ BEGIN v_price := v_services_total; END IF; - -- Prioridade 2: price direto da regra (fallback se sem serviços) + -- Prioridade 2: price direto da regra (fallback se sem servi??os) IF v_price IS NULL OR v_price = 0 THEN SELECT price INTO v_price FROM public.recurrence_rules @@ -1755,17 +1641,17 @@ BEGIN END IF; END IF; - -- Prioridade 3: price do próprio evento de agenda + -- Prioridade 3: price do pr??prio evento de agenda IF v_price IS NULL OR v_price = 0 THEN v_price := NEW.price; END IF; - -- Sem preço → não criar registro (não é erro, apenas skip silencioso) + -- Sem pre??o ??? n??o criar registro (n??o ?? erro, apenas skip silencioso) IF v_price IS NULL OR v_price <= 0 THEN RETURN NEW; END IF; - -- ── Criação do financial_record ───────────────────────────────────────── + -- ?????? Cria????o do financial_record ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? INSERT INTO public.financial_records ( owner_id, @@ -1780,7 +1666,7 @@ BEGIN clinic_fee_amount, status, due_date - -- payment_method: NULL até o momento do pagamento (mark_as_paid preenche) + -- payment_method: NULL at?? o momento do pagamento (mark_as_paid preenche) ) VALUES ( NEW.owner_id, NEW.tenant_id, @@ -1790,14 +1676,14 @@ BEGIN v_price, 0, v_price, - 0, -- clinic_fee_pct: sem campo de configuração global no schema atual. + 0, -- clinic_fee_pct: sem campo de configura????o global no schema atual. 0, -- clinic_fee_amount: calculado manualmente ou via update posterior. 'pending', - (NEW.inicio_em::DATE + 7) -- vencimento padrão: 7 dias após a sessão + (NEW.inicio_em::DATE + 7) -- vencimento padr??o: 7 dias ap??s a sess??o ); - -- ── Marca sessão como billed ──────────────────────────────────────────── - -- UPDATE em billed (não em status) → não re-dispara este trigger + -- ?????? Marca sess??o como billed ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + -- UPDATE em billed (n??o em status) ??? n??o re-dispara este trigger UPDATE public.agenda_eventos SET billed = TRUE WHERE id = NEW.id; @@ -1814,17 +1700,15 @@ END; $$; -ALTER FUNCTION public.auto_create_financial_record_from_session() OWNER TO supabase_admin; - -- --- Name: FUNCTION auto_create_financial_record_from_session(); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION auto_create_financial_record_from_session(); Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON FUNCTION public.auto_create_financial_record_from_session() IS 'Trigger que cria automaticamente um financial_record (receita, pending) quando uma sessão de agenda é marcada como realizada. Prioridade de preço: recurrence_rule_services > recurrence_rules.price > agenda_eventos.price. Skip silencioso se sem preço, pacote ou registro já existente.'; +COMMENT ON FUNCTION public.auto_create_financial_record_from_session() IS 'Trigger que cria automaticamente um financial_record (receita, pending) quando uma sess??o de agenda ?? marcada como realizada. Prioridade de pre??o: recurrence_rule_services > recurrence_rules.price > agenda_eventos.price. Skip silencioso se sem pre??o, pacote ou registro j?? existente.'; -- --- Name: can_delete_patient(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: can_delete_patient(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.can_delete_patient(p_patient_id uuid) RETURNS boolean @@ -1840,10 +1724,8 @@ CREATE FUNCTION public.can_delete_patient(p_patient_id uuid) RETURNS boolean $$; -ALTER FUNCTION public.can_delete_patient(p_patient_id uuid) OWNER TO supabase_admin; - -- --- Name: cancel_notifications_on_opt_out(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: cancel_notifications_on_opt_out(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.cancel_notifications_on_opt_out() RETURNS trigger @@ -1873,10 +1755,8 @@ END; $$; -ALTER FUNCTION public.cancel_notifications_on_opt_out() OWNER TO supabase_admin; - -- --- Name: cancel_notifications_on_session_cancel(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: cancel_notifications_on_session_cancel(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.cancel_notifications_on_session_cancel() RETURNS trigger @@ -1895,10 +1775,8 @@ END; $$; -ALTER FUNCTION public.cancel_notifications_on_session_cancel() OWNER TO supabase_admin; - -- --- Name: cancel_patient_pending_notifications(uuid, text, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: cancel_patient_pending_notifications(uuid, text, uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text DEFAULT NULL::text, p_evento_id uuid DEFAULT NULL::uuid) RETURNS integer @@ -1921,10 +1799,8 @@ END; $$; -ALTER FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) OWNER TO supabase_admin; - -- --- Name: cancel_recurrence_from(uuid, date); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: cancel_recurrence_from(uuid, date); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) RETURNS void @@ -1946,10 +1822,8 @@ END; $$; -ALTER FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) OWNER TO supabase_admin; - -- --- Name: cancel_subscription(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: cancel_subscription(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.cancel_subscription(p_subscription_id uuid) RETURNS public.subscriptions @@ -1968,7 +1842,7 @@ begin for update; if not found then - raise exception 'Subscription não encontrada'; + raise exception 'Subscription n??o encontrada'; end if; if v_sub.status = 'canceled' then @@ -2033,10 +1907,8 @@ end; $$; -ALTER FUNCTION public.cancel_subscription(p_subscription_id uuid) OWNER TO supabase_admin; - -- --- Name: cancelar_eventos_serie(uuid, timestamp with time zone); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: cancelar_eventos_serie(uuid, timestamp with time zone); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone DEFAULT now()) RETURNS integer @@ -2058,18 +1930,16 @@ END; $$; -ALTER FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) OWNER TO supabase_admin; - -- --- Name: FUNCTION cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone); Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) IS 'Cancela todos os eventos futuros de uma série a partir de p_a_partir_de (inclusive). - Não cancela eventos já realizados.'; +COMMENT ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) IS 'Cancela todos os eventos futuros de uma s??rie a partir de p_a_partir_de (inclusive). + N??o cancela eventos j?? realizados.'; -- --- Name: change_subscription_plan(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: change_subscription_plan(uuid, uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) RETURNS public.subscriptions @@ -2093,7 +1963,7 @@ begin for update; if not found then - raise exception 'Subscription não encontrada'; + raise exception 'Subscription n??o encontrada'; end if; v_old_plan := v_sub.plan_id; @@ -2108,7 +1978,7 @@ begin where id = p_new_plan_id; if v_new_key is null then - raise exception 'Plano não encontrado'; + raise exception 'Plano n??o encontrado'; end if; v_new_target := lower(coalesce(v_new_target, '')); @@ -2119,7 +1989,7 @@ begin end; if v_new_target <> v_sub_target then - raise exception 'Plano inválido para este tipo de assinatura. Assinatura é % e o plano é %.', + raise exception 'Plano inv??lido para este tipo de assinatura. Assinatura ?? % e o plano ?? %.', v_sub_target, v_new_target using errcode = 'P0001'; end if; @@ -2186,10 +2056,8 @@ end; $$; -ALTER FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) OWNER TO supabase_admin; - -- --- Name: cleanup_notification_queue(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: cleanup_notification_queue(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.cleanup_notification_queue() RETURNS integer @@ -2208,10 +2076,8 @@ END; $$; -ALTER FUNCTION public.cleanup_notification_queue() OWNER TO supabase_admin; - -- --- Name: create_clinic_tenant(text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: create_clinic_tenant(text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.create_clinic_tenant(p_name text) RETURNS uuid @@ -2229,7 +2095,7 @@ begin v_name := nullif(trim(coalesce(p_name, '')), ''); if v_name is null then - v_name := 'Clínica'; + v_name := 'Cl??nica'; end if; insert into public.tenants (name, kind, created_at) @@ -2244,10 +2110,8 @@ end; $$; -ALTER FUNCTION public.create_clinic_tenant(p_name text) OWNER TO supabase_admin; - -- --- Name: financial_records; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: financial_records; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.financial_records ( @@ -2289,10 +2153,8 @@ CREATE TABLE public.financial_records ( ); -ALTER TABLE public.financial_records OWNER TO supabase_admin; - -- --- Name: create_financial_record_for_session(uuid, uuid, uuid, uuid, numeric, date); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: create_financial_record_for_session(uuid, uuid, uuid, uuid, numeric, date); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) RETURNS SETOF public.financial_records @@ -2303,7 +2165,7 @@ DECLARE v_existing public.financial_records%ROWTYPE; v_new public.financial_records%ROWTYPE; BEGIN - -- Idempotência: retorna o registro existente se já foi criado + -- Idempot??ncia: retorna o registro existente se j?? foi criado SELECT * INTO v_existing FROM public.financial_records WHERE agenda_evento_id = p_agenda_evento_id @@ -2349,10 +2211,8 @@ END; $$; -ALTER FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) OWNER TO supabase_admin; - -- --- Name: create_patient_intake_request(text, text, text, text, text, boolean); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: create_patient_intake_request(text, text, text, text, text, boolean); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text DEFAULT NULL::text, p_phone text DEFAULT NULL::text, p_notes text DEFAULT NULL::text, p_consent boolean DEFAULT false) RETURNS uuid @@ -2374,7 +2234,7 @@ begin limit 1; if v_owner is null then - raise exception 'Token inválido'; + raise exception 'Token inv??lido'; end if; if v_active is not true then @@ -2390,7 +2250,7 @@ begin end if; if p_name is null or length(trim(p_name)) = 0 then - raise exception 'Nome é obrigatório'; + raise exception 'Nome ?? obrigat??rio'; end if; insert into public.patient_intake_requests @@ -2413,10 +2273,8 @@ end; $$; -ALTER FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) OWNER TO supabase_admin; - -- --- Name: create_patient_intake_request_v2(text, jsonb); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: create_patient_intake_request_v2(text, jsonb); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) RETURNS uuid @@ -2435,7 +2293,7 @@ begin where token = p_token; if v_owner_id is null then - raise exception 'Token inválido ou expirado'; + raise exception 'Token inv??lido ou expirado'; end if; v_birth_raw := nullif(trim(coalesce( @@ -2460,7 +2318,7 @@ begin email_principal, telefone, - avatar_url, -- 🔥 AQUI + avatar_url, -- ???? AQUI data_nascimento, cpf, @@ -2497,7 +2355,7 @@ begin nullif(trim(p_payload->>'email_principal'), ''), nullif(regexp_replace(coalesce(p_payload->>'telefone',''), '\D', '', 'g'), ''), - nullif(trim(p_payload->>'avatar_url'), ''), -- 🔥 AQUI + nullif(trim(p_payload->>'avatar_url'), ''), -- ???? AQUI v_birth, nullif(regexp_replace(coalesce(p_payload->>'cpf',''), '\D', '', 'g'), ''), @@ -2531,10 +2389,8 @@ end; $_$; -ALTER FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) OWNER TO supabase_admin; - -- --- Name: create_support_session(uuid, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: create_support_session(uuid, integer); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer DEFAULT 60) RETURNS json @@ -2548,10 +2404,10 @@ DECLARE v_expires timestamp with time zone; v_session support_sessions; BEGIN - -- Verifica autenticação + -- Verifica autentica????o v_admin_id := auth.uid(); IF v_admin_id IS NULL THEN - RAISE EXCEPTION 'Não autenticado.' USING ERRCODE = 'P0001'; + RAISE EXCEPTION 'N??o autenticado.' USING ERRCODE = 'P0001'; END IF; -- Verifica role saas_admin @@ -2560,27 +2416,27 @@ BEGIN WHERE id = v_admin_id; IF v_role <> 'saas_admin' THEN - RAISE EXCEPTION 'Acesso negado. Somente saas_admin pode criar sessões de suporte.' + RAISE EXCEPTION 'Acesso negado. Somente saas_admin pode criar sess??es de suporte.' USING ERRCODE = 'P0002'; END IF; -- Valida TTL (1 a 120 minutos) IF p_ttl_minutes < 1 OR p_ttl_minutes > 120 THEN - RAISE EXCEPTION 'TTL inválido. Use entre 1 e 120 minutos.' + RAISE EXCEPTION 'TTL inv??lido. Use entre 1 e 120 minutos.' USING ERRCODE = 'P0003'; END IF; -- Valida tenant IF NOT EXISTS (SELECT 1 FROM public.tenants WHERE id = p_tenant_id) THEN - RAISE EXCEPTION 'Tenant não encontrado.' + RAISE EXCEPTION 'Tenant n??o encontrado.' USING ERRCODE = 'P0004'; END IF; - -- Gera token único (64 chars hex, sem pgcrypto) + -- Gera token ??nico (64 chars hex, sem pgcrypto) v_token := replace(gen_random_uuid()::text, '-', '') || replace(gen_random_uuid()::text, '-', ''); v_expires := now() + (p_ttl_minutes || ' minutes')::interval; - -- Insere sessão + -- Insere sess??o INSERT INTO public.support_sessions (tenant_id, admin_id, token, expires_at) VALUES (p_tenant_id, v_admin_id, v_token, v_expires) RETURNING * INTO v_session; @@ -2594,10 +2450,8 @@ END; $$; -ALTER FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) OWNER TO supabase_admin; - -- --- Name: therapist_payouts; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: therapist_payouts; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.therapist_payouts ( @@ -2623,10 +2477,8 @@ CREATE TABLE public.therapist_payouts ( ); -ALTER TABLE public.therapist_payouts OWNER TO supabase_admin; - -- --- Name: create_therapist_payout(uuid, uuid, date, date); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: create_therapist_payout(uuid, uuid, date, date); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) RETURNS public.therapist_payouts @@ -2640,13 +2492,13 @@ DECLARE v_clinic_fee NUMERIC(10,2); v_net NUMERIC(10,2); BEGIN - -- ── Verificação de permissão ──────────────────────────────────────────── - -- Apenas o próprio terapeuta ou o tenant_admin pode criar o repasse + -- ?????? Verifica????o de permiss??o ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + -- Apenas o pr??prio terapeuta ou o tenant_admin pode criar o repasse IF auth.uid() <> p_therapist_id AND NOT public.is_tenant_admin(p_tenant_id) THEN - RAISE EXCEPTION 'Sem permissão para criar repasse para este terapeuta.'; + RAISE EXCEPTION 'Sem permiss??o para criar repasse para este terapeuta.'; END IF; - -- ── Verifica se já existe repasse para o mesmo período ───────────────── + -- ?????? Verifica se j?? existe repasse para o mesmo per??odo ??????????????????????????????????????????????????? IF EXISTS ( SELECT 1 FROM public.therapist_payouts WHERE owner_id = p_therapist_id @@ -2656,13 +2508,13 @@ BEGIN AND status <> 'cancelled' ) THEN RAISE EXCEPTION - 'Já existe um repasse ativo para o período % a % deste terapeuta.', + 'J?? existe um repasse ativo para o per??odo % a % deste terapeuta.', p_period_start, p_period_end; END IF; - -- ── Agrega os financial_records elegíveis ────────────────────────────── - -- Elegíveis: paid, receita, owner=terapeuta, tenant correto, paid_at no período, - -- não soft-deleted, ainda não vinculados a nenhum payout. + -- ?????? Agrega os financial_records eleg??veis ?????????????????????????????????????????????????????????????????????????????????????????? + -- Eleg??veis: paid, receita, owner=terapeuta, tenant correto, paid_at no per??odo, + -- n??o soft-deleted, ainda n??o vinculados a nenhum payout. SELECT COUNT(*) AS total_sessions, COALESCE(SUM(amount), 0) AS gross_amount, @@ -2682,14 +2534,14 @@ BEGIN WHERE tpr.financial_record_id = fr.id ); - -- Sem registros elegíveis → não criar payout vazio + -- Sem registros eleg??veis ??? n??o criar payout vazio IF v_total_sessions = 0 THEN RAISE EXCEPTION - 'Nenhum registro financeiro elegível encontrado para o período % a %.', + 'Nenhum registro financeiro eleg??vel encontrado para o per??odo % a %.', p_period_start, p_period_end; END IF; - -- ── Cria o repasse ───────────────────────────────────────────────────── + -- ?????? Cria o repasse ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? INSERT INTO public.therapist_payouts ( owner_id, tenant_id, @@ -2713,7 +2565,7 @@ BEGIN ) RETURNING * INTO v_payout; - -- ── Vincula os financial_records ao repasse ──────────────────────────── + -- ?????? Vincula os financial_records ao repasse ???????????????????????????????????????????????????????????????????????????????????? INSERT INTO public.therapist_payout_records (payout_id, financial_record_id) SELECT v_payout.id, fr.id FROM public.financial_records fr @@ -2733,17 +2585,15 @@ END; $$; -ALTER FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) OWNER TO supabase_admin; - -- --- Name: FUNCTION create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date); Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) IS 'Cria um repasse para o terapeuta com todos os financial_records paid+receita do período que ainda não estejam vinculados a outro repasse. Lança exceção se não houver registros elegíveis ou se já houver repasse ativo no período.'; +COMMENT ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) IS 'Cria um repasse para o terapeuta com todos os financial_records paid+receita do per??odo que ainda n??o estejam vinculados a outro repasse. Lan??a exce????o se n??o houver registros eleg??veis ou se j?? houver repasse ativo no per??odo.'; -- --- Name: current_member_id(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: current_member_id(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.current_member_id(p_tenant_id uuid) RETURNS uuid @@ -2757,10 +2607,8 @@ CREATE FUNCTION public.current_member_id(p_tenant_id uuid) RETURNS uuid $$; -ALTER FUNCTION public.current_member_id(p_tenant_id uuid) OWNER TO supabase_admin; - -- --- Name: current_member_role(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: current_member_role(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.current_member_role(p_tenant_id uuid) RETURNS text @@ -2774,10 +2622,8 @@ CREATE FUNCTION public.current_member_role(p_tenant_id uuid) RETURNS text $$; -ALTER FUNCTION public.current_member_role(p_tenant_id uuid) OWNER TO supabase_admin; - -- --- Name: debit_addon_credit(uuid, text, uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: debit_addon_credit(uuid, text, uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Consumo'::text) RETURNS jsonb @@ -2804,7 +2650,7 @@ BEGIN RETURN jsonb_build_object('success', false, 'reason', 'insufficient_balance', 'balance', 0); END IF; - -- Verifica rate limit diário + -- Verifica rate limit di??rio IF v_credit.daily_limit IS NOT NULL THEN -- Reset se passou do dia IF v_credit.daily_reset_at IS NULL OR v_credit.daily_reset_at < date_trunc('day', now()) THEN @@ -2817,7 +2663,7 @@ BEGIN END IF; END IF; - -- Verifica rate limit horário + -- Verifica rate limit hor??rio IF v_credit.hourly_limit IS NOT NULL THEN IF v_credit.hourly_reset_at IS NULL OR v_credit.hourly_reset_at < date_trunc('hour', now()) THEN UPDATE addon_credits SET hourly_used = 0, hourly_reset_at = date_trunc('hour', now()) + interval '1 hour' WHERE id = v_credit.id; @@ -2829,7 +2675,7 @@ BEGIN END IF; END IF; - -- Verifica expiração + -- Verifica expira????o IF v_credit.expires_at IS NOT NULL AND v_credit.expires_at < now() THEN RETURN jsonb_build_object('success', false, 'reason', 'credits_expired', 'balance', v_credit.balance); END IF; @@ -2846,7 +2692,7 @@ BEGIN updated_at = now() WHERE id = v_credit.id; - -- Registra transação + -- Registra transa????o INSERT INTO addon_transactions ( tenant_id, addon_type, type, amount, balance_before, balance_after, @@ -2866,17 +2712,15 @@ END; $$; -ALTER FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) OWNER TO supabase_admin; - -- --- Name: FUNCTION debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text); Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) IS 'Debita 1 crédito de add-on. Verifica saldo, rate limits e expiração.'; +COMMENT ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) IS 'Debita 1 cr??dito de add-on. Verifica saldo, rate limits e expira????o.'; -- --- Name: delete_commitment_full(uuid, uuid); Type: FUNCTION; Schema: public; Owner: postgres +-- Name: delete_commitment_full(uuid, uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb @@ -2948,10 +2792,8 @@ end; $$; -ALTER FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) OWNER TO postgres; - -- --- Name: delete_determined_commitment(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: delete_determined_commitment(uuid, uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb @@ -3025,10 +2867,8 @@ end; $$; -ALTER FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) OWNER TO supabase_admin; - -- --- Name: dev_list_auth_users(integer); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: dev_list_auth_users(integer); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.dev_list_auth_users(p_limit integer DEFAULT 50) RETURNS TABLE(id uuid, email text, created_at timestamp with time zone) @@ -3036,7 +2876,7 @@ CREATE FUNCTION public.dev_list_auth_users(p_limit integer DEFAULT 50) RETURNS T SET search_path TO 'public', 'auth' AS $$ begin - -- só saas_admin pode ver + -- s?? saas_admin pode ver if not exists ( select 1 from public.profiles p @@ -3058,10 +2898,8 @@ end; $$; -ALTER FUNCTION public.dev_list_auth_users(p_limit integer) OWNER TO supabase_admin; - -- --- Name: dev_list_custom_users(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: dev_list_custom_users(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.dev_list_custom_users() RETURNS TABLE(user_id uuid, email text, created_at timestamp with time zone, global_role text, tenant_role text, tenant_id uuid, password_dev text, kind text) @@ -3112,10 +2950,8 @@ CREATE FUNCTION public.dev_list_custom_users() RETURNS TABLE(user_id uuid, email $$; -ALTER FUNCTION public.dev_list_custom_users() OWNER TO supabase_admin; - -- --- Name: dev_list_intent_leads(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: dev_list_intent_leads(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.dev_list_intent_leads() RETURNS TABLE(email text, last_intent_at timestamp with time zone, plan_key text, billing_interval text, status text, tenant_id uuid) @@ -3141,10 +2977,8 @@ CREATE FUNCTION public.dev_list_intent_leads() RETURNS TABLE(email text, last_in $$; -ALTER FUNCTION public.dev_list_intent_leads() OWNER TO supabase_admin; - -- --- Name: dev_public_debug_snapshot(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: dev_public_debug_snapshot(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.dev_public_debug_snapshot() RETURNS TABLE(users_total integer, tenants_total integer, intents_new_total integer, latest_intents jsonb) @@ -3183,10 +3017,8 @@ end; $_$; -ALTER FUNCTION public.dev_public_debug_snapshot() OWNER TO supabase_admin; - -- --- Name: ensure_personal_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: ensure_personal_tenant(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.ensure_personal_tenant() RETURNS uuid @@ -3219,10 +3051,8 @@ END; $$; -ALTER FUNCTION public.ensure_personal_tenant() OWNER TO supabase_admin; - -- --- Name: ensure_personal_tenant_for_user(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: ensure_personal_tenant_for_user(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) RETURNS uuid @@ -3240,7 +3070,7 @@ begin raise exception 'Missing user id'; end if; - -- só considera tenant pessoal (kind='saas') + -- s?? considera tenant pessoal (kind='saas') select tm.tenant_id into v_existing from public.tenant_members tm @@ -3273,10 +3103,8 @@ end; $$; -ALTER FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) OWNER TO supabase_admin; - -- --- Name: faq_votar(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: faq_votar(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.faq_votar(faq_id uuid) RETURNS void @@ -3290,10 +3118,8 @@ CREATE FUNCTION public.faq_votar(faq_id uuid) RETURNS void $$; -ALTER FUNCTION public.faq_votar(faq_id uuid) OWNER TO supabase_admin; - -- --- Name: fix_all_subscription_mismatches(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: fix_all_subscription_mismatches(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.fix_all_subscription_mismatches() RETURNS void @@ -3314,10 +3140,8 @@ end; $$; -ALTER FUNCTION public.fix_all_subscription_mismatches() OWNER TO supabase_admin; - -- --- Name: fn_agenda_regras_semanais_no_overlap(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: fn_agenda_regras_semanais_no_overlap(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.fn_agenda_regras_semanais_no_overlap() RETURNS trigger @@ -3339,7 +3163,7 @@ begin and (new.hora_inicio < r.hora_fim and new.hora_fim > r.hora_inicio); if v_count > 0 then - raise exception 'Janela sobreposta: já existe uma regra ativa nesse intervalo.'; + raise exception 'Janela sobreposta: j?? existe uma regra ativa nesse intervalo.'; end if; return new; @@ -3347,10 +3171,81 @@ end; $$; -ALTER FUNCTION public.fn_agenda_regras_semanais_no_overlap() OWNER TO supabase_admin; +-- +-- Name: fn_document_signature_timeline(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.fn_document_signature_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_patient_id uuid; + v_tenant_id uuid; + v_doc_nome text; +BEGIN + IF NEW.status = 'assinado' AND (OLD.status IS NULL OR OLD.status <> 'assinado') THEN + SELECT d.patient_id, d.tenant_id, d.nome_original + INTO v_patient_id, v_tenant_id, v_doc_nome + FROM public.documents d + WHERE d.id = NEW.documento_id; + + IF v_patient_id IS NOT NULL THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, evento_tipo, + titulo, descricao, icone_cor, + link_ref_tipo, link_ref_id, + gerado_por, ocorrido_em + ) VALUES ( + v_patient_id, + v_tenant_id, + 'documento_assinado', + 'Documento assinado: ' || COALESCE(v_doc_nome, 'documento'), + 'Assinado por ' || COALESCE(NEW.signatario_nome, NEW.signatario_tipo), + 'green', + 'documento', + NEW.documento_id, + NEW.signatario_id, + NEW.assinado_em + ); + END IF; + END IF; + RETURN NEW; +END; +$$; + -- --- Name: get_financial_report(uuid, date, date, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: fn_documents_timeline_insert(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.fn_documents_timeline_insert() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, evento_tipo, + titulo, descricao, icone_cor, + link_ref_tipo, link_ref_id, + gerado_por, ocorrido_em + ) VALUES ( + NEW.patient_id, + NEW.tenant_id, + 'documento_adicionado', + 'Documento adicionado: ' || COALESCE(NEW.nome_original, 'arquivo'), + 'Tipo: ' || COALESCE(NEW.tipo_documento, 'outro'), + 'blue', + 'documento', + NEW.id, + NEW.uploaded_by, + NEW.uploaded_at + ); + RETURN NEW; +END; +$$; + + +-- +-- Name: get_financial_report(uuid, date, date, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text DEFAULT 'month'::text) RETURNS TABLE(group_key text, group_label text, total_receitas numeric, total_despesas numeric, saldo numeric, total_pendente numeric, total_overdue numeric, count_records bigint) @@ -3358,9 +3253,9 @@ CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, SET search_path TO 'public' AS $$ - -- ── Valida p_group_by antes de executar ────────────────────────────────── - -- (lança erro se valor inválido; plpgsql seria necessário para isso em SQL puro, - -- então usamos um CTE de validação com CASE WHEN para retornar vazio em vez de erro) + -- ?????? Valida p_group_by antes de executar ?????????????????????????????????????????????????????????????????????????????????????????????????????? + -- (lan??a erro se valor inv??lido; plpgsql seria necess??rio para isso em SQL puro, + -- ent??o usamos um CTE de valida????o com CASE WHEN para retornar vazio em vez de erro) WITH base AS ( SELECT @@ -3381,9 +3276,9 @@ CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, ) WHEN 'category' THEN COALESCE(fr.category_id::TEXT, fr.category, 'sem_categoria') WHEN 'patient' THEN COALESCE(fr.patient_id::TEXT, 'sem_paciente') - ELSE NULL -- group_by inválido → group_key NULL → retorno vazio + ELSE NULL -- group_by inv??lido ??? group_key NULL ??? retorno vazio END AS gkey, - -- Label legível (enriquecido via JOIN abaixo quando possível) + -- Label leg??vel (enriquecido via JOIN abaixo quando poss??vel) CASE p_group_by WHEN 'month' THEN TO_CHAR( COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), @@ -3429,24 +3324,22 @@ CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, COUNT(*) AS count_records FROM base - WHERE gkey IS NOT NULL -- descarta p_group_by inválido + WHERE gkey IS NOT NULL -- descarta p_group_by inv??lido GROUP BY gkey, glabel ORDER BY gkey ASC; $$; -ALTER FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) OWNER TO supabase_admin; - -- --- Name: FUNCTION get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text); Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) IS 'Relatório financeiro agrupado por mês, semana ISO, categoria ou paciente. p_group_by aceita: ''month'' | ''week'' | ''category'' | ''patient''. Totais de receita/despesa consideram apenas registros com status=paid. total_pendente e total_overdue incluem todos os tipos (receita + despesa).'; +COMMENT ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) IS 'Relat??rio financeiro agrupado por m??s, semana ISO, categoria ou paciente. p_group_by aceita: ''month'' | ''week'' | ''category'' | ''patient''. Totais de receita/despesa consideram apenas registros com status=paid. total_pendente e total_overdue incluem todos os tipos (receita + despesa).'; -- --- Name: get_financial_summary(uuid, integer, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: get_financial_summary(uuid, integer, integer); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) RETURNS TABLE(total_receitas numeric, total_despesas numeric, total_pendente numeric, saldo_liquido numeric, total_repasse numeric, count_receitas bigint, count_despesas bigint) @@ -3454,12 +3347,12 @@ CREATE FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_ SET search_path TO 'public' AS $$ SELECT - -- Receitas pagas no período + -- Receitas pagas no per??odo COALESCE(SUM(amount) FILTER ( WHERE type = 'receita' AND status = 'paid' ), 0) AS total_receitas, - -- Despesas pagas no período + -- Despesas pagas no per??odo COALESCE(SUM(amount) FILTER ( WHERE type = 'despesa' AND status = 'paid' ), 0) AS total_despesas, @@ -3469,7 +3362,7 @@ CREATE FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_ WHERE status IN ('pending', 'overdue') ), 0) AS total_pendente, - -- Saldo líquido (receitas pagas − despesas pagas) + -- Saldo l??quido (receitas pagas ??? despesas pagas) COALESCE(SUM(amount) FILTER ( WHERE type = 'receita' AND status = 'paid' ), 0) @@ -3477,7 +3370,7 @@ CREATE FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_ WHERE type = 'despesa' AND status = 'paid' ), 0) AS saldo_liquido, - -- Total repassado à clínica (apenas receitas pagas) + -- Total repassado ?? cl??nica (apenas receitas pagas) COALESCE(SUM(clinic_fee_amount) FILTER ( WHERE type = 'receita' AND status = 'paid' ), 0) AS total_repasse, @@ -3494,10 +3387,8 @@ CREATE FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_ $$; -ALTER FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) OWNER TO supabase_admin; - -- --- Name: get_my_email(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: get_my_email(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.get_my_email() RETURNS text @@ -3510,10 +3401,8 @@ CREATE FUNCTION public.get_my_email() RETURNS text $$; -ALTER FUNCTION public.get_my_email() OWNER TO supabase_admin; - -- --- Name: guard_account_type_immutable(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: guard_account_type_immutable(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.guard_account_type_immutable() RETURNS trigger @@ -3521,7 +3410,7 @@ CREATE FUNCTION public.guard_account_type_immutable() RETURNS trigger AS $$ BEGIN IF OLD.account_type <> 'free' AND NEW.account_type IS DISTINCT FROM OLD.account_type THEN - RAISE EXCEPTION 'account_type é imutável após escolha (atual: "%" para tentativa: "%"). Para mudar de perfil, crie uma nova conta.', OLD.account_type, NEW.account_type + RAISE EXCEPTION 'account_type ?? imut??vel ap??s escolha (atual: "%" para tentativa: "%"). Para mudar de perfil, crie uma nova conta.', OLD.account_type, NEW.account_type USING ERRCODE = 'P0001'; END IF; RETURN NEW; @@ -3529,10 +3418,8 @@ END; $$; -ALTER FUNCTION public.guard_account_type_immutable() OWNER TO supabase_admin; - -- --- Name: guard_locked_commitment(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: guard_locked_commitment(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.guard_locked_commitment() RETURNS trigger @@ -3541,22 +3428,22 @@ CREATE FUNCTION public.guard_locked_commitment() RETURNS trigger begin if (old.is_locked = true) then if (tg_op = 'DELETE') then - raise exception 'Compromisso bloqueado não pode ser excluído.'; + raise exception 'Compromisso bloqueado n??o pode ser exclu??do.'; end if; if (tg_op = 'UPDATE') then if (new.active = false) then - raise exception 'Compromisso bloqueado não pode ser desativado.'; + raise exception 'Compromisso bloqueado n??o pode ser desativado.'; end if; - -- trava renomear (mantém o "Sessão" sempre igual) + -- trava renomear (mant??m o "Sess??o" sempre igual) if (new.name is distinct from old.name) then - raise exception 'Compromisso bloqueado não pode ser renomeado.'; + raise exception 'Compromisso bloqueado n??o pode ser renomeado.'; end if; - -- se quiser travar descrição também, descomente: + -- se quiser travar descri????o tamb??m, descomente: -- if (new.description is distinct from old.description) then - -- raise exception 'Compromisso bloqueado não pode alterar descrição.'; + -- raise exception 'Compromisso bloqueado n??o pode alterar descri????o.'; -- end if; end if; end if; @@ -3566,10 +3453,8 @@ end; $$; -ALTER FUNCTION public.guard_locked_commitment() OWNER TO supabase_admin; - -- --- Name: guard_no_change_core_plan_key(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: guard_no_change_core_plan_key(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.guard_no_change_core_plan_key() RETURNS trigger @@ -3578,7 +3463,7 @@ CREATE FUNCTION public.guard_no_change_core_plan_key() RETURNS trigger begin if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') and new.key is distinct from old.key then - raise exception 'Não é permitido alterar a key do plano padrão (%).', old.key + raise exception 'N??o ?? permitido alterar a key do plano padr??o (%).', old.key using errcode = 'P0001'; end if; @@ -3586,10 +3471,8 @@ begin end $$; -ALTER FUNCTION public.guard_no_change_core_plan_key() OWNER TO supabase_admin; - -- --- Name: guard_no_change_plan_target(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: guard_no_change_plan_target(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.guard_no_change_plan_target() RETURNS trigger @@ -3598,17 +3481,17 @@ CREATE FUNCTION public.guard_no_change_plan_target() RETURNS trigger declare v_bypass text; begin - -- bypass controlado por sessão/transação: - -- só passa se app.plan_migration_bypass = '1' + -- bypass controlado por sess??o/transa????o: + -- s?? passa se app.plan_migration_bypass = '1' v_bypass := current_setting('app.plan_migration_bypass', true); if v_bypass = '1' then return new; end if; - -- comportamento original (bloqueia qualquer mudança) + -- comportamento original (bloqueia qualquer mudan??a) if new.target is distinct from old.target then - raise exception 'Não é permitido alterar target do plano (%) de % para %.', + raise exception 'N??o ?? permitido alterar target do plano (%) de % para %.', old.key, old.target, new.target using errcode = 'P0001'; end if; @@ -3618,10 +3501,8 @@ end $$; -ALTER FUNCTION public.guard_no_change_plan_target() OWNER TO supabase_admin; - -- --- Name: guard_no_delete_core_plans(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: guard_no_delete_core_plans(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.guard_no_delete_core_plans() RETURNS trigger @@ -3629,7 +3510,7 @@ CREATE FUNCTION public.guard_no_delete_core_plans() RETURNS trigger AS $$ begin if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') then - raise exception 'Plano padrão (%) não pode ser removido.', old.key + raise exception 'Plano padr??o (%) n??o pode ser removido.', old.key using errcode = 'P0001'; end if; @@ -3637,10 +3518,8 @@ begin end $$; -ALTER FUNCTION public.guard_no_delete_core_plans() OWNER TO supabase_admin; - -- --- Name: guard_patient_cannot_own_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: guard_patient_cannot_own_tenant(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.guard_patient_cannot_own_tenant() RETURNS trigger @@ -3654,7 +3533,7 @@ BEGIN WHERE id = NEW.user_id; IF v_account_type = 'patient' AND NEW.role IN ('tenant_admin', 'therapist') THEN - RAISE EXCEPTION 'Usuário com perfil "patient" não pode ser proprietário ou terapeuta de um tenant. Se tornou profissional? Crie uma nova conta.' + RAISE EXCEPTION 'Usu??rio com perfil "patient" n??o pode ser propriet??rio ou terapeuta de um tenant. Se tornou profissional? Crie uma nova conta.' USING ERRCODE = 'P0001'; END IF; @@ -3663,10 +3542,8 @@ END; $$; -ALTER FUNCTION public.guard_patient_cannot_own_tenant() OWNER TO supabase_admin; - -- --- Name: guard_tenant_kind_immutable(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: guard_tenant_kind_immutable(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.guard_tenant_kind_immutable() RETURNS trigger @@ -3674,7 +3551,7 @@ CREATE FUNCTION public.guard_tenant_kind_immutable() RETURNS trigger AS $$ BEGIN IF NEW.kind IS DISTINCT FROM OLD.kind THEN - RAISE EXCEPTION 'tenants.kind é imutável após criação. Tentativa de alterar "%" para "%".', OLD.kind, NEW.kind + RAISE EXCEPTION 'tenants.kind ?? imut??vel ap??s cria????o. Tentativa de alterar "%" para "%".', OLD.kind, NEW.kind USING ERRCODE = 'P0001'; END IF; RETURN NEW; @@ -3682,10 +3559,8 @@ END; $$; -ALTER FUNCTION public.guard_tenant_kind_immutable() OWNER TO supabase_admin; - -- --- Name: handle_new_user(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: handle_new_user(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.handle_new_user() RETURNS trigger @@ -3701,10 +3576,8 @@ END; $$; -ALTER FUNCTION public.handle_new_user() OWNER TO supabase_admin; - -- --- Name: handle_new_user_create_personal_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: handle_new_user_create_personal_tenant(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.handle_new_user_create_personal_tenant() RETURNS trigger @@ -3717,10 +3590,8 @@ END; $$; -ALTER FUNCTION public.handle_new_user_create_personal_tenant() OWNER TO supabase_admin; - -- --- Name: has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) RETURNS boolean @@ -3735,10 +3606,8 @@ CREATE FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) RETURNS $$; -ALTER FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) OWNER TO supabase_admin; - -- --- Name: is_clinic_tenant(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: is_clinic_tenant(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.is_clinic_tenant(_tenant_id uuid) RETURNS boolean @@ -3752,10 +3621,8 @@ CREATE FUNCTION public.is_clinic_tenant(_tenant_id uuid) RETURNS boolean $$; -ALTER FUNCTION public.is_clinic_tenant(_tenant_id uuid) OWNER TO supabase_admin; - -- --- Name: is_saas_admin(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: is_saas_admin(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.is_saas_admin() RETURNS boolean @@ -3768,10 +3635,8 @@ CREATE FUNCTION public.is_saas_admin() RETURNS boolean $$; -ALTER FUNCTION public.is_saas_admin() OWNER TO supabase_admin; - -- --- Name: is_tenant_admin(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: is_tenant_admin(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.is_tenant_admin(p_tenant_id uuid) RETURNS boolean @@ -3790,10 +3655,8 @@ CREATE FUNCTION public.is_tenant_admin(p_tenant_id uuid) RETURNS boolean $$; -ALTER FUNCTION public.is_tenant_admin(p_tenant_id uuid) OWNER TO supabase_admin; - -- --- Name: is_tenant_member(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: is_tenant_member(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.is_tenant_member(_tenant_id uuid) RETURNS boolean @@ -3809,10 +3672,8 @@ CREATE FUNCTION public.is_tenant_member(_tenant_id uuid) RETURNS boolean $$; -ALTER FUNCTION public.is_tenant_member(_tenant_id uuid) OWNER TO supabase_admin; - -- --- Name: is_therapist_tenant(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: is_therapist_tenant(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.is_therapist_tenant(_tenant_id uuid) RETURNS boolean @@ -3825,10 +3686,8 @@ CREATE FUNCTION public.is_therapist_tenant(_tenant_id uuid) RETURNS boolean $$; -ALTER FUNCTION public.is_therapist_tenant(_tenant_id uuid) OWNER TO supabase_admin; - -- --- Name: jwt_email(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: jwt_email(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.jwt_email() RETURNS text @@ -3838,10 +3697,8 @@ CREATE FUNCTION public.jwt_email() RETURNS text $$; -ALTER FUNCTION public.jwt_email() OWNER TO supabase_admin; - -- --- Name: list_financial_records(uuid, integer, integer, text, text, uuid, integer, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: list_financial_records(uuid, integer, integer, text, text, uuid, integer, integer); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer DEFAULT NULL::integer, p_month integer DEFAULT NULL::integer, p_type text DEFAULT NULL::text, p_status text DEFAULT NULL::text, p_patient_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0) RETURNS SETOF public.financial_records @@ -3863,10 +3720,8 @@ CREATE FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer DE $$; -ALTER FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) OWNER TO supabase_admin; - -- --- Name: mark_as_paid(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: mark_as_paid(uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) RETURNS SETOF public.financial_records @@ -3876,7 +3731,7 @@ CREATE FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method DECLARE v_record public.financial_records%ROWTYPE; BEGIN - -- Garante que o registro pertence ao usuário autenticado (RLS não aplica em SECURITY DEFINER) + -- Garante que o registro pertence ao usu??rio autenticado (RLS n??o aplica em SECURITY DEFINER) SELECT * INTO v_record FROM public.financial_records WHERE id = p_financial_record_id @@ -3884,11 +3739,11 @@ BEGIN AND deleted_at IS NULL; IF NOT FOUND THEN - RAISE EXCEPTION 'Registro financeiro não encontrado ou sem permissão.'; + RAISE EXCEPTION 'Registro financeiro n??o encontrado ou sem permiss??o.'; END IF; IF v_record.status NOT IN ('pending', 'overdue') THEN - RAISE EXCEPTION 'Apenas cobranças pendentes ou vencidas podem ser marcadas como pagas.'; + RAISE EXCEPTION 'Apenas cobran??as pendentes ou vencidas podem ser marcadas como pagas.'; END IF; UPDATE public.financial_records @@ -3904,10 +3759,8 @@ END; $$; -ALTER FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) OWNER TO supabase_admin; - -- --- Name: mark_payout_as_paid(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: mark_payout_as_paid(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.mark_payout_as_paid(p_payout_id uuid) RETURNS public.therapist_payouts @@ -3923,18 +3776,18 @@ BEGIN WHERE id = p_payout_id; IF NOT FOUND THEN - RAISE EXCEPTION 'Repasse não encontrado: %', p_payout_id; + RAISE EXCEPTION 'Repasse n??o encontrado: %', p_payout_id; END IF; - -- Verifica permissão: apenas tenant_admin do tenant do repasse + -- Verifica permiss??o: apenas tenant_admin do tenant do repasse IF NOT public.is_tenant_admin(v_payout.tenant_id) THEN - RAISE EXCEPTION 'Apenas o administrador da clínica pode marcar repasses como pagos.'; + RAISE EXCEPTION 'Apenas o administrador da cl??nica pode marcar repasses como pagos.'; END IF; -- Verifica status IF v_payout.status <> 'pending' THEN RAISE EXCEPTION - 'Repasse já está com status ''%''. Apenas repasses pendentes podem ser pagos.', + 'Repasse j?? est?? com status ''%''. Apenas repasses pendentes podem ser pagos.', v_payout.status; END IF; @@ -3952,17 +3805,15 @@ END; $$; -ALTER FUNCTION public.mark_payout_as_paid(p_payout_id uuid) OWNER TO supabase_admin; - -- --- Name: FUNCTION mark_payout_as_paid(p_payout_id uuid); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION mark_payout_as_paid(p_payout_id uuid); Type: COMMENT; Schema: public; Owner: - -- COMMENT ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) IS 'Marca um repasse de terapeuta como pago. Apenas o tenant_admin pode chamar. Apenas repasses com status=pending podem ser finalizados.'; -- --- Name: my_tenants(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: my_tenants(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.my_tenants() RETURNS TABLE(tenant_id uuid, role text, status text, kind text) @@ -3979,10 +3830,8 @@ CREATE FUNCTION public.my_tenants() RETURNS TABLE(tenant_id uuid, role text, sta $$; -ALTER FUNCTION public.my_tenants() OWNER TO supabase_admin; - -- --- Name: notice_track_click(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: notice_track_click(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.notice_track_click(p_notice_id uuid) RETURNS void @@ -3996,10 +3845,8 @@ end; $$; -ALTER FUNCTION public.notice_track_click(p_notice_id uuid) OWNER TO supabase_admin; - -- --- Name: notice_track_view(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: notice_track_view(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.notice_track_view(p_notice_id uuid) RETURNS void @@ -4013,10 +3860,8 @@ end; $$; -ALTER FUNCTION public.notice_track_view(p_notice_id uuid) OWNER TO supabase_admin; - -- --- Name: notify_on_intake(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: notify_on_intake(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.notify_on_intake() RETURNS trigger @@ -4051,10 +3896,8 @@ END; $$; -ALTER FUNCTION public.notify_on_intake() OWNER TO supabase_admin; - -- --- Name: notify_on_scheduling(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: notify_on_scheduling(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.notify_on_scheduling() RETURNS trigger @@ -4062,13 +3905,11 @@ CREATE FUNCTION public.notify_on_scheduling() RETURNS trigger AS $$ BEGIN IF NEW.status = 'pendente' THEN INSERT INTO public.notifications ( owner_id, tenant_id, type, ref_id, ref_table, payload ) VALUES ( NEW.owner_id, NEW.tenant_id, - 'new_scheduling', NEW.id, 'agendador_solicitacoes', jsonb_build_object( 'title', 'Nova solicitação de agendamento', 'detail', COALESCE(NEW.paciente_nome, 'Paciente') || ' ' || COALESCE(NEW.paciente_sobrenome, '') || ' — ' || COALESCE(NEW.tipo, ''), 'deeplink', '/therapist/agendamentos-recebidos', 'avatar_initials', upper(left(COALESCE(NEW.paciente_nome, '?'), 1) || left(COALESCE(NEW.paciente_sobrenome, ''), 1)) ) ); END IF; RETURN NEW; END; $$; + 'new_scheduling', NEW.id, 'agendador_solicitacoes', jsonb_build_object( 'title', 'Nova solicita????o de agendamento', 'detail', COALESCE(NEW.paciente_nome, 'Paciente') || ' ' || COALESCE(NEW.paciente_sobrenome, '') || ' ??? ' || COALESCE(NEW.tipo, ''), 'deeplink', '/therapist/agendamentos-recebidos', 'avatar_initials', upper(left(COALESCE(NEW.paciente_nome, '?'), 1) || left(COALESCE(NEW.paciente_sobrenome, ''), 1)) ) ); END IF; RETURN NEW; END; $$; -ALTER FUNCTION public.notify_on_scheduling() OWNER TO supabase_admin; - -- --- Name: notify_on_session_status(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: notify_on_session_status(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.notify_on_session_status() RETURNS trigger @@ -4100,8 +3941,8 @@ BEGIN NEW.id, 'agenda_eventos', jsonb_build_object( - 'title', CASE WHEN NEW.status = 'faltou' THEN 'Paciente faltou' ELSE 'Sessão cancelada' END, - 'detail', COALESCE(v_nome, 'Paciente') || ' — ' || to_char(NEW.inicio_em, 'DD/MM HH24:MI'), + 'title', CASE WHEN NEW.status = 'faltou' THEN 'Paciente faltou' ELSE 'Sess??o cancelada' END, + 'detail', COALESCE(v_nome, 'Paciente') || ' ??? ' || to_char(NEW.inicio_em, 'DD/MM HH24:MI'), 'deeplink', '/therapist/agenda', 'avatar_initials', upper(left(COALESCE(v_nome, '?'), 2)) ) @@ -4113,10 +3954,8 @@ END; $$; -ALTER FUNCTION public.notify_on_session_status() OWNER TO supabase_admin; - -- --- Name: on_new_user_seed_patient_groups(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: on_new_user_seed_patient_groups(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.on_new_user_seed_patient_groups() RETURNS trigger @@ -4130,10 +3969,8 @@ CREATE FUNCTION public.on_new_user_seed_patient_groups() RETURNS trigger $$; -ALTER FUNCTION public.on_new_user_seed_patient_groups() OWNER TO supabase_admin; - -- --- Name: patients_validate_member_consistency(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: patients_validate_member_consistency(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.patients_validate_member_consistency() RETURNS trigger @@ -4184,10 +4021,8 @@ END; $$; -ALTER FUNCTION public.patients_validate_member_consistency() OWNER TO supabase_admin; - -- --- Name: patients_validate_responsible_member_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: patients_validate_responsible_member_tenant(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.patients_validate_responsible_member_tenant() RETURNS trigger @@ -4217,10 +4052,8 @@ end; $$; -ALTER FUNCTION public.patients_validate_responsible_member_tenant() OWNER TO supabase_admin; - -- --- Name: populate_notification_queue(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: populate_notification_queue(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.populate_notification_queue() RETURNS void @@ -4247,7 +4080,7 @@ BEGIN 'hora_sessao', TO_CHAR(ae.inicio_em AT TIME ZONE 'America/Sao_Paulo', 'HH24:MI'), 'nome_terapeuta', COALESCE(prof.full_name, 'Terapeuta'), 'modalidade', COALESCE(ae.modalidade, 'Presencial'), - 'titulo', COALESCE(ae.titulo, 'Sessão') + 'titulo', COALESCE(ae.titulo, 'Sess??o') ), CASE ch.channel WHEN 'whatsapp' THEN COALESCE(p.telefone, '') @@ -4315,10 +4148,8 @@ END; $$; -ALTER FUNCTION public.populate_notification_queue() OWNER TO supabase_admin; - -- --- Name: prevent_promoting_to_system(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: prevent_promoting_to_system(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.prevent_promoting_to_system() RETURNS trigger @@ -4326,17 +4157,15 @@ CREATE FUNCTION public.prevent_promoting_to_system() RETURNS trigger AS $$ begin if new.is_system = true and old.is_system is distinct from true then - raise exception 'Não é permitido transformar um grupo comum em grupo do sistema.'; + raise exception 'N??o ?? permitido transformar um grupo comum em grupo do sistema.'; end if; return new; end; $$; -ALTER FUNCTION public.prevent_promoting_to_system() OWNER TO supabase_admin; - -- --- Name: prevent_saas_membership(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: prevent_saas_membership(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.prevent_saas_membership() RETURNS trigger @@ -4357,27 +4186,25 @@ END; $$; -ALTER FUNCTION public.prevent_saas_membership() OWNER TO supabase_admin; - -- --- Name: prevent_system_group_changes(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: prevent_system_group_changes(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.prevent_system_group_changes() RETURNS trigger LANGUAGE plpgsql AS $$ begin - -- Se for grupo do sistema, regras rígidas: + -- Se for grupo do sistema, regras r??gidas: if old.is_system = true then -- nunca pode deletar if tg_op = 'DELETE' then - raise exception 'Grupos padrão do sistema não podem ser alterados ou excluídos.'; + raise exception 'Grupos padr??o do sistema n??o podem ser alterados ou exclu??dos.'; end if; if tg_op = 'UPDATE' then -- permite SOMENTE mudar tenant_id e/ou updated_at - -- qualquer mudança de conteúdo permanece proibida + -- qualquer mudan??a de conte??do permanece proibida if new.nome is distinct from old.nome or new.descricao is distinct from old.descricao or @@ -4388,16 +4215,16 @@ begin new.therapist_id is distinct from old.therapist_id or new.created_at is distinct from old.created_at then - raise exception 'Grupos padrão do sistema não podem ser alterados ou excluídos.'; + raise exception 'Grupos padr??o do sistema n??o podem ser alterados ou exclu??dos.'; end if; - -- chegou aqui: só tenant_id/updated_at mudaram -> ok + -- chegou aqui: s?? tenant_id/updated_at mudaram -> ok return new; end if; end if; - -- não-system: deixa passar + -- n??o-system: deixa passar if tg_op = 'DELETE' then return old; end if; @@ -4407,10 +4234,8 @@ end; $$; -ALTER FUNCTION public.prevent_system_group_changes() OWNER TO supabase_admin; - -- --- Name: provision_account_tenant(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: provision_account_tenant(uuid, text, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text DEFAULT NULL::text) RETURNS uuid @@ -4422,7 +4247,7 @@ DECLARE v_name text; BEGIN IF p_kind NOT IN ('therapist', 'clinic_coworking', 'clinic_reception', 'clinic_full') THEN - RAISE EXCEPTION 'kind inválido: "%". Use: therapist, clinic_coworking, clinic_reception, clinic_full.', p_kind + RAISE EXCEPTION 'kind inv??lido: "%". Use: therapist, clinic_coworking, clinic_reception, clinic_full.', p_kind USING ERRCODE = 'P0001'; END IF; @@ -4437,7 +4262,7 @@ BEGIN AND tm.status = 'active' AND t.kind = p_kind ) THEN - RAISE EXCEPTION 'Usuário já possui um tenant do tipo "%".', p_kind + RAISE EXCEPTION 'Usu??rio j?? possui um tenant do tipo "%".', p_kind USING ERRCODE = 'P0001'; END IF; @@ -4470,17 +4295,15 @@ END; $$; -ALTER FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) OWNER TO supabase_admin; - -- --- Name: FUNCTION provision_account_tenant(p_user_id uuid, p_kind text, p_name text); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION provision_account_tenant(p_user_id uuid, p_kind text, p_name text); Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) IS 'Cria o tenant do tipo correto e atualiza account_type no profile. Chamar no onboarding após escolha/pagamento de plano therapist ou clinic. p_kind: therapist | clinic_coworking | clinic_reception | clinic_full'; +COMMENT ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) IS 'Cria o tenant do tipo correto e atualiza account_type no profile. Chamar no onboarding ap??s escolha/pagamento de plano therapist ou clinic. p_kind: therapist | clinic_coworking | clinic_reception | clinic_full'; -- --- Name: reactivate_subscription(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: reactivate_subscription(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.reactivate_subscription(p_subscription_id uuid) RETURNS public.subscriptions @@ -4499,7 +4322,7 @@ begin for update; if not found then - raise exception 'Subscription não encontrada'; + raise exception 'Subscription n??o encontrada'; end if; if v_sub.status = 'active' then @@ -4546,7 +4369,7 @@ begin v_sub.plan_id, v_sub.plan_id, auth.uid(), - 'Reativação manual via admin', + 'Reativa????o manual via admin', 'admin_panel', jsonb_build_object('previous_status', 'canceled') ); @@ -4564,10 +4387,8 @@ end; $$; -ALTER FUNCTION public.reactivate_subscription(p_subscription_id uuid) OWNER TO supabase_admin; - -- --- Name: rebuild_owner_entitlements(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: rebuild_owner_entitlements(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) RETURNS void @@ -4589,7 +4410,7 @@ begin delete from public.owner_feature_entitlements e where e.owner_id = p_owner_id; - -- Se não tem assinatura ativa, acabou + -- Se n??o tem assinatura ativa, acabou if v_plan_id is null then return; end if; @@ -4609,10 +4430,8 @@ end; $$; -ALTER FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) OWNER TO supabase_admin; - -- --- Name: revoke_support_session(text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: revoke_support_session(text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.revoke_support_session(p_token text) RETURNS boolean @@ -4625,7 +4444,7 @@ DECLARE BEGIN v_admin_id := auth.uid(); IF v_admin_id IS NULL THEN - RAISE EXCEPTION 'Não autenticado.' USING ERRCODE = 'P0001'; + RAISE EXCEPTION 'N??o autenticado.' USING ERRCODE = 'P0001'; END IF; SELECT role INTO v_role FROM public.profiles WHERE id = v_admin_id; @@ -4642,10 +4461,8 @@ END; $$; -ALTER FUNCTION public.revoke_support_session(p_token text) OWNER TO supabase_admin; - -- --- Name: rotate_patient_invite_token(text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: rotate_patient_invite_token(text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.rotate_patient_invite_token(p_new_token text) RETURNS uuid @@ -4656,13 +4473,13 @@ declare v_uid uuid; v_id uuid; begin - -- pega o usuário logado + -- pega o usu??rio logado v_uid := auth.uid(); if v_uid is null then - raise exception 'Usuário não autenticado'; + raise exception 'Usu??rio n??o autenticado'; end if; - -- desativa tokens antigos ativos do usuário + -- desativa tokens antigos ativos do usu??rio update public.patient_invites set active = false where owner_id = v_uid @@ -4678,10 +4495,8 @@ end; $$; -ALTER FUNCTION public.rotate_patient_invite_token(p_new_token text) OWNER TO supabase_admin; - -- --- Name: saas_votar_doc(uuid, boolean); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: saas_votar_doc(uuid, boolean); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) RETURNS jsonb @@ -4692,16 +4507,16 @@ declare v_voto_antigo boolean; begin if v_uid is null then - raise exception 'Não autenticado'; + raise exception 'N??o autenticado'; end if; - -- Verifica se já votou + -- Verifica se j?? votou select util into v_voto_antigo from public.saas_doc_votos where doc_id = p_doc_id and user_id = v_uid; if found then - -- Já votou igual → cancela o voto (toggle) + -- J?? votou igual ??? cancela o voto (toggle) if v_voto_antigo = p_util then delete from public.saas_doc_votos where doc_id = p_doc_id and user_id = v_uid; @@ -4743,22 +4558,20 @@ end; $$; -ALTER FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) OWNER TO supabase_admin; - -- --- Name: safe_delete_patient(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: safe_delete_patient(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.safe_delete_patient(p_patient_id uuid) RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER AS $$ BEGIN - -- Bloqueia se houver histórico + -- Bloqueia se houver hist??rico IF NOT public.can_delete_patient(p_patient_id) THEN RETURN jsonb_build_object( 'ok', false, 'error', 'has_history', - 'message', 'Este paciente possui histórico clínico ou financeiro e não pode ser removido. Você pode desativar ou arquivar o paciente.' + 'message', 'Este paciente possui hist??rico cl??nico ou financeiro e n??o pode ser removido. Voc?? pode desativar ou arquivar o paciente.' ); END IF; @@ -4776,7 +4589,7 @@ BEGIN RETURN jsonb_build_object( 'ok', false, 'error', 'forbidden', - 'message', 'Sem permissão para excluir este paciente.' + 'message', 'Sem permiss??o para excluir este paciente.' ); END IF; @@ -4787,10 +4600,8 @@ END; $$; -ALTER FUNCTION public.safe_delete_patient(p_patient_id uuid) OWNER TO supabase_admin; - -- --- Name: sanitize_phone_br(text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: sanitize_phone_br(text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.sanitize_phone_br(raw_phone text) RETURNS text @@ -4806,10 +4617,8 @@ CREATE FUNCTION public.sanitize_phone_br(raw_phone text) RETURNS text END; $$; -ALTER FUNCTION public.sanitize_phone_br(raw_phone text) OWNER TO supabase_admin; - -- --- Name: seed_default_financial_categories(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: seed_default_financial_categories(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.seed_default_financial_categories(p_user_id uuid) RETURNS void @@ -4819,25 +4628,56 @@ CREATE FUNCTION public.seed_default_financial_categories(p_user_id uuid) RETURNS BEGIN INSERT INTO public.financial_categories (user_id, name, type, color, icon, sort_order) VALUES - (p_user_id, 'Sessão', 'receita', '#22c55e', 'pi pi-heart', 1), - (p_user_id, 'Supervisão', 'receita', '#6366f1', 'pi pi-users', 2), - (p_user_id, 'Convênio', 'receita', '#3b82f6', 'pi pi-building', 3), - (p_user_id, 'Grupo terapêutico', 'receita', '#f59e0b', 'pi pi-sitemap', 4), + (p_user_id, 'Sess??o', 'receita', '#22c55e', 'pi pi-heart', 1), + (p_user_id, 'Supervis??o', 'receita', '#6366f1', 'pi pi-users', 2), + (p_user_id, 'Conv??nio', 'receita', '#3b82f6', 'pi pi-building', 3), + (p_user_id, 'Grupo terap??utico', 'receita', '#f59e0b', 'pi pi-sitemap', 4), (p_user_id, 'Outro (receita)', 'receita', '#8b5cf6', 'pi pi-plus-circle', 5), (p_user_id, 'Aluguel sala', 'despesa', '#ef4444', 'pi pi-home', 1), (p_user_id, 'Plataforma/SaaS', 'despesa', '#f97316', 'pi pi-desktop', 2), - (p_user_id, 'Repasse clínica', 'despesa', '#64748b', 'pi pi-arrow-right-arrow-left', 3), - (p_user_id, 'Supervisão (custo)', 'despesa', '#6366f1', 'pi pi-users', 4), + (p_user_id, 'Repasse cl??nica', 'despesa', '#64748b', 'pi pi-arrow-right-arrow-left', 3), + (p_user_id, 'Supervis??o (custo)', 'despesa', '#6366f1', 'pi pi-users', 4), (p_user_id, 'Outro (despesa)', 'despesa', '#94a3b8', 'pi pi-minus-circle', 5) ON CONFLICT DO NOTHING; END; $$; -ALTER FUNCTION public.seed_default_financial_categories(p_user_id uuid) OWNER TO supabase_admin; +-- +-- Name: seed_default_patient_groups(uuid); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.seed_default_patient_groups(p_tenant_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_owner_id uuid; +BEGIN + -- busca o owner (tenant_admin) do tenant + SELECT user_id INTO v_owner_id + FROM public.tenant_members + WHERE tenant_id = p_tenant_id + AND role = 'tenant_admin' + AND status = 'active' + LIMIT 1; + + IF v_owner_id IS NULL THEN + RETURN; + END IF; + + INSERT INTO public.patient_groups (owner_id, nome, cor, is_system, tenant_id) + VALUES + (v_owner_id, 'Crian??as', '#60a5fa', true, p_tenant_id), + (v_owner_id, 'Adolescentes', '#a78bfa', true, p_tenant_id), + (v_owner_id, 'Idosos', '#34d399', true, p_tenant_id) + ON CONFLICT (owner_id, nome) DO NOTHING; +END; +$$; + -- --- Name: seed_determined_commitments(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: seed_determined_commitments(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.seed_determined_commitments(p_tenant_id uuid) RETURNS void @@ -4846,7 +4686,7 @@ CREATE FUNCTION public.seed_determined_commitments(p_tenant_id uuid) RETURNS voi declare v_id uuid; begin - -- Sessão (locked + sempre ativa) + -- Sess??o (locked + sempre ativa) if not exists ( select 1 from public.determined_commitments where tenant_id = p_tenant_id and is_native = true and native_key = 'session' @@ -4854,7 +4694,7 @@ begin insert into public.determined_commitments (tenant_id, is_native, native_key, is_locked, active, name, description) values - (p_tenant_id, true, 'session', true, true, 'Sessão', 'Sessão com paciente'); + (p_tenant_id, true, 'session', true, true, 'Sess??o', 'Sess??o com paciente'); end if; -- Leitura @@ -4868,7 +4708,7 @@ begin (p_tenant_id, true, 'reading', false, true, 'Leitura', 'Praticar leitura'); end if; - -- Supervisão + -- Supervis??o if not exists ( select 1 from public.determined_commitments where tenant_id = p_tenant_id and is_native = true and native_key = 'supervision' @@ -4876,10 +4716,10 @@ begin insert into public.determined_commitments (tenant_id, is_native, native_key, is_locked, active, name, description) values - (p_tenant_id, true, 'supervision', false, true, 'Supervisão', 'Supervisão'); + (p_tenant_id, true, 'supervision', false, true, 'Supervis??o', 'Supervis??o'); end if; - -- Aula ✅ (corrigido) + -- Aula ??? (corrigido) if not exists ( select 1 from public.determined_commitments where tenant_id = p_tenant_id and is_native = true and native_key = 'class' @@ -4890,7 +4730,7 @@ begin (p_tenant_id, true, 'class', false, false, 'Aula', 'Dar aula'); end if; - -- Análise pessoal + -- An??lise pessoal if not exists ( select 1 from public.determined_commitments where tenant_id = p_tenant_id and is_native = true and native_key = 'analysis' @@ -4898,11 +4738,11 @@ begin insert into public.determined_commitments (tenant_id, is_native, native_key, is_locked, active, name, description) values - (p_tenant_id, true, 'analysis', false, true, 'Análise Pessoal', 'Minha análise pessoal'); + (p_tenant_id, true, 'analysis', false, true, 'An??lise Pessoal', 'Minha an??lise pessoal'); end if; -- ------------------------------------------------------- - -- Campos padrão (idempotentes por (commitment_id, key)) + -- Campos padr??o (idempotentes por (commitment_id, key)) -- ------------------------------------------------------- -- Leitura @@ -4924,11 +4764,11 @@ begin if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'notes', 'Observação', 'textarea', false, 30); + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); end if; end if; - -- Supervisão + -- Supervis??o select id into v_id from public.determined_commitments where tenant_id = p_tenant_id and is_native = true and native_key = 'supervision' @@ -4947,7 +4787,7 @@ begin if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'notes', 'Observação', 'textarea', false, 30); + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); end if; end if; @@ -4970,11 +4810,11 @@ begin if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'notes', 'Observação', 'textarea', false, 30); + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); end if; end if; - -- Análise + -- An??lise select id into v_id from public.determined_commitments where tenant_id = p_tenant_id and is_native = true and native_key = 'analysis' @@ -4993,17 +4833,15 @@ begin if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'notes', 'Observação', 'textarea', false, 30); + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); end if; end if; end; $$; -ALTER FUNCTION public.seed_determined_commitments(p_tenant_id uuid) OWNER TO supabase_admin; - -- --- Name: set_insurance_plans_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: set_insurance_plans_updated_at(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.set_insurance_plans_updated_at() RETURNS trigger @@ -5012,10 +4850,22 @@ CREATE FUNCTION public.set_insurance_plans_updated_at() RETURNS trigger BEGIN NEW.updated_at = now(); RETURN NEW; END; $$; -ALTER FUNCTION public.set_insurance_plans_updated_at() OWNER TO supabase_admin; +-- +-- Name: set_medicos_updated_at(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.set_medicos_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + -- --- Name: set_owner_id(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: set_owner_id(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.set_owner_id() RETURNS trigger @@ -5030,10 +4880,8 @@ end; $$; -ALTER FUNCTION public.set_owner_id() OWNER TO supabase_admin; - -- --- Name: set_services_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: set_services_updated_at(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.set_services_updated_at() RETURNS trigger @@ -5046,17 +4894,15 @@ END; $$; -ALTER FUNCTION public.set_services_updated_at() OWNER TO supabase_admin; - -- --- Name: set_tenant_feature_exception(uuid, text, boolean, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: set_tenant_feature_exception(uuid, text, boolean, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text DEFAULT NULL::text) RETURNS void LANGUAGE plpgsql SECURITY DEFINER AS $$ begin - -- ✅ Só owner ou admin do tenant podem alterar features + -- ??? S?? owner ou admin do tenant podem alterar features if not exists ( select 1 from public.tenant_members where tenant_id = p_tenant_id @@ -5081,10 +4927,8 @@ end; $$; -ALTER FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) OWNER TO supabase_admin; - -- --- Name: set_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: set_updated_at(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.set_updated_at() RETURNS trigger @@ -5097,10 +4941,8 @@ END; $$; -ALTER FUNCTION public.set_updated_at() OWNER TO supabase_admin; - -- --- Name: set_updated_at_recurrence(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: set_updated_at_recurrence(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.set_updated_at_recurrence() RETURNS trigger @@ -5110,10 +4952,8 @@ BEGIN NEW.updated_at = now(); RETURN NEW; END; $$; -ALTER FUNCTION public.set_updated_at_recurrence() OWNER TO supabase_admin; - -- --- Name: split_recurrence_at(uuid, date); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: split_recurrence_at(uuid, date); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) RETURNS uuid @@ -5130,7 +4970,7 @@ BEGIN WHERE id = p_recurrence_id; IF NOT FOUND THEN - RAISE EXCEPTION 'recurrence_rule % não encontrada', p_recurrence_id; + RAISE EXCEPTION 'recurrence_rule % n??o encontrada', p_recurrence_id; END IF; -- encerra a regra antiga na data anterior @@ -5164,10 +5004,8 @@ END; $$; -ALTER FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) OWNER TO supabase_admin; - -- --- Name: subscription_intents_view_insert(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_view_insert(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.subscription_intents_view_insert() RETURNS trigger @@ -5182,12 +5020,12 @@ begin where p.key = new.plan_key; if v_plan_id is null then - raise exception 'Plano inválido: plan_key=%', new.plan_key; + raise exception 'Plano inv??lido: plan_key=%', new.plan_key; end if; if lower(v_target) = 'clinic' then if new.tenant_id is null then - raise exception 'Intenção clinic exige tenant_id.'; + raise exception 'Inten????o clinic exige tenant_id.'; end if; insert into public.subscription_intents_tenant ( @@ -5207,7 +5045,7 @@ begin return new; end if; - -- therapist ou supervisor → tabela personal + -- therapist ou supervisor ??? tabela personal if lower(v_target) in ('therapist', 'supervisor') then insert into public.subscription_intents_personal ( id, user_id, created_by_user_id, email, @@ -5226,15 +5064,13 @@ begin return new; end if; - raise exception 'Target de plano não suportado: %', v_target; + raise exception 'Target de plano n??o suportado: %', v_target; end; $$; -ALTER FUNCTION public.subscription_intents_view_insert() OWNER TO supabase_admin; - -- --- Name: subscriptions_validate_scope(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: subscriptions_validate_scope(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.subscriptions_validate_scope() RETURNS trigger @@ -5248,7 +5084,7 @@ BEGIN WHERE p.id = NEW.plan_id; IF v_target IS NULL THEN - RAISE EXCEPTION 'Plano inválido (target nulo).'; + RAISE EXCEPTION 'Plano inv??lido (target nulo).'; END IF; IF v_target = 'clinic' THEN @@ -5256,13 +5092,13 @@ BEGIN RAISE EXCEPTION 'Assinatura clinic exige tenant_id.'; END IF; IF NEW.user_id IS NOT NULL THEN - RAISE EXCEPTION 'Assinatura clinic não pode ter user_id (XOR).'; + RAISE EXCEPTION 'Assinatura clinic n??o pode ter user_id (XOR).'; END IF; ELSIF v_target IN ('therapist', 'supervisor') THEN - -- supervisor é pessoal como therapist + -- supervisor ?? pessoal como therapist IF NEW.tenant_id IS NOT NULL THEN - RAISE EXCEPTION 'Assinatura % não deve ter tenant_id.', v_target; + RAISE EXCEPTION 'Assinatura % n??o deve ter tenant_id.', v_target; END IF; IF NEW.user_id IS NULL THEN RAISE EXCEPTION 'Assinatura % exige user_id.', v_target; @@ -5270,14 +5106,14 @@ BEGIN ELSIF v_target = 'patient' THEN IF NEW.tenant_id IS NOT NULL THEN - RAISE EXCEPTION 'Assinatura patient não deve ter tenant_id.'; + RAISE EXCEPTION 'Assinatura patient n??o deve ter tenant_id.'; END IF; IF NEW.user_id IS NULL THEN RAISE EXCEPTION 'Assinatura patient exige user_id.'; END IF; ELSE - RAISE EXCEPTION 'Target de plano inválido: %', v_target; + RAISE EXCEPTION 'Target de plano inv??lido: %', v_target; END IF; RETURN NEW; @@ -5285,10 +5121,8 @@ END; $$; -ALTER FUNCTION public.subscriptions_validate_scope() OWNER TO supabase_admin; - -- --- Name: sync_busy_mirror_agenda_eventos(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: sync_busy_mirror_agenda_eventos(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.sync_busy_mirror_agenda_eventos() RETURNS trigger @@ -5300,7 +5134,7 @@ declare is_personal boolean; should_mirror boolean; begin - -- Anti-recursão: espelho não espelha + -- Anti-recurs??o: espelho n??o espelha if (tg_op <> 'DELETE') then if new.mirror_of_event_id is not null then return new; @@ -5311,7 +5145,7 @@ begin end if; end if; - -- Define se é pessoal e se deve espelhar + -- Define se ?? pessoal e se deve espelhar if (tg_op = 'DELETE') then is_personal := (old.tenant_id = old.owner_id); should_mirror := (old.visibility_scope in ('busy_only','private')); @@ -5320,7 +5154,7 @@ begin should_mirror := (new.visibility_scope in ('busy_only','private')); end if; - -- Se não é pessoal, não faz nada + -- Se n??o ?? pessoal, n??o faz nada if not is_personal then if (tg_op = 'DELETE') then return old; @@ -5338,7 +5172,7 @@ begin end if; -- INSERT/UPDATE: - -- Se não deve espelhar, remove espelhos e sai + -- Se n??o deve espelhar, remove espelhos e sai if not should_mirror then delete from public.agenda_eventos e where e.mirror_of_event_id = new.id @@ -5347,7 +5181,7 @@ begin return new; end if; - -- Para cada clínica onde o usuário é therapist active, cria/atualiza o "Ocupado" + -- Para cada cl??nica onde o usu??rio ?? therapist active, cria/atualiza o "Ocupado" for clinic_tenant in select tm.tenant_id from public.tenant_members tm @@ -5402,7 +5236,7 @@ begin updated_at = now(); end loop; - -- Limpa espelhos de clínicas onde o vínculo therapist active não existe mais + -- Limpa espelhos de cl??nicas onde o v??nculo therapist active n??o existe mais delete from public.agenda_eventos e where e.mirror_of_event_id = new.id and e.mirror_source = 'personal_busy_mirror' @@ -5420,10 +5254,8 @@ end; $$; -ALTER FUNCTION public.sync_busy_mirror_agenda_eventos() OWNER TO supabase_admin; - -- --- Name: sync_overdue_financial_records(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: sync_overdue_financial_records(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.sync_overdue_financial_records() RETURNS integer @@ -5448,17 +5280,15 @@ END; $$; -ALTER FUNCTION public.sync_overdue_financial_records() OWNER TO supabase_admin; - -- --- Name: FUNCTION sync_overdue_financial_records(); Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: FUNCTION sync_overdue_financial_records(); Type: COMMENT; Schema: public; Owner: - -- COMMENT ON FUNCTION public.sync_overdue_financial_records() IS 'Marca como overdue todos os financial_records pendentes com due_date vencido. Pode ser chamada manualmente, via pg_cron ou via Supabase Edge Function agendada.'; -- --- Name: tenant_accept_invite(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_accept_invite(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_accept_invite(p_token uuid) RETURNS jsonb @@ -5476,7 +5306,7 @@ begin raise exception 'not_authenticated' using errcode = 'P0001'; end if; - -- 2) pega email real do usuário logado sem depender do JWT claim + -- 2) pega email real do usu??rio logado sem depender do JWT claim select u.email into v_email from auth.users u @@ -5497,7 +5327,7 @@ begin raise exception 'invite_not_found' using errcode = 'P0001'; end if; - -- 4) validações de estado + -- 4) valida????es de estado if v_invite.revoked_at is not null then raise exception 'invite_revoked' using errcode = 'P0001'; end if; @@ -5529,7 +5359,7 @@ begin role = excluded.role, status = 'active'; - -- 8) retorno útil pro front (você já tenta ler tenant_id no AcceptInvitePage) + -- 8) retorno ??til pro front (voc?? j?? tenta ler tenant_id no AcceptInvitePage) return jsonb_build_object( 'ok', true, 'tenant_id', v_invite.tenant_id, @@ -5539,10 +5369,8 @@ end; $$; -ALTER FUNCTION public.tenant_accept_invite(p_token uuid) OWNER TO supabase_admin; - -- --- Name: tenant_members; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: tenant_members; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.tenant_members ( @@ -5555,10 +5383,8 @@ CREATE TABLE public.tenant_members ( ); -ALTER TABLE public.tenant_members OWNER TO supabase_admin; - -- --- Name: tenant_add_member_by_email(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_add_member_by_email(uuid, text, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text DEFAULT 'therapist'::text) RETURNS public.tenant_members @@ -5572,17 +5398,17 @@ declare v_email text; begin if p_tenant_id is null then - raise exception 'tenant_id é obrigatório'; + raise exception 'tenant_id ?? obrigat??rio'; end if; v_email := lower(trim(coalesce(p_email, ''))); if v_email = '' then - raise exception 'email é obrigatório'; + raise exception 'email ?? obrigat??rio'; end if; -- valida role permitida if p_role not in ('tenant_admin','therapist','secretary','patient') then - raise exception 'role inválida: %', p_role; + raise exception 'role inv??lida: %', p_role; end if; -- apenas admin do tenant (role real no banco) @@ -5596,10 +5422,10 @@ begin ) into v_is_admin; if not v_is_admin then - raise exception 'sem permissão: apenas admin da clínica pode adicionar membros'; + raise exception 'sem permiss??o: apenas admin da cl??nica pode adicionar membros'; end if; - -- acha usuário pelo e-mail no Supabase Auth + -- acha usu??rio pelo e-mail no Supabase Auth select u.id into v_target_uid from auth.users u @@ -5607,7 +5433,7 @@ begin limit 1; if v_target_uid is null then - raise exception 'nenhum usuário encontrado com este e-mail'; + raise exception 'nenhum usu??rio encontrado com este e-mail'; end if; -- cria ou reativa membro @@ -5624,10 +5450,8 @@ end; $$; -ALTER FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - -- --- Name: tenant_feature_allowed(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_feature_allowed(uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) RETURNS boolean @@ -5643,10 +5467,8 @@ CREATE FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key te $$; -ALTER FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) OWNER TO supabase_admin; - -- --- Name: tenant_feature_enabled(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_feature_enabled(uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) RETURNS boolean @@ -5661,10 +5483,8 @@ CREATE FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key te $$; -ALTER FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) OWNER TO supabase_admin; - -- --- Name: tenant_features_guard_with_plan(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_features_guard_with_plan(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_features_guard_with_plan() RETURNS trigger @@ -5673,7 +5493,7 @@ CREATE FUNCTION public.tenant_features_guard_with_plan() RETURNS trigger declare v_allowed boolean; begin - -- só valida quando está habilitando + -- s?? valida quando est?? habilitando if new.enabled is distinct from true then return new; end if; @@ -5689,7 +5509,7 @@ begin into v_allowed; if not v_allowed then - raise exception 'Feature % não permitida pelo plano atual do tenant %.', + raise exception 'Feature % n??o permitida pelo plano atual do tenant %.', new.feature_key, new.tenant_id using errcode = 'P0001'; end if; @@ -5699,10 +5519,8 @@ end; $$; -ALTER FUNCTION public.tenant_features_guard_with_plan() OWNER TO supabase_admin; - -- --- Name: tenant_has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) RETURNS boolean @@ -5726,10 +5544,8 @@ CREATE FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) RETURN $$; -ALTER FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) OWNER TO supabase_admin; - -- --- Name: tenant_invite_member_by_email(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_invite_member_by_email(uuid, text, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) RETURNS uuid @@ -5742,9 +5558,9 @@ declare v_token uuid; v_updated int; begin - -- validações básicas + -- valida????es b??sicas if p_tenant_id is null then - raise exception 'tenant_id inválido' using errcode = 'P0001'; + raise exception 'tenant_id inv??lido' using errcode = 'P0001'; end if; v_email := lower(trim(coalesce(p_email, ''))); @@ -5754,16 +5570,16 @@ begin -- role permitido (ajuste se quiser) if p_role is null or p_role not in ('therapist', 'secretary') then - raise exception 'Role inválido (use therapist/secretary)' using errcode = 'P0001'; + raise exception 'Role inv??lido (use therapist/secretary)' using errcode = 'P0001'; end if; - -- ✅ bloqueio: auto-convite + -- ??? bloqueio: auto-convite v_my_email := public.get_my_email(); if v_my_email is not null and v_email = v_my_email then - raise exception 'Você não pode convidar o seu próprio email.' using errcode = 'P0001'; + raise exception 'Voc?? n??o pode convidar o seu pr??prio email.' using errcode = 'P0001'; end if; - -- ✅ bloqueio: já é membro ativo do tenant + -- ??? bloqueio: j?? ?? membro ativo do tenant if exists ( select 1 from tenant_members tm @@ -5772,10 +5588,10 @@ begin and tm.status = 'active' and lower(au.email) = v_email ) then - raise exception 'Este email já está vinculado a esta clínica.' using errcode = 'P0001'; + raise exception 'Este email j?? est?? vinculado a esta cl??nica.' using errcode = 'P0001'; end if; - -- ✅ permissão: só admin do tenant pode convidar + -- ??? permiss??o: s?? admin do tenant pode convidar if not exists ( select 1 from tenant_members me @@ -5784,10 +5600,10 @@ begin and me.status = 'active' and me.role in ('tenant_admin','clinic_admin') ) then - raise exception 'Sem permissão para convidar membros.' using errcode = 'P0001'; + raise exception 'Sem permiss??o para convidar membros.' using errcode = 'P0001'; end if; - -- Gera token (reenvio simples / regeneração) + -- Gera token (reenvio simples / regenera????o) v_token := gen_random_uuid(); -- 1) tenta "regerar" um convite pendente existente (mesmo email) @@ -5805,7 +5621,7 @@ begin get diagnostics v_updated = row_count; - -- 2) se não atualizou nada, cria convite novo + -- 2) se n??o atualizou nada, cria convite novo if v_updated = 0 then insert into tenant_invites (tenant_id, email, role, token, created_at, expires_at) values (p_tenant_id, v_email, p_role, v_token, now(), now() + interval '7 days'); @@ -5816,10 +5632,8 @@ end; $$; -ALTER FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - -- --- Name: tenant_reactivate_member(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_reactivate_member(uuid, uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void @@ -5848,10 +5662,8 @@ end; $$; -ALTER FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - -- --- Name: tenant_remove_member(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_remove_member(uuid, uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void @@ -5874,7 +5686,7 @@ begin raise exception 'cannot_remove_self'; end if; - -- pega role atual do membro (se não existir, erro) + -- pega role atual do membro (se n??o existir, erro) select role into v_role from public.tenant_members where tenant_id = p_tenant_id @@ -5884,7 +5696,7 @@ begin raise exception 'membership_not_found'; end if; - -- trava: se for therapist, não pode remover com eventos futuros + -- trava: se for therapist, n??o pode remover com eventos futuros if v_role = 'therapist' then if exists ( select 1 @@ -5911,10 +5723,8 @@ end; $$; -ALTER FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - -- --- Name: tenant_remove_member_soft(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_remove_member_soft(uuid, uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) RETURNS void @@ -5947,10 +5757,8 @@ end; $$; -ALTER FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - -- --- Name: tenant_revoke_invite(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_revoke_invite(uuid, text, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) RETURNS void @@ -5987,10 +5795,8 @@ end; $$; -ALTER FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - -- --- Name: tenant_set_member_status(uuid, uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_set_member_status(uuid, uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) RETURNS void @@ -6029,10 +5835,8 @@ end; $$; -ALTER FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) OWNER TO supabase_admin; - -- --- Name: tenant_update_member_role(uuid, uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: tenant_update_member_role(uuid, uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) RETURNS void @@ -6056,7 +5860,7 @@ begin raise exception 'not_allowed'; end if; - -- evita o admin remover o próprio admin sem querer (opcional mas recomendado) + -- evita o admin remover o pr??prio admin sem querer (opcional mas recomendado) if p_member_user_id = auth.uid() and p_new_role <> 'tenant_admin' then raise exception 'cannot_demote_self'; end if; @@ -6073,10 +5877,8 @@ end; $$; -ALTER FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) OWNER TO supabase_admin; - -- --- Name: toggle_plan(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: toggle_plan(uuid); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.toggle_plan(owner uuid) RETURNS void @@ -6107,10 +5909,8 @@ end; $$; -ALTER FUNCTION public.toggle_plan(owner uuid) OWNER TO supabase_admin; - -- --- Name: transition_subscription(uuid, text, text, jsonb); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: transition_subscription(uuid, text, text, jsonb); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text DEFAULT NULL::text, p_metadata jsonb DEFAULT NULL::jsonb) RETURNS public.subscriptions @@ -6129,11 +5929,11 @@ begin where id = p_subscription_id; if not found then - raise exception 'Assinatura não encontrada'; + raise exception 'Assinatura n??o encontrada'; end if; -- ===================================================== - -- 🔐 BLOCO DE AUTORIZAÇÃO + -- ???? BLOCO DE AUTORIZA????O -- ===================================================== -- 1) SaaS admin pode tudo @@ -6166,11 +5966,11 @@ begin end if; if not v_is_allowed then - raise exception 'Sem permissão para transicionar esta assinatura'; + raise exception 'Sem permiss??o para transicionar esta assinatura'; end if; -- ===================================================== - -- 🧠 TRANSIÇÃO + -- ???? TRANSI????O -- ===================================================== update public.subscriptions @@ -6185,7 +5985,7 @@ begin returning * into v_sub; -- ===================================================== - -- 🧾 EVENT LOG + -- ???? EVENT LOG -- ===================================================== insert into public.subscription_events ( @@ -6218,10 +6018,8 @@ end; $$; -ALTER FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) OWNER TO supabase_admin; - -- --- Name: trg_fn_financial_records_auto_overdue(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: trg_fn_financial_records_auto_overdue(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.trg_fn_financial_records_auto_overdue() RETURNS trigger @@ -6240,10 +6038,118 @@ END; $$; -ALTER FUNCTION public.trg_fn_financial_records_auto_overdue() OWNER TO supabase_admin; +-- +-- Name: trg_fn_patient_risco_timeline(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.trg_fn_patient_risco_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF OLD.risco_elevado IS DISTINCT FROM NEW.risco_elevado THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, + evento_tipo, titulo, descricao, icone_cor, + gerado_por, ocorrido_em + ) VALUES ( + NEW.id, NEW.tenant_id, + CASE WHEN NEW.risco_elevado THEN 'risco_sinalizado' ELSE 'risco_removido' END, + CASE WHEN NEW.risco_elevado THEN 'Risco elevado sinalizado' ELSE 'Sinalização de risco removida' END, + NEW.risco_nota, + CASE WHEN NEW.risco_elevado THEN 'red' ELSE 'green' END, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + -- --- Name: unstick_notification_queue(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: trg_fn_patient_status_history(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.trg_fn_patient_status_history() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF (TG_OP = 'INSERT') OR (OLD.status IS DISTINCT FROM NEW.status) THEN + INSERT INTO public.patient_status_history ( + patient_id, tenant_id, + status_anterior, status_novo, + motivo, encaminhado_para, data_saida, + alterado_por, alterado_em + ) VALUES ( + NEW.id, NEW.tenant_id, + CASE WHEN TG_OP = 'INSERT' THEN NULL ELSE OLD.status END, + NEW.status, + NEW.motivo_saida, + NEW.encaminhado_para, + NEW.data_saida, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + + +-- +-- Name: trg_fn_patient_status_timeline(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.trg_fn_patient_status_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF (TG_OP = 'INSERT') OR (OLD.status IS DISTINCT FROM NEW.status) THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, + evento_tipo, titulo, descricao, icone_cor, + gerado_por, ocorrido_em + ) VALUES ( + NEW.id, NEW.tenant_id, + 'status_alterado', + 'Status alterado para ' || NEW.status, + CASE + WHEN TG_OP = 'INSERT' THEN 'Paciente cadastrado' + ELSE 'De ' || OLD.status || ' → ' || NEW.status || + CASE WHEN NEW.motivo_saida IS NOT NULL THEN ' · ' || NEW.motivo_saida ELSE '' END + END, + CASE NEW.status + WHEN 'Ativo' THEN 'green' + WHEN 'Alta' THEN 'blue' + WHEN 'Inativo' THEN 'gray' + WHEN 'Encaminhado' THEN 'amber' + WHEN 'Arquivado' THEN 'gray' + ELSE 'gray' + END, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + + +-- +-- Name: trg_set_updated_at(); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.trg_set_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN + NEW.updated_at = now(); + RETURN NEW; + END; + $$; + + +-- +-- Name: unstick_notification_queue(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.unstick_notification_queue() RETURNS integer @@ -6266,10 +6172,8 @@ END; $$; -ALTER FUNCTION public.unstick_notification_queue() OWNER TO supabase_admin; - -- --- Name: update_payment_settings_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: update_payment_settings_updated_at(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.update_payment_settings_updated_at() RETURNS trigger @@ -6282,10 +6186,8 @@ END; $$; -ALTER FUNCTION public.update_payment_settings_updated_at() OWNER TO supabase_admin; - -- --- Name: update_professional_pricing_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: update_professional_pricing_updated_at(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.update_professional_pricing_updated_at() RETURNS trigger @@ -6298,10 +6200,8 @@ END; $$; -ALTER FUNCTION public.update_professional_pricing_updated_at() OWNER TO supabase_admin; - -- --- Name: user_has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: user_has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.user_has_feature(_user_id uuid, _feature text) RETURNS boolean @@ -6317,10 +6217,8 @@ CREATE FUNCTION public.user_has_feature(_user_id uuid, _feature text) RETURNS bo $$; -ALTER FUNCTION public.user_has_feature(_user_id uuid, _feature text) OWNER TO supabase_admin; - -- --- Name: validate_support_session(text); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: validate_support_session(text); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.validate_support_session(p_token text) RETURNS json @@ -6352,10 +6250,8 @@ END; $$; -ALTER FUNCTION public.validate_support_session(p_token text) OWNER TO supabase_admin; - -- --- Name: whoami(); Type: FUNCTION; Schema: public; Owner: supabase_admin +-- Name: whoami(); Type: FUNCTION; Schema: public; Owner: - -- CREATE FUNCTION public.whoami() RETURNS TABLE(uid uuid, role text) @@ -6365,10 +6261,8 @@ CREATE FUNCTION public.whoami() RETURNS TABLE(uid uuid, role text) $$; -ALTER FUNCTION public.whoami() OWNER TO supabase_admin; - -- --- Name: apply_rls(jsonb, integer); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: apply_rls(jsonb, integer); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer DEFAULT (1024 * 1024)) RETURNS SETOF realtime.wal_rls @@ -6672,10 +6566,8 @@ end; $$; -ALTER FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) OWNER TO supabase_admin; - -- --- Name: broadcast_changes(text, text, text, text, text, record, record, text); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: broadcast_changes(text, text, text, text, text, record, record, text); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text DEFAULT 'ROW'::text) RETURNS void @@ -6703,10 +6595,8 @@ END; $$; -ALTER FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text) OWNER TO supabase_admin; - -- --- Name: build_prepared_statement_sql(text, regclass, realtime.wal_column[]); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: build_prepared_statement_sql(text, regclass, realtime.wal_column[]); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) RETURNS text @@ -6738,10 +6628,8 @@ CREATE FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name te $$; -ALTER FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) OWNER TO supabase_admin; - -- --- Name: cast(text, regtype); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: cast(text, regtype); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime."cast"(val text, type_ regtype) RETURNS jsonb @@ -6756,10 +6644,8 @@ CREATE FUNCTION realtime."cast"(val text, type_ regtype) RETURNS jsonb $$; -ALTER FUNCTION realtime."cast"(val text, type_ regtype) OWNER TO supabase_admin; - -- --- Name: check_equality_op(realtime.equality_op, regtype, text, text); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: check_equality_op(realtime.equality_op, regtype, text, text); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) RETURNS boolean @@ -6797,10 +6683,8 @@ CREATE FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtyp $$; -ALTER FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) OWNER TO supabase_admin; - -- --- Name: is_visible_through_filters(realtime.wal_column[], realtime.user_defined_filter[]); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: is_visible_through_filters(realtime.wal_column[], realtime.user_defined_filter[]); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) RETURNS boolean @@ -6835,10 +6719,8 @@ CREATE FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[ $_$; -ALTER FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) OWNER TO supabase_admin; - -- --- Name: list_changes(name, name, integer, integer); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: list_changes(name, name, integer, integer); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) RETURNS SETOF realtime.wal_rls @@ -6903,10 +6785,8 @@ CREATE FUNCTION realtime.list_changes(publication name, slot_name name, max_chan $$; -ALTER FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) OWNER TO supabase_admin; - -- --- Name: quote_wal2json(regclass); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: quote_wal2json(regclass); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.quote_wal2json(entity regclass) RETURNS text @@ -6943,10 +6823,8 @@ CREATE FUNCTION realtime.quote_wal2json(entity regclass) RETURNS text $$; -ALTER FUNCTION realtime.quote_wal2json(entity regclass) OWNER TO supabase_admin; - -- --- Name: send(jsonb, text, text, boolean); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: send(jsonb, text, text, boolean); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean DEFAULT true) RETURNS void @@ -6982,10 +6860,8 @@ END; $$; -ALTER FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean) OWNER TO supabase_admin; - -- --- Name: subscription_check_filters(); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: subscription_check_filters(); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.subscription_check_filters() RETURNS trigger @@ -7058,10 +6934,8 @@ CREATE FUNCTION realtime.subscription_check_filters() RETURNS trigger $$; -ALTER FUNCTION realtime.subscription_check_filters() OWNER TO supabase_admin; - -- --- Name: to_regrole(text); Type: FUNCTION; Schema: realtime; Owner: supabase_admin +-- Name: to_regrole(text); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.to_regrole(role_name text) RETURNS regrole @@ -7069,10 +6943,8 @@ CREATE FUNCTION realtime.to_regrole(role_name text) RETURNS regrole AS $$ select role_name::regrole $$; -ALTER FUNCTION realtime.to_regrole(role_name text) OWNER TO supabase_admin; - -- --- Name: topic(); Type: FUNCTION; Schema: realtime; Owner: supabase_realtime_admin +-- Name: topic(); Type: FUNCTION; Schema: realtime; Owner: - -- CREATE FUNCTION realtime.topic() RETURNS text @@ -7082,10 +6954,8 @@ select nullif(current_setting('realtime.topic', true), '')::text; $$; -ALTER FUNCTION realtime.topic() OWNER TO supabase_realtime_admin; - -- --- Name: can_insert_object(text, text, uuid, jsonb); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: can_insert_object(text, text, uuid, jsonb); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.can_insert_object(bucketid text, name text, owner uuid, metadata jsonb) RETURNS void @@ -7101,10 +6971,8 @@ END $$; -ALTER FUNCTION storage.can_insert_object(bucketid text, name text, owner uuid, metadata jsonb) OWNER TO supabase_storage_admin; - -- --- Name: enforce_bucket_name_length(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: enforce_bucket_name_length(); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.enforce_bucket_name_length() RETURNS trigger @@ -7119,10 +6987,8 @@ end; $$; -ALTER FUNCTION storage.enforce_bucket_name_length() OWNER TO supabase_storage_admin; - -- --- Name: extension(text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: extension(text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.extension(name text) RETURNS text @@ -7140,10 +7006,8 @@ END $$; -ALTER FUNCTION storage.extension(name text) OWNER TO supabase_storage_admin; - -- --- Name: filename(text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: filename(text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.filename(name text) RETURNS text @@ -7158,10 +7022,8 @@ END $$; -ALTER FUNCTION storage.filename(name text) OWNER TO supabase_storage_admin; - -- --- Name: foldername(text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: foldername(text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.foldername(name text) RETURNS text[] @@ -7176,10 +7038,8 @@ END $$; -ALTER FUNCTION storage.foldername(name text) OWNER TO supabase_storage_admin; - -- --- Name: get_common_prefix(text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: get_common_prefix(text, text, text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.get_common_prefix(p_key text, p_prefix text, p_delimiter text) RETURNS text @@ -7193,10 +7053,8 @@ END; $$; -ALTER FUNCTION storage.get_common_prefix(p_key text, p_prefix text, p_delimiter text) OWNER TO supabase_storage_admin; - -- --- Name: get_size_by_bucket(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: get_size_by_bucket(); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.get_size_by_bucket() RETURNS TABLE(size bigint, bucket_id text) @@ -7211,10 +7069,8 @@ END $$; -ALTER FUNCTION storage.get_size_by_bucket() OWNER TO supabase_storage_admin; - -- --- Name: list_multipart_uploads_with_delimiter(text, text, text, integer, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: list_multipart_uploads_with_delimiter(text, text, text, integer, text, text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.list_multipart_uploads_with_delimiter(bucket_id text, prefix_param text, delimiter_param text, max_keys integer DEFAULT 100, next_key_token text DEFAULT ''::text, next_upload_token text DEFAULT ''::text) RETURNS TABLE(key text, id text, created_at timestamp with time zone) @@ -7259,10 +7115,8 @@ END; $_$; -ALTER FUNCTION storage.list_multipart_uploads_with_delimiter(bucket_id text, prefix_param text, delimiter_param text, max_keys integer, next_key_token text, next_upload_token text) OWNER TO supabase_storage_admin; - -- --- Name: list_objects_with_delimiter(text, text, text, integer, text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: list_objects_with_delimiter(text, text, text, integer, text, text, text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.list_objects_with_delimiter(_bucket_id text, prefix_param text, delimiter_param text, max_keys integer DEFAULT 100, start_after text DEFAULT ''::text, next_token text DEFAULT ''::text, sort_order text DEFAULT 'asc'::text) RETURNS TABLE(name text, id uuid, metadata jsonb, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone) @@ -7476,10 +7330,8 @@ END; $_$; -ALTER FUNCTION storage.list_objects_with_delimiter(_bucket_id text, prefix_param text, delimiter_param text, max_keys integer, start_after text, next_token text, sort_order text) OWNER TO supabase_storage_admin; - -- --- Name: operation(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: operation(); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.operation() RETURNS text @@ -7491,10 +7343,8 @@ END; $$; -ALTER FUNCTION storage.operation() OWNER TO supabase_storage_admin; - -- --- Name: protect_delete(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: protect_delete(); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.protect_delete() RETURNS trigger @@ -7512,10 +7362,8 @@ END; $$; -ALTER FUNCTION storage.protect_delete() OWNER TO supabase_storage_admin; - -- --- Name: search(text, text, integer, integer, integer, text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: search(text, text, integer, integer, integer, text, text, text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.search(prefix text, bucketname text, limits integer DEFAULT 100, levels integer DEFAULT 1, offsets integer DEFAULT 0, search text DEFAULT ''::text, sortcolumn text DEFAULT 'name'::text, sortorder text DEFAULT 'asc'::text) RETURNS TABLE(name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) @@ -7768,10 +7616,8 @@ END; $_$; -ALTER FUNCTION storage.search(prefix text, bucketname text, limits integer, levels integer, offsets integer, search text, sortcolumn text, sortorder text) OWNER TO supabase_storage_admin; - -- --- Name: search_by_timestamp(text, text, integer, integer, text, text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: search_by_timestamp(text, text, integer, integer, text, text, text, text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.search_by_timestamp(p_prefix text, p_bucket_id text, p_limit integer, p_level integer, p_start_after text, p_sort_order text, p_sort_column text, p_sort_column_after text) RETURNS TABLE(key text, name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) @@ -7877,10 +7723,8 @@ END; $_$; -ALTER FUNCTION storage.search_by_timestamp(p_prefix text, p_bucket_id text, p_limit integer, p_level integer, p_start_after text, p_sort_order text, p_sort_column text, p_sort_column_after text) OWNER TO supabase_storage_admin; - -- --- Name: search_v2(text, text, integer, integer, text, text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: search_v2(text, text, integer, integer, text, text, text, text); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.search_v2(prefix text, bucket_name text, limits integer DEFAULT 100, levels integer DEFAULT 1, start_after text DEFAULT ''::text, sort_order text DEFAULT 'asc'::text, sort_column text DEFAULT 'name'::text, sort_column_after text DEFAULT ''::text) RETURNS TABLE(key text, name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) @@ -7939,10 +7783,8 @@ END; $$; -ALTER FUNCTION storage.search_v2(prefix text, bucket_name text, limits integer, levels integer, start_after text, sort_order text, sort_column text, sort_column_after text) OWNER TO supabase_storage_admin; - -- --- Name: update_updated_at_column(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin +-- Name: update_updated_at_column(); Type: FUNCTION; Schema: storage; Owner: - -- CREATE FUNCTION storage.update_updated_at_column() RETURNS trigger @@ -7955,10 +7797,8 @@ END; $$; -ALTER FUNCTION storage.update_updated_at_column() OWNER TO supabase_storage_admin; - -- --- Name: http_request(); Type: FUNCTION; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: http_request(); Type: FUNCTION; Schema: supabase_functions; Owner: - -- CREATE FUNCTION supabase_functions.http_request() RETURNS trigger @@ -8038,10 +7878,8 @@ CREATE FUNCTION supabase_functions.http_request() RETURNS trigger $$; -ALTER FUNCTION supabase_functions.http_request() OWNER TO supabase_functions_admin; - -- --- Name: extensions; Type: TABLE; Schema: _realtime; Owner: supabase_admin +-- Name: extensions; Type: TABLE; Schema: _realtime; Owner: - -- CREATE TABLE _realtime.extensions ( @@ -8054,10 +7892,8 @@ CREATE TABLE _realtime.extensions ( ); -ALTER TABLE _realtime.extensions OWNER TO supabase_admin; - -- --- Name: schema_migrations; Type: TABLE; Schema: _realtime; Owner: supabase_admin +-- Name: schema_migrations; Type: TABLE; Schema: _realtime; Owner: - -- CREATE TABLE _realtime.schema_migrations ( @@ -8066,10 +7902,8 @@ CREATE TABLE _realtime.schema_migrations ( ); -ALTER TABLE _realtime.schema_migrations OWNER TO supabase_admin; - -- --- Name: tenants; Type: TABLE; Schema: _realtime; Owner: supabase_admin +-- Name: tenants; Type: TABLE; Schema: _realtime; Owner: - -- CREATE TABLE _realtime.tenants ( @@ -8097,10 +7931,8 @@ CREATE TABLE _realtime.tenants ( ); -ALTER TABLE _realtime.tenants OWNER TO supabase_admin; - -- --- Name: audit_log_entries; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: audit_log_entries; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.audit_log_entries ( @@ -8112,17 +7944,15 @@ CREATE TABLE auth.audit_log_entries ( ); -ALTER TABLE auth.audit_log_entries OWNER TO supabase_auth_admin; - -- --- Name: TABLE audit_log_entries; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE audit_log_entries; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.audit_log_entries IS 'Auth: Audit trail for user actions.'; -- --- Name: flow_state; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: flow_state; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.flow_state ( @@ -8146,17 +7976,15 @@ CREATE TABLE auth.flow_state ( ); -ALTER TABLE auth.flow_state OWNER TO supabase_auth_admin; - -- --- Name: TABLE flow_state; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE flow_state; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.flow_state IS 'Stores metadata for all OAuth/SSO login flows'; -- --- Name: identities; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: identities; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.identities ( @@ -8172,24 +8000,22 @@ CREATE TABLE auth.identities ( ); -ALTER TABLE auth.identities OWNER TO supabase_auth_admin; - -- --- Name: TABLE identities; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE identities; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.identities IS 'Auth: Stores identities associated to a user.'; -- --- Name: COLUMN identities.email; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: COLUMN identities.email; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON COLUMN auth.identities.email IS 'Auth: Email is a generated column that references the optional email property in the identity_data'; -- --- Name: instances; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: instances; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.instances ( @@ -8201,17 +8027,15 @@ CREATE TABLE auth.instances ( ); -ALTER TABLE auth.instances OWNER TO supabase_auth_admin; - -- --- Name: TABLE instances; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE instances; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.instances IS 'Auth: Manages users across multiple sites.'; -- --- Name: mfa_amr_claims; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_amr_claims; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.mfa_amr_claims ( @@ -8223,17 +8047,15 @@ CREATE TABLE auth.mfa_amr_claims ( ); -ALTER TABLE auth.mfa_amr_claims OWNER TO supabase_auth_admin; - -- --- Name: TABLE mfa_amr_claims; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE mfa_amr_claims; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.mfa_amr_claims IS 'auth: stores authenticator method reference claims for multi factor authentication'; -- --- Name: mfa_challenges; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_challenges; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.mfa_challenges ( @@ -8247,17 +8069,15 @@ CREATE TABLE auth.mfa_challenges ( ); -ALTER TABLE auth.mfa_challenges OWNER TO supabase_auth_admin; - -- --- Name: TABLE mfa_challenges; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE mfa_challenges; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.mfa_challenges IS 'auth: stores metadata about challenge requests made'; -- --- Name: mfa_factors; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_factors; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.mfa_factors ( @@ -8277,24 +8097,22 @@ CREATE TABLE auth.mfa_factors ( ); -ALTER TABLE auth.mfa_factors OWNER TO supabase_auth_admin; - -- --- Name: TABLE mfa_factors; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE mfa_factors; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.mfa_factors IS 'auth: stores metadata about factors'; -- --- Name: COLUMN mfa_factors.last_webauthn_challenge_data; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: COLUMN mfa_factors.last_webauthn_challenge_data; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON COLUMN auth.mfa_factors.last_webauthn_challenge_data IS 'Stores the latest WebAuthn challenge data including attestation/assertion for customer verification'; -- --- Name: oauth_authorizations; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_authorizations; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.oauth_authorizations ( @@ -8326,10 +8144,8 @@ CREATE TABLE auth.oauth_authorizations ( ); -ALTER TABLE auth.oauth_authorizations OWNER TO supabase_auth_admin; - -- --- Name: oauth_client_states; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_client_states; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.oauth_client_states ( @@ -8340,17 +8156,15 @@ CREATE TABLE auth.oauth_client_states ( ); -ALTER TABLE auth.oauth_client_states OWNER TO supabase_auth_admin; - -- --- Name: TABLE oauth_client_states; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE oauth_client_states; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.oauth_client_states IS 'Stores OAuth states for third-party provider authentication flows where Supabase acts as the OAuth client.'; -- --- Name: oauth_clients; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_clients; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.oauth_clients ( @@ -8374,10 +8188,8 @@ CREATE TABLE auth.oauth_clients ( ); -ALTER TABLE auth.oauth_clients OWNER TO supabase_auth_admin; - -- --- Name: oauth_consents; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_consents; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.oauth_consents ( @@ -8393,10 +8205,8 @@ CREATE TABLE auth.oauth_consents ( ); -ALTER TABLE auth.oauth_consents OWNER TO supabase_auth_admin; - -- --- Name: one_time_tokens; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: one_time_tokens; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.one_time_tokens ( @@ -8411,10 +8221,8 @@ CREATE TABLE auth.one_time_tokens ( ); -ALTER TABLE auth.one_time_tokens OWNER TO supabase_auth_admin; - -- --- Name: refresh_tokens; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.refresh_tokens ( @@ -8430,17 +8238,15 @@ CREATE TABLE auth.refresh_tokens ( ); -ALTER TABLE auth.refresh_tokens OWNER TO supabase_auth_admin; - -- --- Name: TABLE refresh_tokens; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE refresh_tokens; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.refresh_tokens IS 'Auth: Store of tokens used to refresh JWT tokens once they expire.'; -- --- Name: refresh_tokens_id_seq; Type: SEQUENCE; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens_id_seq; Type: SEQUENCE; Schema: auth; Owner: - -- CREATE SEQUENCE auth.refresh_tokens_id_seq @@ -8451,17 +8257,15 @@ CREATE SEQUENCE auth.refresh_tokens_id_seq CACHE 1; -ALTER SEQUENCE auth.refresh_tokens_id_seq OWNER TO supabase_auth_admin; - -- --- Name: refresh_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: auth; Owner: - -- ALTER SEQUENCE auth.refresh_tokens_id_seq OWNED BY auth.refresh_tokens.id; -- --- Name: saml_providers; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_providers; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.saml_providers ( @@ -8480,17 +8284,15 @@ CREATE TABLE auth.saml_providers ( ); -ALTER TABLE auth.saml_providers OWNER TO supabase_auth_admin; - -- --- Name: TABLE saml_providers; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE saml_providers; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.saml_providers IS 'Auth: Manages SAML Identity Provider connections.'; -- --- Name: saml_relay_states; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_relay_states; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.saml_relay_states ( @@ -8506,17 +8308,15 @@ CREATE TABLE auth.saml_relay_states ( ); -ALTER TABLE auth.saml_relay_states OWNER TO supabase_auth_admin; - -- --- Name: TABLE saml_relay_states; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE saml_relay_states; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.saml_relay_states IS 'Auth: Contains SAML Relay State information for each Service Provider initiated login.'; -- --- Name: schema_migrations; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: schema_migrations; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.schema_migrations ( @@ -8524,17 +8324,15 @@ CREATE TABLE auth.schema_migrations ( ); -ALTER TABLE auth.schema_migrations OWNER TO supabase_auth_admin; - -- --- Name: TABLE schema_migrations; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE schema_migrations; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.schema_migrations IS 'Auth: Manages updates to the auth system.'; -- --- Name: sessions; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: sessions; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.sessions ( @@ -8557,38 +8355,36 @@ CREATE TABLE auth.sessions ( ); -ALTER TABLE auth.sessions OWNER TO supabase_auth_admin; - -- --- Name: TABLE sessions; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE sessions; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.sessions IS 'Auth: Stores session data associated to a user.'; -- --- Name: COLUMN sessions.not_after; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: COLUMN sessions.not_after; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON COLUMN auth.sessions.not_after IS 'Auth: Not after is a nullable column that contains a timestamp after which the session should be regarded as expired.'; -- --- Name: COLUMN sessions.refresh_token_hmac_key; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: COLUMN sessions.refresh_token_hmac_key; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON COLUMN auth.sessions.refresh_token_hmac_key IS 'Holds a HMAC-SHA256 key used to sign refresh tokens for this session.'; -- --- Name: COLUMN sessions.refresh_token_counter; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: COLUMN sessions.refresh_token_counter; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON COLUMN auth.sessions.refresh_token_counter IS 'Holds the ID (counter) of the last issued refresh token.'; -- --- Name: sso_domains; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_domains; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.sso_domains ( @@ -8601,17 +8397,15 @@ CREATE TABLE auth.sso_domains ( ); -ALTER TABLE auth.sso_domains OWNER TO supabase_auth_admin; - -- --- Name: TABLE sso_domains; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE sso_domains; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.sso_domains IS 'Auth: Manages SSO email address domain mapping to an SSO Identity Provider.'; -- --- Name: sso_providers; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_providers; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.sso_providers ( @@ -8624,24 +8418,22 @@ CREATE TABLE auth.sso_providers ( ); -ALTER TABLE auth.sso_providers OWNER TO supabase_auth_admin; - -- --- Name: TABLE sso_providers; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE sso_providers; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.sso_providers IS 'Auth: Manages SSO identity provider information; see saml_providers for SAML.'; -- --- Name: COLUMN sso_providers.resource_id; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: COLUMN sso_providers.resource_id; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON COLUMN auth.sso_providers.resource_id IS 'Auth: Uniquely identifies a SSO provider according to a user-chosen resource ID (case insensitive), useful in infrastructure as code.'; -- --- Name: users; Type: TABLE; Schema: auth; Owner: supabase_auth_admin +-- Name: users; Type: TABLE; Schema: auth; Owner: - -- CREATE TABLE auth.users ( @@ -8684,24 +8476,55 @@ CREATE TABLE auth.users ( ); -ALTER TABLE auth.users OWNER TO supabase_auth_admin; - -- --- Name: TABLE users; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: TABLE users; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON TABLE auth.users IS 'Auth: Stores user login data within a secure schema.'; -- --- Name: COLUMN users.is_sso_user; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: COLUMN users.is_sso_user; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON COLUMN auth.users.is_sso_user IS 'Auth: Set this column to true when the account comes from SSO. These accounts can have duplicate emails.'; -- --- Name: addon_credits; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: _db_migrations; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public._db_migrations ( + id integer NOT NULL, + filename text NOT NULL, + hash text NOT NULL, + category text DEFAULT 'migration'::text NOT NULL, + applied_at timestamp with time zone DEFAULT now() NOT NULL +); + + +-- +-- Name: _db_migrations_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public._db_migrations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: _db_migrations_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public._db_migrations_id_seq OWNED BY public._db_migrations.id; + + +-- +-- Name: addon_credits; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.addon_credits ( @@ -8728,17 +8551,15 @@ CREATE TABLE public.addon_credits ( ); -ALTER TABLE public.addon_credits OWNER TO supabase_admin; - -- --- Name: TABLE addon_credits; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: TABLE addon_credits; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON TABLE public.addon_credits IS 'Saldo de créditos de add-ons por tenant. Um registro por (tenant_id, addon_type).'; +COMMENT ON TABLE public.addon_credits IS 'Saldo de cr??ditos de add-ons por tenant. Um registro por (tenant_id, addon_type).'; -- --- Name: addon_products; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: addon_products; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.addon_products ( @@ -8761,17 +8582,15 @@ CREATE TABLE public.addon_products ( ); -ALTER TABLE public.addon_products OWNER TO supabase_admin; - -- --- Name: TABLE addon_products; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: TABLE addon_products; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON TABLE public.addon_products IS 'Catálogo de recursos extras vendidos pela plataforma (SMS, servidor, domínio, etc.)'; +COMMENT ON TABLE public.addon_products IS 'Cat??logo de recursos extras vendidos pela plataforma (SMS, servidor, dom??nio, etc.)'; -- --- Name: addon_transactions; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: addon_transactions; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.addon_transactions ( @@ -8796,17 +8615,15 @@ CREATE TABLE public.addon_transactions ( ); -ALTER TABLE public.addon_transactions OWNER TO supabase_admin; - -- --- Name: TABLE addon_transactions; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: TABLE addon_transactions; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON TABLE public.addon_transactions IS 'Histórico de todas as transações de créditos: compras, consumo, ajustes, reembolsos.'; +COMMENT ON TABLE public.addon_transactions IS 'Hist??rico de todas as transa????es de cr??ditos: compras, consumo, ajustes, reembolsos.'; -- --- Name: agenda_bloqueios; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agenda_bloqueios ( @@ -8828,10 +8645,8 @@ CREATE TABLE public.agenda_bloqueios ( ); -ALTER TABLE public.agenda_bloqueios OWNER TO supabase_admin; - -- --- Name: agenda_configuracoes; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agenda_configuracoes ( @@ -8870,7 +8685,9 @@ CREATE TABLE public.agenda_configuracoes ( tenant_id uuid, jornada_igual_todos boolean DEFAULT true, slot_mode text DEFAULT 'fixed'::text NOT NULL, + atendimento_mode text DEFAULT 'particular'::text, CONSTRAINT agenda_configuracoes_admin_slot_visual_minutos_check CHECK ((admin_slot_visual_minutos = ANY (ARRAY[5, 10, 15, 20, 30, 60]))), + CONSTRAINT agenda_configuracoes_atendimento_mode_check CHECK (((atendimento_mode IS NULL) OR (atendimento_mode = ANY (ARRAY['particular'::text, 'convenio'::text, 'ambos'::text])))), CONSTRAINT agenda_configuracoes_check CHECK (((usar_horario_admin_custom = false) OR ((admin_inicio_visualizacao IS NOT NULL) AND (admin_fim_visualizacao IS NOT NULL) AND (admin_fim_visualizacao > admin_inicio_visualizacao)))), CONSTRAINT agenda_configuracoes_duracao_padrao_minutos_check CHECK (((duracao_padrao_minutos >= 10) AND (duracao_padrao_minutos <= 240))), CONSTRAINT agenda_configuracoes_granularidade_min_check CHECK (((granularidade_min IS NULL) OR (granularidade_min = ANY (ARRAY[5, 10, 15, 20, 30, 45, 50, 60])))), @@ -8890,10 +8707,15 @@ CREATE TABLE public.agenda_configuracoes ( ); -ALTER TABLE public.agenda_configuracoes OWNER TO supabase_admin; +-- +-- Name: COLUMN agenda_configuracoes.atendimento_mode; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.agenda_configuracoes.atendimento_mode IS 'Modo de atendimento: particular | convenio | ambos'; + -- --- Name: agenda_eventos; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agenda_eventos ( @@ -8932,17 +8754,15 @@ CREATE TABLE public.agenda_eventos ( ); -ALTER TABLE public.agenda_eventos OWNER TO supabase_admin; - -- --- Name: COLUMN agenda_eventos.price; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN agenda_eventos.price; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.agenda_eventos.price IS 'Valor da sessão em BRL. Preenchido automaticamente pela tabela professional_pricing do profissional.'; +COMMENT ON COLUMN public.agenda_eventos.price IS 'Valor da sess??o em BRL. Preenchido automaticamente pela tabela professional_pricing do profissional.'; -- --- Name: agenda_excecoes; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agenda_excecoes ( @@ -8964,10 +8784,8 @@ CREATE TABLE public.agenda_excecoes ( ); -ALTER TABLE public.agenda_excecoes OWNER TO supabase_admin; - -- --- Name: agenda_online_slots; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agenda_online_slots ( @@ -8983,10 +8801,8 @@ CREATE TABLE public.agenda_online_slots ( ); -ALTER TABLE public.agenda_online_slots OWNER TO supabase_admin; - -- --- Name: agenda_online_slots_id_seq; Type: SEQUENCE; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots_id_seq; Type: SEQUENCE; Schema: public; Owner: - -- CREATE SEQUENCE public.agenda_online_slots_id_seq @@ -8997,17 +8813,15 @@ CREATE SEQUENCE public.agenda_online_slots_id_seq CACHE 1; -ALTER SEQUENCE public.agenda_online_slots_id_seq OWNER TO supabase_admin; - -- --- Name: agenda_online_slots_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - -- ALTER SEQUENCE public.agenda_online_slots_id_seq OWNED BY public.agenda_online_slots.id; -- --- Name: agenda_regras_semanais; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agenda_regras_semanais ( @@ -9027,10 +8841,8 @@ CREATE TABLE public.agenda_regras_semanais ( ); -ALTER TABLE public.agenda_regras_semanais OWNER TO supabase_admin; - -- --- Name: agenda_slots_bloqueados_semanais; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agenda_slots_bloqueados_semanais ( @@ -9047,10 +8859,8 @@ CREATE TABLE public.agenda_slots_bloqueados_semanais ( ); -ALTER TABLE public.agenda_slots_bloqueados_semanais OWNER TO supabase_admin; - -- --- Name: agenda_slots_regras; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agenda_slots_regras ( @@ -9075,10 +8885,8 @@ CREATE TABLE public.agenda_slots_regras ( ); -ALTER TABLE public.agenda_slots_regras OWNER TO supabase_admin; - -- --- Name: agendador_configuracoes; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agendador_configuracoes ( @@ -9125,24 +8933,22 @@ CREATE TABLE public.agendador_configuracoes ( ); -ALTER TABLE public.agendador_configuracoes OWNER TO supabase_admin; - -- --- Name: COLUMN agendador_configuracoes.pagamento_modo; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN agendador_configuracoes.pagamento_modo; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.agendador_configuracoes.pagamento_modo IS 'sem_pagamento | pagar_na_hora | pix_antecipado'; -- --- Name: COLUMN agendador_configuracoes.pagamento_metodos_visiveis; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN agendador_configuracoes.pagamento_metodos_visiveis; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.agendador_configuracoes.pagamento_metodos_visiveis IS 'Métodos exibidos ao paciente quando pagamento_modo = pagar_na_hora. Ex: {pix, deposito, dinheiro, cartao, convenio}'; +COMMENT ON COLUMN public.agendador_configuracoes.pagamento_metodos_visiveis IS 'M??todos exibidos ao paciente quando pagamento_modo = pagar_na_hora. Ex: {pix, deposito, dinheiro, cartao, convenio}'; -- --- Name: agendador_solicitacoes; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.agendador_solicitacoes ( @@ -9179,10 +8985,8 @@ CREATE TABLE public.agendador_solicitacoes ( ); -ALTER TABLE public.agendador_solicitacoes OWNER TO supabase_admin; - -- --- Name: billing_contracts; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: billing_contracts; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.billing_contracts ( @@ -9208,10 +9012,8 @@ CREATE TABLE public.billing_contracts ( ); -ALTER TABLE public.billing_contracts OWNER TO supabase_admin; - -- --- Name: commitment_services; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: commitment_services; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.commitment_services ( @@ -9231,10 +9033,8 @@ CREATE TABLE public.commitment_services ( ); -ALTER TABLE public.commitment_services OWNER TO supabase_admin; - -- --- Name: commitment_time_logs; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.commitment_time_logs ( @@ -9251,10 +9051,8 @@ CREATE TABLE public.commitment_time_logs ( ); -ALTER TABLE public.commitment_time_logs OWNER TO supabase_admin; - -- --- Name: company_profiles; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: company_profiles; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.company_profiles ( @@ -9283,20 +9081,16 @@ CREATE TABLE public.company_profiles ( ); -ALTER TABLE public.company_profiles OWNER TO supabase_admin; - -- --- Name: current_tenant_id; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: current_tenant_id; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.current_tenant_id AS SELECT current_setting('request.jwt.claim.tenant_id'::text, true) AS current_setting; -ALTER VIEW public.current_tenant_id OWNER TO supabase_admin; - -- --- Name: determined_commitment_fields; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.determined_commitment_fields ( @@ -9313,10 +9107,8 @@ CREATE TABLE public.determined_commitment_fields ( ); -ALTER TABLE public.determined_commitment_fields OWNER TO supabase_admin; - -- --- Name: determined_commitments; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: determined_commitments; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.determined_commitments ( @@ -9336,10 +9128,8 @@ CREATE TABLE public.determined_commitments ( ); -ALTER TABLE public.determined_commitments OWNER TO supabase_admin; - -- --- Name: dev_user_credentials; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: dev_user_credentials; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.dev_user_credentials ( @@ -9353,10 +9143,474 @@ CREATE TABLE public.dev_user_credentials ( ); -ALTER TABLE public.dev_user_credentials OWNER TO supabase_admin; +-- +-- Name: document_access_logs; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.document_access_logs ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + documento_id uuid NOT NULL, + tenant_id uuid NOT NULL, + acao text NOT NULL, + user_id uuid, + ip inet, + user_agent text, + acessado_em timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT dal_acao_check CHECK ((acao = ANY (ARRAY['visualizou'::text, 'baixou'::text, 'imprimiu'::text, 'compartilhou'::text, 'assinou'::text]))) +); + -- --- Name: email_layout_config; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: TABLE document_access_logs; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.document_access_logs IS 'Log imutavel de acessos a documentos. Conformidade CFP e LGPD. Sem UPDATE/DELETE.'; + + +-- +-- Name: COLUMN document_access_logs.acao; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_access_logs.acao IS 'visualizou|baixou|imprimiu|compartilhou|assinou.'; + + +-- +-- Name: document_generated; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.document_generated ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + template_id uuid NOT NULL, + patient_id uuid NOT NULL, + tenant_id uuid NOT NULL, + dados_preenchidos jsonb DEFAULT '{}'::jsonb NOT NULL, + pdf_path text NOT NULL, + storage_bucket text DEFAULT 'generated-docs'::text NOT NULL, + documento_id uuid, + gerado_por uuid NOT NULL, + gerado_em timestamp with time zone DEFAULT now() NOT NULL +); + + +-- +-- Name: TABLE document_generated; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.document_generated IS 'Registro de cada documento PDF gerado a partir de um template.'; + + +-- +-- Name: COLUMN document_generated.template_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_generated.template_id IS 'Template usado para gerar o documento.'; + + +-- +-- Name: COLUMN document_generated.dados_preenchidos; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_generated.dados_preenchidos IS 'Snapshot JSON dos dados usados no preenchimento. Permite auditoria futura.'; + + +-- +-- Name: COLUMN document_generated.pdf_path; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_generated.pdf_path IS 'Caminho do PDF gerado no Supabase Storage bucket.'; + + +-- +-- Name: COLUMN document_generated.documento_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_generated.documento_id IS 'FK opcional para documents — se o PDF gerado tambem foi registrado como documento do paciente.'; + + +-- +-- Name: COLUMN document_generated.gerado_por; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_generated.gerado_por IS 'Usuario que gerou o documento (auth.uid()).'; + + +-- +-- Name: document_share_links; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.document_share_links ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + documento_id uuid NOT NULL, + tenant_id uuid NOT NULL, + token text DEFAULT encode(extensions.gen_random_bytes(32), 'hex'::text) NOT NULL, + expira_em timestamp with time zone NOT NULL, + usos_max smallint DEFAULT 5 NOT NULL, + usos smallint DEFAULT 0 NOT NULL, + criado_por uuid NOT NULL, + criado_em timestamp with time zone DEFAULT now(), + ativo boolean DEFAULT true NOT NULL +); + + +-- +-- Name: TABLE document_share_links; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.document_share_links IS 'Links temporarios assinados para compartilhar documento com profissional externo.'; + + +-- +-- Name: COLUMN document_share_links.token; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_share_links.token IS 'Token unico gerado automaticamente (32 bytes hex).'; + + +-- +-- Name: COLUMN document_share_links.expira_em; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_share_links.expira_em IS 'Data/hora de expiracao do link.'; + + +-- +-- Name: COLUMN document_share_links.usos_max; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_share_links.usos_max IS 'Numero maximo de acessos permitidos.'; + + +-- +-- Name: COLUMN document_share_links.usos; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_share_links.usos IS 'Numero de vezes que o link ja foi acessado.'; + + +-- +-- Name: document_signatures; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.document_signatures ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + documento_id uuid NOT NULL, + tenant_id uuid NOT NULL, + signatario_tipo text NOT NULL, + signatario_id uuid, + signatario_nome text, + signatario_email text, + ordem smallint DEFAULT 1 NOT NULL, + status text DEFAULT 'pendente'::text NOT NULL, + ip inet, + user_agent text, + assinado_em timestamp with time zone, + hash_documento text, + criado_em timestamp with time zone DEFAULT now(), + atualizado_em timestamp with time zone DEFAULT now(), + CONSTRAINT ds_signatario_tipo_check CHECK ((signatario_tipo = ANY (ARRAY['paciente'::text, 'responsavel_legal'::text, 'terapeuta'::text]))), + CONSTRAINT ds_status_check CHECK ((status = ANY (ARRAY['pendente'::text, 'enviado'::text, 'assinado'::text, 'recusado'::text, 'expirado'::text]))) +); + + +-- +-- Name: TABLE document_signatures; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.document_signatures IS 'Assinaturas eletronicas de documentos. Cada signatario tem seu registro.'; + + +-- +-- Name: COLUMN document_signatures.signatario_tipo; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_signatures.signatario_tipo IS 'paciente|responsavel_legal|terapeuta.'; + + +-- +-- Name: COLUMN document_signatures.status; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_signatures.status IS 'pendente|enviado|assinado|recusado|expirado.'; + + +-- +-- Name: COLUMN document_signatures.ip; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_signatures.ip IS 'IP do signatario no momento da assinatura.'; + + +-- +-- Name: COLUMN document_signatures.hash_documento; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_signatures.hash_documento IS 'Hash SHA-256 do documento no momento da assinatura. Garante integridade.'; + + +-- +-- Name: document_templates; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.document_templates ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid, + owner_id uuid, + nome_template text NOT NULL, + tipo text DEFAULT 'outro'::text NOT NULL, + descricao text, + corpo_html text DEFAULT ''::text NOT NULL, + cabecalho_html text, + rodape_html text, + variaveis text[] DEFAULT '{}'::text[], + logo_url text, + is_global boolean DEFAULT false NOT NULL, + ativo boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT dt_tipo_check CHECK ((tipo = ANY (ARRAY['declaracao_comparecimento'::text, 'atestado_psicologico'::text, 'relatorio_acompanhamento'::text, 'recibo_pagamento'::text, 'termo_consentimento'::text, 'encaminhamento'::text, 'contrato_servicos'::text, 'tcle'::text, 'autorizacao_menor'::text, 'laudo_psicologico'::text, 'parecer_psicologico'::text, 'termo_sigilo'::text, 'declaracao_inicio_tratamento'::text, 'termo_alta'::text, 'tcle_online'::text, 'outro'::text]))) +); + + +-- +-- Name: TABLE document_templates; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.document_templates IS 'Templates de documentos para geracao automatica (declaracao, atestado, recibo etc.).'; + + +-- +-- Name: COLUMN document_templates.nome_template; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_templates.nome_template IS 'Nome do template. Ex: Declaracao de Comparecimento.'; + + +-- +-- Name: COLUMN document_templates.tipo; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_templates.tipo IS 'declaracao_comparecimento|atestado_psicologico|relatorio_acompanhamento|recibo_pagamento|termo_consentimento|encaminhamento|outro.'; + + +-- +-- Name: COLUMN document_templates.corpo_html; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_templates.corpo_html IS 'Corpo do template em HTML com variaveis {{nome_variavel}}.'; + + +-- +-- Name: COLUMN document_templates.cabecalho_html; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_templates.cabecalho_html IS 'HTML do cabecalho (logo, nome da clinica etc.).'; + + +-- +-- Name: COLUMN document_templates.rodape_html; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_templates.rodape_html IS 'HTML do rodape (CRP, endereco, contato etc.).'; + + +-- +-- Name: COLUMN document_templates.variaveis; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_templates.variaveis IS 'Array com nomes das variaveis usadas no template. Ex: {paciente_nome, data_sessao}.'; + + +-- +-- Name: COLUMN document_templates.logo_url; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_templates.logo_url IS 'URL do logo personalizado para o cabecalho do documento.'; + + +-- +-- Name: COLUMN document_templates.is_global; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.document_templates.is_global IS 'true = template padrao do sistema visivel para todos. false = template do tenant.'; + + +-- +-- Name: documents; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.documents ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + patient_id uuid NOT NULL, + bucket_path text NOT NULL, + storage_bucket text DEFAULT 'documents'::text NOT NULL, + nome_original text NOT NULL, + mime_type text, + tamanho_bytes bigint, + tipo_documento text DEFAULT 'outro'::text NOT NULL, + categoria text, + descricao text, + tags text[] DEFAULT '{}'::text[], + agenda_evento_id uuid, + session_note_id uuid, + visibilidade text DEFAULT 'privado'::text NOT NULL, + compartilhado_portal boolean DEFAULT false NOT NULL, + compartilhado_supervisor boolean DEFAULT false NOT NULL, + compartilhado_em timestamp with time zone, + expira_compartilhamento timestamp with time zone, + enviado_pelo_paciente boolean DEFAULT false NOT NULL, + status_revisao text DEFAULT 'aprovado'::text, + revisado_por uuid, + revisado_em timestamp with time zone, + uploaded_by uuid NOT NULL, + uploaded_at timestamp with time zone DEFAULT now() NOT NULL, + deleted_at timestamp with time zone, + deleted_by uuid, + retencao_ate timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT documents_status_revisao_check CHECK ((status_revisao = ANY (ARRAY['pendente'::text, 'aprovado'::text, 'rejeitado'::text]))), + CONSTRAINT documents_tipo_check CHECK ((tipo_documento = ANY (ARRAY['laudo'::text, 'receita'::text, 'exame'::text, 'termo_assinado'::text, 'relatorio_externo'::text, 'identidade'::text, 'convenio'::text, 'declaracao'::text, 'atestado'::text, 'recibo'::text, 'outro'::text]))), + CONSTRAINT documents_visibilidade_check CHECK ((visibilidade = ANY (ARRAY['privado'::text, 'compartilhado_supervisor'::text, 'compartilhado_portal'::text]))) +); + + +-- +-- Name: TABLE documents; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.documents IS 'Documentos e arquivos vinculados a pacientes. Armazenados no Supabase Storage.'; + + +-- +-- Name: COLUMN documents.owner_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.owner_id IS 'Terapeuta dono do documento (auth.uid()).'; + + +-- +-- Name: COLUMN documents.tenant_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.tenant_id IS 'Tenant do terapeuta.'; + + +-- +-- Name: COLUMN documents.patient_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.patient_id IS 'Paciente ao qual o documento pertence.'; + + +-- +-- Name: COLUMN documents.bucket_path; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.bucket_path IS 'Caminho do arquivo no Supabase Storage bucket.'; + + +-- +-- Name: COLUMN documents.storage_bucket; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.storage_bucket IS 'Nome do bucket no Storage. Default: documents.'; + + +-- +-- Name: COLUMN documents.nome_original; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.nome_original IS 'Nome original do arquivo enviado.'; + + +-- +-- Name: COLUMN documents.mime_type; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.mime_type IS 'MIME type do arquivo. Ex: application/pdf, image/jpeg.'; + + +-- +-- Name: COLUMN documents.tamanho_bytes; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.tamanho_bytes IS 'Tamanho do arquivo em bytes.'; + + +-- +-- Name: COLUMN documents.tipo_documento; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.tipo_documento IS 'Tipo: laudo|receita|exame|termo_assinado|relatorio_externo|identidade|convenio|declaracao|atestado|recibo|outro.'; + + +-- +-- Name: COLUMN documents.categoria; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.categoria IS 'Categoria livre para organizacao adicional.'; + + +-- +-- Name: COLUMN documents.tags; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.tags IS 'Tags livres para busca e filtro. Array de text.'; + + +-- +-- Name: COLUMN documents.visibilidade; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.visibilidade IS 'privado|compartilhado_supervisor|compartilhado_portal.'; + + +-- +-- Name: COLUMN documents.compartilhado_portal; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.compartilhado_portal IS 'true = visivel para o paciente no portal.'; + + +-- +-- Name: COLUMN documents.compartilhado_supervisor; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.compartilhado_supervisor IS 'true = visivel para o supervisor.'; + + +-- +-- Name: COLUMN documents.enviado_pelo_paciente; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.enviado_pelo_paciente IS 'true = upload feito pelo paciente via portal.'; + + +-- +-- Name: COLUMN documents.status_revisao; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.status_revisao IS 'pendente|aprovado|rejeitado — para uploads do paciente.'; + + +-- +-- Name: COLUMN documents.deleted_at; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.deleted_at IS 'Soft delete: data da exclusao. NULL = ativo.'; + + +-- +-- Name: COLUMN documents.retencao_ate; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.documents.retencao_ate IS 'LGPD/CFP: arquivo retido ate esta data mesmo apos soft delete.'; + + +-- +-- Name: email_layout_config; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.email_layout_config ( @@ -9369,10 +9623,8 @@ CREATE TABLE public.email_layout_config ( ); -ALTER TABLE public.email_layout_config OWNER TO supabase_admin; - -- --- Name: email_templates_global; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: email_templates_global; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.email_templates_global ( @@ -9391,10 +9643,8 @@ CREATE TABLE public.email_templates_global ( ); -ALTER TABLE public.email_templates_global OWNER TO supabase_admin; - -- --- Name: email_templates_tenant; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: email_templates_tenant; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.email_templates_tenant ( @@ -9412,10 +9662,8 @@ CREATE TABLE public.email_templates_tenant ( ); -ALTER TABLE public.email_templates_tenant OWNER TO supabase_admin; - -- --- Name: entitlements_invalidation; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: entitlements_invalidation; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.entitlements_invalidation ( @@ -9424,10 +9672,8 @@ CREATE TABLE public.entitlements_invalidation ( ); -ALTER TABLE public.entitlements_invalidation OWNER TO supabase_admin; - -- --- Name: features; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: features; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.features ( @@ -9440,17 +9686,15 @@ CREATE TABLE public.features ( ); -ALTER TABLE public.features OWNER TO supabase_admin; - -- --- Name: COLUMN features.descricao; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN features.descricao; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.features.descricao IS 'Descrição humana da feature (exibição no admin e documentação).'; +COMMENT ON COLUMN public.features.descricao IS 'Descri????o humana da feature (exibi????o no admin e documenta????o).'; -- --- Name: feriados; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: feriados; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.feriados ( @@ -9469,10 +9713,8 @@ CREATE TABLE public.feriados ( ); -ALTER TABLE public.feriados OWNER TO supabase_admin; - -- --- Name: financial_categories; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: financial_categories; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.financial_categories ( @@ -9487,10 +9729,8 @@ CREATE TABLE public.financial_categories ( ); -ALTER TABLE public.financial_categories OWNER TO supabase_admin; - -- --- Name: financial_exceptions; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.financial_exceptions ( @@ -9509,10 +9749,8 @@ CREATE TABLE public.financial_exceptions ( ); -ALTER TABLE public.financial_exceptions OWNER TO supabase_admin; - -- --- Name: global_notices; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: global_notices; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.global_notices ( @@ -9552,10 +9790,8 @@ CREATE TABLE public.global_notices ( ); -ALTER TABLE public.global_notices OWNER TO supabase_admin; - -- --- Name: insurance_plan_services; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: insurance_plan_services; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.insurance_plan_services ( @@ -9569,10 +9805,8 @@ CREATE TABLE public.insurance_plan_services ( ); -ALTER TABLE public.insurance_plan_services OWNER TO supabase_admin; - -- --- Name: insurance_plans; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: insurance_plans; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.insurance_plans ( @@ -9588,10 +9822,8 @@ CREATE TABLE public.insurance_plans ( ); -ALTER TABLE public.insurance_plans OWNER TO supabase_admin; - -- --- Name: login_carousel_slides; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: login_carousel_slides; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.login_carousel_slides ( @@ -9606,10 +9838,130 @@ CREATE TABLE public.login_carousel_slides ( ); -ALTER TABLE public.login_carousel_slides OWNER TO supabase_admin; +-- +-- Name: medicos; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.medicos ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + nome text NOT NULL, + crm text, + especialidade text, + telefone_profissional text, + telefone_pessoal text, + email text, + clinica text, + cidade text, + estado text DEFAULT 'SP'::text, + observacoes text, + ativo boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + -- --- Name: module_features; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: TABLE medicos; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.medicos IS 'Médicos e profissionais de referência cadastrados pelo terapeuta.'; + + +-- +-- Name: COLUMN medicos.owner_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.owner_id IS 'Terapeuta dono do cadastro (auth.uid()).'; + + +-- +-- Name: COLUMN medicos.tenant_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.tenant_id IS 'Tenant do terapeuta.'; + + +-- +-- Name: COLUMN medicos.nome; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.nome IS 'Nome completo do médico/profissional.'; + + +-- +-- Name: COLUMN medicos.crm; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.crm IS 'CRM com UF. Ex: 123456/SP. Único por owner_id.'; + + +-- +-- Name: COLUMN medicos.especialidade; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.especialidade IS 'Especialidade médica. Ex: Psiquiatria, Neurologia.'; + + +-- +-- Name: COLUMN medicos.telefone_profissional; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.telefone_profissional IS 'Telefone do consultório ou clínica.'; + + +-- +-- Name: COLUMN medicos.telefone_pessoal; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.telefone_pessoal IS 'Telefone pessoal / WhatsApp. Campo sensível.'; + + +-- +-- Name: COLUMN medicos.email; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.email IS 'E-mail profissional.'; + + +-- +-- Name: COLUMN medicos.clinica; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.clinica IS 'Nome da clínica ou hospital onde atua.'; + + +-- +-- Name: COLUMN medicos.cidade; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.cidade IS 'Cidade de atuação.'; + + +-- +-- Name: COLUMN medicos.estado; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.estado IS 'UF de atuação. Default SP.'; + + +-- +-- Name: COLUMN medicos.observacoes; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.observacoes IS 'Notas internas do terapeuta sobre o médico.'; + + +-- +-- Name: COLUMN medicos.ativo; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.medicos.ativo IS 'Soft delete: false oculta da listagem.'; + + +-- +-- Name: module_features; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.module_features ( @@ -9621,10 +9973,8 @@ CREATE TABLE public.module_features ( ); -ALTER TABLE public.module_features OWNER TO supabase_admin; - -- --- Name: modules; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: modules; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.modules ( @@ -9637,10 +9987,8 @@ CREATE TABLE public.modules ( ); -ALTER TABLE public.modules OWNER TO supabase_admin; - -- --- Name: notice_dismissals; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: notice_dismissals; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.notice_dismissals ( @@ -9652,10 +10000,8 @@ CREATE TABLE public.notice_dismissals ( ); -ALTER TABLE public.notice_dismissals OWNER TO supabase_admin; - -- --- Name: notification_channels; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: notification_channels; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.notification_channels ( @@ -9674,16 +10020,70 @@ CREATE TABLE public.notification_channels ( created_at timestamp with time zone DEFAULT now() NOT NULL, updated_at timestamp with time zone DEFAULT now() NOT NULL, deleted_at timestamp with time zone, + twilio_subaccount_sid text, + twilio_phone_number text, + twilio_phone_sid text, + webhook_url text, + cost_per_message_usd numeric(8,6) DEFAULT 0, + price_per_message_brl numeric(8,4) DEFAULT 0, + provisioned_at timestamp with time zone, CONSTRAINT notification_channels_channel_check CHECK ((channel = ANY (ARRAY['whatsapp'::text, 'email'::text, 'sms'::text]))), CONSTRAINT notification_channels_connection_status_check CHECK ((connection_status = ANY (ARRAY['connected'::text, 'disconnected'::text, 'connecting'::text, 'qr_pending'::text, 'error'::text]))), CONSTRAINT notification_channels_provider_check CHECK ((provider = ANY (ARRAY['evolution_api'::text, 'meta_official'::text, 'twilio'::text, 'zenvia'::text, 'sendgrid'::text, 'resend'::text, 'smtp'::text, 'zapi'::text]))) ); -ALTER TABLE public.notification_channels OWNER TO supabase_admin; +-- +-- Name: COLUMN notification_channels.twilio_subaccount_sid; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.notification_channels.twilio_subaccount_sid IS 'SID da subconta Twilio criada para este tenant'; + -- --- Name: notification_logs; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: COLUMN notification_channels.twilio_phone_number; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.notification_channels.twilio_phone_number IS 'Número WhatsApp provisionado (E.164, ex: +5511999990000)'; + + +-- +-- Name: COLUMN notification_channels.twilio_phone_sid; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.notification_channels.twilio_phone_sid IS 'SID do número de telefone na subconta Twilio'; + + +-- +-- Name: COLUMN notification_channels.webhook_url; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.notification_channels.webhook_url IS 'URL do webhook configurada na Twilio para receber callbacks de status'; + + +-- +-- Name: COLUMN notification_channels.cost_per_message_usd; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.notification_channels.cost_per_message_usd IS 'Custo real Twilio por mensagem WhatsApp (USD)'; + + +-- +-- Name: COLUMN notification_channels.price_per_message_brl; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.notification_channels.price_per_message_brl IS 'Valor cobrado do tenant por mensagem (BRL, inclui margem SaaS)'; + + +-- +-- Name: COLUMN notification_channels.provisioned_at; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.notification_channels.provisioned_at IS 'Timestamp do provisionamento da subconta'; + + +-- +-- Name: notification_logs; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.notification_logs ( @@ -9716,10 +10116,8 @@ CREATE TABLE public.notification_logs ( ); -ALTER TABLE public.notification_logs OWNER TO supabase_admin; - -- --- Name: notification_preferences; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: notification_preferences; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.notification_preferences ( @@ -9744,10 +10142,8 @@ CREATE TABLE public.notification_preferences ( ); -ALTER TABLE public.notification_preferences OWNER TO supabase_admin; - -- --- Name: notification_queue; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: notification_queue; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.notification_queue ( @@ -9777,10 +10173,8 @@ CREATE TABLE public.notification_queue ( ); -ALTER TABLE public.notification_queue OWNER TO supabase_admin; - -- --- Name: notification_schedules; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: notification_schedules; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.notification_schedules ( @@ -9808,10 +10202,8 @@ CREATE TABLE public.notification_schedules ( ); -ALTER TABLE public.notification_schedules OWNER TO supabase_admin; - -- --- Name: notification_templates; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: notification_templates; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.notification_templates ( @@ -9841,10 +10233,8 @@ CREATE TABLE public.notification_templates ( ); -ALTER TABLE public.notification_templates OWNER TO supabase_admin; - -- --- Name: notifications; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: notifications; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.notifications ( @@ -9862,10 +10252,8 @@ CREATE TABLE public.notifications ( ); -ALTER TABLE public.notifications OWNER TO supabase_admin; - -- --- Name: plan_features; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: plan_features; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.plan_features ( @@ -9877,10 +10265,8 @@ CREATE TABLE public.plan_features ( ); -ALTER TABLE public.plan_features OWNER TO supabase_admin; - -- --- Name: tenant_modules; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: tenant_modules; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.tenant_modules ( @@ -9896,10 +10282,8 @@ CREATE TABLE public.tenant_modules ( ); -ALTER TABLE public.tenant_modules OWNER TO supabase_admin; - -- --- Name: owner_feature_entitlements; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: owner_feature_entitlements; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.owner_feature_entitlements AS @@ -9931,10 +10315,8 @@ CREATE VIEW public.owner_feature_entitlements AS GROUP BY owner_id, feature_key; -ALTER VIEW public.owner_feature_entitlements OWNER TO supabase_admin; - -- --- Name: owner_users; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: owner_users; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.owner_users ( @@ -9945,10 +10327,53 @@ CREATE TABLE public.owner_users ( ); -ALTER TABLE public.owner_users OWNER TO supabase_admin; +-- +-- Name: patient_contacts; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.patient_contacts ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + patient_id uuid NOT NULL, + tenant_id uuid NOT NULL, + nome text NOT NULL, + tipo text NOT NULL, + relacao text, + telefone text, + email text, + cpf text, + especialidade text, + registro_profissional text, + is_primario boolean DEFAULT false NOT NULL, + ativo boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT patient_contacts_tipo_check CHECK ((tipo = ANY (ARRAY['emergencia'::text, 'responsavel_legal'::text, 'profissional_saude'::text, 'outro'::text]))) +); + -- --- Name: patient_discounts; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: TABLE patient_contacts; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.patient_contacts IS 'Contatos vinculados ao paciente: emergência, responsável legal, outros profissionais de saúde'; + + +-- +-- Name: COLUMN patient_contacts.tipo; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patient_contacts.tipo IS 'Categoria do contato: emergencia | responsavel_legal | profissional_saude | outro'; + + +-- +-- Name: COLUMN patient_contacts.is_primario; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patient_contacts.is_primario IS 'Contato de emergência principal — exibido em destaque no cadastro'; + + +-- +-- Name: patient_discounts; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.patient_discounts ( @@ -9966,10 +10391,8 @@ CREATE TABLE public.patient_discounts ( ); -ALTER TABLE public.patient_discounts OWNER TO supabase_admin; - -- --- Name: patient_group_patient; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.patient_group_patient ( @@ -9980,10 +10403,8 @@ CREATE TABLE public.patient_group_patient ( ); -ALTER TABLE public.patient_group_patient OWNER TO supabase_admin; - -- --- Name: patient_groups; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: patient_groups; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.patient_groups ( @@ -10001,10 +10422,8 @@ CREATE TABLE public.patient_groups ( ); -ALTER TABLE public.patient_groups OWNER TO supabase_admin; - -- --- Name: patient_intake_requests; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.patient_intake_requests ( @@ -10049,10 +10468,8 @@ CREATE TABLE public.patient_intake_requests ( ); -ALTER TABLE public.patient_intake_requests OWNER TO supabase_admin; - -- --- Name: patient_invites; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: patient_invites; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.patient_invites ( @@ -10068,10 +10485,8 @@ CREATE TABLE public.patient_invites ( ); -ALTER TABLE public.patient_invites OWNER TO supabase_admin; - -- --- Name: patient_patient_tag; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.patient_patient_tag ( @@ -10083,10 +10498,75 @@ CREATE TABLE public.patient_patient_tag ( ); -ALTER TABLE public.patient_patient_tag OWNER TO supabase_admin; +-- +-- Name: patient_status_history; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.patient_status_history ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + patient_id uuid NOT NULL, + tenant_id uuid NOT NULL, + status_anterior text, + status_novo text NOT NULL, + motivo text, + encaminhado_para text, + data_saida date, + alterado_por uuid, + alterado_em timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT psh_status_novo_check CHECK ((status_novo = ANY (ARRAY['Ativo'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text]))) +); + -- --- Name: patient_tags; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: TABLE patient_status_history; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.patient_status_history IS 'Histórico imutável de todas as mudanças de status do paciente — não editar, apenas inserir'; + + +-- +-- Name: patient_support_contacts; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.patient_support_contacts ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + patient_id uuid NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + nome text, + relacao text, + tipo text, + telefone text, + email text, + is_primario boolean DEFAULT false NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + + +-- +-- Name: TABLE patient_support_contacts; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.patient_support_contacts IS 'Rede de suporte do paciente. Exibida no card "Contatos & rede de suporte" do perfil.'; + + +-- +-- Name: COLUMN patient_support_contacts.tipo; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patient_support_contacts.tipo IS 'emergencia | familiar | profissional_saude | amigo | outro'; + + +-- +-- Name: COLUMN patient_support_contacts.is_primario; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patient_support_contacts.is_primario IS 'true = badge vermelho "emergência" no perfil do paciente.'; + + +-- +-- Name: patient_tags; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.patient_tags ( @@ -10101,10 +10581,50 @@ CREATE TABLE public.patient_tags ( ); -ALTER TABLE public.patient_tags OWNER TO supabase_admin; +-- +-- Name: patient_timeline; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.patient_timeline ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + patient_id uuid NOT NULL, + tenant_id uuid NOT NULL, + evento_tipo text NOT NULL, + titulo text NOT NULL, + descricao text, + icone_cor text DEFAULT 'gray'::text, + link_ref_tipo text, + link_ref_id uuid, + gerado_por uuid, + ocorrido_em timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT pt_evento_tipo_check CHECK ((evento_tipo = ANY (ARRAY['primeira_sessao'::text, 'sessao_realizada'::text, 'sessao_cancelada'::text, 'falta'::text, 'status_alterado'::text, 'risco_sinalizado'::text, 'risco_removido'::text, 'documento_assinado'::text, 'documento_adicionado'::text, 'escala_respondida'::text, 'escala_enviada'::text, 'pagamento_vencido'::text, 'pagamento_recebido'::text, 'tarefa_combinada'::text, 'contato_adicionado'::text, 'prontuario_editado'::text, 'nota_adicionada'::text, 'manual'::text]))), + CONSTRAINT pt_icone_cor_check CHECK ((icone_cor = ANY (ARRAY['green'::text, 'blue'::text, 'amber'::text, 'red'::text, 'gray'::text, 'purple'::text]))) +); + -- --- Name: patients; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: TABLE patient_timeline; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.patient_timeline IS 'Feed cronológico de eventos do paciente — alimentado por triggers e inserções manuais'; + + +-- +-- Name: COLUMN patient_timeline.link_ref_tipo; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patient_timeline.link_ref_tipo IS 'Tipo da entidade referenciada (polimórfico): agenda_evento | financial_record | documento | escala'; + + +-- +-- Name: COLUMN patient_timeline.link_ref_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patient_timeline.link_ref_id IS 'ID da entidade referenciada — sem FK formal para suportar múltiplos tipos'; + + +-- +-- Name: patients; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.patients ( @@ -10155,25 +10675,185 @@ CREATE TABLE public.patients ( user_id uuid, patient_scope text DEFAULT 'clinic'::text NOT NULL, therapist_member_id uuid, + nome_social text, + pronomes text, + etnia text, + religiao text, + faixa_renda text, + canal_preferido text DEFAULT 'whatsapp'::text, + horario_contato_inicio time without time zone DEFAULT '08:00:00'::time without time zone, + horario_contato_fim time without time zone DEFAULT '20:00:00'::time without time zone, + idioma text DEFAULT 'pt-BR'::text, + origem text, + metodo_pagamento_preferido text, + motivo_saida text, + data_saida date, + encaminhado_para text, + risco_elevado boolean DEFAULT false NOT NULL, + risco_nota text, + risco_sinalizado_em timestamp with time zone, + risco_sinalizado_por uuid, + horario_contato text, + convenio text, + convenio_id uuid, CONSTRAINT cpf_responsavel_format_check CHECK (((cpf_responsavel IS NULL) OR (cpf_responsavel ~ '^\d{11}$'::text))), CONSTRAINT patients_cpf_format_check CHECK (((cpf IS NULL) OR (cpf ~ '^\d{11}$'::text))), - CONSTRAINT patients_patient_scope_check CHECK ((patient_scope = ANY (ARRAY['clinic'::text, 'therapist'::text]))), - CONSTRAINT patients_status_check CHECK ((status = ANY (ARRAY['Ativo'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text]))), - CONSTRAINT patients_therapist_scope_consistency CHECK ((((patient_scope = 'clinic'::text) AND (therapist_member_id IS NULL)) OR ((patient_scope = 'therapist'::text) AND (therapist_member_id IS NOT NULL)))) + CONSTRAINT patients_faixa_renda_check CHECK (((faixa_renda IS NULL) OR (faixa_renda = ANY (ARRAY['ate_1sm'::text, '1_3sm'::text, '3_6sm'::text, '6_10sm'::text, 'acima_10sm'::text, 'nao_informado'::text])))), + CONSTRAINT patients_metodo_pagamento_check CHECK (((metodo_pagamento_preferido IS NULL) OR (metodo_pagamento_preferido = ANY (ARRAY['pix'::text, 'cartao'::text, 'dinheiro'::text, 'deposito'::text, 'convenio'::text])))), + CONSTRAINT patients_risco_consistency_check CHECK (((risco_elevado = false) OR ((risco_elevado = true) AND (risco_nota IS NOT NULL) AND (risco_sinalizado_por IS NOT NULL)))), + CONSTRAINT patients_status_check CHECK ((status = ANY (ARRAY['Ativo'::text, 'Em espera'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text]))) ); -ALTER TABLE public.patients OWNER TO supabase_admin; - -- --- Name: COLUMN patients.avatar_url; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN patients.avatar_url; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.patients.avatar_url IS 'URL pública da imagem de avatar armazenada no Supabase Storage'; +COMMENT ON COLUMN public.patients.avatar_url IS 'URL p??blica da imagem de avatar armazenada no Supabase Storage'; -- --- Name: payment_settings; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: COLUMN patients.nome_social; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.nome_social IS 'Nome social / como prefere ser chamado(a) no atendimento.'; + + +-- +-- Name: COLUMN patients.pronomes; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.pronomes IS 'Pronomes de tratamento. Ex: ela/dela, ele/dele. Exibido no header do perfil.'; + + +-- +-- Name: COLUMN patients.etnia; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.etnia IS 'Etnia / raça autodeclarada. Exibida no card "Dados pessoais".'; + + +-- +-- Name: COLUMN patients.religiao; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.religiao IS 'Religião ou espiritualidade (opcional, relevante clinicamente)'; + + +-- +-- Name: COLUMN patients.faixa_renda; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.faixa_renda IS 'Faixa de renda em salários mínimos — usado para precificação solidária'; + + +-- +-- Name: COLUMN patients.canal_preferido; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.canal_preferido IS 'Canal preferido de contato. Ex: WhatsApp, Telefone, E-mail.'; + + +-- +-- Name: COLUMN patients.horario_contato_inicio; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.horario_contato_inicio IS 'Início da janela de horário preferida para contato'; + + +-- +-- Name: COLUMN patients.horario_contato_fim; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.horario_contato_fim IS 'Fim da janela de horário preferida para contato'; + + +-- +-- Name: COLUMN patients.origem; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.origem IS 'Como o paciente chegou: indicacao, agendador, redes_sociais, encaminhamento, outro'; + + +-- +-- Name: COLUMN patients.metodo_pagamento_preferido; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.metodo_pagamento_preferido IS 'Método de pagamento preferido. Ex: PIX, Cartão crédito. Exibido no card Origem.'; + + +-- +-- Name: COLUMN patients.motivo_saida; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.motivo_saida IS 'Motivo de encerramento do acompanhamento. Exibido no card Origem quando preenchido.'; + + +-- +-- Name: COLUMN patients.data_saida; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.data_saida IS 'Data em que o paciente foi desligado/encaminhado'; + + +-- +-- Name: COLUMN patients.encaminhado_para; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.encaminhado_para IS 'Nome ou serviço para onde o paciente foi encaminhado'; + + +-- +-- Name: COLUMN patients.risco_elevado; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.risco_elevado IS 'Flag de atenção clínica — exibe alerta no topo do cadastro e prontuário'; + + +-- +-- Name: COLUMN patients.risco_nota; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.risco_nota IS 'Descrição do risco (obrigatória quando risco_elevado = true)'; + + +-- +-- Name: COLUMN patients.risco_sinalizado_em; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.risco_sinalizado_em IS 'Timestamp em que o risco foi sinalizado'; + + +-- +-- Name: COLUMN patients.risco_sinalizado_por; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.risco_sinalizado_por IS 'Usuário que sinalizou o risco'; + + +-- +-- Name: COLUMN patients.horario_contato; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.horario_contato IS 'Horário preferido para contato. Ex: 08h–18h.'; + + +-- +-- Name: COLUMN patients.convenio; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.convenio IS 'Nome do convênio para exibição (badge azul no header). Derivado de convenio_id.'; + + +-- +-- Name: COLUMN patients.convenio_id; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.patients.convenio_id IS 'FK para insurance_plans.id. Vincula o paciente ao convênio cadastrado.'; + + +-- +-- Name: payment_settings; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.payment_settings ( @@ -10202,10 +10882,8 @@ CREATE TABLE public.payment_settings ( ); -ALTER TABLE public.payment_settings OWNER TO supabase_admin; - -- --- Name: plan_prices; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: plan_prices; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.plan_prices ( @@ -10226,17 +10904,15 @@ CREATE TABLE public.plan_prices ( ); -ALTER TABLE public.plan_prices OWNER TO supabase_admin; - -- --- Name: TABLE plan_prices; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: TABLE plan_prices; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON TABLE public.plan_prices IS 'Histórico de preços por plano (fonte: manual/gateway).'; +COMMENT ON TABLE public.plan_prices IS 'Hist??rico de pre??os por plano (fonte: manual/gateway).'; -- --- Name: plan_public; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: plan_public; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.plan_public ( @@ -10252,17 +10928,15 @@ CREATE TABLE public.plan_public ( ); -ALTER TABLE public.plan_public OWNER TO supabase_admin; - -- --- Name: TABLE plan_public; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: TABLE plan_public; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON TABLE public.plan_public IS 'Configuração de vitrine (página pública) dos planos.'; +COMMENT ON TABLE public.plan_public IS 'Configura????o de vitrine (p??gina p??blica) dos planos.'; -- --- Name: plan_public_bullets; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: plan_public_bullets; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.plan_public_bullets ( @@ -10275,10 +10949,8 @@ CREATE TABLE public.plan_public_bullets ( ); -ALTER TABLE public.plan_public_bullets OWNER TO supabase_admin; - -- --- Name: plans; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: plans; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.plans ( @@ -10297,31 +10969,29 @@ CREATE TABLE public.plans ( ); -ALTER TABLE public.plans OWNER TO supabase_admin; - -- --- Name: COLUMN plans.name; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN plans.name; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.plans.name IS 'Nome interno do plano (admin). A key é técnica/imutável.'; +COMMENT ON COLUMN public.plans.name IS 'Nome interno do plano (admin). A key ?? t??cnica/imut??vel.'; -- --- Name: COLUMN plans.target; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN plans.target; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.plans.target IS 'Público-alvo do plano: patient, therapist ou clinic.'; +COMMENT ON COLUMN public.plans.target IS 'P??blico-alvo do plano: patient, therapist ou clinic.'; -- --- Name: COLUMN plans.max_supervisees; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN plans.max_supervisees; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.plans.max_supervisees IS 'Limite de terapeutas que podem ser supervisionados. Apenas para planos target=supervisor. NULL = sem limite.'; -- --- Name: professional_pricing; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: professional_pricing; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.professional_pricing ( @@ -10336,17 +11006,15 @@ CREATE TABLE public.professional_pricing ( ); -ALTER TABLE public.professional_pricing OWNER TO supabase_admin; - -- --- Name: TABLE professional_pricing; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: TABLE professional_pricing; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON TABLE public.professional_pricing IS 'DEPRECATED: substituída por public.services. Manter até próxima release de limpeza.'; +COMMENT ON TABLE public.professional_pricing IS 'DEPRECATED: substitu??da por public.services. Manter at?? pr??xima release de limpeza.'; -- --- Name: profiles; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: profiles; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.profiles ( @@ -10374,106 +11042,105 @@ CREATE TABLE public.profiles ( social_facebook text, social_x text, social_custom jsonb DEFAULT '[]'::jsonb NOT NULL, + tenant_id uuid, CONSTRAINT profiles_account_type_check CHECK ((account_type = ANY (ARRAY['free'::text, 'patient'::text, 'therapist'::text, 'clinic'::text]))), CONSTRAINT profiles_role_check CHECK ((role = ANY (ARRAY['saas_admin'::text, 'tenant_member'::text, 'portal_user'::text, 'patient'::text]))) ); -ALTER TABLE public.profiles OWNER TO supabase_admin; - -- --- Name: COLUMN profiles.phone; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.phone; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.profiles.phone IS 'WhatsApp / telefone no formato (99) 99999-9999'; -- --- Name: COLUMN profiles.bio; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.bio; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.profiles.bio IS 'Breve apresentação pública (máx 300 chars no front)'; +COMMENT ON COLUMN public.profiles.bio IS 'Breve apresenta????o p??blica (m??x 300 chars no front)'; -- --- Name: COLUMN profiles.account_type; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.account_type; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.profiles.account_type IS 'Tipo de conta: free=sem perfil ainda, patient=paciente (imutável), therapist=terapeuta (imutável), clinic=clínica (imutável).'; +COMMENT ON COLUMN public.profiles.account_type IS 'Tipo de conta: free=sem perfil ainda, patient=paciente (imut??vel), therapist=terapeuta (imut??vel), clinic=cl??nica (imut??vel).'; -- --- Name: COLUMN profiles.platform_roles; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.platform_roles; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.profiles.platform_roles IS 'Papéis globais de plataforma, independentes de tenant. Ex: editor de microlearning. Atribuído pelo saas_admin.'; -- --- Name: COLUMN profiles.nickname; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.nickname; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.profiles.nickname IS 'Apelido preferido para comunicação interna (Agência PSI)'; +COMMENT ON COLUMN public.profiles.nickname IS 'Apelido preferido para comunica????o interna (Ag??ncia PSI)'; -- --- Name: COLUMN profiles.work_description; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.work_description; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.profiles.work_description IS 'Categoria de trabalho selecionada no perfil público'; +COMMENT ON COLUMN public.profiles.work_description IS 'Categoria de trabalho selecionada no perfil p??blico'; -- --- Name: COLUMN profiles.work_description_other; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.work_description_other; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.profiles.work_description_other IS 'Descrição livre quando work_description = ''outro'''; +COMMENT ON COLUMN public.profiles.work_description_other IS 'Descri????o livre quando work_description = ''outro'''; -- --- Name: COLUMN profiles.site_url; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.site_url; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.profiles.site_url IS 'Endereço do site pessoal ou profissional'; +COMMENT ON COLUMN public.profiles.site_url IS 'Endere??o do site pessoal ou profissional'; -- --- Name: COLUMN profiles.social_instagram; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.social_instagram; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.profiles.social_instagram IS 'Handle ou URL do Instagram'; -- --- Name: COLUMN profiles.social_youtube; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.social_youtube; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.profiles.social_youtube IS 'Handle ou URL do canal no YouTube'; -- --- Name: COLUMN profiles.social_facebook; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.social_facebook; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.profiles.social_facebook IS 'Handle ou URL da página no Facebook'; +COMMENT ON COLUMN public.profiles.social_facebook IS 'Handle ou URL da p??gina no Facebook'; -- --- Name: COLUMN profiles.social_x; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.social_x; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.profiles.social_x IS 'Handle ou URL do perfil no X (Twitter)'; -- --- Name: COLUMN profiles.social_custom; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN profiles.social_custom; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.profiles.social_custom IS 'Array JSON com redes adicionais livres: [{name, url}]'; -- --- Name: recurrence_exceptions; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: recurrence_exceptions; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.recurrence_exceptions ( @@ -10495,10 +11162,8 @@ CREATE TABLE public.recurrence_exceptions ( ); -ALTER TABLE public.recurrence_exceptions OWNER TO supabase_admin; - -- --- Name: recurrence_rule_services; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.recurrence_rule_services ( @@ -10518,10 +11183,8 @@ CREATE TABLE public.recurrence_rule_services ( ); -ALTER TABLE public.recurrence_rule_services OWNER TO supabase_admin; - -- --- Name: recurrence_rules; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.recurrence_rules ( @@ -10561,10 +11224,8 @@ CREATE TABLE public.recurrence_rules ( ); -ALTER TABLE public.recurrence_rules OWNER TO supabase_admin; - -- --- Name: saas_admins; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: saas_admins; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.saas_admins ( @@ -10573,10 +11234,8 @@ CREATE TABLE public.saas_admins ( ); -ALTER TABLE public.saas_admins OWNER TO supabase_admin; - -- --- Name: saas_doc_votos; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.saas_doc_votos ( @@ -10589,10 +11248,8 @@ CREATE TABLE public.saas_doc_votos ( ); -ALTER TABLE public.saas_doc_votos OWNER TO supabase_admin; - -- --- Name: saas_docs; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: saas_docs; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.saas_docs ( @@ -10615,24 +11272,22 @@ CREATE TABLE public.saas_docs ( ); -ALTER TABLE public.saas_docs OWNER TO supabase_admin; - -- --- Name: COLUMN saas_docs.categoria; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN saas_docs.categoria; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.saas_docs.categoria IS 'Agrupa docs no portal FAQ (ex: Conta, Agenda, Pagamentos)'; -- --- Name: COLUMN saas_docs.exibir_no_faq; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN saas_docs.exibir_no_faq; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.saas_docs.exibir_no_faq IS 'Se true, a doc e seus itens FAQ aparecem no portal de FAQ'; -- --- Name: saas_faq; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: saas_faq; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.saas_faq ( @@ -10655,10 +11310,8 @@ CREATE TABLE public.saas_faq ( ); -ALTER TABLE public.saas_faq OWNER TO supabase_admin; - -- --- Name: saas_faq_itens; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: saas_faq_itens; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.saas_faq_itens ( @@ -10673,17 +11326,15 @@ CREATE TABLE public.saas_faq_itens ( ); -ALTER TABLE public.saas_faq_itens OWNER TO supabase_admin; - -- --- Name: TABLE saas_faq_itens; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: TABLE saas_faq_itens; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON TABLE public.saas_faq_itens IS 'Pares pergunta/resposta vinculados a um documento de ajuda'; -- --- Name: services; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: services; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.services ( @@ -10700,10 +11351,8 @@ CREATE TABLE public.services ( ); -ALTER TABLE public.services OWNER TO supabase_admin; - -- --- Name: subscription_events; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: subscription_events; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.subscription_events ( @@ -10725,10 +11374,8 @@ CREATE TABLE public.subscription_events ( ); -ALTER TABLE public.subscription_events OWNER TO supabase_admin; - -- --- Name: subscription_intents_personal; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_personal; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.subscription_intents_personal ( @@ -10752,10 +11399,8 @@ CREATE TABLE public.subscription_intents_personal ( ); -ALTER TABLE public.subscription_intents_personal OWNER TO supabase_admin; - -- --- Name: subscription_intents_tenant; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_tenant; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.subscription_intents_tenant ( @@ -10780,10 +11425,8 @@ CREATE TABLE public.subscription_intents_tenant ( ); -ALTER TABLE public.subscription_intents_tenant OWNER TO supabase_admin; - -- --- Name: subscription_intents; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: subscription_intents; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.subscription_intents AS @@ -10826,10 +11469,8 @@ UNION ALL FROM public.subscription_intents_personal p; -ALTER VIEW public.subscription_intents OWNER TO supabase_admin; - -- --- Name: subscription_intents_legacy; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_legacy; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.subscription_intents_legacy ( @@ -10852,10 +11493,8 @@ CREATE TABLE public.subscription_intents_legacy ( ); -ALTER TABLE public.subscription_intents_legacy OWNER TO supabase_admin; - -- --- Name: support_sessions; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: support_sessions; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.support_sessions ( @@ -10868,10 +11507,8 @@ CREATE TABLE public.support_sessions ( ); -ALTER TABLE public.support_sessions OWNER TO supabase_admin; - -- --- Name: tenant_feature_exceptions_log; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: tenant_feature_exceptions_log; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.tenant_feature_exceptions_log ( @@ -10885,10 +11522,8 @@ CREATE TABLE public.tenant_feature_exceptions_log ( ); -ALTER TABLE public.tenant_feature_exceptions_log OWNER TO supabase_admin; - -- --- Name: tenant_features; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: tenant_features; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.tenant_features ( @@ -10900,10 +11535,8 @@ CREATE TABLE public.tenant_features ( ); -ALTER TABLE public.tenant_features OWNER TO supabase_admin; - -- --- Name: tenant_invites; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: tenant_invites; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.tenant_invites ( @@ -10923,10 +11556,8 @@ CREATE TABLE public.tenant_invites ( ); -ALTER TABLE public.tenant_invites OWNER TO supabase_admin; - -- --- Name: tenants; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: tenants; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.tenants ( @@ -10934,21 +11565,27 @@ CREATE TABLE public.tenants ( name text, created_at timestamp with time zone DEFAULT now() NOT NULL, kind text DEFAULT 'saas'::text NOT NULL, + papel_timbrado jsonb DEFAULT '{"footer": {"slots": {"left": null, "right": null, "center": {"type": "custom-text", "content": ""}}, "height": 40, "preset": "text-center", "divider": {"show": true, "color": "#cccccc", "style": "solid"}, "enabled": true, "showPageNumber": false}, "header": {"slots": {"left": {"size": "medium", "type": "logo"}, "right": {"type": "institution-data", "fields": ["nome", "cnpj", "endereco_linha"]}, "center": null}, "height": 80, "preset": "logo-left-text-right", "divider": {"show": true, "color": "#cccccc", "style": "solid"}, "enabled": true}, "margins": {"top": 20, "left": 25, "right": 25, "bottom": 20}}'::jsonb, CONSTRAINT tenants_kind_check CHECK ((kind = ANY (ARRAY['therapist'::text, 'clinic_coworking'::text, 'clinic_reception'::text, 'clinic_full'::text, 'clinic'::text, 'saas'::text, 'supervisor'::text]))) ); -ALTER TABLE public.tenants OWNER TO supabase_admin; - -- --- Name: COLUMN tenants.kind; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN tenants.kind; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.tenants.kind IS 'Tipo do tenant. Imutável após criação. therapist=terapeuta solo. clinic_coworking/clinic_reception/clinic_full=clínicas. clinic e saas são legados.'; +COMMENT ON COLUMN public.tenants.kind IS 'Tipo do tenant. Imut??vel ap??s cria????o. therapist=terapeuta solo. clinic_coworking/clinic_reception/clinic_full=cl??nicas. clinic e saas s??o legados.'; -- --- Name: therapist_payout_records; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: COLUMN tenants.papel_timbrado; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON COLUMN public.tenants.papel_timbrado IS 'Configuração do papel timbrado para geração de documentos (header, footer, margens)'; + + +-- +-- Name: therapist_payout_records; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.therapist_payout_records ( @@ -10957,10 +11594,40 @@ CREATE TABLE public.therapist_payout_records ( ); -ALTER TABLE public.therapist_payout_records OWNER TO supabase_admin; +-- +-- Name: twilio_subaccount_usage; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.twilio_subaccount_usage ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + channel_id uuid NOT NULL, + twilio_subaccount_sid text NOT NULL, + period_start date NOT NULL, + period_end date NOT NULL, + messages_sent integer DEFAULT 0 NOT NULL, + messages_delivered integer DEFAULT 0 NOT NULL, + messages_failed integer DEFAULT 0 NOT NULL, + cost_usd numeric(12,6) DEFAULT 0 NOT NULL, + cost_brl numeric(12,4) DEFAULT 0 NOT NULL, + revenue_brl numeric(12,4) DEFAULT 0 NOT NULL, + margin_brl numeric(12,4) GENERATED ALWAYS AS ((revenue_brl - cost_brl)) STORED, + usd_brl_rate numeric(8,4) DEFAULT 0, + synced_at timestamp with time zone DEFAULT now(), + created_at timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT twilio_subaccount_usage_period_check CHECK ((period_end >= period_start)) +); + -- --- Name: user_settings; Type: TABLE; Schema: public; Owner: supabase_admin +-- Name: TABLE twilio_subaccount_usage; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE public.twilio_subaccount_usage IS 'Consumo mensal de mensagens WhatsApp por subconta Twilio. Sincronizado via Edge Function.'; + + +-- +-- Name: user_settings; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.user_settings ( @@ -10979,66 +11646,64 @@ CREATE TABLE public.user_settings ( ); -ALTER TABLE public.user_settings OWNER TO supabase_admin; - -- --- Name: TABLE user_settings; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: TABLE user_settings; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON TABLE public.user_settings IS 'Preferências de aparência e layout por usuário'; +COMMENT ON TABLE public.user_settings IS 'Prefer??ncias de apar??ncia e layout por usu??rio'; -- --- Name: COLUMN user_settings.user_id; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN user_settings.user_id; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.user_settings.user_id IS 'FK = auth.users.id — um registro por usuário'; +COMMENT ON COLUMN public.user_settings.user_id IS 'FK = auth.users.id ??? um registro por usu??rio'; -- --- Name: COLUMN user_settings.theme_mode; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN user_settings.theme_mode; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.user_settings.theme_mode IS 'light | dark'; -- --- Name: COLUMN user_settings.preset; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN user_settings.preset; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.user_settings.preset IS 'Preset PrimeVue: Aura | Lara | Nora'; -- --- Name: COLUMN user_settings.primary_color; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN user_settings.primary_color; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON COLUMN public.user_settings.primary_color IS 'Nome da cor primária (ex: blue, emerald, noir)'; +COMMENT ON COLUMN public.user_settings.primary_color IS 'Nome da cor prim??ria (ex: blue, emerald, noir)'; -- --- Name: COLUMN user_settings.surface_color; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN user_settings.surface_color; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.user_settings.surface_color IS 'Nome da surface (ex: slate, zinc, neutral)'; -- --- Name: COLUMN user_settings.menu_mode; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN user_settings.menu_mode; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.user_settings.menu_mode IS 'static | overlay'; -- --- Name: COLUMN user_settings.layout_variant; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: COLUMN user_settings.layout_variant; Type: COMMENT; Schema: public; Owner: - -- COMMENT ON COLUMN public.user_settings.layout_variant IS 'classic (sidebar) | rail (mini rail + painel)'; -- --- Name: v_auth_users_public; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_auth_users_public; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_auth_users_public AS @@ -11049,10 +11714,8 @@ CREATE VIEW public.v_auth_users_public AS FROM auth.users u; -ALTER VIEW public.v_auth_users_public OWNER TO supabase_admin; - -- --- Name: v_cashflow_projection; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_cashflow_projection; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_cashflow_projection WITH (security_invoker='on') AS @@ -11072,17 +11735,15 @@ CREATE VIEW public.v_cashflow_projection WITH (security_invoker='on') AS ORDER BY gs.mes; -ALTER VIEW public.v_cashflow_projection OWNER TO supabase_admin; - -- --- Name: VIEW v_cashflow_projection; Type: COMMENT; Schema: public; Owner: supabase_admin +-- Name: VIEW v_cashflow_projection; Type: COMMENT; Schema: public; Owner: - -- -COMMENT ON VIEW public.v_cashflow_projection IS 'Fluxo de caixa projetado: próximos 6 meses com totais de pending+overdue por due_date. Usa security_invoker=on — filtra automaticamente pelo auth.uid() via RLS de financial_records.'; +COMMENT ON VIEW public.v_cashflow_projection IS 'Fluxo de caixa projetado: pr??ximos 6 meses com totais de pending+overdue por due_date. Usa security_invoker=on ??? filtra automaticamente pelo auth.uid() via RLS de financial_records.'; -- --- Name: v_commitment_totals; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_commitment_totals; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_commitment_totals AS @@ -11094,10 +11755,91 @@ CREATE VIEW public.v_commitment_totals AS GROUP BY c.tenant_id, c.id; -ALTER VIEW public.v_commitment_totals OWNER TO supabase_admin; +-- +-- Name: v_patient_engajamento; Type: VIEW; Schema: public; Owner: - +-- + +CREATE VIEW public.v_patient_engajamento WITH (security_invoker='on') AS + WITH sessoes AS ( + SELECT ae.patient_id, + ae.tenant_id, + count(*) FILTER (WHERE (ae.status = 'realizado'::public.status_evento_agenda)) AS total_realizadas, + count(*) FILTER (WHERE (ae.status = ANY (ARRAY['realizado'::public.status_evento_agenda, 'cancelado'::public.status_evento_agenda, 'faltou'::public.status_evento_agenda]))) AS total_marcadas, + count(*) FILTER (WHERE (ae.status = 'faltou'::public.status_evento_agenda)) AS total_faltas, + max(ae.inicio_em) FILTER (WHERE (ae.status = 'realizado'::public.status_evento_agenda)) AS ultima_sessao_em, + min(ae.inicio_em) FILTER (WHERE (ae.status = 'realizado'::public.status_evento_agenda)) AS primeira_sessao_em, + count(*) FILTER (WHERE ((ae.status = 'realizado'::public.status_evento_agenda) AND (ae.inicio_em >= (now() - '30 days'::interval)))) AS sessoes_ultimo_mes + FROM public.agenda_eventos ae + WHERE (ae.patient_id IS NOT NULL) + GROUP BY ae.patient_id, ae.tenant_id + ), financeiro AS ( + SELECT fr.patient_id, + fr.tenant_id, + COALESCE(sum(fr.final_amount) FILTER (WHERE (fr.status = 'paid'::text)), (0)::numeric) AS total_pago, + COALESCE(avg(fr.final_amount) FILTER (WHERE (fr.status = 'paid'::text)), (0)::numeric) AS ticket_medio, + count(*) FILTER (WHERE ((fr.status = ANY (ARRAY['pending'::text, 'overdue'::text])) AND (fr.due_date < now()))) AS cobr_vencidas, + count(*) FILTER (WHERE (fr.status = ANY (ARRAY['pending'::text, 'overdue'::text]))) AS cobr_pendentes, + count(*) FILTER (WHERE ((fr.type = 'receita'::public.financial_record_type) AND (fr.status = 'paid'::text))) AS cobr_pagas + FROM public.financial_records fr + WHERE ((fr.patient_id IS NOT NULL) AND (fr.deleted_at IS NULL)) + GROUP BY fr.patient_id, fr.tenant_id + ) + SELECT p.id AS patient_id, + p.tenant_id, + p.nome_completo, + p.status, + p.risco_elevado, + COALESCE(s.total_realizadas, (0)::bigint) AS total_sessoes, + COALESCE(s.sessoes_ultimo_mes, (0)::bigint) AS sessoes_ultimo_mes, + s.primeira_sessao_em, + s.ultima_sessao_em, + (EXTRACT(day FROM (now() - s.ultima_sessao_em)))::integer AS dias_sem_sessao, + CASE + WHEN (COALESCE(s.total_marcadas, (0)::bigint) = 0) THEN NULL::numeric + ELSE round((((s.total_realizadas)::numeric / (s.total_marcadas)::numeric) * (100)::numeric), 1) + END AS taxa_comparecimento, + COALESCE(f.total_pago, (0)::numeric) AS ltv_total, + round(COALESCE(f.ticket_medio, (0)::numeric), 2) AS ticket_medio, + COALESCE(f.cobr_vencidas, (0)::bigint) AS cobr_vencidas, + COALESCE(f.cobr_pagas, (0)::bigint) AS cobr_pagas, + CASE + WHEN (COALESCE((f.cobr_pagas + f.cobr_vencidas), (0)::bigint) = 0) THEN NULL::numeric + ELSE round((((f.cobr_pagas)::numeric / ((f.cobr_pagas + f.cobr_vencidas))::numeric) * (100)::numeric), 1) + END AS taxa_pagamentos_dia, + round(LEAST((100)::numeric, COALESCE((( + CASE + WHEN (COALESCE(s.total_marcadas, (0)::bigint) = 0) THEN (50)::numeric + ELSE LEAST((50)::numeric, (((s.total_realizadas)::numeric / (s.total_marcadas)::numeric) * (50)::numeric)) + END + + CASE + WHEN (COALESCE((f.cobr_pagas + f.cobr_vencidas), (0)::bigint) = 0) THEN (30)::numeric + ELSE LEAST((30)::numeric, (((f.cobr_pagas)::numeric / ((f.cobr_pagas + f.cobr_vencidas))::numeric) * (30)::numeric)) + END) + ( + CASE + WHEN (s.ultima_sessao_em IS NULL) THEN 0 + WHEN (EXTRACT(day FROM (now() - s.ultima_sessao_em)) <= (14)::numeric) THEN 20 + WHEN (EXTRACT(day FROM (now() - s.ultima_sessao_em)) <= (30)::numeric) THEN 15 + WHEN (EXTRACT(day FROM (now() - s.ultima_sessao_em)) <= (60)::numeric) THEN 8 + ELSE 0 + END)::numeric), (0)::numeric)), 0) AS engajamento_score, + CASE + WHEN (s.primeira_sessao_em IS NULL) THEN NULL::integer + ELSE (EXTRACT(day FROM (now() - s.primeira_sessao_em)))::integer + END AS duracao_tratamento_dias + FROM ((public.patients p + LEFT JOIN sessoes s ON (((s.patient_id = p.id) AND (s.tenant_id = p.tenant_id)))) + LEFT JOIN financeiro f ON (((f.patient_id = p.id) AND (f.tenant_id = p.tenant_id)))); + -- --- Name: v_patient_groups_with_counts; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: VIEW v_patient_engajamento; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON VIEW public.v_patient_engajamento IS 'Score de engajamento e métricas consolidadas por paciente. Calculado em tempo real via RLS (security_invoker=on).'; + + +-- +-- Name: v_patient_groups_with_counts; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_patient_groups_with_counts AS @@ -11115,10 +11857,42 @@ CREATE VIEW public.v_patient_groups_with_counts AS GROUP BY pg.id, pg.nome, pg.cor, pg.owner_id, pg.is_system, pg.is_active, pg.created_at, pg.updated_at; -ALTER VIEW public.v_patient_groups_with_counts OWNER TO supabase_admin; +-- +-- Name: v_patients_risco; Type: VIEW; Schema: public; Owner: - +-- + +CREATE VIEW public.v_patients_risco WITH (security_invoker='on') AS + SELECT p.id, + p.tenant_id, + p.nome_completo, + p.status, + p.risco_elevado, + p.risco_nota, + p.risco_sinalizado_em, + e.dias_sem_sessao, + e.engajamento_score, + e.taxa_comparecimento, + CASE + WHEN p.risco_elevado THEN 'risco_sinalizado'::text + WHEN ((COALESCE(e.dias_sem_sessao, 999) > 30) AND (p.status = 'Ativo'::text)) THEN 'sem_sessao_30d'::text + WHEN (COALESCE(e.taxa_comparecimento, (100)::numeric) < (60)::numeric) THEN 'baixo_comparecimento'::text + WHEN (COALESCE(e.cobr_vencidas, (0)::bigint) > 0) THEN 'cobranca_vencida'::text + ELSE 'ok'::text + END AS alerta_tipo + FROM (public.patients p + JOIN public.v_patient_engajamento e ON ((e.patient_id = p.id))) + WHERE ((p.status = 'Ativo'::text) AND ((p.risco_elevado = true) OR (COALESCE(e.dias_sem_sessao, 999) > 30) OR (COALESCE(e.taxa_comparecimento, (100)::numeric) < (60)::numeric) OR (COALESCE(e.cobr_vencidas, (0)::bigint) > 0))); + -- --- Name: v_plan_active_prices; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: VIEW v_patients_risco; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON VIEW public.v_patients_risco IS 'Pacientes ativos que precisam de atenção: risco clínico, sem sessão há 30+ dias, baixo comparecimento ou cobrança vencida'; + + +-- +-- Name: v_plan_active_prices; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_plan_active_prices AS @@ -11147,10 +11921,8 @@ CREATE VIEW public.v_plan_active_prices AS GROUP BY plan_id; -ALTER VIEW public.v_plan_active_prices OWNER TO supabase_admin; - -- --- Name: v_public_pricing; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_public_pricing; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_public_pricing AS @@ -11177,10 +11949,8 @@ CREATE VIEW public.v_public_pricing AS ORDER BY COALESCE(pp.sort_order, 0), p.key; -ALTER VIEW public.v_public_pricing OWNER TO supabase_admin; - -- --- Name: v_subscription_feature_mismatch; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_subscription_feature_mismatch; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_subscription_feature_mismatch AS @@ -11208,10 +11978,8 @@ CREATE VIEW public.v_subscription_feature_mismatch AS WHERE ((expected.feature_key IS NULL) OR (actual.feature_key IS NULL)); -ALTER VIEW public.v_subscription_feature_mismatch OWNER TO supabase_admin; - -- --- Name: v_subscription_health; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_subscription_health; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_subscription_health AS @@ -11239,10 +12007,8 @@ CREATE VIEW public.v_subscription_health AS LEFT JOIN public.plans p ON ((p.id = s.plan_id))); -ALTER VIEW public.v_subscription_health OWNER TO supabase_admin; - -- --- Name: v_subscription_health_v2; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_subscription_health_v2; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_subscription_health_v2 AS @@ -11270,10 +12036,8 @@ CREATE VIEW public.v_subscription_health_v2 AS LEFT JOIN public.plans p ON ((p.id = s.plan_id))); -ALTER VIEW public.v_subscription_health_v2 OWNER TO supabase_admin; - -- --- Name: v_tag_patient_counts; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tag_patient_counts; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tag_patient_counts AS @@ -11291,10 +12055,8 @@ CREATE VIEW public.v_tag_patient_counts AS GROUP BY t.id, t.owner_id, t.nome, t.cor, t.is_padrao, t.created_at, t.updated_at; -ALTER VIEW public.v_tag_patient_counts OWNER TO supabase_admin; - -- --- Name: v_tenant_active_subscription; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_active_subscription; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_active_subscription AS @@ -11311,10 +12073,8 @@ CREATE VIEW public.v_tenant_active_subscription AS ORDER BY tenant_id, created_at DESC; -ALTER VIEW public.v_tenant_active_subscription OWNER TO supabase_admin; - -- --- Name: v_tenant_entitlements; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_entitlements; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_entitlements AS @@ -11326,10 +12086,8 @@ CREATE VIEW public.v_tenant_entitlements AS JOIN public.features f ON ((f.id = pf.feature_id))); -ALTER VIEW public.v_tenant_entitlements OWNER TO supabase_admin; - -- --- Name: v_tenant_entitlements_full; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_entitlements_full; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_entitlements_full AS @@ -11345,10 +12103,8 @@ CREATE VIEW public.v_tenant_entitlements_full AS JOIN public.plans p ON ((p.id = a.plan_id))); -ALTER VIEW public.v_tenant_entitlements_full OWNER TO supabase_admin; - -- --- Name: v_tenant_entitlements_json; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_entitlements_json; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_entitlements_json AS @@ -11359,10 +12115,8 @@ CREATE VIEW public.v_tenant_entitlements_json AS GROUP BY tenant_id; -ALTER VIEW public.v_tenant_entitlements_json OWNER TO supabase_admin; - -- --- Name: v_tenant_feature_exceptions; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_feature_exceptions; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_feature_exceptions AS @@ -11376,10 +12130,8 @@ CREATE VIEW public.v_tenant_feature_exceptions AS WHERE ((tf.enabled = true) AND (COALESCE(v.allowed, false) = false)); -ALTER VIEW public.v_tenant_feature_exceptions OWNER TO supabase_admin; - -- --- Name: v_tenant_feature_mismatch; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_feature_mismatch; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_feature_mismatch AS @@ -11405,10 +12157,8 @@ CREATE VIEW public.v_tenant_feature_mismatch AS WHERE ((o.enabled = true) AND (COALESCE(p.allowed, false) = false)); -ALTER VIEW public.v_tenant_feature_mismatch OWNER TO supabase_admin; - -- --- Name: v_tenant_members_with_profiles; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_members_with_profiles; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_members_with_profiles AS @@ -11425,10 +12175,8 @@ CREATE VIEW public.v_tenant_members_with_profiles AS LEFT JOIN auth.users au ON ((au.id = tm.user_id))); -ALTER VIEW public.v_tenant_members_with_profiles OWNER TO supabase_admin; - -- --- Name: v_tenant_people; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_people; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_people AS @@ -11455,10 +12203,8 @@ UNION ALL WHERE ((i.accepted_at IS NULL) AND (i.revoked_at IS NULL)); -ALTER VIEW public.v_tenant_people OWNER TO supabase_admin; - -- --- Name: v_tenant_staff; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_tenant_staff; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_tenant_staff AS @@ -11488,10 +12234,46 @@ UNION ALL WHERE ((ti.accepted_at IS NULL) AND (ti.revoked_at IS NULL) AND (ti.expires_at > now())); -ALTER VIEW public.v_tenant_staff OWNER TO supabase_admin; +-- +-- Name: v_twilio_whatsapp_overview; Type: VIEW; Schema: public; Owner: - +-- + +CREATE VIEW public.v_twilio_whatsapp_overview AS + SELECT nc.id AS channel_id, + nc.tenant_id, + nc.owner_id, + nc.is_active, + nc.connection_status, + nc.display_name, + nc.twilio_subaccount_sid, + nc.twilio_phone_number, + nc.twilio_phone_sid, + nc.cost_per_message_usd, + nc.price_per_message_brl, + nc.provisioned_at, + nc.created_at, + nc.updated_at, + COALESCE(u.messages_sent, 0) AS current_month_sent, + COALESCE(u.messages_delivered, 0) AS current_month_delivered, + COALESCE(u.messages_failed, 0) AS current_month_failed, + COALESCE(u.cost_usd, (0)::numeric) AS current_month_cost_usd, + COALESCE(u.cost_brl, (0)::numeric) AS current_month_cost_brl, + COALESCE(u.revenue_brl, (0)::numeric) AS current_month_revenue_brl, + COALESCE(u.margin_brl, (0)::numeric) AS current_month_margin_brl + FROM (public.notification_channels nc + LEFT JOIN public.twilio_subaccount_usage u ON (((u.channel_id = nc.id) AND (u.period_start = (date_trunc('month'::text, (CURRENT_DATE)::timestamp with time zone))::date)))) + WHERE ((nc.channel = 'whatsapp'::text) AND (nc.provider = 'twilio'::text) AND (nc.deleted_at IS NULL)); + -- --- Name: v_user_active_subscription; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: VIEW v_twilio_whatsapp_overview; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON VIEW public.v_twilio_whatsapp_overview IS 'Visão consolidada de subcontas Twilio WhatsApp com uso do mês corrente.'; + + +-- +-- Name: v_user_active_subscription; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_user_active_subscription AS @@ -11508,10 +12290,8 @@ CREATE VIEW public.v_user_active_subscription AS ORDER BY user_id, created_at DESC; -ALTER VIEW public.v_user_active_subscription OWNER TO supabase_admin; - -- --- Name: v_user_entitlements; Type: VIEW; Schema: public; Owner: supabase_admin +-- Name: v_user_entitlements; Type: VIEW; Schema: public; Owner: - -- CREATE VIEW public.v_user_entitlements AS @@ -11523,10 +12303,8 @@ CREATE VIEW public.v_user_entitlements AS JOIN public.features f ON ((f.id = pf.feature_id))); -ALTER VIEW public.v_user_entitlements OWNER TO supabase_admin; - -- --- Name: messages; Type: TABLE; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages; Type: TABLE; Schema: realtime; Owner: - -- CREATE TABLE realtime.messages ( @@ -11542,13 +12320,11 @@ CREATE TABLE realtime.messages ( PARTITION BY RANGE (inserted_at); -ALTER TABLE realtime.messages OWNER TO supabase_realtime_admin; - -- --- Name: messages_2026_03_20; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_14; Type: TABLE; Schema: realtime; Owner: - -- -CREATE TABLE realtime.messages_2026_03_20 ( +CREATE TABLE realtime.messages_2026_04_14 ( topic text NOT NULL, extension text NOT NULL, payload jsonb, @@ -11560,13 +12336,11 @@ CREATE TABLE realtime.messages_2026_03_20 ( ); -ALTER TABLE realtime.messages_2026_03_20 OWNER TO supabase_admin; - -- --- Name: messages_2026_03_21; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_15; Type: TABLE; Schema: realtime; Owner: - -- -CREATE TABLE realtime.messages_2026_03_21 ( +CREATE TABLE realtime.messages_2026_04_15 ( topic text NOT NULL, extension text NOT NULL, payload jsonb, @@ -11578,13 +12352,11 @@ CREATE TABLE realtime.messages_2026_03_21 ( ); -ALTER TABLE realtime.messages_2026_03_21 OWNER TO supabase_admin; - -- --- Name: messages_2026_03_22; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_16; Type: TABLE; Schema: realtime; Owner: - -- -CREATE TABLE realtime.messages_2026_03_22 ( +CREATE TABLE realtime.messages_2026_04_16 ( topic text NOT NULL, extension text NOT NULL, payload jsonb, @@ -11596,13 +12368,11 @@ CREATE TABLE realtime.messages_2026_03_22 ( ); -ALTER TABLE realtime.messages_2026_03_22 OWNER TO supabase_admin; - -- --- Name: messages_2026_03_23; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_17; Type: TABLE; Schema: realtime; Owner: - -- -CREATE TABLE realtime.messages_2026_03_23 ( +CREATE TABLE realtime.messages_2026_04_17 ( topic text NOT NULL, extension text NOT NULL, payload jsonb, @@ -11614,13 +12384,11 @@ CREATE TABLE realtime.messages_2026_03_23 ( ); -ALTER TABLE realtime.messages_2026_03_23 OWNER TO supabase_admin; - -- --- Name: messages_2026_03_24; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_18; Type: TABLE; Schema: realtime; Owner: - -- -CREATE TABLE realtime.messages_2026_03_24 ( +CREATE TABLE realtime.messages_2026_04_18 ( topic text NOT NULL, extension text NOT NULL, payload jsonb, @@ -11632,13 +12400,11 @@ CREATE TABLE realtime.messages_2026_03_24 ( ); -ALTER TABLE realtime.messages_2026_03_24 OWNER TO supabase_admin; - -- --- Name: messages_2026_03_25; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_19; Type: TABLE; Schema: realtime; Owner: - -- -CREATE TABLE realtime.messages_2026_03_25 ( +CREATE TABLE realtime.messages_2026_04_19 ( topic text NOT NULL, extension text NOT NULL, payload jsonb, @@ -11650,13 +12416,11 @@ CREATE TABLE realtime.messages_2026_03_25 ( ); -ALTER TABLE realtime.messages_2026_03_25 OWNER TO supabase_admin; - -- --- Name: messages_2026_03_26; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_20; Type: TABLE; Schema: realtime; Owner: - -- -CREATE TABLE realtime.messages_2026_03_26 ( +CREATE TABLE realtime.messages_2026_04_20 ( topic text NOT NULL, extension text NOT NULL, payload jsonb, @@ -11668,10 +12432,8 @@ CREATE TABLE realtime.messages_2026_03_26 ( ); -ALTER TABLE realtime.messages_2026_03_26 OWNER TO supabase_admin; - -- --- Name: schema_migrations; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: schema_migrations; Type: TABLE; Schema: realtime; Owner: - -- CREATE TABLE realtime.schema_migrations ( @@ -11680,10 +12442,8 @@ CREATE TABLE realtime.schema_migrations ( ); -ALTER TABLE realtime.schema_migrations OWNER TO supabase_admin; - -- --- Name: subscription; Type: TABLE; Schema: realtime; Owner: supabase_admin +-- Name: subscription; Type: TABLE; Schema: realtime; Owner: - -- CREATE TABLE realtime.subscription ( @@ -11697,10 +12457,8 @@ CREATE TABLE realtime.subscription ( ); -ALTER TABLE realtime.subscription OWNER TO supabase_admin; - -- --- Name: subscription_id_seq; Type: SEQUENCE; Schema: realtime; Owner: supabase_admin +-- Name: subscription_id_seq; Type: SEQUENCE; Schema: realtime; Owner: - -- ALTER TABLE realtime.subscription ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY ( @@ -11714,7 +12472,7 @@ ALTER TABLE realtime.subscription ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTI -- --- Name: buckets; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.buckets ( @@ -11732,17 +12490,15 @@ CREATE TABLE storage.buckets ( ); -ALTER TABLE storage.buckets OWNER TO supabase_storage_admin; - -- --- Name: COLUMN buckets.owner; Type: COMMENT; Schema: storage; Owner: supabase_storage_admin +-- Name: COLUMN buckets.owner; Type: COMMENT; Schema: storage; Owner: - -- COMMENT ON COLUMN storage.buckets.owner IS 'Field is deprecated, use owner_id instead'; -- --- Name: buckets_analytics; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets_analytics; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.buckets_analytics ( @@ -11756,10 +12512,8 @@ CREATE TABLE storage.buckets_analytics ( ); -ALTER TABLE storage.buckets_analytics OWNER TO supabase_storage_admin; - -- --- Name: buckets_vectors; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets_vectors; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.buckets_vectors ( @@ -11770,10 +12524,8 @@ CREATE TABLE storage.buckets_vectors ( ); -ALTER TABLE storage.buckets_vectors OWNER TO supabase_storage_admin; - -- --- Name: iceberg_namespaces; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: iceberg_namespaces; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.iceberg_namespaces ( @@ -11787,10 +12539,8 @@ CREATE TABLE storage.iceberg_namespaces ( ); -ALTER TABLE storage.iceberg_namespaces OWNER TO supabase_storage_admin; - -- --- Name: iceberg_tables; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: iceberg_tables; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.iceberg_tables ( @@ -11808,10 +12558,8 @@ CREATE TABLE storage.iceberg_tables ( ); -ALTER TABLE storage.iceberg_tables OWNER TO supabase_storage_admin; - -- --- Name: migrations; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: migrations; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.migrations ( @@ -11822,10 +12570,8 @@ CREATE TABLE storage.migrations ( ); -ALTER TABLE storage.migrations OWNER TO supabase_storage_admin; - -- --- Name: objects; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: objects; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.objects ( @@ -11844,17 +12590,15 @@ CREATE TABLE storage.objects ( ); -ALTER TABLE storage.objects OWNER TO supabase_storage_admin; - -- --- Name: COLUMN objects.owner; Type: COMMENT; Schema: storage; Owner: supabase_storage_admin +-- Name: COLUMN objects.owner; Type: COMMENT; Schema: storage; Owner: - -- COMMENT ON COLUMN storage.objects.owner IS 'Field is deprecated, use owner_id instead'; -- --- Name: s3_multipart_uploads; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.s3_multipart_uploads ( @@ -11870,10 +12614,8 @@ CREATE TABLE storage.s3_multipart_uploads ( ); -ALTER TABLE storage.s3_multipart_uploads OWNER TO supabase_storage_admin; - -- --- Name: s3_multipart_uploads_parts; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads_parts; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.s3_multipart_uploads_parts ( @@ -11890,10 +12632,8 @@ CREATE TABLE storage.s3_multipart_uploads_parts ( ); -ALTER TABLE storage.s3_multipart_uploads_parts OWNER TO supabase_storage_admin; - -- --- Name: vector_indexes; Type: TABLE; Schema: storage; Owner: supabase_storage_admin +-- Name: vector_indexes; Type: TABLE; Schema: storage; Owner: - -- CREATE TABLE storage.vector_indexes ( @@ -11909,10 +12649,8 @@ CREATE TABLE storage.vector_indexes ( ); -ALTER TABLE storage.vector_indexes OWNER TO supabase_storage_admin; - -- --- Name: hooks; Type: TABLE; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: hooks; Type: TABLE; Schema: supabase_functions; Owner: - -- CREATE TABLE supabase_functions.hooks ( @@ -11924,17 +12662,15 @@ CREATE TABLE supabase_functions.hooks ( ); -ALTER TABLE supabase_functions.hooks OWNER TO supabase_functions_admin; - -- --- Name: TABLE hooks; Type: COMMENT; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: TABLE hooks; Type: COMMENT; Schema: supabase_functions; Owner: - -- COMMENT ON TABLE supabase_functions.hooks IS 'Supabase Functions Hooks: Audit trail for triggered hooks.'; -- --- Name: hooks_id_seq; Type: SEQUENCE; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: hooks_id_seq; Type: SEQUENCE; Schema: supabase_functions; Owner: - -- CREATE SEQUENCE supabase_functions.hooks_id_seq @@ -11945,17 +12681,15 @@ CREATE SEQUENCE supabase_functions.hooks_id_seq CACHE 1; -ALTER SEQUENCE supabase_functions.hooks_id_seq OWNER TO supabase_functions_admin; - -- --- Name: hooks_id_seq; Type: SEQUENCE OWNED BY; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: hooks_id_seq; Type: SEQUENCE OWNED BY; Schema: supabase_functions; Owner: - -- ALTER SEQUENCE supabase_functions.hooks_id_seq OWNED BY supabase_functions.hooks.id; -- --- Name: migrations; Type: TABLE; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: migrations; Type: TABLE; Schema: supabase_functions; Owner: - -- CREATE TABLE supabase_functions.migrations ( @@ -11964,80 +12698,85 @@ CREATE TABLE supabase_functions.migrations ( ); -ALTER TABLE supabase_functions.migrations OWNER TO supabase_functions_admin; - -- --- Name: messages_2026_03_20; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_14; Type: TABLE ATTACH; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_20 FOR VALUES FROM ('2026-03-20 00:00:00') TO ('2026-03-21 00:00:00'); +ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_04_14 FOR VALUES FROM ('2026-04-14 00:00:00') TO ('2026-04-15 00:00:00'); -- --- Name: messages_2026_03_21; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_15; Type: TABLE ATTACH; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_21 FOR VALUES FROM ('2026-03-21 00:00:00') TO ('2026-03-22 00:00:00'); +ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_04_15 FOR VALUES FROM ('2026-04-15 00:00:00') TO ('2026-04-16 00:00:00'); -- --- Name: messages_2026_03_22; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_16; Type: TABLE ATTACH; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_22 FOR VALUES FROM ('2026-03-22 00:00:00') TO ('2026-03-23 00:00:00'); +ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_04_16 FOR VALUES FROM ('2026-04-16 00:00:00') TO ('2026-04-17 00:00:00'); -- --- Name: messages_2026_03_23; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_17; Type: TABLE ATTACH; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_23 FOR VALUES FROM ('2026-03-23 00:00:00') TO ('2026-03-24 00:00:00'); +ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_04_17 FOR VALUES FROM ('2026-04-17 00:00:00') TO ('2026-04-18 00:00:00'); -- --- Name: messages_2026_03_24; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_18; Type: TABLE ATTACH; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_24 FOR VALUES FROM ('2026-03-24 00:00:00') TO ('2026-03-25 00:00:00'); +ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_04_18 FOR VALUES FROM ('2026-04-18 00:00:00') TO ('2026-04-19 00:00:00'); -- --- Name: messages_2026_03_25; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_19; Type: TABLE ATTACH; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_25 FOR VALUES FROM ('2026-03-25 00:00:00') TO ('2026-03-26 00:00:00'); +ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_04_19 FOR VALUES FROM ('2026-04-19 00:00:00') TO ('2026-04-20 00:00:00'); -- --- Name: messages_2026_03_26; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_20; Type: TABLE ATTACH; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_26 FOR VALUES FROM ('2026-03-26 00:00:00') TO ('2026-03-27 00:00:00'); +ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_04_20 FOR VALUES FROM ('2026-04-20 00:00:00') TO ('2026-04-21 00:00:00'); -- --- Name: refresh_tokens id; Type: DEFAULT; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens id; Type: DEFAULT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.refresh_tokens ALTER COLUMN id SET DEFAULT nextval('auth.refresh_tokens_id_seq'::regclass); -- --- Name: agenda_online_slots id; Type: DEFAULT; Schema: public; Owner: supabase_admin +-- Name: _db_migrations id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public._db_migrations ALTER COLUMN id SET DEFAULT nextval('public._db_migrations_id_seq'::regclass); + + +-- +-- Name: agenda_online_slots id; Type: DEFAULT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_online_slots ALTER COLUMN id SET DEFAULT nextval('public.agenda_online_slots_id_seq'::regclass); -- --- Name: hooks id; Type: DEFAULT; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: hooks id; Type: DEFAULT; Schema: supabase_functions; Owner: - -- ALTER TABLE ONLY supabase_functions.hooks ALTER COLUMN id SET DEFAULT nextval('supabase_functions.hooks_id_seq'::regclass); -- --- Name: extensions extensions_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: supabase_admin +-- Name: extensions extensions_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: - -- ALTER TABLE ONLY _realtime.extensions @@ -12045,7 +12784,7 @@ ALTER TABLE ONLY _realtime.extensions -- --- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: supabase_admin +-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: - -- ALTER TABLE ONLY _realtime.schema_migrations @@ -12053,7 +12792,7 @@ ALTER TABLE ONLY _realtime.schema_migrations -- --- Name: tenants tenants_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: supabase_admin +-- Name: tenants tenants_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: - -- ALTER TABLE ONLY _realtime.tenants @@ -12061,7 +12800,7 @@ ALTER TABLE ONLY _realtime.tenants -- --- Name: mfa_amr_claims amr_id_pk; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_amr_claims amr_id_pk; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.mfa_amr_claims @@ -12069,7 +12808,7 @@ ALTER TABLE ONLY auth.mfa_amr_claims -- --- Name: audit_log_entries audit_log_entries_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: audit_log_entries audit_log_entries_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.audit_log_entries @@ -12077,7 +12816,7 @@ ALTER TABLE ONLY auth.audit_log_entries -- --- Name: flow_state flow_state_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: flow_state flow_state_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.flow_state @@ -12085,7 +12824,7 @@ ALTER TABLE ONLY auth.flow_state -- --- Name: identities identities_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: identities identities_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.identities @@ -12093,7 +12832,7 @@ ALTER TABLE ONLY auth.identities -- --- Name: identities identities_provider_id_provider_unique; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: identities identities_provider_id_provider_unique; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.identities @@ -12101,7 +12840,7 @@ ALTER TABLE ONLY auth.identities -- --- Name: instances instances_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: instances instances_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.instances @@ -12109,7 +12848,7 @@ ALTER TABLE ONLY auth.instances -- --- Name: mfa_amr_claims mfa_amr_claims_session_id_authentication_method_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_amr_claims mfa_amr_claims_session_id_authentication_method_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.mfa_amr_claims @@ -12117,7 +12856,7 @@ ALTER TABLE ONLY auth.mfa_amr_claims -- --- Name: mfa_challenges mfa_challenges_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_challenges mfa_challenges_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.mfa_challenges @@ -12125,7 +12864,7 @@ ALTER TABLE ONLY auth.mfa_challenges -- --- Name: mfa_factors mfa_factors_last_challenged_at_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_factors mfa_factors_last_challenged_at_key; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.mfa_factors @@ -12133,7 +12872,7 @@ ALTER TABLE ONLY auth.mfa_factors -- --- Name: mfa_factors mfa_factors_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_factors mfa_factors_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.mfa_factors @@ -12141,7 +12880,7 @@ ALTER TABLE ONLY auth.mfa_factors -- --- Name: oauth_authorizations oauth_authorizations_authorization_code_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_authorizations oauth_authorizations_authorization_code_key; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_authorizations @@ -12149,7 +12888,7 @@ ALTER TABLE ONLY auth.oauth_authorizations -- --- Name: oauth_authorizations oauth_authorizations_authorization_id_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_authorizations oauth_authorizations_authorization_id_key; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_authorizations @@ -12157,7 +12896,7 @@ ALTER TABLE ONLY auth.oauth_authorizations -- --- Name: oauth_authorizations oauth_authorizations_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_authorizations oauth_authorizations_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_authorizations @@ -12165,7 +12904,7 @@ ALTER TABLE ONLY auth.oauth_authorizations -- --- Name: oauth_client_states oauth_client_states_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_client_states oauth_client_states_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_client_states @@ -12173,7 +12912,7 @@ ALTER TABLE ONLY auth.oauth_client_states -- --- Name: oauth_clients oauth_clients_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_clients oauth_clients_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_clients @@ -12181,7 +12920,7 @@ ALTER TABLE ONLY auth.oauth_clients -- --- Name: oauth_consents oauth_consents_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_consents oauth_consents_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_consents @@ -12189,7 +12928,7 @@ ALTER TABLE ONLY auth.oauth_consents -- --- Name: oauth_consents oauth_consents_user_client_unique; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_consents oauth_consents_user_client_unique; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_consents @@ -12197,7 +12936,7 @@ ALTER TABLE ONLY auth.oauth_consents -- --- Name: one_time_tokens one_time_tokens_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: one_time_tokens one_time_tokens_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.one_time_tokens @@ -12205,7 +12944,7 @@ ALTER TABLE ONLY auth.one_time_tokens -- --- Name: refresh_tokens refresh_tokens_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens refresh_tokens_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.refresh_tokens @@ -12213,7 +12952,7 @@ ALTER TABLE ONLY auth.refresh_tokens -- --- Name: refresh_tokens refresh_tokens_token_unique; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens refresh_tokens_token_unique; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.refresh_tokens @@ -12221,7 +12960,7 @@ ALTER TABLE ONLY auth.refresh_tokens -- --- Name: saml_providers saml_providers_entity_id_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_providers saml_providers_entity_id_key; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.saml_providers @@ -12229,7 +12968,7 @@ ALTER TABLE ONLY auth.saml_providers -- --- Name: saml_providers saml_providers_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_providers saml_providers_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.saml_providers @@ -12237,7 +12976,7 @@ ALTER TABLE ONLY auth.saml_providers -- --- Name: saml_relay_states saml_relay_states_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_relay_states saml_relay_states_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.saml_relay_states @@ -12245,7 +12984,7 @@ ALTER TABLE ONLY auth.saml_relay_states -- --- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.schema_migrations @@ -12253,7 +12992,7 @@ ALTER TABLE ONLY auth.schema_migrations -- --- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.sessions @@ -12261,7 +13000,7 @@ ALTER TABLE ONLY auth.sessions -- --- Name: sso_domains sso_domains_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_domains sso_domains_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.sso_domains @@ -12269,7 +13008,7 @@ ALTER TABLE ONLY auth.sso_domains -- --- Name: sso_providers sso_providers_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_providers sso_providers_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.sso_providers @@ -12277,7 +13016,7 @@ ALTER TABLE ONLY auth.sso_providers -- --- Name: users users_phone_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: users users_phone_key; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.users @@ -12285,7 +13024,7 @@ ALTER TABLE ONLY auth.users -- --- Name: users users_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: users users_pkey; Type: CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.users @@ -12293,7 +13032,23 @@ ALTER TABLE ONLY auth.users -- --- Name: addon_credits addon_credits_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: _db_migrations _db_migrations_filename_key; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public._db_migrations + ADD CONSTRAINT _db_migrations_filename_key UNIQUE (filename); + + +-- +-- Name: _db_migrations _db_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public._db_migrations + ADD CONSTRAINT _db_migrations_pkey PRIMARY KEY (id); + + +-- +-- Name: addon_credits addon_credits_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_credits @@ -12301,7 +13056,7 @@ ALTER TABLE ONLY public.addon_credits -- --- Name: addon_products addon_products_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_products addon_products_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_products @@ -12309,7 +13064,7 @@ ALTER TABLE ONLY public.addon_products -- --- Name: addon_products addon_products_slug_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_products addon_products_slug_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_products @@ -12317,7 +13072,7 @@ ALTER TABLE ONLY public.addon_products -- --- Name: addon_transactions addon_transactions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_transactions addon_transactions_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_transactions @@ -12325,7 +13080,7 @@ ALTER TABLE ONLY public.addon_transactions -- --- Name: agenda_bloqueios agenda_bloqueios_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios agenda_bloqueios_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_bloqueios @@ -12333,7 +13088,7 @@ ALTER TABLE ONLY public.agenda_bloqueios -- --- Name: agenda_configuracoes agenda_configuracoes_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes agenda_configuracoes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_configuracoes @@ -12341,7 +13096,7 @@ ALTER TABLE ONLY public.agenda_configuracoes -- --- Name: agenda_eventos agenda_eventos_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -12349,7 +13104,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_eventos agenda_eventos_sem_sobreposicao; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_sem_sobreposicao; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -12357,7 +13112,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_excecoes agenda_excecoes_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes agenda_excecoes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_excecoes @@ -12365,7 +13120,7 @@ ALTER TABLE ONLY public.agenda_excecoes -- --- Name: agenda_online_slots agenda_online_slots_owner_id_weekday_time_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots agenda_online_slots_owner_id_weekday_time_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_online_slots @@ -12373,7 +13128,7 @@ ALTER TABLE ONLY public.agenda_online_slots -- --- Name: agenda_online_slots agenda_online_slots_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots agenda_online_slots_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_online_slots @@ -12381,7 +13136,7 @@ ALTER TABLE ONLY public.agenda_online_slots -- --- Name: agenda_regras_semanais agenda_regras_semanais_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais agenda_regras_semanais_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_regras_semanais @@ -12389,7 +13144,7 @@ ALTER TABLE ONLY public.agenda_regras_semanais -- --- Name: agenda_regras_semanais agenda_regras_semanais_unique; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais agenda_regras_semanais_unique; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_regras_semanais @@ -12397,7 +13152,7 @@ ALTER TABLE ONLY public.agenda_regras_semanais -- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_seman_owner_id_dia_semana_hora_inic_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_seman_owner_id_dia_semana_hora_inic_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais @@ -12405,7 +13160,7 @@ ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais -- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais @@ -12413,7 +13168,7 @@ ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais -- --- Name: agenda_slots_regras agenda_slots_regras_owner_id_dia_semana_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras agenda_slots_regras_owner_id_dia_semana_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_slots_regras @@ -12421,7 +13176,7 @@ ALTER TABLE ONLY public.agenda_slots_regras -- --- Name: agenda_slots_regras agenda_slots_regras_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras agenda_slots_regras_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_slots_regras @@ -12429,7 +13184,7 @@ ALTER TABLE ONLY public.agenda_slots_regras -- --- Name: agendador_configuracoes agendador_configuracoes_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes agendador_configuracoes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agendador_configuracoes @@ -12437,7 +13192,7 @@ ALTER TABLE ONLY public.agendador_configuracoes -- --- Name: agendador_solicitacoes agendador_solicitacoes_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes agendador_solicitacoes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agendador_solicitacoes @@ -12445,7 +13200,7 @@ ALTER TABLE ONLY public.agendador_solicitacoes -- --- Name: billing_contracts billing_contracts_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: billing_contracts billing_contracts_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.billing_contracts @@ -12453,7 +13208,7 @@ ALTER TABLE ONLY public.billing_contracts -- --- Name: commitment_services commitment_services_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: commitment_services commitment_services_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.commitment_services @@ -12461,7 +13216,7 @@ ALTER TABLE ONLY public.commitment_services -- --- Name: commitment_time_logs commitment_time_logs_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs commitment_time_logs_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.commitment_time_logs @@ -12469,7 +13224,7 @@ ALTER TABLE ONLY public.commitment_time_logs -- --- Name: company_profiles company_profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: company_profiles company_profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.company_profiles @@ -12477,7 +13232,7 @@ ALTER TABLE ONLY public.company_profiles -- --- Name: company_profiles company_profiles_tenant_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: company_profiles company_profiles_tenant_id_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.company_profiles @@ -12485,7 +13240,7 @@ ALTER TABLE ONLY public.company_profiles -- --- Name: determined_commitment_fields determined_commitment_fields_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields determined_commitment_fields_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.determined_commitment_fields @@ -12493,7 +13248,7 @@ ALTER TABLE ONLY public.determined_commitment_fields -- --- Name: determined_commitments determined_commitments_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: determined_commitments determined_commitments_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.determined_commitments @@ -12501,7 +13256,7 @@ ALTER TABLE ONLY public.determined_commitments -- --- Name: determined_commitments determined_commitments_tenant_native_key_uq; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: determined_commitments determined_commitments_tenant_native_key_uq; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.determined_commitments @@ -12509,7 +13264,7 @@ ALTER TABLE ONLY public.determined_commitments -- --- Name: dev_user_credentials dev_user_credentials_email_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: dev_user_credentials dev_user_credentials_email_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.dev_user_credentials @@ -12517,7 +13272,7 @@ ALTER TABLE ONLY public.dev_user_credentials -- --- Name: dev_user_credentials dev_user_credentials_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: dev_user_credentials dev_user_credentials_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.dev_user_credentials @@ -12525,7 +13280,63 @@ ALTER TABLE ONLY public.dev_user_credentials -- --- Name: email_layout_config email_layout_config_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: document_access_logs document_access_logs_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_access_logs + ADD CONSTRAINT document_access_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: document_generated document_generated_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_generated + ADD CONSTRAINT document_generated_pkey PRIMARY KEY (id); + + +-- +-- Name: document_share_links document_share_links_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_share_links + ADD CONSTRAINT document_share_links_pkey PRIMARY KEY (id); + + +-- +-- Name: document_signatures document_signatures_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_signatures + ADD CONSTRAINT document_signatures_pkey PRIMARY KEY (id); + + +-- +-- Name: document_templates document_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_templates + ADD CONSTRAINT document_templates_pkey PRIMARY KEY (id); + + +-- +-- Name: documents documents_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.documents + ADD CONSTRAINT documents_pkey PRIMARY KEY (id); + + +-- +-- Name: document_share_links dsl_token_unique; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_share_links + ADD CONSTRAINT dsl_token_unique UNIQUE (token); + + +-- +-- Name: email_layout_config email_layout_config_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_layout_config @@ -12533,7 +13344,7 @@ ALTER TABLE ONLY public.email_layout_config -- --- Name: email_layout_config email_layout_config_tenant_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: email_layout_config email_layout_config_tenant_id_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_layout_config @@ -12541,7 +13352,7 @@ ALTER TABLE ONLY public.email_layout_config -- --- Name: email_templates_global email_templates_global_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: email_templates_global email_templates_global_key_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_templates_global @@ -12549,7 +13360,7 @@ ALTER TABLE ONLY public.email_templates_global -- --- Name: email_templates_global email_templates_global_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: email_templates_global email_templates_global_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_templates_global @@ -12557,7 +13368,7 @@ ALTER TABLE ONLY public.email_templates_global -- --- Name: email_templates_tenant email_templates_tenant_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: email_templates_tenant email_templates_tenant_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_templates_tenant @@ -12565,7 +13376,7 @@ ALTER TABLE ONLY public.email_templates_tenant -- --- Name: email_templates_tenant email_templates_tenant_tenant_id_owner_id_template_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: email_templates_tenant email_templates_tenant_tenant_id_owner_id_template_key_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_templates_tenant @@ -12573,7 +13384,7 @@ ALTER TABLE ONLY public.email_templates_tenant -- --- Name: entitlements_invalidation entitlements_invalidation_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: entitlements_invalidation entitlements_invalidation_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.entitlements_invalidation @@ -12581,7 +13392,7 @@ ALTER TABLE ONLY public.entitlements_invalidation -- --- Name: features features_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: features features_key_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.features @@ -12589,7 +13400,7 @@ ALTER TABLE ONLY public.features -- --- Name: features features_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: features features_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.features @@ -12597,7 +13408,7 @@ ALTER TABLE ONLY public.features -- --- Name: feriados feriados_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.feriados @@ -12605,7 +13416,7 @@ ALTER TABLE ONLY public.feriados -- --- Name: feriados feriados_tenant_id_data_nome_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_tenant_id_data_nome_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.feriados @@ -12613,7 +13424,7 @@ ALTER TABLE ONLY public.feriados -- --- Name: financial_categories financial_categories_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_categories financial_categories_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_categories @@ -12621,7 +13432,7 @@ ALTER TABLE ONLY public.financial_categories -- --- Name: financial_exceptions financial_exceptions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions financial_exceptions_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_exceptions @@ -12629,7 +13440,7 @@ ALTER TABLE ONLY public.financial_exceptions -- --- Name: financial_records financial_records_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_records @@ -12637,7 +13448,7 @@ ALTER TABLE ONLY public.financial_records -- --- Name: global_notices global_notices_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: global_notices global_notices_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.global_notices @@ -12645,7 +13456,7 @@ ALTER TABLE ONLY public.global_notices -- --- Name: insurance_plan_services insurance_plan_services_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: insurance_plan_services insurance_plan_services_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.insurance_plan_services @@ -12653,7 +13464,7 @@ ALTER TABLE ONLY public.insurance_plan_services -- --- Name: insurance_plans insurance_plans_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: insurance_plans insurance_plans_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.insurance_plans @@ -12661,7 +13472,7 @@ ALTER TABLE ONLY public.insurance_plans -- --- Name: login_carousel_slides login_carousel_slides_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: login_carousel_slides login_carousel_slides_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.login_carousel_slides @@ -12669,7 +13480,23 @@ ALTER TABLE ONLY public.login_carousel_slides -- --- Name: module_features module_features_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: medicos medicos_crm_owner_unique; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.medicos + ADD CONSTRAINT medicos_crm_owner_unique UNIQUE NULLS NOT DISTINCT (owner_id, crm); + + +-- +-- Name: medicos medicos_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.medicos + ADD CONSTRAINT medicos_pkey PRIMARY KEY (id); + + +-- +-- Name: module_features module_features_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.module_features @@ -12677,7 +13504,7 @@ ALTER TABLE ONLY public.module_features -- --- Name: modules modules_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: modules modules_key_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.modules @@ -12685,7 +13512,7 @@ ALTER TABLE ONLY public.modules -- --- Name: modules modules_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: modules modules_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.modules @@ -12693,7 +13520,7 @@ ALTER TABLE ONLY public.modules -- --- Name: notice_dismissals notice_dismissals_notice_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notice_dismissals notice_dismissals_notice_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notice_dismissals @@ -12701,7 +13528,7 @@ ALTER TABLE ONLY public.notice_dismissals -- --- Name: notice_dismissals notice_dismissals_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notice_dismissals notice_dismissals_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notice_dismissals @@ -12709,7 +13536,7 @@ ALTER TABLE ONLY public.notice_dismissals -- --- Name: notification_channels notification_channels_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_channels notification_channels_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_channels @@ -12717,7 +13544,7 @@ ALTER TABLE ONLY public.notification_channels -- --- Name: notification_logs notification_logs_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_logs notification_logs_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_logs @@ -12725,7 +13552,7 @@ ALTER TABLE ONLY public.notification_logs -- --- Name: notification_preferences notification_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_preferences notification_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_preferences @@ -12733,7 +13560,7 @@ ALTER TABLE ONLY public.notification_preferences -- --- Name: notification_queue notification_queue_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_queue notification_queue_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_queue @@ -12741,7 +13568,7 @@ ALTER TABLE ONLY public.notification_queue -- --- Name: notification_schedules notification_schedules_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_schedules notification_schedules_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_schedules @@ -12749,7 +13576,7 @@ ALTER TABLE ONLY public.notification_schedules -- --- Name: notification_templates notification_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_templates notification_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_templates @@ -12757,7 +13584,7 @@ ALTER TABLE ONLY public.notification_templates -- --- Name: notifications notifications_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notifications notifications_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notifications @@ -12765,7 +13592,7 @@ ALTER TABLE ONLY public.notifications -- --- Name: owner_users owner_users_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: owner_users owner_users_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.owner_users @@ -12773,7 +13600,15 @@ ALTER TABLE ONLY public.owner_users -- --- Name: patient_discounts patient_discounts_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_contacts patient_contacts_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_contacts + ADD CONSTRAINT patient_contacts_pkey PRIMARY KEY (id); + + +-- +-- Name: patient_discounts patient_discounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_discounts @@ -12781,7 +13616,7 @@ ALTER TABLE ONLY public.patient_discounts -- --- Name: patient_group_patient patient_group_patient_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient patient_group_patient_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_group_patient @@ -12789,7 +13624,7 @@ ALTER TABLE ONLY public.patient_group_patient -- --- Name: patient_groups patient_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_groups patient_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_groups @@ -12797,7 +13632,7 @@ ALTER TABLE ONLY public.patient_groups -- --- Name: patient_intake_requests patient_intake_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests patient_intake_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_intake_requests @@ -12805,7 +13640,7 @@ ALTER TABLE ONLY public.patient_intake_requests -- --- Name: patient_invites patient_invites_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_invites patient_invites_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_invites @@ -12813,7 +13648,7 @@ ALTER TABLE ONLY public.patient_invites -- --- Name: patient_invites patient_invites_token_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_invites patient_invites_token_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_invites @@ -12821,7 +13656,7 @@ ALTER TABLE ONLY public.patient_invites -- --- Name: patient_patient_tag patient_patient_tag_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag patient_patient_tag_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_patient_tag @@ -12829,7 +13664,23 @@ ALTER TABLE ONLY public.patient_patient_tag -- --- Name: patient_tags patient_tags_owner_name_uniq; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_status_history patient_status_history_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_status_history + ADD CONSTRAINT patient_status_history_pkey PRIMARY KEY (id); + + +-- +-- Name: patient_support_contacts patient_support_contacts_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_support_contacts + ADD CONSTRAINT patient_support_contacts_pkey PRIMARY KEY (id); + + +-- +-- Name: patient_tags patient_tags_owner_name_uniq; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_tags @@ -12837,7 +13688,7 @@ ALTER TABLE ONLY public.patient_tags -- --- Name: patient_tags patient_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_tags patient_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_tags @@ -12845,7 +13696,15 @@ ALTER TABLE ONLY public.patient_tags -- --- Name: patients patients_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_timeline patient_timeline_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_timeline + ADD CONSTRAINT patient_timeline_pkey PRIMARY KEY (id); + + +-- +-- Name: patients patients_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patients @@ -12853,7 +13712,7 @@ ALTER TABLE ONLY public.patients -- --- Name: payment_settings payment_settings_owner_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: payment_settings payment_settings_owner_id_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.payment_settings @@ -12861,7 +13720,7 @@ ALTER TABLE ONLY public.payment_settings -- --- Name: payment_settings payment_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: payment_settings payment_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.payment_settings @@ -12869,7 +13728,7 @@ ALTER TABLE ONLY public.payment_settings -- --- Name: plan_features plan_features_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_features plan_features_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_features @@ -12877,7 +13736,7 @@ ALTER TABLE ONLY public.plan_features -- --- Name: plan_prices plan_prices_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_prices plan_prices_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_prices @@ -12885,7 +13744,7 @@ ALTER TABLE ONLY public.plan_prices -- --- Name: plan_public_bullets plan_public_bullets_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_public_bullets plan_public_bullets_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_public_bullets @@ -12893,7 +13752,7 @@ ALTER TABLE ONLY public.plan_public_bullets -- --- Name: plan_public plan_public_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_public plan_public_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_public @@ -12901,7 +13760,7 @@ ALTER TABLE ONLY public.plan_public -- --- Name: plans plans_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plans plans_key_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plans @@ -12909,7 +13768,7 @@ ALTER TABLE ONLY public.plans -- --- Name: plans plans_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plans plans_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plans @@ -12917,7 +13776,7 @@ ALTER TABLE ONLY public.plans -- --- Name: professional_pricing professional_pricing_owner_commitment_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: professional_pricing professional_pricing_owner_commitment_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.professional_pricing @@ -12925,7 +13784,7 @@ ALTER TABLE ONLY public.professional_pricing -- --- Name: professional_pricing professional_pricing_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: professional_pricing professional_pricing_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.professional_pricing @@ -12933,7 +13792,7 @@ ALTER TABLE ONLY public.professional_pricing -- --- Name: profiles profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: profiles profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.profiles @@ -12941,7 +13800,7 @@ ALTER TABLE ONLY public.profiles -- --- Name: recurrence_exceptions recurrence_exceptions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_exceptions recurrence_exceptions_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_exceptions @@ -12949,7 +13808,7 @@ ALTER TABLE ONLY public.recurrence_exceptions -- --- Name: recurrence_exceptions recurrence_exceptions_unique; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_exceptions recurrence_exceptions_unique; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_exceptions @@ -12957,7 +13816,7 @@ ALTER TABLE ONLY public.recurrence_exceptions -- --- Name: recurrence_rule_services recurrence_rule_services_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services recurrence_rule_services_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_rule_services @@ -12965,7 +13824,7 @@ ALTER TABLE ONLY public.recurrence_rule_services -- --- Name: recurrence_rules recurrence_rules_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules recurrence_rules_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_rules @@ -12973,7 +13832,7 @@ ALTER TABLE ONLY public.recurrence_rules -- --- Name: saas_admins saas_admins_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_admins saas_admins_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_admins @@ -12981,7 +13840,7 @@ ALTER TABLE ONLY public.saas_admins -- --- Name: saas_doc_votos saas_doc_votos_doc_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos saas_doc_votos_doc_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_doc_votos @@ -12989,7 +13848,7 @@ ALTER TABLE ONLY public.saas_doc_votos -- --- Name: saas_doc_votos saas_doc_votos_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos saas_doc_votos_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_doc_votos @@ -12997,7 +13856,7 @@ ALTER TABLE ONLY public.saas_doc_votos -- --- Name: saas_docs saas_docs_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_docs saas_docs_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_docs @@ -13005,7 +13864,7 @@ ALTER TABLE ONLY public.saas_docs -- --- Name: saas_faq_itens saas_faq_itens_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_faq_itens saas_faq_itens_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_faq_itens @@ -13013,7 +13872,7 @@ ALTER TABLE ONLY public.saas_faq_itens -- --- Name: saas_faq saas_faq_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_faq saas_faq_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_faq @@ -13021,7 +13880,7 @@ ALTER TABLE ONLY public.saas_faq -- --- Name: services services_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: services services_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.services @@ -13029,7 +13888,7 @@ ALTER TABLE ONLY public.services -- --- Name: subscription_events subscription_events_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_events subscription_events_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_events @@ -13037,7 +13896,7 @@ ALTER TABLE ONLY public.subscription_events -- --- Name: subscription_intents_personal subscription_intents_personal_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_personal subscription_intents_personal_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_intents_personal @@ -13045,7 +13904,7 @@ ALTER TABLE ONLY public.subscription_intents_personal -- --- Name: subscription_intents_legacy subscription_intents_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_legacy subscription_intents_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_intents_legacy @@ -13053,7 +13912,7 @@ ALTER TABLE ONLY public.subscription_intents_legacy -- --- Name: subscription_intents_tenant subscription_intents_tenant_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_tenant subscription_intents_tenant_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_intents_tenant @@ -13061,7 +13920,7 @@ ALTER TABLE ONLY public.subscription_intents_tenant -- --- Name: subscriptions subscriptions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscriptions @@ -13069,7 +13928,7 @@ ALTER TABLE ONLY public.subscriptions -- --- Name: support_sessions support_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: support_sessions support_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.support_sessions @@ -13077,7 +13936,7 @@ ALTER TABLE ONLY public.support_sessions -- --- Name: support_sessions support_sessions_token_unique; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: support_sessions support_sessions_token_unique; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.support_sessions @@ -13085,7 +13944,7 @@ ALTER TABLE ONLY public.support_sessions -- --- Name: tenant_feature_exceptions_log tenant_feature_exceptions_log_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_feature_exceptions_log tenant_feature_exceptions_log_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_feature_exceptions_log @@ -13093,7 +13952,7 @@ ALTER TABLE ONLY public.tenant_feature_exceptions_log -- --- Name: tenant_features tenant_features_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_features tenant_features_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_features @@ -13101,7 +13960,7 @@ ALTER TABLE ONLY public.tenant_features -- --- Name: tenant_invites tenant_invites_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_invites tenant_invites_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_invites @@ -13109,7 +13968,7 @@ ALTER TABLE ONLY public.tenant_invites -- --- Name: tenant_members tenant_members_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_members tenant_members_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_members @@ -13117,7 +13976,7 @@ ALTER TABLE ONLY public.tenant_members -- --- Name: tenant_members tenant_members_tenant_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_members tenant_members_tenant_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_members @@ -13125,7 +13984,7 @@ ALTER TABLE ONLY public.tenant_members -- --- Name: tenant_modules tenant_modules_owner_id_module_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_modules tenant_modules_owner_id_module_id_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_modules @@ -13133,7 +13992,7 @@ ALTER TABLE ONLY public.tenant_modules -- --- Name: tenant_modules tenant_modules_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_modules tenant_modules_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_modules @@ -13141,7 +14000,7 @@ ALTER TABLE ONLY public.tenant_modules -- --- Name: tenants tenants_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenants tenants_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenants @@ -13149,7 +14008,7 @@ ALTER TABLE ONLY public.tenants -- --- Name: therapist_payout_records therapist_payout_records_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: therapist_payout_records therapist_payout_records_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.therapist_payout_records @@ -13157,7 +14016,7 @@ ALTER TABLE ONLY public.therapist_payout_records -- --- Name: therapist_payouts therapist_payouts_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: therapist_payouts therapist_payouts_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.therapist_payouts @@ -13165,7 +14024,15 @@ ALTER TABLE ONLY public.therapist_payouts -- --- Name: addon_credits uq_addon_credits_tenant_type; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: twilio_subaccount_usage twilio_subaccount_usage_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.twilio_subaccount_usage + ADD CONSTRAINT twilio_subaccount_usage_pkey PRIMARY KEY (id); + + +-- +-- Name: addon_credits uq_addon_credits_tenant_type; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_credits @@ -13173,7 +14040,7 @@ ALTER TABLE ONLY public.addon_credits -- --- Name: notification_channels uq_channel_per_owner; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_channels uq_channel_per_owner; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_channels @@ -13181,7 +14048,7 @@ ALTER TABLE ONLY public.notification_channels -- --- Name: notification_preferences uq_notif_prefs_patient_owner; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_preferences uq_notif_prefs_patient_owner; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_preferences @@ -13189,7 +14056,7 @@ ALTER TABLE ONLY public.notification_preferences -- --- Name: notification_queue uq_notif_queue_idempotency; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_queue uq_notif_queue_idempotency; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_queue @@ -13197,7 +14064,7 @@ ALTER TABLE ONLY public.notification_queue -- --- Name: notification_schedules uq_notif_schedule_owner; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_schedules uq_notif_schedule_owner; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_schedules @@ -13205,7 +14072,7 @@ ALTER TABLE ONLY public.notification_schedules -- --- Name: notification_templates uq_notif_template_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_templates uq_notif_template_key; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_templates @@ -13213,7 +14080,7 @@ ALTER TABLE ONLY public.notification_templates -- --- Name: user_settings user_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: user_settings user_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.user_settings @@ -13221,7 +14088,7 @@ ALTER TABLE ONLY public.user_settings -- --- Name: messages messages_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages messages_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- ALTER TABLE ONLY realtime.messages @@ -13229,63 +14096,63 @@ ALTER TABLE ONLY realtime.messages -- --- Name: messages_2026_03_20 messages_2026_03_20_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_14 messages_2026_04_14_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages_2026_03_20 - ADD CONSTRAINT messages_2026_03_20_pkey PRIMARY KEY (id, inserted_at); +ALTER TABLE ONLY realtime.messages_2026_04_14 + ADD CONSTRAINT messages_2026_04_14_pkey PRIMARY KEY (id, inserted_at); -- --- Name: messages_2026_03_21 messages_2026_03_21_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_15 messages_2026_04_15_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages_2026_03_21 - ADD CONSTRAINT messages_2026_03_21_pkey PRIMARY KEY (id, inserted_at); +ALTER TABLE ONLY realtime.messages_2026_04_15 + ADD CONSTRAINT messages_2026_04_15_pkey PRIMARY KEY (id, inserted_at); -- --- Name: messages_2026_03_22 messages_2026_03_22_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_16 messages_2026_04_16_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages_2026_03_22 - ADD CONSTRAINT messages_2026_03_22_pkey PRIMARY KEY (id, inserted_at); +ALTER TABLE ONLY realtime.messages_2026_04_16 + ADD CONSTRAINT messages_2026_04_16_pkey PRIMARY KEY (id, inserted_at); -- --- Name: messages_2026_03_23 messages_2026_03_23_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_17 messages_2026_04_17_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages_2026_03_23 - ADD CONSTRAINT messages_2026_03_23_pkey PRIMARY KEY (id, inserted_at); +ALTER TABLE ONLY realtime.messages_2026_04_17 + ADD CONSTRAINT messages_2026_04_17_pkey PRIMARY KEY (id, inserted_at); -- --- Name: messages_2026_03_24 messages_2026_03_24_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_18 messages_2026_04_18_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages_2026_03_24 - ADD CONSTRAINT messages_2026_03_24_pkey PRIMARY KEY (id, inserted_at); +ALTER TABLE ONLY realtime.messages_2026_04_18 + ADD CONSTRAINT messages_2026_04_18_pkey PRIMARY KEY (id, inserted_at); -- --- Name: messages_2026_03_25 messages_2026_03_25_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_19 messages_2026_04_19_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages_2026_03_25 - ADD CONSTRAINT messages_2026_03_25_pkey PRIMARY KEY (id, inserted_at); +ALTER TABLE ONLY realtime.messages_2026_04_19 + ADD CONSTRAINT messages_2026_04_19_pkey PRIMARY KEY (id, inserted_at); -- --- Name: messages_2026_03_26 messages_2026_03_26_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_20 messages_2026_04_20_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- -ALTER TABLE ONLY realtime.messages_2026_03_26 - ADD CONSTRAINT messages_2026_03_26_pkey PRIMARY KEY (id, inserted_at); +ALTER TABLE ONLY realtime.messages_2026_04_20 + ADD CONSTRAINT messages_2026_04_20_pkey PRIMARY KEY (id, inserted_at); -- --- Name: subscription pk_subscription; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: subscription pk_subscription; Type: CONSTRAINT; Schema: realtime; Owner: - -- ALTER TABLE ONLY realtime.subscription @@ -13293,7 +14160,7 @@ ALTER TABLE ONLY realtime.subscription -- --- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin +-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: realtime; Owner: - -- ALTER TABLE ONLY realtime.schema_migrations @@ -13301,7 +14168,7 @@ ALTER TABLE ONLY realtime.schema_migrations -- --- Name: buckets_analytics buckets_analytics_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets_analytics buckets_analytics_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.buckets_analytics @@ -13309,7 +14176,7 @@ ALTER TABLE ONLY storage.buckets_analytics -- --- Name: buckets buckets_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets buckets_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.buckets @@ -13317,7 +14184,7 @@ ALTER TABLE ONLY storage.buckets -- --- Name: buckets_vectors buckets_vectors_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets_vectors buckets_vectors_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.buckets_vectors @@ -13325,7 +14192,7 @@ ALTER TABLE ONLY storage.buckets_vectors -- --- Name: iceberg_namespaces iceberg_namespaces_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: iceberg_namespaces iceberg_namespaces_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.iceberg_namespaces @@ -13333,7 +14200,7 @@ ALTER TABLE ONLY storage.iceberg_namespaces -- --- Name: iceberg_tables iceberg_tables_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: iceberg_tables iceberg_tables_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.iceberg_tables @@ -13341,7 +14208,7 @@ ALTER TABLE ONLY storage.iceberg_tables -- --- Name: migrations migrations_name_key; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: migrations migrations_name_key; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.migrations @@ -13349,7 +14216,7 @@ ALTER TABLE ONLY storage.migrations -- --- Name: migrations migrations_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: migrations migrations_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.migrations @@ -13357,7 +14224,7 @@ ALTER TABLE ONLY storage.migrations -- --- Name: objects objects_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: objects objects_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.objects @@ -13365,7 +14232,7 @@ ALTER TABLE ONLY storage.objects -- --- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.s3_multipart_uploads_parts @@ -13373,7 +14240,7 @@ ALTER TABLE ONLY storage.s3_multipart_uploads_parts -- --- Name: s3_multipart_uploads s3_multipart_uploads_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads s3_multipart_uploads_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.s3_multipart_uploads @@ -13381,7 +14248,7 @@ ALTER TABLE ONLY storage.s3_multipart_uploads -- --- Name: vector_indexes vector_indexes_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: vector_indexes vector_indexes_pkey; Type: CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.vector_indexes @@ -13389,7 +14256,7 @@ ALTER TABLE ONLY storage.vector_indexes -- --- Name: hooks hooks_pkey; Type: CONSTRAINT; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: hooks hooks_pkey; Type: CONSTRAINT; Schema: supabase_functions; Owner: - -- ALTER TABLE ONLY supabase_functions.hooks @@ -13397,7 +14264,7 @@ ALTER TABLE ONLY supabase_functions.hooks -- --- Name: migrations migrations_pkey; Type: CONSTRAINT; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: migrations migrations_pkey; Type: CONSTRAINT; Schema: supabase_functions; Owner: - -- ALTER TABLE ONLY supabase_functions.migrations @@ -13405,2639 +14272,3073 @@ ALTER TABLE ONLY supabase_functions.migrations -- --- Name: extensions_tenant_external_id_index; Type: INDEX; Schema: _realtime; Owner: supabase_admin +-- Name: extensions_tenant_external_id_index; Type: INDEX; Schema: _realtime; Owner: - -- CREATE INDEX extensions_tenant_external_id_index ON _realtime.extensions USING btree (tenant_external_id); -- --- Name: extensions_tenant_external_id_type_index; Type: INDEX; Schema: _realtime; Owner: supabase_admin +-- Name: extensions_tenant_external_id_type_index; Type: INDEX; Schema: _realtime; Owner: - -- CREATE UNIQUE INDEX extensions_tenant_external_id_type_index ON _realtime.extensions USING btree (tenant_external_id, type); -- --- Name: tenants_external_id_index; Type: INDEX; Schema: _realtime; Owner: supabase_admin +-- Name: tenants_external_id_index; Type: INDEX; Schema: _realtime; Owner: - -- CREATE UNIQUE INDEX tenants_external_id_index ON _realtime.tenants USING btree (external_id); -- --- Name: audit_logs_instance_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: audit_logs_instance_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX audit_logs_instance_id_idx ON auth.audit_log_entries USING btree (instance_id); -- --- Name: confirmation_token_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: confirmation_token_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX confirmation_token_idx ON auth.users USING btree (confirmation_token) WHERE ((confirmation_token)::text !~ '^[0-9 ]*$'::text); -- --- Name: email_change_token_current_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: email_change_token_current_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX email_change_token_current_idx ON auth.users USING btree (email_change_token_current) WHERE ((email_change_token_current)::text !~ '^[0-9 ]*$'::text); -- --- Name: email_change_token_new_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: email_change_token_new_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX email_change_token_new_idx ON auth.users USING btree (email_change_token_new) WHERE ((email_change_token_new)::text !~ '^[0-9 ]*$'::text); -- --- Name: factor_id_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: factor_id_created_at_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX factor_id_created_at_idx ON auth.mfa_factors USING btree (user_id, created_at); -- --- Name: flow_state_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: flow_state_created_at_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX flow_state_created_at_idx ON auth.flow_state USING btree (created_at DESC); -- --- Name: identities_email_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: identities_email_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX identities_email_idx ON auth.identities USING btree (email text_pattern_ops); -- --- Name: INDEX identities_email_idx; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: INDEX identities_email_idx; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON INDEX auth.identities_email_idx IS 'Auth: Ensures indexed queries on the email column'; -- --- Name: identities_user_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: identities_user_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX identities_user_id_idx ON auth.identities USING btree (user_id); -- --- Name: idx_auth_code; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: idx_auth_code; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX idx_auth_code ON auth.flow_state USING btree (auth_code); -- --- Name: idx_oauth_client_states_created_at; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: idx_oauth_client_states_created_at; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX idx_oauth_client_states_created_at ON auth.oauth_client_states USING btree (created_at); -- --- Name: idx_user_id_auth_method; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: idx_user_id_auth_method; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX idx_user_id_auth_method ON auth.flow_state USING btree (user_id, authentication_method); -- --- Name: mfa_challenge_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_challenge_created_at_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX mfa_challenge_created_at_idx ON auth.mfa_challenges USING btree (created_at DESC); -- --- Name: mfa_factors_user_friendly_name_unique; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_factors_user_friendly_name_unique; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX mfa_factors_user_friendly_name_unique ON auth.mfa_factors USING btree (friendly_name, user_id) WHERE (TRIM(BOTH FROM friendly_name) <> ''::text); -- --- Name: mfa_factors_user_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_factors_user_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX mfa_factors_user_id_idx ON auth.mfa_factors USING btree (user_id); -- --- Name: oauth_auth_pending_exp_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_auth_pending_exp_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX oauth_auth_pending_exp_idx ON auth.oauth_authorizations USING btree (expires_at) WHERE (status = 'pending'::auth.oauth_authorization_status); -- --- Name: oauth_clients_deleted_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_clients_deleted_at_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX oauth_clients_deleted_at_idx ON auth.oauth_clients USING btree (deleted_at); -- --- Name: oauth_consents_active_client_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_consents_active_client_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX oauth_consents_active_client_idx ON auth.oauth_consents USING btree (client_id) WHERE (revoked_at IS NULL); -- --- Name: oauth_consents_active_user_client_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_consents_active_user_client_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX oauth_consents_active_user_client_idx ON auth.oauth_consents USING btree (user_id, client_id) WHERE (revoked_at IS NULL); -- --- Name: oauth_consents_user_order_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_consents_user_order_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX oauth_consents_user_order_idx ON auth.oauth_consents USING btree (user_id, granted_at DESC); -- --- Name: one_time_tokens_relates_to_hash_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: one_time_tokens_relates_to_hash_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX one_time_tokens_relates_to_hash_idx ON auth.one_time_tokens USING hash (relates_to); -- --- Name: one_time_tokens_token_hash_hash_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: one_time_tokens_token_hash_hash_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX one_time_tokens_token_hash_hash_idx ON auth.one_time_tokens USING hash (token_hash); -- --- Name: one_time_tokens_user_id_token_type_key; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: one_time_tokens_user_id_token_type_key; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX one_time_tokens_user_id_token_type_key ON auth.one_time_tokens USING btree (user_id, token_type); -- --- Name: reauthentication_token_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: reauthentication_token_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX reauthentication_token_idx ON auth.users USING btree (reauthentication_token) WHERE ((reauthentication_token)::text !~ '^[0-9 ]*$'::text); -- --- Name: recovery_token_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: recovery_token_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX recovery_token_idx ON auth.users USING btree (recovery_token) WHERE ((recovery_token)::text !~ '^[0-9 ]*$'::text); -- --- Name: refresh_tokens_instance_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens_instance_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX refresh_tokens_instance_id_idx ON auth.refresh_tokens USING btree (instance_id); -- --- Name: refresh_tokens_instance_id_user_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens_instance_id_user_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX refresh_tokens_instance_id_user_id_idx ON auth.refresh_tokens USING btree (instance_id, user_id); -- --- Name: refresh_tokens_parent_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens_parent_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX refresh_tokens_parent_idx ON auth.refresh_tokens USING btree (parent); -- --- Name: refresh_tokens_session_id_revoked_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens_session_id_revoked_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX refresh_tokens_session_id_revoked_idx ON auth.refresh_tokens USING btree (session_id, revoked); -- --- Name: refresh_tokens_updated_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens_updated_at_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX refresh_tokens_updated_at_idx ON auth.refresh_tokens USING btree (updated_at DESC); -- --- Name: saml_providers_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_providers_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX saml_providers_sso_provider_id_idx ON auth.saml_providers USING btree (sso_provider_id); -- --- Name: saml_relay_states_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_relay_states_created_at_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX saml_relay_states_created_at_idx ON auth.saml_relay_states USING btree (created_at DESC); -- --- Name: saml_relay_states_for_email_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_relay_states_for_email_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX saml_relay_states_for_email_idx ON auth.saml_relay_states USING btree (for_email); -- --- Name: saml_relay_states_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_relay_states_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX saml_relay_states_sso_provider_id_idx ON auth.saml_relay_states USING btree (sso_provider_id); -- --- Name: sessions_not_after_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: sessions_not_after_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX sessions_not_after_idx ON auth.sessions USING btree (not_after DESC); -- --- Name: sessions_oauth_client_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: sessions_oauth_client_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX sessions_oauth_client_id_idx ON auth.sessions USING btree (oauth_client_id); -- --- Name: sessions_user_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: sessions_user_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX sessions_user_id_idx ON auth.sessions USING btree (user_id); -- --- Name: sso_domains_domain_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_domains_domain_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX sso_domains_domain_idx ON auth.sso_domains USING btree (lower(domain)); -- --- Name: sso_domains_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_domains_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX sso_domains_sso_provider_id_idx ON auth.sso_domains USING btree (sso_provider_id); -- --- Name: sso_providers_resource_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_providers_resource_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX sso_providers_resource_id_idx ON auth.sso_providers USING btree (lower(resource_id)); -- --- Name: sso_providers_resource_id_pattern_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_providers_resource_id_pattern_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX sso_providers_resource_id_pattern_idx ON auth.sso_providers USING btree (resource_id text_pattern_ops); -- --- Name: unique_phone_factor_per_user; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: unique_phone_factor_per_user; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX unique_phone_factor_per_user ON auth.mfa_factors USING btree (user_id, phone); -- --- Name: user_id_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: user_id_created_at_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX user_id_created_at_idx ON auth.sessions USING btree (user_id, created_at); -- --- Name: users_email_partial_key; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: users_email_partial_key; Type: INDEX; Schema: auth; Owner: - -- CREATE UNIQUE INDEX users_email_partial_key ON auth.users USING btree (email) WHERE (is_sso_user = false); -- --- Name: INDEX users_email_partial_key; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin +-- Name: INDEX users_email_partial_key; Type: COMMENT; Schema: auth; Owner: - -- COMMENT ON INDEX auth.users_email_partial_key IS 'Auth: A partial unique index that applies only when is_sso_user is false'; -- --- Name: users_instance_id_email_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: users_instance_id_email_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX users_instance_id_email_idx ON auth.users USING btree (instance_id, lower((email)::text)); -- --- Name: users_instance_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: users_instance_id_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX users_instance_id_idx ON auth.users USING btree (instance_id); -- --- Name: users_is_anonymous_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin +-- Name: users_is_anonymous_idx; Type: INDEX; Schema: auth; Owner: - -- CREATE INDEX users_is_anonymous_idx ON auth.users USING btree (is_anonymous); -- --- Name: agenda_bloqueios_owner_data_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios_owner_data_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_bloqueios_owner_data_idx ON public.agenda_bloqueios USING btree (owner_id, data_inicio, data_fim); -- --- Name: agenda_bloqueios_owner_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios_owner_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_bloqueios_owner_id_idx ON public.agenda_bloqueios USING btree (owner_id); -- --- Name: agenda_bloqueios_recorrente_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios_recorrente_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_bloqueios_recorrente_idx ON public.agenda_bloqueios USING btree (owner_id, dia_semana) WHERE (recorrente = true); -- --- Name: agenda_bloqueios_tenant_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios_tenant_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_bloqueios_tenant_id_idx ON public.agenda_bloqueios USING btree (tenant_id); -- --- Name: agenda_configuracoes_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_configuracoes_tenant_idx ON public.agenda_configuracoes USING btree (tenant_id); -- --- Name: agenda_configuracoes_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes_tenant_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_configuracoes_tenant_owner_idx ON public.agenda_configuracoes USING btree (tenant_id, owner_id); -- --- Name: agenda_eventos_billing_contract_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos_billing_contract_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_eventos_billing_contract_idx ON public.agenda_eventos USING btree (billing_contract_id) WHERE (billing_contract_id IS NOT NULL); -- --- Name: agenda_eventos_insurance_plan_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos_insurance_plan_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_eventos_insurance_plan_idx ON public.agenda_eventos USING btree (insurance_plan_id); -- --- Name: agenda_eventos_owner_inicio_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos_owner_inicio_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_eventos_owner_inicio_idx ON public.agenda_eventos USING btree (owner_id, inicio_em); -- --- Name: agenda_eventos_owner_terapeuta_inicio_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos_owner_terapeuta_inicio_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_eventos_owner_terapeuta_inicio_idx ON public.agenda_eventos USING btree (owner_id, terapeuta_id, inicio_em); -- --- Name: agenda_eventos_recurrence_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos_recurrence_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_eventos_recurrence_idx ON public.agenda_eventos USING btree (recurrence_id) WHERE (recurrence_id IS NOT NULL); -- --- Name: agenda_eventos_tenant_inicio_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos_tenant_inicio_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_eventos_tenant_inicio_idx ON public.agenda_eventos USING btree (tenant_id, inicio_em); -- --- Name: agenda_eventos_tenant_owner_inicio_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos_tenant_owner_inicio_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_eventos_tenant_owner_inicio_idx ON public.agenda_eventos USING btree (tenant_id, owner_id, inicio_em); -- --- Name: agenda_excecoes_owner_data_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes_owner_data_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_excecoes_owner_data_idx ON public.agenda_excecoes USING btree (owner_id, data); -- --- Name: agenda_excecoes_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_excecoes_tenant_idx ON public.agenda_excecoes USING btree (tenant_id); -- --- Name: agenda_excecoes_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes_tenant_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_excecoes_tenant_owner_idx ON public.agenda_excecoes USING btree (tenant_id, owner_id); -- --- Name: agenda_online_slots_owner_weekday_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots_owner_weekday_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_online_slots_owner_weekday_idx ON public.agenda_online_slots USING btree (owner_id, weekday); -- --- Name: agenda_online_slots_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_online_slots_tenant_idx ON public.agenda_online_slots USING btree (tenant_id); -- --- Name: agenda_online_slots_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots_tenant_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_online_slots_tenant_owner_idx ON public.agenda_online_slots USING btree (tenant_id, owner_id); -- --- Name: agenda_regras_semanais_owner_dia_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais_owner_dia_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_regras_semanais_owner_dia_idx ON public.agenda_regras_semanais USING btree (owner_id, dia_semana); -- --- Name: agenda_regras_semanais_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_regras_semanais_tenant_idx ON public.agenda_regras_semanais USING btree (tenant_id); -- --- Name: agenda_regras_semanais_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais_tenant_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_regras_semanais_tenant_owner_idx ON public.agenda_regras_semanais USING btree (tenant_id, owner_id); -- --- Name: agenda_slots_bloqueados_semanais_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_slots_bloqueados_semanais_tenant_idx ON public.agenda_slots_bloqueados_semanais USING btree (tenant_id); -- --- Name: agenda_slots_bloqueados_semanais_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais_tenant_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_slots_bloqueados_semanais_tenant_owner_idx ON public.agenda_slots_bloqueados_semanais USING btree (tenant_id, owner_id); -- --- Name: agenda_slots_regras_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_slots_regras_tenant_idx ON public.agenda_slots_regras USING btree (tenant_id); -- --- Name: agenda_slots_regras_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras_tenant_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agenda_slots_regras_tenant_owner_idx ON public.agenda_slots_regras USING btree (tenant_id, owner_id); -- --- Name: agendador_cfg_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agendador_cfg_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agendador_cfg_tenant_idx ON public.agendador_configuracoes USING btree (tenant_id); -- --- Name: agendador_sol_data_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agendador_sol_data_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agendador_sol_data_idx ON public.agendador_solicitacoes USING btree (data_solicitada, hora_solicitada); -- --- Name: agendador_sol_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agendador_sol_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agendador_sol_owner_idx ON public.agendador_solicitacoes USING btree (owner_id, status); -- --- Name: agendador_sol_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: agendador_sol_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX agendador_sol_tenant_idx ON public.agendador_solicitacoes USING btree (tenant_id); -- --- Name: billing_contracts_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: billing_contracts_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX billing_contracts_owner_idx ON public.billing_contracts USING btree (owner_id); -- --- Name: billing_contracts_patient_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: billing_contracts_patient_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX billing_contracts_patient_idx ON public.billing_contracts USING btree (patient_id); -- --- Name: billing_contracts_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: billing_contracts_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX billing_contracts_tenant_idx ON public.billing_contracts USING btree (tenant_id); -- --- Name: commitment_services_commitment_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: commitment_services_commitment_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX commitment_services_commitment_idx ON public.commitment_services USING btree (commitment_id); -- --- Name: commitment_services_service_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: commitment_services_service_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX commitment_services_service_idx ON public.commitment_services USING btree (service_id); -- --- Name: commitment_time_logs_calendar_event_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs_calendar_event_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX commitment_time_logs_calendar_event_idx ON public.commitment_time_logs USING btree (calendar_event_id); -- --- Name: commitment_time_logs_commitment_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs_commitment_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX commitment_time_logs_commitment_idx ON public.commitment_time_logs USING btree (commitment_id, created_at DESC); -- --- Name: commitment_time_logs_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX commitment_time_logs_tenant_idx ON public.commitment_time_logs USING btree (tenant_id, created_at DESC); -- --- Name: determined_commitment_fields_commitment_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: dal_documento_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dal_documento_idx ON public.document_access_logs USING btree (documento_id, acessado_em DESC); + + +-- +-- Name: dal_tenant_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dal_tenant_idx ON public.document_access_logs USING btree (tenant_id, acessado_em DESC); + + +-- +-- Name: dal_user_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dal_user_idx ON public.document_access_logs USING btree (user_id, acessado_em DESC); + + +-- +-- Name: determined_commitment_fields_commitment_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX determined_commitment_fields_commitment_idx ON public.determined_commitment_fields USING btree (commitment_id, sort_order); -- --- Name: determined_commitment_fields_key_uniq; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields_key_uniq; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX determined_commitment_fields_key_uniq ON public.determined_commitment_fields USING btree (commitment_id, key); -- --- Name: determined_commitment_fields_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX determined_commitment_fields_tenant_idx ON public.determined_commitment_fields USING btree (tenant_id); -- --- Name: determined_commitments_active_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: determined_commitments_active_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX determined_commitments_active_idx ON public.determined_commitments USING btree (tenant_id, active); -- --- Name: determined_commitments_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: determined_commitments_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX determined_commitments_tenant_idx ON public.determined_commitments USING btree (tenant_id); -- --- Name: determined_commitments_tenant_name_uniq; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: determined_commitments_tenant_name_uniq; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX determined_commitments_tenant_name_uniq ON public.determined_commitments USING btree (tenant_id, lower(name)); -- --- Name: feriados_global_unique; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: dg_gerado_por_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dg_gerado_por_idx ON public.document_generated USING btree (gerado_por, gerado_em DESC); + + +-- +-- Name: dg_patient_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dg_patient_idx ON public.document_generated USING btree (patient_id, gerado_em DESC); + + +-- +-- Name: dg_template_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dg_template_idx ON public.document_generated USING btree (template_id); + + +-- +-- Name: dg_tenant_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dg_tenant_idx ON public.document_generated USING btree (tenant_id, gerado_em DESC); + + +-- +-- Name: docs_active_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX docs_active_idx ON public.documents USING btree (patient_id, uploaded_at DESC) WHERE (deleted_at IS NULL); + + +-- +-- Name: docs_nome_trgm_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX docs_nome_trgm_idx ON public.documents USING gin (nome_original public.gin_trgm_ops); + + +-- +-- Name: docs_owner_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX docs_owner_idx ON public.documents USING btree (owner_id); + + +-- +-- Name: docs_patient_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX docs_patient_idx ON public.documents USING btree (patient_id); + + +-- +-- Name: docs_tags_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX docs_tags_idx ON public.documents USING gin (tags); + + +-- +-- Name: docs_tenant_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX docs_tenant_idx ON public.documents USING btree (tenant_id); + + +-- +-- Name: docs_tipo_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX docs_tipo_idx ON public.documents USING btree (patient_id, tipo_documento); + + +-- +-- Name: docs_uploaded_at_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX docs_uploaded_at_idx ON public.documents USING btree (patient_id, uploaded_at DESC); + + +-- +-- Name: ds_documento_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ds_documento_idx ON public.document_signatures USING btree (documento_id, ordem); + + +-- +-- Name: ds_status_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ds_status_idx ON public.document_signatures USING btree (documento_id, status); + + +-- +-- Name: ds_tenant_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX ds_tenant_idx ON public.document_signatures USING btree (tenant_id); + + +-- +-- Name: dsl_documento_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dsl_documento_idx ON public.document_share_links USING btree (documento_id); + + +-- +-- Name: dsl_expira_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dsl_expira_idx ON public.document_share_links USING btree (expira_em) WHERE (ativo = true); + + +-- +-- Name: dsl_token_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dsl_token_idx ON public.document_share_links USING btree (token) WHERE (ativo = true); + + +-- +-- Name: dt_global_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dt_global_idx ON public.document_templates USING btree (is_global) WHERE (is_global = true); + + +-- +-- Name: dt_nome_trgm_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dt_nome_trgm_idx ON public.document_templates USING gin (nome_template public.gin_trgm_ops); + + +-- +-- Name: dt_owner_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dt_owner_idx ON public.document_templates USING btree (owner_id); + + +-- +-- Name: dt_tenant_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dt_tenant_idx ON public.document_templates USING btree (tenant_id); + + +-- +-- Name: dt_tipo_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX dt_tipo_idx ON public.document_templates USING btree (tipo); + + +-- +-- Name: feriados_global_unique; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX feriados_global_unique ON public.feriados USING btree (data, nome) WHERE (tenant_id IS NULL); -- --- Name: financial_exceptions_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX financial_exceptions_owner_idx ON public.financial_exceptions USING btree (owner_id); -- --- Name: financial_exceptions_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX financial_exceptions_tenant_idx ON public.financial_exceptions USING btree (tenant_id); -- --- Name: idx_addon_credits_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_addon_credits_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_addon_credits_tenant ON public.addon_credits USING btree (tenant_id) WHERE (is_active = true); -- --- Name: idx_addon_credits_type; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_addon_credits_type; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_addon_credits_type ON public.addon_credits USING btree (addon_type) WHERE (is_active = true); -- --- Name: idx_addon_products_active; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_addon_products_active; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_addon_products_active ON public.addon_products USING btree (is_active, is_visible) WHERE (deleted_at IS NULL); -- --- Name: idx_addon_products_type; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_addon_products_type; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_addon_products_type ON public.addon_products USING btree (addon_type) WHERE (deleted_at IS NULL); -- --- Name: idx_addon_tx_created; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_addon_tx_created; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_addon_tx_created ON public.addon_transactions USING btree (created_at DESC); -- --- Name: idx_addon_tx_queue; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_addon_tx_queue; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_addon_tx_queue ON public.addon_transactions USING btree (queue_id) WHERE (queue_id IS NOT NULL); -- --- Name: idx_addon_tx_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_addon_tx_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_addon_tx_tenant ON public.addon_transactions USING btree (tenant_id, addon_type); -- --- Name: idx_addon_tx_type; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_addon_tx_type; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_addon_tx_type ON public.addon_transactions USING btree (type); -- --- Name: idx_agenda_eventos_determined_commitment_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_agenda_eventos_determined_commitment_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_agenda_eventos_determined_commitment_id ON public.agenda_eventos USING btree (determined_commitment_id); -- --- Name: idx_agenda_excecoes_owner_data; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_agenda_excecoes_owner_data; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_agenda_excecoes_owner_data ON public.agenda_excecoes USING btree (owner_id, data); -- --- Name: idx_agenda_slots_regras_owner_dia; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_agenda_slots_regras_owner_dia; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_agenda_slots_regras_owner_dia ON public.agenda_slots_regras USING btree (owner_id, dia_semana); -- --- Name: idx_email_templates_global_domain; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_email_templates_global_domain; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_email_templates_global_domain ON public.email_templates_global USING btree (domain) WHERE (is_active = true); -- --- Name: idx_email_templates_global_key; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_email_templates_global_key; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_email_templates_global_key ON public.email_templates_global USING btree (key) WHERE (is_active = true); -- --- Name: idx_email_templates_tenant_lookup; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_email_templates_tenant_lookup; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_email_templates_tenant_lookup ON public.email_templates_tenant USING btree (tenant_id, template_key) WHERE (enabled = true); -- --- Name: idx_email_templates_tenant_owner; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_email_templates_tenant_owner; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_email_templates_tenant_owner ON public.email_templates_tenant USING btree (owner_id, template_key) WHERE ((enabled = true) AND (owner_id IS NOT NULL)); -- --- Name: idx_financial_categories_user_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_categories_user_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_categories_user_id ON public.financial_categories USING btree (user_id); -- --- Name: idx_financial_records_active; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_active; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_active ON public.financial_records USING btree (owner_id, paid_at DESC) WHERE (deleted_at IS NULL); -- --- Name: idx_financial_records_agenda_evento_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_agenda_evento_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_agenda_evento_id ON public.financial_records USING btree (agenda_evento_id) WHERE (agenda_evento_id IS NOT NULL); -- --- Name: idx_financial_records_category_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_category_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_category_id ON public.financial_records USING btree (category_id) WHERE (category_id IS NOT NULL); -- --- Name: idx_financial_records_due_date; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_due_date; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_due_date ON public.financial_records USING btree (due_date); -- --- Name: idx_financial_records_installment_group; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_installment_group; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_installment_group ON public.financial_records USING btree (installment_group) WHERE (installment_group IS NOT NULL); -- --- Name: idx_financial_records_owner_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_owner_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_owner_id ON public.financial_records USING btree (owner_id); -- --- Name: idx_financial_records_paid_at; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_paid_at; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_paid_at ON public.financial_records USING btree (paid_at DESC); -- --- Name: idx_financial_records_patient_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_patient_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_patient_id ON public.financial_records USING btree (patient_id); -- --- Name: idx_financial_records_status; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_status; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_status ON public.financial_records USING btree (status) WHERE (deleted_at IS NULL); -- --- Name: idx_financial_records_tenant_active; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_tenant_active; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_tenant_active ON public.financial_records USING btree (tenant_id, paid_at DESC) WHERE ((deleted_at IS NULL) AND (tenant_id IS NOT NULL)); -- --- Name: idx_financial_records_tenant_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_tenant_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_tenant_id ON public.financial_records USING btree (tenant_id); -- --- Name: idx_financial_records_type_status; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_financial_records_type_status; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_financial_records_type_status ON public.financial_records USING btree (type, status); -- --- Name: idx_global_notices_active_priority; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_global_notices_active_priority; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_global_notices_active_priority ON public.global_notices USING btree (is_active, priority DESC, starts_at, ends_at); -- --- Name: idx_intakes_converted_patient_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_intakes_converted_patient_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_intakes_converted_patient_id ON public.patient_intake_requests USING btree (converted_patient_id); -- --- Name: idx_intakes_owner_cpf; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_intakes_owner_cpf; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_intakes_owner_cpf ON public.patient_intake_requests USING btree (owner_id, cpf); -- --- Name: idx_intakes_owner_created; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_intakes_owner_created; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_intakes_owner_created ON public.patient_intake_requests USING btree (owner_id, created_at DESC); -- --- Name: idx_intakes_owner_status_created; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_intakes_owner_status_created; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_intakes_owner_status_created ON public.patient_intake_requests USING btree (owner_id, status, created_at DESC); -- --- Name: idx_intakes_status_created; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_intakes_status_created; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_intakes_status_created ON public.patient_intake_requests USING btree (status, created_at DESC); -- --- Name: idx_notice_dismissals_user; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notice_dismissals_user; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notice_dismissals_user ON public.notice_dismissals USING btree (user_id, notice_id); -- --- Name: idx_notif_channels_owner_active; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_channels_owner_active; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_channels_owner_active ON public.notification_channels USING btree (owner_id, channel) WHERE ((is_active = true) AND (deleted_at IS NULL)); -- --- Name: idx_notif_channels_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_channels_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_channels_tenant ON public.notification_channels USING btree (tenant_id) WHERE (deleted_at IS NULL); -- --- Name: idx_notif_logs_owner_date; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_logs_owner_date; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_logs_owner_date ON public.notification_logs USING btree (owner_id, created_at DESC); -- --- Name: idx_notif_logs_patient; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_logs_patient; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_logs_patient ON public.notification_logs USING btree (patient_id, created_at DESC); -- --- Name: idx_notif_logs_provider_msg; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_logs_provider_msg; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_logs_provider_msg ON public.notification_logs USING btree (provider_message_id) WHERE (provider_message_id IS NOT NULL); -- --- Name: idx_notif_logs_status; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_logs_status; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_logs_status ON public.notification_logs USING btree (status, created_at DESC); -- --- Name: idx_notif_logs_tenant_date; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_logs_tenant_date; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_logs_tenant_date ON public.notification_logs USING btree (tenant_id, created_at DESC); -- --- Name: idx_notif_prefs_owner; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_prefs_owner; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_prefs_owner ON public.notification_preferences USING btree (owner_id) WHERE (deleted_at IS NULL); -- --- Name: idx_notif_prefs_patient; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_prefs_patient; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_prefs_patient ON public.notification_preferences USING btree (patient_id) WHERE (deleted_at IS NULL); -- --- Name: idx_notif_prefs_whatsapp_active; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_prefs_whatsapp_active; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_prefs_whatsapp_active ON public.notification_preferences USING btree (owner_id, patient_id) WHERE ((whatsapp_opt_in = true) AND (deleted_at IS NULL)); -- --- Name: idx_notif_queue_evento; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_queue_evento; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_queue_evento ON public.notification_queue USING btree (agenda_evento_id) WHERE (status = ANY (ARRAY['pendente'::text, 'processando'::text])); -- --- Name: idx_notif_queue_patient; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_queue_patient; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_queue_patient ON public.notification_queue USING btree (patient_id, channel) WHERE (status = 'pendente'::text); -- --- Name: idx_notif_queue_pending; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_queue_pending; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_queue_pending ON public.notification_queue USING btree (scheduled_at) WHERE (status = 'pendente'::text); -- --- Name: idx_notif_queue_processing; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_queue_processing; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_queue_processing ON public.notification_queue USING btree (status, updated_at) WHERE (status = 'processando'::text); -- --- Name: idx_notif_queue_retry; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_queue_retry; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_queue_retry ON public.notification_queue USING btree (next_retry_at) WHERE ((status = 'pendente'::text) AND (attempts > 0)); -- --- Name: idx_notif_queue_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_queue_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_queue_tenant ON public.notification_queue USING btree (tenant_id, created_at DESC); -- --- Name: idx_notif_schedules_owner_active; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_schedules_owner_active; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_schedules_owner_active ON public.notification_schedules USING btree (owner_id, event_type) WHERE ((is_active = true) AND (deleted_at IS NULL)); -- --- Name: idx_notif_templates_default; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_templates_default; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_templates_default ON public.notification_templates USING btree (channel, event_type) WHERE ((is_default = true) AND (deleted_at IS NULL) AND (tenant_id IS NULL)); -- --- Name: idx_notif_templates_lookup; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_templates_lookup; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_templates_lookup ON public.notification_templates USING btree (channel, event_type, is_active) WHERE (deleted_at IS NULL); -- --- Name: idx_notif_templates_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notif_templates_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_notif_templates_tenant ON public.notification_templates USING btree (tenant_id, channel, event_type) WHERE ((deleted_at IS NULL) AND (is_active = true)); -- --- Name: idx_patient_group_patient_group_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_notification_channels_twilio_subaccount_sid; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_notification_channels_twilio_subaccount_sid ON public.notification_channels USING btree (twilio_subaccount_sid) WHERE (twilio_subaccount_sid IS NOT NULL); + + +-- +-- Name: idx_patient_contacts_patient; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_patient_contacts_patient ON public.patient_contacts USING btree (patient_id); + + +-- +-- Name: idx_patient_contacts_tenant; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_patient_contacts_tenant ON public.patient_contacts USING btree (tenant_id); + + +-- +-- Name: idx_patient_group_patient_group_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patient_group_patient_group_id ON public.patient_group_patient USING btree (patient_group_id); -- --- Name: idx_patient_groups_owner; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patient_groups_owner; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patient_groups_owner ON public.patient_groups USING btree (owner_id); -- --- Name: idx_patient_groups_owner_system_nome; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patient_groups_owner_system_nome; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patient_groups_owner_system_nome ON public.patient_groups USING btree (owner_id, is_system, nome); -- --- Name: idx_patient_tags_owner; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patient_tags_owner; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patient_tags_owner ON public.patient_tags USING btree (owner_id); -- --- Name: idx_patients_created_at; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_created_at; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_created_at ON public.patients USING btree (created_at DESC); -- --- Name: idx_patients_last_attended; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_last_attended; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_last_attended ON public.patients USING btree (last_attended_at DESC); -- --- Name: idx_patients_owner_email_principal; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_origem; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_patients_origem ON public.patients USING btree (tenant_id, origem) WHERE (origem IS NOT NULL); + + +-- +-- Name: idx_patients_owner_email_principal; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_owner_email_principal ON public.patients USING btree (owner_id, email_principal); -- --- Name: idx_patients_owner_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_owner_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_owner_id ON public.patients USING btree (owner_id); -- --- Name: idx_patients_owner_nome; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_owner_nome; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_owner_nome ON public.patients USING btree (owner_id, nome_completo); -- --- Name: idx_patients_responsible_member; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_responsible_member; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_responsible_member ON public.patients USING btree (responsible_member_id); -- --- Name: idx_patients_status; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_risco_elevado; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_patients_risco_elevado ON public.patients USING btree (tenant_id, risco_elevado) WHERE (risco_elevado = true); + + +-- +-- Name: idx_patients_status; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_status ON public.patients USING btree (status); -- --- Name: idx_patients_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_status_tenant; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_patients_status_tenant ON public.patients USING btree (tenant_id, status); + + +-- +-- Name: idx_patients_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_tenant ON public.patients USING btree (tenant_id); -- --- Name: idx_patients_tenant_email_norm; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_patients_tenant_email_norm; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_patients_tenant_email_norm ON public.patients USING btree (tenant_id, lower(TRIM(BOTH FROM email_principal))); -- --- Name: idx_pgp_group; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_pgp_group; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_pgp_group ON public.patient_group_patient USING btree (patient_group_id); -- --- Name: idx_pgp_patient; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_pgp_patient; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_pgp_patient ON public.patient_group_patient USING btree (patient_id); -- --- Name: idx_ppt_patient; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_ppt_patient; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_ppt_patient ON public.patient_patient_tag USING btree (patient_id); -- --- Name: idx_ppt_tag; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_ppt_tag; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_ppt_tag ON public.patient_patient_tag USING btree (tag_id); -- --- Name: idx_slots_bloq_owner_dia; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_psh_patient; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_psh_patient ON public.patient_status_history USING btree (patient_id, alterado_em DESC); + + +-- +-- Name: idx_psh_tenant; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_psh_tenant ON public.patient_status_history USING btree (tenant_id, alterado_em DESC); + + +-- +-- Name: idx_pt_evento_tipo; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_pt_evento_tipo ON public.patient_timeline USING btree (patient_id, evento_tipo); + + +-- +-- Name: idx_pt_patient_ocorrido; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_pt_patient_ocorrido ON public.patient_timeline USING btree (patient_id, ocorrido_em DESC); + + +-- +-- Name: idx_pt_tenant; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_pt_tenant ON public.patient_timeline USING btree (tenant_id, ocorrido_em DESC); + + +-- +-- Name: idx_slots_bloq_owner_dia; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_slots_bloq_owner_dia ON public.agenda_slots_bloqueados_semanais USING btree (owner_id, dia_semana); -- --- Name: idx_subscription_intents_plan_interval; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_subscription_intents_plan_interval; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_subscription_intents_plan_interval ON public.subscription_intents_legacy USING btree (plan_key, "interval"); -- --- Name: idx_subscription_intents_status; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_subscription_intents_status; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_subscription_intents_status ON public.subscription_intents_legacy USING btree (status); -- --- Name: idx_subscription_intents_user_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_subscription_intents_user_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_subscription_intents_user_id ON public.subscription_intents_legacy USING btree (user_id); -- --- Name: idx_tenant_features_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_tenant_features_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_tenant_features_tenant ON public.tenant_features USING btree (tenant_id); -- --- Name: idx_tenant_invites_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_tenant_invites_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_tenant_invites_tenant ON public.tenant_invites USING btree (tenant_id); -- --- Name: idx_tenant_invites_token; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_tenant_invites_token; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_tenant_invites_token ON public.tenant_invites USING btree (token); -- --- Name: idx_therapist_payout_records_financial_record_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_therapist_payout_records_financial_record_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_therapist_payout_records_financial_record_id ON public.therapist_payout_records USING btree (financial_record_id); -- --- Name: idx_therapist_payouts_owner_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_therapist_payouts_owner_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_therapist_payouts_owner_id ON public.therapist_payouts USING btree (owner_id); -- --- Name: idx_therapist_payouts_period; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_therapist_payouts_period; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_therapist_payouts_period ON public.therapist_payouts USING btree (period_start, period_end); -- --- Name: idx_therapist_payouts_status; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_therapist_payouts_status; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_therapist_payouts_status ON public.therapist_payouts USING btree (status) WHERE (status = 'pending'::text); -- --- Name: idx_therapist_payouts_tenant_id; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_therapist_payouts_tenant_id; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX idx_therapist_payouts_tenant_id ON public.therapist_payouts USING btree (tenant_id); -- --- Name: insurance_plans_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: idx_twilio_usage_channel; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_twilio_usage_channel ON public.twilio_subaccount_usage USING btree (channel_id, period_start DESC); + + +-- +-- Name: idx_twilio_usage_tenant_period; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_twilio_usage_tenant_period ON public.twilio_subaccount_usage USING btree (tenant_id, period_start DESC); + + +-- +-- Name: idx_twilio_usage_unique_period; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX idx_twilio_usage_unique_period ON public.twilio_subaccount_usage USING btree (channel_id, period_start, period_end); + + +-- +-- Name: insurance_plans_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX insurance_plans_owner_idx ON public.insurance_plans USING btree (owner_id); -- --- Name: insurance_plans_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: insurance_plans_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX insurance_plans_tenant_idx ON public.insurance_plans USING btree (tenant_id); -- --- Name: ix_plan_prices_plan; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: ix_plan_prices_plan; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX ix_plan_prices_plan ON public.plan_prices USING btree (plan_id); -- --- Name: ix_plan_public_bullets_plan; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: ix_plan_public_bullets_plan; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX ix_plan_public_bullets_plan ON public.plan_public_bullets USING btree (plan_id); -- --- Name: ix_plan_public_sort; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: ix_plan_public_sort; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX ix_plan_public_sort ON public.plan_public USING btree (sort_order); -- --- Name: notifications_owner_created; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: medicos_especialidade_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX medicos_especialidade_idx ON public.medicos USING btree (especialidade); + + +-- +-- Name: medicos_nome_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX medicos_nome_idx ON public.medicos USING btree (nome); + + +-- +-- Name: medicos_nome_trgm_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX medicos_nome_trgm_idx ON public.medicos USING gin (nome public.gin_trgm_ops); + + +-- +-- Name: medicos_owner_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX medicos_owner_idx ON public.medicos USING btree (owner_id); + + +-- +-- Name: medicos_tenant_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX medicos_tenant_idx ON public.medicos USING btree (tenant_id); + + +-- +-- Name: notifications_owner_created; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX notifications_owner_created ON public.notifications USING btree (owner_id, created_at DESC); -- --- Name: notifications_owner_unread; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: notifications_owner_unread; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX notifications_owner_unread ON public.notifications USING btree (owner_id, read_at) WHERE (read_at IS NULL); -- --- Name: patient_discounts_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_discounts_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_discounts_owner_idx ON public.patient_discounts USING btree (owner_id); -- --- Name: patient_discounts_patient_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_discounts_patient_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_discounts_patient_idx ON public.patient_discounts USING btree (patient_id); -- --- Name: patient_discounts_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_discounts_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_discounts_tenant_idx ON public.patient_discounts USING btree (tenant_id); -- --- Name: patient_group_patient_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_group_patient_tenant_idx ON public.patient_group_patient USING btree (tenant_id); -- --- Name: patient_groups_owner_nome_uniq; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_groups_owner_nome_uniq; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX patient_groups_owner_nome_uniq ON public.patient_groups USING btree (owner_id, nome); -- --- Name: patient_groups_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_groups_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_groups_tenant_idx ON public.patient_groups USING btree (tenant_id); -- --- Name: patient_intake_owner_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_intake_owner_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_intake_owner_id_idx ON public.patient_intake_requests USING btree (owner_id); -- --- Name: patient_intake_requests_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_intake_requests_tenant_idx ON public.patient_intake_requests USING btree (tenant_id); -- --- Name: patient_intake_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_intake_status_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_intake_status_idx ON public.patient_intake_requests USING btree (status); -- --- Name: patient_intake_token_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_intake_token_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_intake_token_idx ON public.patient_intake_requests USING btree (token); -- --- Name: patient_invites_one_active_per_owner; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_invites_one_active_per_owner; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX patient_invites_one_active_per_owner ON public.patient_invites USING btree (owner_id) WHERE (active = true); -- --- Name: patient_invites_owner_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_invites_owner_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_invites_owner_id_idx ON public.patient_invites USING btree (owner_id); -- --- Name: patient_invites_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_invites_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_invites_tenant_idx ON public.patient_invites USING btree (tenant_id); -- --- Name: patient_invites_token_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_invites_token_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_invites_token_idx ON public.patient_invites USING btree (token); -- --- Name: patient_patient_tag_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_patient_tag_tenant_idx ON public.patient_patient_tag USING btree (tenant_id); -- --- Name: patient_tags_owner_name_uq; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_tags_owner_name_uq; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX patient_tags_owner_name_uq ON public.patient_tags USING btree (owner_id, lower(nome)); -- --- Name: patient_tags_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patient_tags_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX patient_tags_tenant_idx ON public.patient_tags USING btree (tenant_id); -- --- Name: payment_settings_tenant_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: patients_convenio_id_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX patients_convenio_id_idx ON public.patients USING btree (convenio_id); + + +-- +-- Name: patients_etnia_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX patients_etnia_idx ON public.patients USING btree (etnia); + + +-- +-- Name: patients_pronomes_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX patients_pronomes_idx ON public.patients USING btree (pronomes); + + +-- +-- Name: payment_settings_tenant_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX payment_settings_tenant_id_idx ON public.payment_settings USING btree (tenant_id); -- --- Name: ppt_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: ppt_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX ppt_owner_idx ON public.patient_patient_tag USING btree (owner_id); -- --- Name: ppt_patient_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: ppt_patient_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX ppt_patient_idx ON public.patient_patient_tag USING btree (patient_id); -- --- Name: ppt_tag_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: ppt_tag_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX ppt_tag_idx ON public.patient_patient_tag USING btree (tag_id); -- --- Name: professional_pricing_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: professional_pricing_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX professional_pricing_tenant_idx ON public.professional_pricing USING btree (tenant_id); -- --- Name: profiles_work_description_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: profiles_work_description_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX profiles_work_description_idx ON public.profiles USING btree (work_description) WHERE (work_description IS NOT NULL); -- --- Name: recurrence_exceptions_rule_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: psc_owner_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX psc_owner_idx ON public.patient_support_contacts USING btree (owner_id); + + +-- +-- Name: psc_patient_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX psc_patient_idx ON public.patient_support_contacts USING btree (patient_id); + + +-- +-- Name: recurrence_exceptions_rule_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX recurrence_exceptions_rule_idx ON public.recurrence_exceptions USING btree (recurrence_id); -- --- Name: recurrence_exceptions_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: recurrence_exceptions_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX recurrence_exceptions_tenant_idx ON public.recurrence_exceptions USING btree (tenant_id); -- --- Name: recurrence_rule_services_rule_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services_rule_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX recurrence_rule_services_rule_idx ON public.recurrence_rule_services USING btree (rule_id); -- --- Name: recurrence_rule_services_service_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services_service_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX recurrence_rule_services_service_idx ON public.recurrence_rule_services USING btree (service_id); -- --- Name: recurrence_rules_active_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules_active_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX recurrence_rules_active_idx ON public.recurrence_rules USING btree (owner_id, status) WHERE (status = 'ativo'::text); -- --- Name: recurrence_rules_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX recurrence_rules_owner_idx ON public.recurrence_rules USING btree (owner_id); -- --- Name: recurrence_rules_patient_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules_patient_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX recurrence_rules_patient_idx ON public.recurrence_rules USING btree (patient_id); -- --- Name: recurrence_rules_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX recurrence_rules_tenant_idx ON public.recurrence_rules USING btree (tenant_id); -- --- Name: saas_doc_votos_doc_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos_doc_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_doc_votos_doc_id_idx ON public.saas_doc_votos USING btree (doc_id); -- --- Name: saas_doc_votos_user_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos_user_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_doc_votos_user_id_idx ON public.saas_doc_votos USING btree (user_id); -- --- Name: saas_docs_categoria_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_docs_categoria_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_docs_categoria_idx ON public.saas_docs USING btree (categoria); -- --- Name: saas_docs_exibir_no_faq_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_docs_exibir_no_faq_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_docs_exibir_no_faq_idx ON public.saas_docs USING btree (exibir_no_faq) WHERE (exibir_no_faq = true); -- --- Name: saas_docs_path_ativo_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_docs_path_ativo_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_docs_path_ativo_idx ON public.saas_docs USING btree (pagina_path, ativo); -- --- Name: saas_faq_ativo_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_faq_ativo_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_faq_ativo_idx ON public.saas_faq USING btree (ativo); -- --- Name: saas_faq_categoria_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_faq_categoria_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_faq_categoria_idx ON public.saas_faq USING btree (categoria); -- --- Name: saas_faq_fts_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_faq_fts_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_faq_fts_idx ON public.saas_faq USING gin (to_tsvector('portuguese'::regconfig, ((COALESCE(pergunta, ''::text) || ' '::text) || COALESCE(conteudo, ''::text)))); -- --- Name: saas_faq_itens_ativo_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_faq_itens_ativo_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_faq_itens_ativo_idx ON public.saas_faq_itens USING btree (ativo); -- --- Name: saas_faq_itens_doc_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_faq_itens_doc_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_faq_itens_doc_id_idx ON public.saas_faq_itens USING btree (doc_id); -- --- Name: saas_faq_pagina_path_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_faq_pagina_path_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_faq_pagina_path_idx ON public.saas_faq USING btree (pagina_path); -- --- Name: saas_faq_publico_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_faq_publico_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_faq_publico_idx ON public.saas_faq USING btree (publico); -- --- Name: saas_faq_votos_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: saas_faq_votos_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX saas_faq_votos_idx ON public.saas_faq USING btree (votos DESC); -- --- Name: services_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: services_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX services_owner_idx ON public.services USING btree (owner_id); -- --- Name: services_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: services_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX services_tenant_idx ON public.services USING btree (tenant_id); -- --- Name: sint_personal_created_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: sint_personal_created_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX sint_personal_created_idx ON public.subscription_intents_personal USING btree (created_at DESC); -- --- Name: sint_personal_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: sint_personal_status_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX sint_personal_status_idx ON public.subscription_intents_personal USING btree (status); -- --- Name: sint_tenant_created_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: sint_tenant_created_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX sint_tenant_created_idx ON public.subscription_intents_tenant USING btree (created_at DESC); -- --- Name: sint_tenant_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: sint_tenant_status_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX sint_tenant_status_idx ON public.subscription_intents_tenant USING btree (status); -- --- Name: sint_tenant_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: sint_tenant_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX sint_tenant_tenant_idx ON public.subscription_intents_tenant USING btree (tenant_id); -- --- Name: subscription_events_created_at_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscription_events_created_at_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscription_events_created_at_idx ON public.subscription_events USING btree (created_at DESC); -- --- Name: subscription_events_owner_ref_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscription_events_owner_ref_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscription_events_owner_ref_idx ON public.subscription_events USING btree (owner_type, owner_ref); -- --- Name: subscription_events_sub_created_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscription_events_sub_created_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscription_events_sub_created_idx ON public.subscription_events USING btree (subscription_id, created_at DESC); -- --- Name: subscription_events_subscription_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscription_events_subscription_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscription_events_subscription_id_idx ON public.subscription_events USING btree (subscription_id); -- --- Name: subscriptions_one_active_per_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_one_active_per_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX subscriptions_one_active_per_tenant ON public.subscriptions USING btree (tenant_id) WHERE (status = 'active'::text); -- --- Name: subscriptions_one_active_per_user; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_one_active_per_user; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX subscriptions_one_active_per_user ON public.subscriptions USING btree (user_id) WHERE (status = 'active'::text); -- --- Name: subscriptions_one_active_per_user_personal; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_one_active_per_user_personal; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX subscriptions_one_active_per_user_personal ON public.subscriptions USING btree (user_id) WHERE ((tenant_id IS NULL) AND (status = 'active'::text)); -- --- Name: subscriptions_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscriptions_owner_idx ON public.subscriptions USING btree (user_id); -- --- Name: subscriptions_plan_key_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_plan_key_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscriptions_plan_key_idx ON public.subscriptions USING btree (plan_key); -- --- Name: subscriptions_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_status_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscriptions_status_idx ON public.subscriptions USING btree (status); -- --- Name: subscriptions_tenant_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_tenant_id_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscriptions_tenant_id_idx ON public.subscriptions USING btree (tenant_id); -- --- Name: subscriptions_tenant_period_end_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_tenant_period_end_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscriptions_tenant_period_end_idx ON public.subscriptions USING btree (tenant_id, current_period_end); -- --- Name: subscriptions_tenant_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_tenant_status_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscriptions_tenant_status_idx ON public.subscriptions USING btree (tenant_id, status); -- --- Name: subscriptions_user_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: subscriptions_user_status_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX subscriptions_user_status_idx ON public.subscriptions USING btree (user_id, status, created_at DESC); -- --- Name: support_sessions_expires_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: support_sessions_expires_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX support_sessions_expires_idx ON public.support_sessions USING btree (expires_at); -- --- Name: support_sessions_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: support_sessions_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX support_sessions_tenant_idx ON public.support_sessions USING btree (tenant_id); -- --- Name: support_sessions_token_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: support_sessions_token_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX support_sessions_token_idx ON public.support_sessions USING btree (token); -- --- Name: tenant_members_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: tenant_members_tenant_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX tenant_members_tenant_idx ON public.tenant_members USING btree (tenant_id); -- --- Name: tenant_members_user_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: tenant_members_user_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX tenant_members_user_idx ON public.tenant_members USING btree (user_id); -- --- Name: tenant_modules_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: tenant_modules_owner_idx; Type: INDEX; Schema: public; Owner: - -- CREATE INDEX tenant_modules_owner_idx ON public.tenant_modules USING btree (owner_id); -- --- Name: unique_member_per_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: unique_member_per_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX unique_member_per_tenant ON public.tenant_members USING btree (tenant_id, user_id); -- --- Name: uq_patients_tenant_user; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: uq_patient_contacts_primario; Type: INDEX; Schema: public; Owner: - +-- + +CREATE UNIQUE INDEX uq_patient_contacts_primario ON public.patient_contacts USING btree (patient_id) WHERE ((is_primario = true) AND (ativo = true)); + + +-- +-- Name: uq_patients_tenant_user; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX uq_patients_tenant_user ON public.patients USING btree (tenant_id, user_id) WHERE (user_id IS NOT NULL); -- --- Name: uq_plan_price_active; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: uq_plan_price_active; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX uq_plan_price_active ON public.plan_prices USING btree (plan_id, "interval", currency) WHERE ((is_active = true) AND (active_to IS NULL)); -- --- Name: uq_plan_prices_active; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: uq_plan_prices_active; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX uq_plan_prices_active ON public.plan_prices USING btree (plan_id, "interval") WHERE (is_active = true); -- --- Name: uq_subscriptions_active_by_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: uq_subscriptions_active_by_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX uq_subscriptions_active_by_tenant ON public.subscriptions USING btree (tenant_id) WHERE ((tenant_id IS NOT NULL) AND (status = 'active'::text)); -- --- Name: uq_subscriptions_active_personal_by_user; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: uq_subscriptions_active_personal_by_user; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX uq_subscriptions_active_personal_by_user ON public.subscriptions USING btree (user_id) WHERE ((tenant_id IS NULL) AND (status = 'active'::text)); -- --- Name: uq_tenant_invites_pending; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: uq_tenant_invites_pending; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX uq_tenant_invites_pending ON public.tenant_invites USING btree (tenant_id, lower(email), role) WHERE ((accepted_at IS NULL) AND (revoked_at IS NULL)); -- --- Name: uq_tenant_members_tenant_user; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: uq_tenant_members_tenant_user; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX uq_tenant_members_tenant_user ON public.tenant_members USING btree (tenant_id, user_id); -- --- Name: ux_subscriptions_active_per_personal_user; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: ux_subscriptions_active_per_personal_user; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX ux_subscriptions_active_per_personal_user ON public.subscriptions USING btree (user_id) WHERE ((status = 'active'::text) AND (tenant_id IS NULL)); -- --- Name: ux_subscriptions_active_per_tenant; Type: INDEX; Schema: public; Owner: supabase_admin +-- Name: ux_subscriptions_active_per_tenant; Type: INDEX; Schema: public; Owner: - -- CREATE UNIQUE INDEX ux_subscriptions_active_per_tenant ON public.subscriptions USING btree (tenant_id) WHERE ((status = 'active'::text) AND (tenant_id IS NOT NULL)); -- --- Name: ix_realtime_subscription_entity; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: ix_realtime_subscription_entity; Type: INDEX; Schema: realtime; Owner: - -- CREATE INDEX ix_realtime_subscription_entity ON realtime.subscription USING btree (entity); -- --- Name: messages_inserted_at_topic_index; Type: INDEX; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_inserted_at_topic_index; Type: INDEX; Schema: realtime; Owner: - -- CREATE INDEX messages_inserted_at_topic_index ON ONLY realtime.messages USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); -- --- Name: messages_2026_03_20_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_14_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: - -- -CREATE INDEX messages_2026_03_20_inserted_at_topic_idx ON realtime.messages_2026_03_20 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); +CREATE INDEX messages_2026_04_14_inserted_at_topic_idx ON realtime.messages_2026_04_14 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); -- --- Name: messages_2026_03_21_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_15_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: - -- -CREATE INDEX messages_2026_03_21_inserted_at_topic_idx ON realtime.messages_2026_03_21 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); +CREATE INDEX messages_2026_04_15_inserted_at_topic_idx ON realtime.messages_2026_04_15 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); -- --- Name: messages_2026_03_22_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_16_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: - -- -CREATE INDEX messages_2026_03_22_inserted_at_topic_idx ON realtime.messages_2026_03_22 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); +CREATE INDEX messages_2026_04_16_inserted_at_topic_idx ON realtime.messages_2026_04_16 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); -- --- Name: messages_2026_03_23_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_17_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: - -- -CREATE INDEX messages_2026_03_23_inserted_at_topic_idx ON realtime.messages_2026_03_23 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); +CREATE INDEX messages_2026_04_17_inserted_at_topic_idx ON realtime.messages_2026_04_17 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); -- --- Name: messages_2026_03_24_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_18_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: - -- -CREATE INDEX messages_2026_03_24_inserted_at_topic_idx ON realtime.messages_2026_03_24 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); +CREATE INDEX messages_2026_04_18_inserted_at_topic_idx ON realtime.messages_2026_04_18 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); -- --- Name: messages_2026_03_25_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_19_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: - -- -CREATE INDEX messages_2026_03_25_inserted_at_topic_idx ON realtime.messages_2026_03_25 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); +CREATE INDEX messages_2026_04_19_inserted_at_topic_idx ON realtime.messages_2026_04_19 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); -- --- Name: messages_2026_03_26_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: messages_2026_04_20_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: - -- -CREATE INDEX messages_2026_03_26_inserted_at_topic_idx ON realtime.messages_2026_03_26 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); +CREATE INDEX messages_2026_04_20_inserted_at_topic_idx ON realtime.messages_2026_04_20 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); -- --- Name: subscription_subscription_id_entity_filters_key; Type: INDEX; Schema: realtime; Owner: supabase_admin +-- Name: subscription_subscription_id_entity_filters_key; Type: INDEX; Schema: realtime; Owner: - -- CREATE UNIQUE INDEX subscription_subscription_id_entity_filters_key ON realtime.subscription USING btree (subscription_id, entity, filters); -- --- Name: bname; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: bname; Type: INDEX; Schema: storage; Owner: - -- CREATE UNIQUE INDEX bname ON storage.buckets USING btree (name); -- --- Name: bucketid_objname; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: bucketid_objname; Type: INDEX; Schema: storage; Owner: - -- CREATE UNIQUE INDEX bucketid_objname ON storage.objects USING btree (bucket_id, name); -- --- Name: buckets_analytics_unique_name_idx; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets_analytics_unique_name_idx; Type: INDEX; Schema: storage; Owner: - -- CREATE UNIQUE INDEX buckets_analytics_unique_name_idx ON storage.buckets_analytics USING btree (name) WHERE (deleted_at IS NULL); -- --- Name: idx_iceberg_namespaces_bucket_id; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: idx_iceberg_namespaces_bucket_id; Type: INDEX; Schema: storage; Owner: - -- CREATE UNIQUE INDEX idx_iceberg_namespaces_bucket_id ON storage.iceberg_namespaces USING btree (catalog_id, name); -- --- Name: idx_iceberg_tables_location; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: idx_iceberg_tables_location; Type: INDEX; Schema: storage; Owner: - -- CREATE UNIQUE INDEX idx_iceberg_tables_location ON storage.iceberg_tables USING btree (location); -- --- Name: idx_iceberg_tables_namespace_id; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: idx_iceberg_tables_namespace_id; Type: INDEX; Schema: storage; Owner: - -- CREATE UNIQUE INDEX idx_iceberg_tables_namespace_id ON storage.iceberg_tables USING btree (catalog_id, namespace_id, name); -- --- Name: idx_multipart_uploads_list; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: idx_multipart_uploads_list; Type: INDEX; Schema: storage; Owner: - -- CREATE INDEX idx_multipart_uploads_list ON storage.s3_multipart_uploads USING btree (bucket_id, key, created_at); -- --- Name: idx_objects_bucket_id_name; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: idx_objects_bucket_id_name; Type: INDEX; Schema: storage; Owner: - -- CREATE INDEX idx_objects_bucket_id_name ON storage.objects USING btree (bucket_id, name COLLATE "C"); -- --- Name: idx_objects_bucket_id_name_lower; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: idx_objects_bucket_id_name_lower; Type: INDEX; Schema: storage; Owner: - -- CREATE INDEX idx_objects_bucket_id_name_lower ON storage.objects USING btree (bucket_id, lower(name) COLLATE "C"); -- --- Name: name_prefix_search; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: name_prefix_search; Type: INDEX; Schema: storage; Owner: - -- CREATE INDEX name_prefix_search ON storage.objects USING btree (name text_pattern_ops); -- --- Name: vector_indexes_name_bucket_id_idx; Type: INDEX; Schema: storage; Owner: supabase_storage_admin +-- Name: vector_indexes_name_bucket_id_idx; Type: INDEX; Schema: storage; Owner: - -- CREATE UNIQUE INDEX vector_indexes_name_bucket_id_idx ON storage.vector_indexes USING btree (name, bucket_id); -- --- Name: supabase_functions_hooks_h_table_id_h_name_idx; Type: INDEX; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: supabase_functions_hooks_h_table_id_h_name_idx; Type: INDEX; Schema: supabase_functions; Owner: - -- CREATE INDEX supabase_functions_hooks_h_table_id_h_name_idx ON supabase_functions.hooks USING btree (hook_table_id, hook_name); -- --- Name: supabase_functions_hooks_request_id_idx; Type: INDEX; Schema: supabase_functions; Owner: supabase_functions_admin +-- Name: supabase_functions_hooks_request_id_idx; Type: INDEX; Schema: supabase_functions; Owner: - -- CREATE INDEX supabase_functions_hooks_request_id_idx ON supabase_functions.hooks USING btree (request_id); -- --- Name: messages_2026_03_20_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_14_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_03_20_inserted_at_topic_idx; +ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_04_14_inserted_at_topic_idx; -- --- Name: messages_2026_03_20_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_14_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_03_20_pkey; +ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_04_14_pkey; -- --- Name: messages_2026_03_21_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_15_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_03_21_inserted_at_topic_idx; +ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_04_15_inserted_at_topic_idx; -- --- Name: messages_2026_03_21_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_15_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_03_21_pkey; +ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_04_15_pkey; -- --- Name: messages_2026_03_22_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_16_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_03_22_inserted_at_topic_idx; +ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_04_16_inserted_at_topic_idx; -- --- Name: messages_2026_03_22_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_16_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_03_22_pkey; +ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_04_16_pkey; -- --- Name: messages_2026_03_23_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_17_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_03_23_inserted_at_topic_idx; +ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_04_17_inserted_at_topic_idx; -- --- Name: messages_2026_03_23_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_17_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_03_23_pkey; +ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_04_17_pkey; -- --- Name: messages_2026_03_24_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_18_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_03_24_inserted_at_topic_idx; +ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_04_18_inserted_at_topic_idx; -- --- Name: messages_2026_03_24_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_18_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_03_24_pkey; +ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_04_18_pkey; -- --- Name: messages_2026_03_25_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_19_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_03_25_inserted_at_topic_idx; +ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_04_19_inserted_at_topic_idx; -- --- Name: messages_2026_03_25_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_19_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_03_25_pkey; +ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_04_19_pkey; -- --- Name: messages_2026_03_26_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_20_inserted_at_topic_idx; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_03_26_inserted_at_topic_idx; +ALTER INDEX realtime.messages_inserted_at_topic_index ATTACH PARTITION realtime.messages_2026_04_20_inserted_at_topic_idx; -- --- Name: messages_2026_03_26_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages_2026_04_20_pkey; Type: INDEX ATTACH; Schema: realtime; Owner: - -- -ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_03_26_pkey; +ALTER INDEX realtime.messages_pkey ATTACH PARTITION realtime.messages_2026_04_20_pkey; -- --- Name: users on_auth_user_created; Type: TRIGGER; Schema: auth; Owner: supabase_auth_admin +-- Name: users on_auth_user_created; Type: TRIGGER; Schema: auth; Owner: - -- CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.handle_new_user(); -- --- Name: users trg_seed_patient_groups; Type: TRIGGER; Schema: auth; Owner: supabase_auth_admin +-- Name: users trg_seed_patient_groups; Type: TRIGGER; Schema: auth; Owner: - -- CREATE TRIGGER trg_seed_patient_groups AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.on_new_user_seed_patient_groups(); -- --- Name: agenda_bloqueios agenda_bloqueios_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios agenda_bloqueios_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER agenda_bloqueios_updated_at BEFORE UPDATE ON public.agenda_bloqueios FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: agendador_configuracoes agendador_slug_trigger; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes agendador_slug_trigger; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER agendador_slug_trigger BEFORE INSERT OR UPDATE ON public.agendador_configuracoes FOR EACH ROW EXECUTE FUNCTION public.agendador_gerar_slug(); -- --- Name: tenant_members prevent_saas_membership_trigger; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: tenant_members prevent_saas_membership_trigger; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER prevent_saas_membership_trigger BEFORE INSERT ON public.tenant_members FOR EACH ROW EXECUTE FUNCTION public.prevent_saas_membership(); -- --- Name: insurance_plan_services set_insurance_plan_services_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: insurance_plan_services set_insurance_plan_services_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER set_insurance_plan_services_updated_at BEFORE UPDATE ON public.insurance_plan_services FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: user_settings t_user_settings_set_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: user_settings t_user_settings_set_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER t_user_settings_set_updated_at BEFORE UPDATE ON public.user_settings FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: agenda_configuracoes tg_agenda_configuracoes_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes tg_agenda_configuracoes_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER tg_agenda_configuracoes_updated_at BEFORE UPDATE ON public.agenda_configuracoes FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: agenda_eventos tg_agenda_eventos_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos tg_agenda_eventos_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER tg_agenda_eventos_updated_at BEFORE UPDATE ON public.agenda_eventos FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: agenda_excecoes tg_agenda_excecoes_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes tg_agenda_excecoes_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER tg_agenda_excecoes_updated_at BEFORE UPDATE ON public.agenda_excecoes FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: agenda_regras_semanais tg_agenda_regras_semanais_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais tg_agenda_regras_semanais_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER tg_agenda_regras_semanais_updated_at BEFORE UPDATE ON public.agenda_regras_semanais FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: recurrence_rules tg_recurrence_rules_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules tg_recurrence_rules_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER tg_recurrence_rules_updated_at BEFORE UPDATE ON public.recurrence_rules FOR EACH ROW EXECUTE FUNCTION public.set_updated_at_recurrence(); -- --- Name: plan_public tr_plan_public_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: plan_public tr_plan_public_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER tr_plan_public_updated_at BEFORE UPDATE ON public.plan_public FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: profiles trg_account_type_immutable; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: profiles trg_account_type_immutable; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_account_type_immutable BEFORE UPDATE OF account_type ON public.profiles FOR EACH ROW EXECUTE FUNCTION public.guard_account_type_immutable(); -- --- Name: agenda_configuracoes trg_agenda_cfg_sync; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes trg_agenda_cfg_sync; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_agenda_cfg_sync BEFORE INSERT OR UPDATE ON public.agenda_configuracoes FOR EACH ROW EXECUTE FUNCTION public.agenda_cfg_sync(); -- --- Name: agenda_eventos trg_agenda_eventos_busy_mirror_del; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos trg_agenda_eventos_busy_mirror_del; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_agenda_eventos_busy_mirror_del AFTER DELETE ON public.agenda_eventos FOR EACH ROW WHEN (((old.mirror_of_event_id IS NULL) AND (old.tenant_id = old.owner_id))) EXECUTE FUNCTION public.sync_busy_mirror_agenda_eventos(); -- --- Name: agenda_eventos trg_agenda_eventos_busy_mirror_ins; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos trg_agenda_eventos_busy_mirror_ins; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_agenda_eventos_busy_mirror_ins AFTER INSERT ON public.agenda_eventos FOR EACH ROW WHEN (((new.mirror_of_event_id IS NULL) AND (new.tenant_id = new.owner_id) AND (new.visibility_scope = ANY (ARRAY['busy_only'::text, 'private'::text])))) EXECUTE FUNCTION public.sync_busy_mirror_agenda_eventos(); -- --- Name: agenda_eventos trg_agenda_eventos_busy_mirror_upd; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos trg_agenda_eventos_busy_mirror_upd; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_agenda_eventos_busy_mirror_upd AFTER UPDATE ON public.agenda_eventos FOR EACH ROW WHEN (((new.mirror_of_event_id IS NULL) AND (new.tenant_id = new.owner_id) AND ((new.visibility_scope IS DISTINCT FROM old.visibility_scope) OR (new.inicio_em IS DISTINCT FROM old.inicio_em) OR (new.fim_em IS DISTINCT FROM old.fim_em) OR (new.owner_id IS DISTINCT FROM old.owner_id) OR (new.tenant_id IS DISTINCT FROM old.tenant_id)))) EXECUTE FUNCTION public.sync_busy_mirror_agenda_eventos(); -- --- Name: agenda_regras_semanais trg_agenda_regras_semanais_no_overlap; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais trg_agenda_regras_semanais_no_overlap; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_agenda_regras_semanais_no_overlap BEFORE INSERT OR UPDATE ON public.agenda_regras_semanais FOR EACH ROW EXECUTE FUNCTION public.fn_agenda_regras_semanais_no_overlap(); -- --- Name: agenda_eventos trg_auto_financial_from_session; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos trg_auto_financial_from_session; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_auto_financial_from_session AFTER UPDATE OF status ON public.agenda_eventos FOR EACH ROW EXECUTE FUNCTION public.auto_create_financial_record_from_session(); -- --- Name: notification_preferences trg_cancel_notifs_on_opt_out; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: notification_preferences trg_cancel_notifs_on_opt_out; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_cancel_notifs_on_opt_out AFTER UPDATE ON public.notification_preferences FOR EACH ROW EXECUTE FUNCTION public.cancel_notifications_on_opt_out(); -- --- Name: agenda_eventos trg_cancel_notifs_on_session_cancel; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos trg_cancel_notifs_on_session_cancel; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_cancel_notifs_on_session_cancel AFTER UPDATE ON public.agenda_eventos FOR EACH ROW WHEN ((new.status IS DISTINCT FROM old.status)) EXECUTE FUNCTION public.cancel_notifications_on_session_cancel(); -- --- Name: company_profiles trg_company_profiles_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: company_profiles trg_company_profiles_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_company_profiles_updated_at BEFORE UPDATE ON public.company_profiles FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: determined_commitment_fields trg_determined_commitment_fields_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields trg_determined_commitment_fields_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_determined_commitment_fields_updated_at BEFORE UPDATE ON public.determined_commitment_fields FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: determined_commitments trg_determined_commitments_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: determined_commitments trg_determined_commitments_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_determined_commitments_updated_at BEFORE UPDATE ON public.determined_commitments FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: email_layout_config trg_email_layout_config_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: documents trg_documents_timeline_insert; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_documents_timeline_insert AFTER INSERT ON public.documents FOR EACH ROW EXECUTE FUNCTION public.fn_documents_timeline_insert(); + + +-- +-- Name: documents trg_documents_updated_at; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_documents_updated_at BEFORE UPDATE ON public.documents FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); + + +-- +-- Name: document_signatures trg_ds_timeline; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_ds_timeline AFTER UPDATE ON public.document_signatures FOR EACH ROW EXECUTE FUNCTION public.fn_document_signature_timeline(); + + +-- +-- Name: document_signatures trg_ds_updated_at; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_ds_updated_at BEFORE UPDATE ON public.document_signatures FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); + + +-- +-- Name: document_templates trg_dt_updated_at; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_dt_updated_at BEFORE UPDATE ON public.document_templates FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); + + +-- +-- Name: email_layout_config trg_email_layout_config_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_email_layout_config_updated_at BEFORE UPDATE ON public.email_layout_config FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: email_templates_global trg_email_templates_global_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: email_templates_global trg_email_templates_global_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_email_templates_global_updated_at BEFORE UPDATE ON public.email_templates_global FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: email_templates_tenant trg_email_templates_tenant_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: email_templates_tenant trg_email_templates_tenant_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_email_templates_tenant_updated_at BEFORE UPDATE ON public.email_templates_tenant FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: financial_exceptions trg_financial_exceptions_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions trg_financial_exceptions_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_financial_exceptions_updated_at BEFORE UPDATE ON public.financial_exceptions FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: financial_records trg_financial_records_auto_overdue; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: financial_records trg_financial_records_auto_overdue; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_financial_records_auto_overdue BEFORE UPDATE ON public.financial_records FOR EACH ROW EXECUTE FUNCTION public.trg_fn_financial_records_auto_overdue(); -- --- Name: financial_records trg_financial_records_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: financial_records trg_financial_records_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_financial_records_updated_at BEFORE UPDATE ON public.financial_records FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: global_notices trg_global_notices_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: global_notices trg_global_notices_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_global_notices_updated_at BEFORE UPDATE ON public.global_notices FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: insurance_plans trg_insurance_plans_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: insurance_plans trg_insurance_plans_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_insurance_plans_updated_at BEFORE UPDATE ON public.insurance_plans FOR EACH ROW EXECUTE FUNCTION public.set_insurance_plans_updated_at(); -- --- Name: plans trg_no_change_core_plan_key; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: medicos trg_medicos_updated_at; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_medicos_updated_at BEFORE UPDATE ON public.medicos FOR EACH ROW EXECUTE FUNCTION public.set_medicos_updated_at(); + + +-- +-- Name: plans trg_no_change_core_plan_key; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_no_change_core_plan_key BEFORE UPDATE ON public.plans FOR EACH ROW EXECUTE FUNCTION public.guard_no_change_core_plan_key(); -- --- Name: plans trg_no_change_plan_target; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: plans trg_no_change_plan_target; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_no_change_plan_target BEFORE UPDATE ON public.plans FOR EACH ROW EXECUTE FUNCTION public.guard_no_change_plan_target(); -- --- Name: plans trg_no_delete_core_plans; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: plans trg_no_delete_core_plans; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_no_delete_core_plans BEFORE DELETE ON public.plans FOR EACH ROW EXECUTE FUNCTION public.guard_no_delete_core_plans(); -- --- Name: notification_channels trg_notification_channels_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: notification_channels trg_notification_channels_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notification_channels_updated_at BEFORE UPDATE ON public.notification_channels FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: notification_logs trg_notification_logs_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: notification_logs trg_notification_logs_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notification_logs_updated_at BEFORE UPDATE ON public.notification_logs FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: notification_preferences trg_notification_preferences_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: notification_preferences trg_notification_preferences_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notification_preferences_updated_at BEFORE UPDATE ON public.notification_preferences FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: notification_queue trg_notification_queue_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: notification_queue trg_notification_queue_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notification_queue_updated_at BEFORE UPDATE ON public.notification_queue FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: notification_schedules trg_notification_schedules_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: notification_schedules trg_notification_schedules_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notification_schedules_updated_at BEFORE UPDATE ON public.notification_schedules FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: notification_templates trg_notification_templates_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: notification_templates trg_notification_templates_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notification_templates_updated_at BEFORE UPDATE ON public.notification_templates FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: patient_intake_requests trg_notify_on_intake; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests trg_notify_on_intake; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notify_on_intake AFTER INSERT ON public.patient_intake_requests FOR EACH ROW EXECUTE FUNCTION public.notify_on_intake(); -- --- Name: agendador_solicitacoes trg_notify_on_scheduling; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes trg_notify_on_scheduling; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notify_on_scheduling AFTER INSERT ON public.agendador_solicitacoes FOR EACH ROW EXECUTE FUNCTION public.notify_on_scheduling(); -- --- Name: agenda_eventos trg_notify_on_session_status; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos trg_notify_on_session_status; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_notify_on_session_status AFTER UPDATE OF status ON public.agenda_eventos FOR EACH ROW EXECUTE FUNCTION public.notify_on_session_status(); -- --- Name: tenant_members trg_patient_cannot_own_tenant; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: tenant_members trg_patient_cannot_own_tenant; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_patient_cannot_own_tenant BEFORE INSERT OR UPDATE ON public.tenant_members FOR EACH ROW EXECUTE FUNCTION public.guard_patient_cannot_own_tenant(); -- --- Name: patient_groups trg_patient_groups_set_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patient_contacts trg_patient_contacts_updated_at; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_patient_contacts_updated_at BEFORE UPDATE ON public.patient_contacts FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); + + +-- +-- Name: patient_groups trg_patient_groups_set_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_patient_groups_set_updated_at BEFORE UPDATE ON public.patient_groups FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: patient_intake_requests trg_patient_intake_requests_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests trg_patient_intake_requests_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_patient_intake_requests_updated_at BEFORE UPDATE ON public.patient_intake_requests FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: patient_tags trg_patient_tags_set_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patients trg_patient_risco_timeline; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_patient_risco_timeline AFTER UPDATE OF risco_elevado ON public.patients FOR EACH ROW EXECUTE FUNCTION public.trg_fn_patient_risco_timeline(); + + +-- +-- Name: patients trg_patient_status_history; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_patient_status_history AFTER INSERT OR UPDATE OF status ON public.patients FOR EACH ROW EXECUTE FUNCTION public.trg_fn_patient_status_history(); + + +-- +-- Name: patients trg_patient_status_timeline; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_patient_status_timeline AFTER INSERT OR UPDATE OF status ON public.patients FOR EACH ROW EXECUTE FUNCTION public.trg_fn_patient_status_timeline(); + + +-- +-- Name: patient_tags trg_patient_tags_set_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_patient_tags_set_updated_at BEFORE UPDATE ON public.patient_tags FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: patients trg_patients_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patients trg_patients_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_patients_updated_at BEFORE UPDATE ON public.patients FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: patients trg_patients_validate_members; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patients trg_patients_validate_members; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_patients_validate_members BEFORE INSERT OR UPDATE OF tenant_id, responsible_member_id, patient_scope, therapist_member_id ON public.patients FOR EACH ROW EXECUTE FUNCTION public.patients_validate_member_consistency(); -- --- Name: payment_settings trg_payment_settings_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: payment_settings trg_payment_settings_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_payment_settings_updated_at BEFORE UPDATE ON public.payment_settings FOR EACH ROW EXECUTE FUNCTION public.update_payment_settings_updated_at(); -- --- Name: patient_groups trg_prevent_promoting_to_system; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patient_groups trg_prevent_promoting_to_system; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_prevent_promoting_to_system BEFORE UPDATE ON public.patient_groups FOR EACH ROW EXECUTE FUNCTION public.prevent_promoting_to_system(); -- --- Name: patient_groups trg_prevent_system_group_changes; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patient_groups trg_prevent_system_group_changes; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_prevent_system_group_changes BEFORE DELETE OR UPDATE ON public.patient_groups FOR EACH ROW EXECUTE FUNCTION public.prevent_system_group_changes(); -- --- Name: professional_pricing trg_professional_pricing_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: professional_pricing trg_professional_pricing_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_professional_pricing_updated_at BEFORE UPDATE ON public.professional_pricing FOR EACH ROW EXECUTE FUNCTION public.update_professional_pricing_updated_at(); -- --- Name: profiles trg_profiles_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: profiles trg_profiles_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_profiles_updated_at BEFORE UPDATE ON public.profiles FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: services trg_services_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: patient_support_contacts trg_psc_updated_at; Type: TRIGGER; Schema: public; Owner: - +-- + +CREATE TRIGGER trg_psc_updated_at BEFORE UPDATE ON public.patient_support_contacts FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); + + +-- +-- Name: services trg_services_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_services_updated_at BEFORE UPDATE ON public.services FOR EACH ROW EXECUTE FUNCTION public.set_services_updated_at(); -- --- Name: subscription_intents trg_subscription_intents_view_insert; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: subscription_intents trg_subscription_intents_view_insert; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_subscription_intents_view_insert INSTEAD OF INSERT ON public.subscription_intents FOR EACH ROW EXECUTE FUNCTION public.subscription_intents_view_insert(); -- --- Name: subscriptions trg_subscriptions_validate_scope; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: subscriptions trg_subscriptions_validate_scope; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_subscriptions_validate_scope BEFORE INSERT OR UPDATE ON public.subscriptions FOR EACH ROW EXECUTE FUNCTION public.subscriptions_validate_scope(); -- --- Name: tenant_features trg_tenant_features_guard_with_plan; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: tenant_features trg_tenant_features_guard_with_plan; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_tenant_features_guard_with_plan BEFORE INSERT OR UPDATE ON public.tenant_features FOR EACH ROW EXECUTE FUNCTION public.tenant_features_guard_with_plan(); -- --- Name: tenant_features trg_tenant_features_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: tenant_features trg_tenant_features_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_tenant_features_updated_at BEFORE UPDATE ON public.tenant_features FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: tenants trg_tenant_kind_immutable; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: tenants trg_tenant_kind_immutable; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_tenant_kind_immutable BEFORE UPDATE OF kind ON public.tenants FOR EACH ROW EXECUTE FUNCTION public.guard_tenant_kind_immutable(); -- --- Name: therapist_payouts trg_therapist_payouts_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: therapist_payouts trg_therapist_payouts_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_therapist_payouts_updated_at BEFORE UPDATE ON public.therapist_payouts FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: user_settings trg_user_settings_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin +-- Name: user_settings trg_user_settings_updated_at; Type: TRIGGER; Schema: public; Owner: - -- CREATE TRIGGER trg_user_settings_updated_at BEFORE UPDATE ON public.user_settings FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); -- --- Name: subscription tr_check_filters; Type: TRIGGER; Schema: realtime; Owner: supabase_admin +-- Name: subscription tr_check_filters; Type: TRIGGER; Schema: realtime; Owner: - -- CREATE TRIGGER tr_check_filters BEFORE INSERT OR UPDATE ON realtime.subscription FOR EACH ROW EXECUTE FUNCTION realtime.subscription_check_filters(); -- --- Name: buckets enforce_bucket_name_length_trigger; Type: TRIGGER; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets enforce_bucket_name_length_trigger; Type: TRIGGER; Schema: storage; Owner: - -- CREATE TRIGGER enforce_bucket_name_length_trigger BEFORE INSERT OR UPDATE OF name ON storage.buckets FOR EACH ROW EXECUTE FUNCTION storage.enforce_bucket_name_length(); -- --- Name: buckets protect_buckets_delete; Type: TRIGGER; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets protect_buckets_delete; Type: TRIGGER; Schema: storage; Owner: - -- CREATE TRIGGER protect_buckets_delete BEFORE DELETE ON storage.buckets FOR EACH STATEMENT EXECUTE FUNCTION storage.protect_delete(); -- --- Name: objects protect_objects_delete; Type: TRIGGER; Schema: storage; Owner: supabase_storage_admin +-- Name: objects protect_objects_delete; Type: TRIGGER; Schema: storage; Owner: - -- CREATE TRIGGER protect_objects_delete BEFORE DELETE ON storage.objects FOR EACH STATEMENT EXECUTE FUNCTION storage.protect_delete(); -- --- Name: objects update_objects_updated_at; Type: TRIGGER; Schema: storage; Owner: supabase_storage_admin +-- Name: objects update_objects_updated_at; Type: TRIGGER; Schema: storage; Owner: - -- CREATE TRIGGER update_objects_updated_at BEFORE UPDATE ON storage.objects FOR EACH ROW EXECUTE FUNCTION storage.update_updated_at_column(); -- --- Name: extensions extensions_tenant_external_id_fkey; Type: FK CONSTRAINT; Schema: _realtime; Owner: supabase_admin +-- Name: extensions extensions_tenant_external_id_fkey; Type: FK CONSTRAINT; Schema: _realtime; Owner: - -- ALTER TABLE ONLY _realtime.extensions @@ -16045,7 +17346,7 @@ ALTER TABLE ONLY _realtime.extensions -- --- Name: identities identities_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: identities identities_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.identities @@ -16053,7 +17354,7 @@ ALTER TABLE ONLY auth.identities -- --- Name: mfa_amr_claims mfa_amr_claims_session_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_amr_claims mfa_amr_claims_session_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.mfa_amr_claims @@ -16061,7 +17362,7 @@ ALTER TABLE ONLY auth.mfa_amr_claims -- --- Name: mfa_challenges mfa_challenges_auth_factor_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_challenges mfa_challenges_auth_factor_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.mfa_challenges @@ -16069,7 +17370,7 @@ ALTER TABLE ONLY auth.mfa_challenges -- --- Name: mfa_factors mfa_factors_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_factors mfa_factors_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.mfa_factors @@ -16077,7 +17378,7 @@ ALTER TABLE ONLY auth.mfa_factors -- --- Name: oauth_authorizations oauth_authorizations_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_authorizations oauth_authorizations_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_authorizations @@ -16085,7 +17386,7 @@ ALTER TABLE ONLY auth.oauth_authorizations -- --- Name: oauth_authorizations oauth_authorizations_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_authorizations oauth_authorizations_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_authorizations @@ -16093,7 +17394,7 @@ ALTER TABLE ONLY auth.oauth_authorizations -- --- Name: oauth_consents oauth_consents_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_consents oauth_consents_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_consents @@ -16101,7 +17402,7 @@ ALTER TABLE ONLY auth.oauth_consents -- --- Name: oauth_consents oauth_consents_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: oauth_consents oauth_consents_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.oauth_consents @@ -16109,7 +17410,7 @@ ALTER TABLE ONLY auth.oauth_consents -- --- Name: one_time_tokens one_time_tokens_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: one_time_tokens one_time_tokens_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.one_time_tokens @@ -16117,7 +17418,7 @@ ALTER TABLE ONLY auth.one_time_tokens -- --- Name: refresh_tokens refresh_tokens_session_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens refresh_tokens_session_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.refresh_tokens @@ -16125,7 +17426,7 @@ ALTER TABLE ONLY auth.refresh_tokens -- --- Name: saml_providers saml_providers_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_providers saml_providers_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.saml_providers @@ -16133,7 +17434,7 @@ ALTER TABLE ONLY auth.saml_providers -- --- Name: saml_relay_states saml_relay_states_flow_state_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_relay_states saml_relay_states_flow_state_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.saml_relay_states @@ -16141,7 +17442,7 @@ ALTER TABLE ONLY auth.saml_relay_states -- --- Name: saml_relay_states saml_relay_states_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_relay_states saml_relay_states_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.saml_relay_states @@ -16149,7 +17450,7 @@ ALTER TABLE ONLY auth.saml_relay_states -- --- Name: sessions sessions_oauth_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: sessions sessions_oauth_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.sessions @@ -16157,7 +17458,7 @@ ALTER TABLE ONLY auth.sessions -- --- Name: sessions sessions_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: sessions sessions_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.sessions @@ -16165,7 +17466,7 @@ ALTER TABLE ONLY auth.sessions -- --- Name: sso_domains sso_domains_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_domains sso_domains_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: - -- ALTER TABLE ONLY auth.sso_domains @@ -16173,7 +17474,7 @@ ALTER TABLE ONLY auth.sso_domains -- --- Name: addon_credits addon_credits_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_credits addon_credits_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_credits @@ -16181,7 +17482,7 @@ ALTER TABLE ONLY public.addon_credits -- --- Name: addon_credits addon_credits_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_credits addon_credits_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_credits @@ -16189,7 +17490,7 @@ ALTER TABLE ONLY public.addon_credits -- --- Name: addon_transactions addon_transactions_admin_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_transactions addon_transactions_admin_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_transactions @@ -16197,7 +17498,7 @@ ALTER TABLE ONLY public.addon_transactions -- --- Name: addon_transactions addon_transactions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_transactions addon_transactions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_transactions @@ -16205,7 +17506,7 @@ ALTER TABLE ONLY public.addon_transactions -- --- Name: addon_transactions addon_transactions_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_transactions addon_transactions_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_transactions @@ -16213,7 +17514,7 @@ ALTER TABLE ONLY public.addon_transactions -- --- Name: addon_transactions addon_transactions_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: addon_transactions addon_transactions_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.addon_transactions @@ -16221,7 +17522,7 @@ ALTER TABLE ONLY public.addon_transactions -- --- Name: agenda_bloqueios agenda_bloqueios_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios agenda_bloqueios_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_bloqueios @@ -16229,7 +17530,7 @@ ALTER TABLE ONLY public.agenda_bloqueios -- --- Name: agenda_bloqueios agenda_bloqueios_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios agenda_bloqueios_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_bloqueios @@ -16237,7 +17538,7 @@ ALTER TABLE ONLY public.agenda_bloqueios -- --- Name: agenda_configuracoes agenda_configuracoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes agenda_configuracoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_configuracoes @@ -16245,7 +17546,7 @@ ALTER TABLE ONLY public.agenda_configuracoes -- --- Name: agenda_eventos agenda_eventos_billing_contract_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_billing_contract_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -16253,7 +17554,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_eventos agenda_eventos_determined_commitment_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_determined_commitment_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -16261,7 +17562,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_eventos agenda_eventos_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -16269,7 +17570,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_eventos agenda_eventos_insurance_plan_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_insurance_plan_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -16277,7 +17578,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_eventos agenda_eventos_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -16285,7 +17586,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_eventos agenda_eventos_recurrence_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_recurrence_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -16293,7 +17594,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_eventos agenda_eventos_terapeuta_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_terapeuta_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_eventos @@ -16301,7 +17602,7 @@ ALTER TABLE ONLY public.agenda_eventos -- --- Name: agenda_excecoes agenda_excecoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes agenda_excecoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_excecoes @@ -16309,7 +17610,7 @@ ALTER TABLE ONLY public.agenda_excecoes -- --- Name: agenda_online_slots agenda_online_slots_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots agenda_online_slots_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_online_slots @@ -16317,7 +17618,7 @@ ALTER TABLE ONLY public.agenda_online_slots -- --- Name: agenda_online_slots agenda_online_slots_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots agenda_online_slots_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_online_slots @@ -16325,7 +17626,7 @@ ALTER TABLE ONLY public.agenda_online_slots -- --- Name: agenda_regras_semanais agenda_regras_semanais_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais agenda_regras_semanais_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_regras_semanais @@ -16333,7 +17634,7 @@ ALTER TABLE ONLY public.agenda_regras_semanais -- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais @@ -16341,7 +17642,7 @@ ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais -- --- Name: agenda_slots_regras agenda_slots_regras_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras agenda_slots_regras_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agenda_slots_regras @@ -16349,7 +17650,7 @@ ALTER TABLE ONLY public.agenda_slots_regras -- --- Name: agendador_configuracoes agendador_configuracoes_owner_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes agendador_configuracoes_owner_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agendador_configuracoes @@ -16357,7 +17658,7 @@ ALTER TABLE ONLY public.agendador_configuracoes -- --- Name: agendador_configuracoes agendador_configuracoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes agendador_configuracoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agendador_configuracoes @@ -16365,7 +17666,7 @@ ALTER TABLE ONLY public.agendador_configuracoes -- --- Name: agendador_solicitacoes agendador_sol_owner_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes agendador_sol_owner_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agendador_solicitacoes @@ -16373,7 +17674,7 @@ ALTER TABLE ONLY public.agendador_solicitacoes -- --- Name: agendador_solicitacoes agendador_sol_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes agendador_sol_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.agendador_solicitacoes @@ -16381,7 +17682,7 @@ ALTER TABLE ONLY public.agendador_solicitacoes -- --- Name: billing_contracts billing_contracts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: billing_contracts billing_contracts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.billing_contracts @@ -16389,7 +17690,7 @@ ALTER TABLE ONLY public.billing_contracts -- --- Name: billing_contracts billing_contracts_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: billing_contracts billing_contracts_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.billing_contracts @@ -16397,7 +17698,7 @@ ALTER TABLE ONLY public.billing_contracts -- --- Name: commitment_services commitment_services_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: commitment_services commitment_services_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.commitment_services @@ -16405,7 +17706,7 @@ ALTER TABLE ONLY public.commitment_services -- --- Name: commitment_services commitment_services_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: commitment_services commitment_services_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.commitment_services @@ -16413,7 +17714,7 @@ ALTER TABLE ONLY public.commitment_services -- --- Name: commitment_time_logs commitment_time_logs_calendar_event_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs commitment_time_logs_calendar_event_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.commitment_time_logs @@ -16421,7 +17722,7 @@ ALTER TABLE ONLY public.commitment_time_logs -- --- Name: commitment_time_logs commitment_time_logs_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs commitment_time_logs_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.commitment_time_logs @@ -16429,7 +17730,7 @@ ALTER TABLE ONLY public.commitment_time_logs -- --- Name: commitment_time_logs commitment_time_logs_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs commitment_time_logs_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.commitment_time_logs @@ -16437,15 +17738,15 @@ ALTER TABLE ONLY public.commitment_time_logs -- --- Name: company_profiles company_profiles_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: company_profiles company_profiles_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.company_profiles - ADD CONSTRAINT company_profiles_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES auth.users(id) ON DELETE CASCADE; + ADD CONSTRAINT company_profiles_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; -- --- Name: determined_commitment_fields determined_commitment_fields_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields determined_commitment_fields_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.determined_commitment_fields @@ -16453,7 +17754,7 @@ ALTER TABLE ONLY public.determined_commitment_fields -- --- Name: determined_commitment_fields determined_commitment_fields_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields determined_commitment_fields_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.determined_commitment_fields @@ -16461,7 +17762,7 @@ ALTER TABLE ONLY public.determined_commitment_fields -- --- Name: determined_commitments determined_commitments_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: determined_commitments determined_commitments_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.determined_commitments @@ -16469,7 +17770,71 @@ ALTER TABLE ONLY public.determined_commitments -- --- Name: email_layout_config email_layout_config_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: document_access_logs document_access_logs_documento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_access_logs + ADD CONSTRAINT document_access_logs_documento_id_fkey FOREIGN KEY (documento_id) REFERENCES public.documents(id) ON DELETE CASCADE; + + +-- +-- Name: document_generated document_generated_documento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_generated + ADD CONSTRAINT document_generated_documento_id_fkey FOREIGN KEY (documento_id) REFERENCES public.documents(id) ON DELETE SET NULL; + + +-- +-- Name: document_generated document_generated_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_generated + ADD CONSTRAINT document_generated_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + + +-- +-- Name: document_generated document_generated_template_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_generated + ADD CONSTRAINT document_generated_template_id_fkey FOREIGN KEY (template_id) REFERENCES public.document_templates(id) ON DELETE RESTRICT; + + +-- +-- Name: document_share_links document_share_links_documento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_share_links + ADD CONSTRAINT document_share_links_documento_id_fkey FOREIGN KEY (documento_id) REFERENCES public.documents(id) ON DELETE CASCADE; + + +-- +-- Name: document_signatures document_signatures_documento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.document_signatures + ADD CONSTRAINT document_signatures_documento_id_fkey FOREIGN KEY (documento_id) REFERENCES public.documents(id) ON DELETE CASCADE; + + +-- +-- Name: documents documents_agenda_evento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.documents + ADD CONSTRAINT documents_agenda_evento_id_fkey FOREIGN KEY (agenda_evento_id) REFERENCES public.agenda_eventos(id) ON DELETE SET NULL; + + +-- +-- Name: documents documents_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.documents + ADD CONSTRAINT documents_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + + +-- +-- Name: email_layout_config email_layout_config_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_layout_config @@ -16477,7 +17842,7 @@ ALTER TABLE ONLY public.email_layout_config -- --- Name: email_templates_tenant email_templates_tenant_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: email_templates_tenant email_templates_tenant_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_templates_tenant @@ -16485,7 +17850,7 @@ ALTER TABLE ONLY public.email_templates_tenant -- --- Name: email_templates_tenant email_templates_tenant_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: email_templates_tenant email_templates_tenant_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.email_templates_tenant @@ -16493,7 +17858,7 @@ ALTER TABLE ONLY public.email_templates_tenant -- --- Name: feriados feriados_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.feriados @@ -16501,7 +17866,7 @@ ALTER TABLE ONLY public.feriados -- --- Name: feriados feriados_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.feriados @@ -16509,7 +17874,7 @@ ALTER TABLE ONLY public.feriados -- --- Name: financial_categories financial_categories_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_categories financial_categories_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_categories @@ -16517,7 +17882,7 @@ ALTER TABLE ONLY public.financial_categories -- --- Name: financial_exceptions financial_exceptions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions financial_exceptions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_exceptions @@ -16525,7 +17890,7 @@ ALTER TABLE ONLY public.financial_exceptions -- --- Name: financial_records financial_records_agenda_evento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_agenda_evento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_records @@ -16533,7 +17898,7 @@ ALTER TABLE ONLY public.financial_records -- --- Name: financial_records financial_records_category_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_category_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_records @@ -16541,7 +17906,7 @@ ALTER TABLE ONLY public.financial_records -- --- Name: financial_records financial_records_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_records @@ -16549,7 +17914,7 @@ ALTER TABLE ONLY public.financial_records -- --- Name: financial_records financial_records_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_records @@ -16557,7 +17922,7 @@ ALTER TABLE ONLY public.financial_records -- --- Name: financial_records financial_records_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_records @@ -16565,7 +17930,7 @@ ALTER TABLE ONLY public.financial_records -- --- Name: financial_records financial_records_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.financial_records @@ -16573,7 +17938,7 @@ ALTER TABLE ONLY public.financial_records -- --- Name: global_notices global_notices_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: global_notices global_notices_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.global_notices @@ -16581,7 +17946,7 @@ ALTER TABLE ONLY public.global_notices -- --- Name: insurance_plan_services insurance_plan_services_plan_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: insurance_plan_services insurance_plan_services_plan_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.insurance_plan_services @@ -16589,7 +17954,7 @@ ALTER TABLE ONLY public.insurance_plan_services -- --- Name: insurance_plans insurance_plans_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: insurance_plans insurance_plans_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.insurance_plans @@ -16597,7 +17962,7 @@ ALTER TABLE ONLY public.insurance_plans -- --- Name: module_features module_features_feature_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: module_features module_features_feature_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.module_features @@ -16605,7 +17970,7 @@ ALTER TABLE ONLY public.module_features -- --- Name: module_features module_features_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: module_features module_features_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.module_features @@ -16613,7 +17978,7 @@ ALTER TABLE ONLY public.module_features -- --- Name: notice_dismissals notice_dismissals_notice_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notice_dismissals notice_dismissals_notice_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notice_dismissals @@ -16621,7 +17986,7 @@ ALTER TABLE ONLY public.notice_dismissals -- --- Name: notice_dismissals notice_dismissals_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notice_dismissals notice_dismissals_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notice_dismissals @@ -16629,7 +17994,7 @@ ALTER TABLE ONLY public.notice_dismissals -- --- Name: notification_channels notification_channels_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_channels notification_channels_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_channels @@ -16637,7 +18002,7 @@ ALTER TABLE ONLY public.notification_channels -- --- Name: notification_logs notification_logs_queue_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_logs notification_logs_queue_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_logs @@ -16645,7 +18010,7 @@ ALTER TABLE ONLY public.notification_logs -- --- Name: notification_schedules notification_schedules_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_schedules notification_schedules_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_schedules @@ -16653,7 +18018,7 @@ ALTER TABLE ONLY public.notification_schedules -- --- Name: notification_templates notification_templates_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notification_templates notification_templates_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notification_templates @@ -16661,7 +18026,7 @@ ALTER TABLE ONLY public.notification_templates -- --- Name: notifications notifications_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: notifications notifications_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.notifications @@ -16669,7 +18034,23 @@ ALTER TABLE ONLY public.notifications -- --- Name: patient_discounts patient_discounts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_contacts patient_contacts_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_contacts + ADD CONSTRAINT patient_contacts_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + + +-- +-- Name: patient_contacts patient_contacts_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_contacts + ADD CONSTRAINT patient_contacts_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; + + +-- +-- Name: patient_discounts patient_discounts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_discounts @@ -16677,7 +18058,7 @@ ALTER TABLE ONLY public.patient_discounts -- --- Name: patient_discounts patient_discounts_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_discounts patient_discounts_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_discounts @@ -16685,7 +18066,7 @@ ALTER TABLE ONLY public.patient_discounts -- --- Name: patient_group_patient patient_group_patient_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient patient_group_patient_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_group_patient @@ -16693,7 +18074,7 @@ ALTER TABLE ONLY public.patient_group_patient -- --- Name: patient_group_patient patient_group_patient_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient patient_group_patient_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_group_patient @@ -16701,7 +18082,7 @@ ALTER TABLE ONLY public.patient_group_patient -- --- Name: patient_groups patient_groups_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_groups patient_groups_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_groups @@ -16709,7 +18090,7 @@ ALTER TABLE ONLY public.patient_groups -- --- Name: patient_intake_requests patient_intake_requests_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests patient_intake_requests_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_intake_requests @@ -16717,7 +18098,7 @@ ALTER TABLE ONLY public.patient_intake_requests -- --- Name: patient_invites patient_invites_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_invites patient_invites_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_invites @@ -16725,7 +18106,7 @@ ALTER TABLE ONLY public.patient_invites -- --- Name: patient_patient_tag patient_patient_tag_tag_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag patient_patient_tag_tag_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_patient_tag @@ -16733,7 +18114,7 @@ ALTER TABLE ONLY public.patient_patient_tag -- --- Name: patient_patient_tag patient_patient_tag_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag patient_patient_tag_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_patient_tag @@ -16741,7 +18122,39 @@ ALTER TABLE ONLY public.patient_patient_tag -- --- Name: patient_tags patient_tags_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_status_history patient_status_history_alterado_por_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_status_history + ADD CONSTRAINT patient_status_history_alterado_por_fkey FOREIGN KEY (alterado_por) REFERENCES auth.users(id) ON DELETE SET NULL; + + +-- +-- Name: patient_status_history patient_status_history_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_status_history + ADD CONSTRAINT patient_status_history_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + + +-- +-- Name: patient_status_history patient_status_history_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_status_history + ADD CONSTRAINT patient_status_history_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; + + +-- +-- Name: patient_support_contacts patient_support_contacts_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_support_contacts + ADD CONSTRAINT patient_support_contacts_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + + +-- +-- Name: patient_tags patient_tags_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_tags @@ -16749,7 +18162,39 @@ ALTER TABLE ONLY public.patient_tags -- --- Name: patients patients_responsible_member_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_timeline patient_timeline_gerado_por_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_timeline + ADD CONSTRAINT patient_timeline_gerado_por_fkey FOREIGN KEY (gerado_por) REFERENCES auth.users(id) ON DELETE SET NULL; + + +-- +-- Name: patient_timeline patient_timeline_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_timeline + ADD CONSTRAINT patient_timeline_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + + +-- +-- Name: patient_timeline patient_timeline_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patient_timeline + ADD CONSTRAINT patient_timeline_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; + + +-- +-- Name: patients patients_convenio_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patients + ADD CONSTRAINT patients_convenio_id_fkey FOREIGN KEY (convenio_id) REFERENCES public.insurance_plans(id) ON DELETE SET NULL; + + +-- +-- Name: patients patients_responsible_member_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patients @@ -16757,7 +18202,15 @@ ALTER TABLE ONLY public.patients -- --- Name: patients patients_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patients patients_risco_sinalizado_por_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.patients + ADD CONSTRAINT patients_risco_sinalizado_por_fkey FOREIGN KEY (risco_sinalizado_por) REFERENCES auth.users(id) ON DELETE SET NULL; + + +-- +-- Name: patients patients_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patients @@ -16765,7 +18218,7 @@ ALTER TABLE ONLY public.patients -- --- Name: patients patients_therapist_member_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patients patients_therapist_member_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patients @@ -16773,7 +18226,7 @@ ALTER TABLE ONLY public.patients -- --- Name: patients patients_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patients patients_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patients @@ -16781,7 +18234,7 @@ ALTER TABLE ONLY public.patients -- --- Name: payment_settings payment_settings_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: payment_settings payment_settings_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.payment_settings @@ -16789,7 +18242,7 @@ ALTER TABLE ONLY public.payment_settings -- --- Name: payment_settings payment_settings_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: payment_settings payment_settings_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.payment_settings @@ -16797,7 +18250,7 @@ ALTER TABLE ONLY public.payment_settings -- --- Name: plan_features plan_features_feature_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_features plan_features_feature_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_features @@ -16805,7 +18258,7 @@ ALTER TABLE ONLY public.plan_features -- --- Name: plan_features plan_features_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_features plan_features_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_features @@ -16813,7 +18266,7 @@ ALTER TABLE ONLY public.plan_features -- --- Name: plan_prices plan_prices_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_prices plan_prices_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_prices @@ -16821,7 +18274,7 @@ ALTER TABLE ONLY public.plan_prices -- --- Name: plan_public_bullets plan_public_bullets_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_public_bullets plan_public_bullets_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_public_bullets @@ -16829,7 +18282,7 @@ ALTER TABLE ONLY public.plan_public_bullets -- --- Name: plan_public plan_public_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: plan_public plan_public_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.plan_public @@ -16837,7 +18290,7 @@ ALTER TABLE ONLY public.plan_public -- --- Name: patient_patient_tag ppt_patient_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag ppt_patient_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_patient_tag @@ -16845,7 +18298,7 @@ ALTER TABLE ONLY public.patient_patient_tag -- --- Name: patient_patient_tag ppt_tag_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag ppt_tag_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.patient_patient_tag @@ -16853,7 +18306,7 @@ ALTER TABLE ONLY public.patient_patient_tag -- --- Name: professional_pricing professional_pricing_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: professional_pricing professional_pricing_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.professional_pricing @@ -16861,7 +18314,7 @@ ALTER TABLE ONLY public.professional_pricing -- --- Name: profiles profiles_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: profiles profiles_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.profiles @@ -16869,7 +18322,15 @@ ALTER TABLE ONLY public.profiles -- --- Name: recurrence_exceptions recurrence_exceptions_agenda_evento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: profiles profiles_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.profiles + ADD CONSTRAINT profiles_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id); + + +-- +-- Name: recurrence_exceptions recurrence_exceptions_agenda_evento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_exceptions @@ -16877,7 +18338,7 @@ ALTER TABLE ONLY public.recurrence_exceptions -- --- Name: recurrence_exceptions recurrence_exceptions_recurrence_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_exceptions recurrence_exceptions_recurrence_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_exceptions @@ -16885,7 +18346,7 @@ ALTER TABLE ONLY public.recurrence_exceptions -- --- Name: recurrence_rule_services recurrence_rule_services_rule_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services recurrence_rule_services_rule_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_rule_services @@ -16893,7 +18354,7 @@ ALTER TABLE ONLY public.recurrence_rule_services -- --- Name: recurrence_rule_services recurrence_rule_services_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services recurrence_rule_services_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_rule_services @@ -16901,7 +18362,7 @@ ALTER TABLE ONLY public.recurrence_rule_services -- --- Name: recurrence_rules recurrence_rules_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules recurrence_rules_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_rules @@ -16909,7 +18370,7 @@ ALTER TABLE ONLY public.recurrence_rules -- --- Name: recurrence_rules recurrence_rules_insurance_plan_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules recurrence_rules_insurance_plan_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.recurrence_rules @@ -16917,7 +18378,7 @@ ALTER TABLE ONLY public.recurrence_rules -- --- Name: saas_admins saas_admins_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_admins saas_admins_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_admins @@ -16925,7 +18386,7 @@ ALTER TABLE ONLY public.saas_admins -- --- Name: saas_doc_votos saas_doc_votos_doc_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos saas_doc_votos_doc_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_doc_votos @@ -16933,7 +18394,7 @@ ALTER TABLE ONLY public.saas_doc_votos -- --- Name: saas_doc_votos saas_doc_votos_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos saas_doc_votos_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_doc_votos @@ -16941,7 +18402,7 @@ ALTER TABLE ONLY public.saas_doc_votos -- --- Name: saas_faq_itens saas_faq_itens_doc_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: saas_faq_itens saas_faq_itens_doc_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.saas_faq_itens @@ -16949,7 +18410,7 @@ ALTER TABLE ONLY public.saas_faq_itens -- --- Name: services services_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: services services_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.services @@ -16957,7 +18418,7 @@ ALTER TABLE ONLY public.services -- --- Name: subscription_intents_personal sint_personal_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_personal sint_personal_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_intents_personal @@ -16965,7 +18426,7 @@ ALTER TABLE ONLY public.subscription_intents_personal -- --- Name: subscription_intents_tenant sint_tenant_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_tenant sint_tenant_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_intents_tenant @@ -16973,7 +18434,7 @@ ALTER TABLE ONLY public.subscription_intents_tenant -- --- Name: subscription_events subscription_events_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_events subscription_events_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_events @@ -16981,7 +18442,7 @@ ALTER TABLE ONLY public.subscription_events -- --- Name: subscription_intents_personal subscription_intents_personal_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_personal subscription_intents_personal_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_intents_personal @@ -16989,7 +18450,7 @@ ALTER TABLE ONLY public.subscription_intents_personal -- --- Name: subscription_intents_tenant subscription_intents_tenant_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_tenant subscription_intents_tenant_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_intents_tenant @@ -16997,7 +18458,7 @@ ALTER TABLE ONLY public.subscription_intents_tenant -- --- Name: subscription_intents_legacy subscription_intents_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_legacy subscription_intents_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscription_intents_legacy @@ -17005,7 +18466,7 @@ ALTER TABLE ONLY public.subscription_intents_legacy -- --- Name: subscriptions subscriptions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscriptions @@ -17013,7 +18474,7 @@ ALTER TABLE ONLY public.subscriptions -- --- Name: subscriptions subscriptions_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.subscriptions @@ -17021,7 +18482,7 @@ ALTER TABLE ONLY public.subscriptions -- --- Name: support_sessions support_sessions_admin_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: support_sessions support_sessions_admin_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.support_sessions @@ -17029,7 +18490,7 @@ ALTER TABLE ONLY public.support_sessions -- --- Name: support_sessions support_sessions_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: support_sessions support_sessions_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.support_sessions @@ -17037,7 +18498,7 @@ ALTER TABLE ONLY public.support_sessions -- --- Name: tenant_features tenant_features_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_features tenant_features_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_features @@ -17045,7 +18506,7 @@ ALTER TABLE ONLY public.tenant_features -- --- Name: tenant_invites tenant_invites_accepted_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_invites tenant_invites_accepted_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_invites @@ -17053,7 +18514,7 @@ ALTER TABLE ONLY public.tenant_invites -- --- Name: tenant_invites tenant_invites_invited_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_invites tenant_invites_invited_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_invites @@ -17061,7 +18522,7 @@ ALTER TABLE ONLY public.tenant_invites -- --- Name: tenant_invites tenant_invites_revoked_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_invites tenant_invites_revoked_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_invites @@ -17069,7 +18530,7 @@ ALTER TABLE ONLY public.tenant_invites -- --- Name: tenant_invites tenant_invites_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_invites tenant_invites_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_invites @@ -17077,7 +18538,7 @@ ALTER TABLE ONLY public.tenant_invites -- --- Name: tenant_members tenant_members_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_members tenant_members_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_members @@ -17085,7 +18546,7 @@ ALTER TABLE ONLY public.tenant_members -- --- Name: tenant_members tenant_members_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_members tenant_members_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_members @@ -17093,7 +18554,7 @@ ALTER TABLE ONLY public.tenant_members -- --- Name: tenant_modules tenant_modules_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_modules tenant_modules_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_modules @@ -17101,7 +18562,7 @@ ALTER TABLE ONLY public.tenant_modules -- --- Name: tenant_modules tenant_modules_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: tenant_modules tenant_modules_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.tenant_modules @@ -17109,7 +18570,7 @@ ALTER TABLE ONLY public.tenant_modules -- --- Name: therapist_payout_records therapist_payout_records_financial_record_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: therapist_payout_records therapist_payout_records_financial_record_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.therapist_payout_records @@ -17117,7 +18578,7 @@ ALTER TABLE ONLY public.therapist_payout_records -- --- Name: therapist_payout_records therapist_payout_records_payout_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: therapist_payout_records therapist_payout_records_payout_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.therapist_payout_records @@ -17125,7 +18586,7 @@ ALTER TABLE ONLY public.therapist_payout_records -- --- Name: therapist_payouts therapist_payouts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: therapist_payouts therapist_payouts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.therapist_payouts @@ -17133,7 +18594,7 @@ ALTER TABLE ONLY public.therapist_payouts -- --- Name: therapist_payouts therapist_payouts_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: therapist_payouts therapist_payouts_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.therapist_payouts @@ -17141,7 +18602,15 @@ ALTER TABLE ONLY public.therapist_payouts -- --- Name: user_settings user_settings_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin +-- Name: twilio_subaccount_usage twilio_subaccount_usage_channel_fk; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.twilio_subaccount_usage + ADD CONSTRAINT twilio_subaccount_usage_channel_fk FOREIGN KEY (channel_id) REFERENCES public.notification_channels(id) ON DELETE CASCADE; + + +-- +-- Name: user_settings user_settings_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- ALTER TABLE ONLY public.user_settings @@ -17149,7 +18618,7 @@ ALTER TABLE ONLY public.user_settings -- --- Name: iceberg_namespaces iceberg_namespaces_catalog_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: iceberg_namespaces iceberg_namespaces_catalog_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.iceberg_namespaces @@ -17157,7 +18626,7 @@ ALTER TABLE ONLY storage.iceberg_namespaces -- --- Name: iceberg_tables iceberg_tables_catalog_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: iceberg_tables iceberg_tables_catalog_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.iceberg_tables @@ -17165,7 +18634,7 @@ ALTER TABLE ONLY storage.iceberg_tables -- --- Name: iceberg_tables iceberg_tables_namespace_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: iceberg_tables iceberg_tables_namespace_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.iceberg_tables @@ -17173,7 +18642,7 @@ ALTER TABLE ONLY storage.iceberg_tables -- --- Name: objects objects_bucketId_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: objects objects_bucketId_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.objects @@ -17181,7 +18650,7 @@ ALTER TABLE ONLY storage.objects -- --- Name: s3_multipart_uploads s3_multipart_uploads_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads s3_multipart_uploads_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.s3_multipart_uploads @@ -17189,7 +18658,7 @@ ALTER TABLE ONLY storage.s3_multipart_uploads -- --- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.s3_multipart_uploads_parts @@ -17197,7 +18666,7 @@ ALTER TABLE ONLY storage.s3_multipart_uploads_parts -- --- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_upload_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_upload_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.s3_multipart_uploads_parts @@ -17205,7 +18674,7 @@ ALTER TABLE ONLY storage.s3_multipart_uploads_parts -- --- Name: vector_indexes vector_indexes_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin +-- Name: vector_indexes vector_indexes_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: - -- ALTER TABLE ONLY storage.vector_indexes @@ -17213,109 +18682,109 @@ ALTER TABLE ONLY storage.vector_indexes -- --- Name: audit_log_entries; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: audit_log_entries; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.audit_log_entries ENABLE ROW LEVEL SECURITY; -- --- Name: flow_state; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: flow_state; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.flow_state ENABLE ROW LEVEL SECURITY; -- --- Name: identities; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: identities; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.identities ENABLE ROW LEVEL SECURITY; -- --- Name: instances; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: instances; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.instances ENABLE ROW LEVEL SECURITY; -- --- Name: mfa_amr_claims; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_amr_claims; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.mfa_amr_claims ENABLE ROW LEVEL SECURITY; -- --- Name: mfa_challenges; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_challenges; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.mfa_challenges ENABLE ROW LEVEL SECURITY; -- --- Name: mfa_factors; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: mfa_factors; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.mfa_factors ENABLE ROW LEVEL SECURITY; -- --- Name: one_time_tokens; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: one_time_tokens; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.one_time_tokens ENABLE ROW LEVEL SECURITY; -- --- Name: refresh_tokens; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: refresh_tokens; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.refresh_tokens ENABLE ROW LEVEL SECURITY; -- --- Name: saml_providers; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_providers; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.saml_providers ENABLE ROW LEVEL SECURITY; -- --- Name: saml_relay_states; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: saml_relay_states; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.saml_relay_states ENABLE ROW LEVEL SECURITY; -- --- Name: schema_migrations; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: schema_migrations; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.schema_migrations ENABLE ROW LEVEL SECURITY; -- --- Name: sessions; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: sessions; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.sessions ENABLE ROW LEVEL SECURITY; -- --- Name: sso_domains; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_domains; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.sso_domains ENABLE ROW LEVEL SECURITY; -- --- Name: sso_providers; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: sso_providers; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.sso_providers ENABLE ROW LEVEL SECURITY; -- --- Name: users; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin +-- Name: users; Type: ROW SECURITY; Schema: auth; Owner: - -- ALTER TABLE auth.users ENABLE ROW LEVEL SECURITY; -- --- Name: addon_credits; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: addon_credits; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.addon_credits ENABLE ROW LEVEL SECURITY; -- --- Name: addon_credits addon_credits_admin_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: addon_credits addon_credits_admin_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY addon_credits_admin_select ON public.addon_credits FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 @@ -17324,7 +18793,7 @@ CREATE POLICY addon_credits_admin_select ON public.addon_credits FOR SELECT TO a -- --- Name: addon_credits addon_credits_admin_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: addon_credits addon_credits_admin_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY addon_credits_admin_write ON public.addon_credits TO authenticated USING ((EXISTS ( SELECT 1 @@ -17335,20 +18804,20 @@ CREATE POLICY addon_credits_admin_write ON public.addon_credits TO authenticated -- --- Name: addon_credits addon_credits_select_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: addon_credits addon_credits_select_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY addon_credits_select_own ON public.addon_credits FOR SELECT TO authenticated USING ((public.is_tenant_member(tenant_id) OR (owner_id = auth.uid()))); -- --- Name: addon_products; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: addon_products; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.addon_products ENABLE ROW LEVEL SECURITY; -- --- Name: addon_products addon_products_admin_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: addon_products addon_products_admin_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY addon_products_admin_all ON public.addon_products TO authenticated USING ((EXISTS ( SELECT 1 @@ -17359,20 +18828,20 @@ CREATE POLICY addon_products_admin_all ON public.addon_products TO authenticated -- --- Name: addon_products addon_products_select_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: addon_products addon_products_select_authenticated; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY addon_products_select_authenticated ON public.addon_products FOR SELECT TO authenticated USING (((deleted_at IS NULL) AND (is_active = true) AND (is_visible = true))); -- --- Name: addon_transactions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: addon_transactions; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.addon_transactions ENABLE ROW LEVEL SECURITY; -- --- Name: addon_transactions addon_transactions_admin_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: addon_transactions addon_transactions_admin_insert; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY addon_transactions_admin_insert ON public.addon_transactions FOR INSERT TO authenticated WITH CHECK ((EXISTS ( SELECT 1 @@ -17381,7 +18850,7 @@ CREATE POLICY addon_transactions_admin_insert ON public.addon_transactions FOR I -- --- Name: addon_transactions addon_transactions_admin_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: addon_transactions addon_transactions_admin_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY addon_transactions_admin_select ON public.addon_transactions FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 @@ -17390,297 +18859,297 @@ CREATE POLICY addon_transactions_admin_select ON public.addon_transactions FOR S -- --- Name: addon_transactions addon_transactions_select_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: addon_transactions addon_transactions_select_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY addon_transactions_select_own ON public.addon_transactions FOR SELECT TO authenticated USING ((public.is_tenant_member(tenant_id) OR (owner_id = auth.uid()))); -- --- Name: agenda_bloqueios; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agenda_bloqueios ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_configuracoes; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agenda_configuracoes ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_configuracoes agenda_configuracoes_clinic_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes agenda_configuracoes_clinic_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_configuracoes_clinic_read ON public.agenda_configuracoes FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); -- --- Name: agenda_configuracoes agenda_configuracoes_clinic_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes agenda_configuracoes_clinic_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_configuracoes_clinic_write ON public.agenda_configuracoes USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); -- --- Name: agenda_configuracoes agenda_configuracoes_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_configuracoes agenda_configuracoes_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_configuracoes_owner ON public.agenda_configuracoes USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: agenda_eventos; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agenda_eventos ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_eventos agenda_eventos_delete; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_delete; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_eventos_delete ON public.agenda_eventos FOR DELETE USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.delete'::text))); -- --- Name: agenda_eventos agenda_eventos_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_insert; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_eventos_insert ON public.agenda_eventos FOR INSERT WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.create'::text))); -- --- Name: agenda_eventos agenda_eventos_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_owner_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_eventos_owner_all ON public.agenda_eventos TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: agenda_eventos agenda_eventos_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_eventos_select ON public.agenda_eventos FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); -- --- Name: agenda_eventos agenda_eventos_update; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_eventos agenda_eventos_update; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_eventos_update ON public.agenda_eventos FOR UPDATE USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); -- --- Name: agenda_excecoes; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agenda_excecoes ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_excecoes agenda_excecoes_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes agenda_excecoes_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_excecoes_owner ON public.agenda_excecoes USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: agenda_excecoes agenda_excecoes_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes agenda_excecoes_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_excecoes_select ON public.agenda_excecoes FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); -- --- Name: agenda_excecoes agenda_excecoes_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_excecoes agenda_excecoes_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_excecoes_write ON public.agenda_excecoes USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); -- --- Name: agenda_online_slots; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agenda_online_slots ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_online_slots agenda_online_slots_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots agenda_online_slots_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_online_slots_owner ON public.agenda_online_slots USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: agenda_online_slots agenda_online_slots_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots agenda_online_slots_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_online_slots_select ON public.agenda_online_slots FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); -- --- Name: agenda_online_slots agenda_online_slots_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_online_slots agenda_online_slots_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_online_slots_write ON public.agenda_online_slots USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); -- --- Name: agenda_regras_semanais; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agenda_regras_semanais ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_regras_semanais agenda_regras_semanais_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais agenda_regras_semanais_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_regras_semanais_owner ON public.agenda_regras_semanais USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: agenda_regras_semanais agenda_regras_semanais_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais agenda_regras_semanais_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_regras_semanais_select ON public.agenda_regras_semanais FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); -- --- Name: agenda_regras_semanais agenda_regras_semanais_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_regras_semanais agenda_regras_semanais_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_regras_semanais_write ON public.agenda_regras_semanais USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); -- --- Name: agenda_slots_bloqueados_semanais; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agenda_slots_bloqueados_semanais ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_slots_bloqueados_semanais_select ON public.agenda_slots_bloqueados_semanais FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); -- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_slots_bloqueados_semanais_write ON public.agenda_slots_bloqueados_semanais USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); -- --- Name: agenda_slots_regras; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agenda_slots_regras ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_slots_regras agenda_slots_regras_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras agenda_slots_regras_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_slots_regras_select ON public.agenda_slots_regras FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); -- --- Name: agenda_slots_regras agenda_slots_regras_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_slots_regras agenda_slots_regras_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agenda_slots_regras_write ON public.agenda_slots_regras USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); -- --- Name: agendador_configuracoes agendador_cfg_public_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes agendador_cfg_public_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agendador_cfg_public_read ON public.agendador_configuracoes FOR SELECT TO anon USING (((ativo = true) AND (link_slug IS NOT NULL))); -- --- Name: agendador_configuracoes agendador_cfg_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes agendador_cfg_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agendador_cfg_select ON public.agendador_configuracoes FOR SELECT USING ((auth.uid() = owner_id)); -- --- Name: agendador_configuracoes agendador_cfg_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes agendador_cfg_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agendador_cfg_write ON public.agendador_configuracoes USING ((auth.uid() = owner_id)) WITH CHECK ((auth.uid() = owner_id)); -- --- Name: agendador_configuracoes; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agendador_configuracoes; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agendador_configuracoes ENABLE ROW LEVEL SECURITY; -- --- Name: agendador_solicitacoes agendador_sol_owner_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes agendador_sol_owner_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agendador_sol_owner_select ON public.agendador_solicitacoes FOR SELECT USING ((auth.uid() = owner_id)); -- --- Name: agendador_solicitacoes agendador_sol_owner_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes agendador_sol_owner_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agendador_sol_owner_write ON public.agendador_solicitacoes USING ((auth.uid() = owner_id)) WITH CHECK ((auth.uid() = owner_id)); -- --- Name: agendador_solicitacoes agendador_sol_patient_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes agendador_sol_patient_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agendador_sol_patient_read ON public.agendador_solicitacoes FOR SELECT TO authenticated USING (((auth.uid() = user_id) OR (auth.uid() = owner_id))); -- --- Name: agendador_solicitacoes agendador_sol_public_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes agendador_sol_public_insert; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY agendador_sol_public_insert ON public.agendador_solicitacoes FOR INSERT TO anon WITH CHECK (true); -- --- Name: agendador_solicitacoes; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: agendador_solicitacoes; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.agendador_solicitacoes ENABLE ROW LEVEL SECURITY; -- --- Name: billing_contracts; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: billing_contracts; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.billing_contracts ENABLE ROW LEVEL SECURITY; -- --- Name: billing_contracts billing_contracts: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: billing_contracts billing_contracts: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "billing_contracts: owner full access" ON public.billing_contracts USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: agenda_bloqueios bloqueios_delete; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios bloqueios_delete; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY bloqueios_delete ON public.agenda_bloqueios FOR DELETE TO authenticated USING ((owner_id = auth.uid())); -- --- Name: agenda_bloqueios bloqueios_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios bloqueios_insert; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY bloqueios_insert ON public.agenda_bloqueios FOR INSERT TO authenticated WITH CHECK ((owner_id = auth.uid())); -- --- Name: agenda_bloqueios bloqueios_select_clinic; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios bloqueios_select_clinic; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY bloqueios_select_clinic ON public.agenda_bloqueios FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT tenant_members.tenant_id @@ -17689,21 +19158,21 @@ CREATE POLICY bloqueios_select_clinic ON public.agenda_bloqueios FOR SELECT TO a -- --- Name: agenda_bloqueios bloqueios_select_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios bloqueios_select_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY bloqueios_select_own ON public.agenda_bloqueios FOR SELECT TO authenticated USING ((owner_id = auth.uid())); -- --- Name: agenda_bloqueios bloqueios_update; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios bloqueios_update; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY bloqueios_update ON public.agenda_bloqueios FOR UPDATE TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: saas_docs clinic_admin_read_all_docs; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_docs clinic_admin_read_all_docs; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY clinic_admin_read_all_docs ON public.saas_docs FOR SELECT TO authenticated USING (((ativo = true) AND (EXISTS ( SELECT 1 @@ -17712,13 +19181,13 @@ CREATE POLICY clinic_admin_read_all_docs ON public.saas_docs FOR SELECT TO authe -- --- Name: commitment_services; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: commitment_services; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.commitment_services ENABLE ROW LEVEL SECURITY; -- --- Name: commitment_services commitment_services: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: commitment_services commitment_services: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "commitment_services: owner full access" ON public.commitment_services USING ((EXISTS ( SELECT 1 @@ -17729,47 +19198,57 @@ CREATE POLICY "commitment_services: owner full access" ON public.commitment_serv -- --- Name: commitment_time_logs; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.commitment_time_logs ENABLE ROW LEVEL SECURITY; -- --- Name: company_profiles; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: company_profiles; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.company_profiles ENABLE ROW LEVEL SECURITY; -- --- Name: company_profiles company_profiles_delete; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: company_profiles company_profiles_delete; Type: POLICY; Schema: public; Owner: - -- -CREATE POLICY company_profiles_delete ON public.company_profiles FOR DELETE USING ((tenant_id = auth.uid())); +CREATE POLICY company_profiles_delete ON public.company_profiles FOR DELETE USING ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))); -- --- Name: company_profiles company_profiles_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: company_profiles company_profiles_insert; Type: POLICY; Schema: public; Owner: - -- -CREATE POLICY company_profiles_insert ON public.company_profiles FOR INSERT WITH CHECK ((tenant_id = auth.uid())); +CREATE POLICY company_profiles_insert ON public.company_profiles FOR INSERT WITH CHECK ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))); -- --- Name: company_profiles company_profiles_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: company_profiles company_profiles_select; Type: POLICY; Schema: public; Owner: - -- -CREATE POLICY company_profiles_select ON public.company_profiles FOR SELECT USING ((tenant_id = auth.uid())); +CREATE POLICY company_profiles_select ON public.company_profiles FOR SELECT USING ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))); -- --- Name: company_profiles company_profiles_update; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: company_profiles company_profiles_update; Type: POLICY; Schema: public; Owner: - -- -CREATE POLICY company_profiles_update ON public.company_profiles FOR UPDATE USING ((tenant_id = auth.uid())); +CREATE POLICY company_profiles_update ON public.company_profiles FOR UPDATE USING ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))) WITH CHECK ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))); -- --- Name: commitment_time_logs ctl_delete_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs ctl_delete_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY ctl_delete_for_active_member ON public.commitment_time_logs FOR DELETE TO authenticated USING ((EXISTS ( SELECT 1 @@ -17778,7 +19257,7 @@ CREATE POLICY ctl_delete_for_active_member ON public.commitment_time_logs FOR DE -- --- Name: commitment_time_logs ctl_insert_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs ctl_insert_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY ctl_insert_for_active_member ON public.commitment_time_logs FOR INSERT TO authenticated WITH CHECK ((EXISTS ( SELECT 1 @@ -17787,7 +19266,7 @@ CREATE POLICY ctl_insert_for_active_member ON public.commitment_time_logs FOR IN -- --- Name: commitment_time_logs ctl_select_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs ctl_select_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY ctl_select_for_active_member ON public.commitment_time_logs FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 @@ -17796,7 +19275,7 @@ CREATE POLICY ctl_select_for_active_member ON public.commitment_time_logs FOR SE -- --- Name: commitment_time_logs ctl_update_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: commitment_time_logs ctl_update_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY ctl_update_for_active_member ON public.commitment_time_logs FOR UPDATE TO authenticated USING ((EXISTS ( SELECT 1 @@ -17807,7 +19286,23 @@ CREATE POLICY ctl_update_for_active_member ON public.commitment_time_logs FOR UP -- --- Name: determined_commitments dc_delete_custom_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: document_access_logs dal: tenant members can insert; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dal: tenant members can insert" ON public.document_access_logs FOR INSERT WITH CHECK (true); + + +-- +-- Name: document_access_logs dal: tenant members can select; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dal: tenant members can select" ON public.document_access_logs FOR SELECT USING ((tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); + + +-- +-- Name: determined_commitments dc_delete_custom_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dc_delete_custom_for_active_member ON public.determined_commitments FOR DELETE TO authenticated USING (((is_native = false) AND (EXISTS ( SELECT 1 @@ -17816,7 +19311,7 @@ CREATE POLICY dc_delete_custom_for_active_member ON public.determined_commitment -- --- Name: determined_commitments dc_insert_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: determined_commitments dc_insert_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dc_insert_for_active_member ON public.determined_commitments FOR INSERT TO authenticated WITH CHECK ((EXISTS ( SELECT 1 @@ -17825,7 +19320,7 @@ CREATE POLICY dc_insert_for_active_member ON public.determined_commitments FOR I -- --- Name: determined_commitments dc_select_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: determined_commitments dc_select_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dc_select_for_active_member ON public.determined_commitments FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 @@ -17834,7 +19329,7 @@ CREATE POLICY dc_select_for_active_member ON public.determined_commitments FOR S -- --- Name: determined_commitments dc_update_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: determined_commitments dc_update_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dc_update_for_active_member ON public.determined_commitments FOR UPDATE TO authenticated USING ((EXISTS ( SELECT 1 @@ -17845,7 +19340,7 @@ CREATE POLICY dc_update_for_active_member ON public.determined_commitments FOR U -- --- Name: determined_commitment_fields dcf_delete_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields dcf_delete_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dcf_delete_for_active_member ON public.determined_commitment_fields FOR DELETE TO authenticated USING ((EXISTS ( SELECT 1 @@ -17854,7 +19349,7 @@ CREATE POLICY dcf_delete_for_active_member ON public.determined_commitment_field -- --- Name: determined_commitment_fields dcf_insert_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields dcf_insert_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dcf_insert_for_active_member ON public.determined_commitment_fields FOR INSERT TO authenticated WITH CHECK ((EXISTS ( SELECT 1 @@ -17863,7 +19358,7 @@ CREATE POLICY dcf_insert_for_active_member ON public.determined_commitment_field -- --- Name: determined_commitment_fields dcf_select_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields dcf_select_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dcf_select_for_active_member ON public.determined_commitment_fields FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 @@ -17872,7 +19367,7 @@ CREATE POLICY dcf_select_for_active_member ON public.determined_commitment_field -- --- Name: determined_commitment_fields dcf_update_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields dcf_update_for_active_member; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dcf_update_for_active_member ON public.determined_commitment_fields FOR UPDATE TO authenticated USING ((EXISTS ( SELECT 1 @@ -17883,26 +19378,26 @@ CREATE POLICY dcf_update_for_active_member ON public.determined_commitment_field -- --- Name: agenda_bloqueios delete own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios delete own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "delete own" ON public.agenda_bloqueios FOR DELETE USING ((owner_id = auth.uid())); -- --- Name: determined_commitment_fields; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: determined_commitment_fields; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.determined_commitment_fields ENABLE ROW LEVEL SECURITY; -- --- Name: determined_commitments; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: determined_commitments; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.determined_commitments ENABLE ROW LEVEL SECURITY; -- --- Name: dev_user_credentials dev_creds_select_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: dev_user_credentials dev_creds_select_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dev_creds_select_saas_admin ON public.dev_user_credentials FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 @@ -17911,7 +19406,7 @@ CREATE POLICY dev_creds_select_saas_admin ON public.dev_user_credentials FOR SEL -- --- Name: dev_user_credentials dev_creds_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: dev_user_credentials dev_creds_write_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY dev_creds_write_saas_admin ON public.dev_user_credentials TO authenticated USING ((EXISTS ( SELECT 1 @@ -17922,58 +19417,200 @@ CREATE POLICY dev_creds_write_saas_admin ON public.dev_user_credentials TO authe -- --- Name: dev_user_credentials; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: dev_user_credentials; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.dev_user_credentials ENABLE ROW LEVEL SECURITY; -- --- Name: email_layout_config; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: document_generated dg: generator full access; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dg: generator full access" ON public.document_generated USING ((gerado_por = auth.uid())) WITH CHECK ((gerado_por = auth.uid())); + + +-- +-- Name: document_generated dg: tenant members can select; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dg: tenant members can select" ON public.document_generated FOR SELECT USING ((tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); + + +-- +-- Name: document_access_logs; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.document_access_logs ENABLE ROW LEVEL SECURITY; + +-- +-- Name: document_generated; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.document_generated ENABLE ROW LEVEL SECURITY; + +-- +-- Name: document_share_links; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.document_share_links ENABLE ROW LEVEL SECURITY; + +-- +-- Name: document_signatures; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.document_signatures ENABLE ROW LEVEL SECURITY; + +-- +-- Name: document_templates; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.document_templates ENABLE ROW LEVEL SECURITY; + +-- +-- Name: documents; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.documents ENABLE ROW LEVEL SECURITY; + +-- +-- Name: documents documents: owner full access; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "documents: owner full access" ON public.documents USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); + + +-- +-- Name: document_signatures ds: tenant members access; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "ds: tenant members access" ON public.document_signatures USING ((tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))) WITH CHECK ((tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); + + +-- +-- Name: document_share_links dsl: creator full access; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dsl: creator full access" ON public.document_share_links USING ((criado_por = auth.uid())) WITH CHECK ((criado_por = auth.uid())); + + +-- +-- Name: document_share_links dsl: public read by token; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dsl: public read by token" ON public.document_share_links FOR SELECT USING (((ativo = true) AND (expira_em > now()) AND (usos < usos_max))); + + +-- +-- Name: document_templates dt: global templates readable by all; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dt: global templates readable by all" ON public.document_templates FOR SELECT USING ((is_global = true)); + + +-- +-- Name: document_templates dt: owner can delete; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dt: owner can delete" ON public.document_templates FOR DELETE USING (((owner_id = auth.uid()) AND (is_global = false))); + + +-- +-- Name: document_templates dt: owner can insert; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dt: owner can insert" ON public.document_templates FOR INSERT WITH CHECK (((owner_id = auth.uid()) AND (is_global = false))); + + +-- +-- Name: document_templates dt: owner can update; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dt: owner can update" ON public.document_templates FOR UPDATE USING (((owner_id = auth.uid()) AND (is_global = false))) WITH CHECK (((owner_id = auth.uid()) AND (is_global = false))); + + +-- +-- Name: document_templates dt: saas admin can delete global; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dt: saas admin can delete global" ON public.document_templates FOR DELETE USING (((is_global = true) AND public.is_saas_admin())); + + +-- +-- Name: document_templates dt: saas admin can insert global; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dt: saas admin can insert global" ON public.document_templates FOR INSERT WITH CHECK (((is_global = true) AND public.is_saas_admin())); + + +-- +-- Name: document_templates dt: saas admin can update global; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dt: saas admin can update global" ON public.document_templates FOR UPDATE USING (((is_global = true) AND public.is_saas_admin())) WITH CHECK (((is_global = true) AND public.is_saas_admin())); + + +-- +-- Name: document_templates dt: tenant members can select; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "dt: tenant members can select" ON public.document_templates FOR SELECT USING (((is_global = false) AND (tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text)))))); + + +-- +-- Name: email_layout_config; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.email_layout_config ENABLE ROW LEVEL SECURITY; -- --- Name: email_templates_global; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: email_templates_global; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.email_templates_global ENABLE ROW LEVEL SECURITY; -- --- Name: email_templates_tenant; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: email_templates_tenant; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.email_templates_tenant ENABLE ROW LEVEL SECURITY; -- --- Name: entitlements_invalidation ent_inv_select_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: entitlements_invalidation ent_inv_select_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY ent_inv_select_own ON public.entitlements_invalidation FOR SELECT USING (((owner_id = auth.uid()) OR public.is_saas_admin())); -- --- Name: entitlements_invalidation ent_inv_update_saas; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: entitlements_invalidation ent_inv_update_saas; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY ent_inv_update_saas ON public.entitlements_invalidation FOR UPDATE USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: entitlements_invalidation ent_inv_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: entitlements_invalidation ent_inv_write_saas; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY ent_inv_write_saas ON public.entitlements_invalidation FOR INSERT WITH CHECK (public.is_saas_admin()); -- --- Name: entitlements_invalidation; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: entitlements_invalidation; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.entitlements_invalidation ENABLE ROW LEVEL SECURITY; -- --- Name: saas_faq faq_admin_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_faq faq_admin_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY faq_admin_write ON public.saas_faq TO authenticated USING ((EXISTS ( SELECT 1 @@ -17982,14 +19619,14 @@ CREATE POLICY faq_admin_write ON public.saas_faq TO authenticated USING ((EXISTS -- --- Name: saas_faq faq_auth_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_faq faq_auth_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY faq_auth_read ON public.saas_faq FOR SELECT TO authenticated USING ((ativo = true)); -- --- Name: saas_faq_itens faq_itens_admin_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_faq_itens faq_itens_admin_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY faq_itens_admin_write ON public.saas_faq_itens TO authenticated USING ((EXISTS ( SELECT 1 @@ -17998,7 +19635,7 @@ CREATE POLICY faq_itens_admin_write ON public.saas_faq_itens TO authenticated US -- --- Name: saas_faq_itens faq_itens_auth_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_faq_itens faq_itens_auth_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY faq_itens_auth_read ON public.saas_faq_itens FOR SELECT TO authenticated USING (((ativo = true) AND (EXISTS ( SELECT 1 @@ -18007,54 +19644,54 @@ CREATE POLICY faq_itens_auth_read ON public.saas_faq_itens FOR SELECT TO authent -- --- Name: saas_faq faq_public_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_faq faq_public_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY faq_public_read ON public.saas_faq FOR SELECT USING (((publico = true) AND (ativo = true))); -- --- Name: features; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: features; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.features ENABLE ROW LEVEL SECURITY; -- --- Name: features features_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: features features_read_authenticated; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY features_read_authenticated ON public.features FOR SELECT TO authenticated USING (true); -- --- Name: features features_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: features features_write_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY features_write_saas_admin ON public.features TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: feriados; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: feriados; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.feriados ENABLE ROW LEVEL SECURITY; -- --- Name: feriados feriados_delete; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_delete; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY feriados_delete ON public.feriados FOR DELETE USING ((owner_id = auth.uid())); -- --- Name: feriados feriados_global_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_global_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY feriados_global_select ON public.feriados FOR SELECT USING ((tenant_id IS NULL)); -- --- Name: feriados feriados_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_insert; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY feriados_insert ON public.feriados FOR INSERT WITH CHECK ((tenant_id IN ( SELECT tenant_members.tenant_id @@ -18063,7 +19700,7 @@ CREATE POLICY feriados_insert ON public.feriados FOR INSERT WITH CHECK ((tenant_ -- --- Name: feriados feriados_saas_delete; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_saas_delete; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY feriados_saas_delete ON public.feriados FOR DELETE USING ((EXISTS ( SELECT 1 @@ -18072,7 +19709,7 @@ CREATE POLICY feriados_saas_delete ON public.feriados FOR DELETE USING ((EXISTS -- --- Name: feriados feriados_saas_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_saas_insert; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY feriados_saas_insert ON public.feriados FOR INSERT WITH CHECK ((EXISTS ( SELECT 1 @@ -18081,7 +19718,7 @@ CREATE POLICY feriados_saas_insert ON public.feriados FOR INSERT WITH CHECK ((EX -- --- Name: feriados feriados_saas_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_saas_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY feriados_saas_select ON public.feriados FOR SELECT USING ((EXISTS ( SELECT 1 @@ -18090,7 +19727,7 @@ CREATE POLICY feriados_saas_select ON public.feriados FOR SELECT USING ((EXISTS -- --- Name: feriados feriados_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: feriados feriados_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY feriados_select ON public.feriados FOR SELECT USING ((tenant_id IN ( SELECT tenant_members.tenant_id @@ -18099,33 +19736,33 @@ CREATE POLICY feriados_select ON public.feriados FOR SELECT USING ((tenant_id IN -- --- Name: financial_categories; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: financial_categories; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.financial_categories ENABLE ROW LEVEL SECURITY; -- --- Name: financial_categories financial_categories_self; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: financial_categories financial_categories_self; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY financial_categories_self ON public.financial_categories USING ((auth.uid() = user_id)) WITH CHECK ((auth.uid() = user_id)); -- --- Name: financial_exceptions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.financial_exceptions ENABLE ROW LEVEL SECURITY; -- --- Name: financial_exceptions financial_exceptions: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions financial_exceptions: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "financial_exceptions: owner full access" ON public.financial_exceptions USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: financial_exceptions financial_exceptions: tenant members read clinic rules; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: financial_exceptions financial_exceptions: tenant members read clinic rules; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "financial_exceptions: tenant members read clinic rules" ON public.financial_exceptions FOR SELECT USING (((owner_id IS NULL) AND (EXISTS ( SELECT 1 @@ -18134,27 +19771,27 @@ CREATE POLICY "financial_exceptions: tenant members read clinic rules" ON public -- --- Name: financial_records; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: financial_records; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.financial_records ENABLE ROW LEVEL SECURITY; -- --- Name: financial_records financial_records_self; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_self; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY financial_records_self ON public.financial_records USING ((auth.uid() = owner_id)) WITH CHECK ((auth.uid() = owner_id)); -- --- Name: financial_records financial_records_tenant_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_tenant_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY financial_records_tenant_admin ON public.financial_records FOR SELECT USING (((tenant_id IS NOT NULL) AND public.is_tenant_admin(tenant_id))); -- --- Name: financial_records financial_records_tenant_member_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: financial_records financial_records_tenant_member_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY financial_records_tenant_member_read ON public.financial_records FOR SELECT USING (((tenant_id IS NOT NULL) AND (EXISTS ( SELECT 1 @@ -18163,20 +19800,20 @@ CREATE POLICY financial_records_tenant_member_read ON public.financial_records F -- --- Name: email_templates_global global templates readable by authenticated; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: email_templates_global global templates readable by authenticated; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "global templates readable by authenticated" ON public.email_templates_global FOR SELECT USING ((auth.role() = 'authenticated'::text)); -- --- Name: global_notices; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: global_notices; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.global_notices ENABLE ROW LEVEL SECURITY; -- --- Name: global_notices global_notices_saas_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: global_notices global_notices_saas_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY global_notices_saas_all ON public.global_notices TO authenticated USING ((EXISTS ( SELECT 1 @@ -18185,27 +19822,27 @@ CREATE POLICY global_notices_saas_all ON public.global_notices TO authenticated -- --- Name: global_notices global_notices_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: global_notices global_notices_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY global_notices_select ON public.global_notices FOR SELECT TO authenticated USING ((is_active = true)); -- --- Name: agenda_bloqueios insert own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios insert own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "insert own" ON public.agenda_bloqueios FOR INSERT WITH CHECK ((owner_id = auth.uid())); -- --- Name: insurance_plan_services; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: insurance_plan_services; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.insurance_plan_services ENABLE ROW LEVEL SECURITY; -- --- Name: insurance_plan_services insurance_plan_services_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: insurance_plan_services insurance_plan_services_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY insurance_plan_services_owner ON public.insurance_plan_services USING ((EXISTS ( SELECT 1 @@ -18216,107 +19853,120 @@ CREATE POLICY insurance_plan_services_owner ON public.insurance_plan_services US -- --- Name: insurance_plans; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: insurance_plans; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.insurance_plans ENABLE ROW LEVEL SECURITY; -- --- Name: insurance_plans insurance_plans: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: insurance_plans insurance_plans: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "insurance_plans: owner full access" ON public.insurance_plans USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: login_carousel_slides; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: login_carousel_slides; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.login_carousel_slides ENABLE ROW LEVEL SECURITY; -- --- Name: module_features; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: medicos; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.medicos ENABLE ROW LEVEL SECURITY; + +-- +-- Name: medicos medicos: owner full access; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "medicos: owner full access" ON public.medicos USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); + + +-- +-- Name: module_features; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.module_features ENABLE ROW LEVEL SECURITY; -- --- Name: module_features module_features_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: module_features module_features_read_authenticated; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY module_features_read_authenticated ON public.module_features FOR SELECT TO authenticated USING (true); -- --- Name: module_features module_features_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: module_features module_features_write_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY module_features_write_saas_admin ON public.module_features TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: modules; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: modules; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.modules ENABLE ROW LEVEL SECURITY; -- --- Name: modules modules_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: modules modules_read_authenticated; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY modules_read_authenticated ON public.modules FOR SELECT TO authenticated USING (true); -- --- Name: modules modules_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: modules modules_write_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY modules_write_saas_admin ON public.modules TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: notice_dismissals; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: notice_dismissals; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.notice_dismissals ENABLE ROW LEVEL SECURITY; -- --- Name: notice_dismissals notice_dismissals_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notice_dismissals notice_dismissals_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notice_dismissals_own ON public.notice_dismissals TO authenticated USING ((user_id = auth.uid())) WITH CHECK ((user_id = auth.uid())); -- --- Name: notification_logs notif_logs_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notification_logs notif_logs_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notif_logs_owner ON public.notification_logs FOR SELECT USING ((owner_id = auth.uid())); -- --- Name: notification_preferences notif_prefs_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notification_preferences notif_prefs_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notif_prefs_owner ON public.notification_preferences USING (((owner_id = auth.uid()) AND (deleted_at IS NULL))) WITH CHECK ((owner_id = auth.uid())); -- --- Name: notification_queue notif_queue_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notification_queue notif_queue_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notif_queue_owner ON public.notification_queue FOR SELECT USING ((owner_id = auth.uid())); -- --- Name: notification_schedules notif_schedules_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notification_schedules notif_schedules_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notif_schedules_owner ON public.notification_schedules USING (((owner_id = auth.uid()) AND (deleted_at IS NULL))) WITH CHECK ((owner_id = auth.uid())); -- --- Name: notification_templates notif_templates_admin_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notification_templates notif_templates_admin_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notif_templates_admin_all ON public.notification_templates TO authenticated USING ((EXISTS ( SELECT 1 @@ -18327,109 +19977,129 @@ CREATE POLICY notif_templates_admin_all ON public.notification_templates TO auth -- --- Name: notification_templates notif_templates_read_global; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notification_templates notif_templates_read_global; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notif_templates_read_global ON public.notification_templates FOR SELECT TO authenticated USING (((deleted_at IS NULL) AND (((tenant_id IS NULL) AND (is_default = true)) OR (owner_id = auth.uid()) OR public.is_tenant_member(tenant_id)))); -- --- Name: notification_templates notif_templates_write_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notification_templates notif_templates_write_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notif_templates_write_owner ON public.notification_templates TO authenticated USING (((owner_id = auth.uid()) OR public.is_tenant_member(tenant_id))) WITH CHECK (((owner_id = auth.uid()) OR public.is_tenant_member(tenant_id))); -- --- Name: notification_channels; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: notification_channels; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.notification_channels ENABLE ROW LEVEL SECURITY; -- --- Name: notification_channels notification_channels_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notification_channels notification_channels_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY notification_channels_owner ON public.notification_channels USING (((owner_id = auth.uid()) AND (deleted_at IS NULL))) WITH CHECK ((owner_id = auth.uid())); -- --- Name: notification_logs; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: notification_logs; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.notification_logs ENABLE ROW LEVEL SECURITY; -- --- Name: notification_preferences; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: notification_preferences; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.notification_preferences ENABLE ROW LEVEL SECURITY; -- --- Name: notification_queue; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: notification_queue; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.notification_queue ENABLE ROW LEVEL SECURITY; -- --- Name: notification_schedules; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: notification_schedules; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.notification_schedules ENABLE ROW LEVEL SECURITY; -- --- Name: notification_templates; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: notification_templates; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.notification_templates ENABLE ROW LEVEL SECURITY; -- --- Name: notifications; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: notifications; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.notifications ENABLE ROW LEVEL SECURITY; -- --- Name: notifications owner only; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: notifications owner only; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "owner only" ON public.notifications USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: owner_users; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: owner_users; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.owner_users ENABLE ROW LEVEL SECURITY; -- --- Name: owner_users owner_users: user can read own links; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: owner_users owner_users: user can read own links; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "owner_users: user can read own links" ON public.owner_users FOR SELECT TO authenticated USING ((user_id = auth.uid())); -- --- Name: patient_discounts; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: patient_contacts; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.patient_contacts ENABLE ROW LEVEL SECURITY; + +-- +-- Name: patient_contacts patient_contacts_select; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY patient_contacts_select ON public.patient_contacts FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); + + +-- +-- Name: patient_contacts patient_contacts_write; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY patient_contacts_write ON public.patient_contacts USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); + + +-- +-- Name: patient_discounts; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.patient_discounts ENABLE ROW LEVEL SECURITY; -- --- Name: patient_discounts patient_discounts: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_discounts patient_discounts: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "patient_discounts: owner full access" ON public.patient_discounts USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: patient_group_patient; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.patient_group_patient ENABLE ROW LEVEL SECURITY; -- --- Name: patient_group_patient patient_group_patient_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient patient_group_patient_owner_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_group_patient_owner_all ON public.patient_group_patient TO authenticated USING ((EXISTS ( SELECT 1 @@ -18440,331 +20110,384 @@ CREATE POLICY patient_group_patient_owner_all ON public.patient_group_patient TO -- --- Name: patient_group_patient patient_group_patient_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient patient_group_patient_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_group_patient_select ON public.patient_group_patient FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); -- --- Name: patient_group_patient patient_group_patient_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_group_patient patient_group_patient_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_group_patient_write ON public.patient_group_patient USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); -- --- Name: patient_groups; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: patient_groups; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.patient_groups ENABLE ROW LEVEL SECURITY; -- --- Name: patient_groups patient_groups_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_groups patient_groups_owner_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_groups_owner_all ON public.patient_groups TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: patient_groups patient_groups_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_groups patient_groups_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_groups_select ON public.patient_groups FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); -- --- Name: patient_groups patient_groups_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_groups patient_groups_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_groups_write ON public.patient_groups USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); -- --- Name: patient_intake_requests; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.patient_intake_requests ENABLE ROW LEVEL SECURITY; -- --- Name: patient_intake_requests patient_intake_requests_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests patient_intake_requests_owner_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_intake_requests_owner_all ON public.patient_intake_requests TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: patient_intake_requests patient_intake_requests_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests patient_intake_requests_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_intake_requests_select ON public.patient_intake_requests FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); -- --- Name: patient_intake_requests patient_intake_requests_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_intake_requests patient_intake_requests_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_intake_requests_write ON public.patient_intake_requests USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); -- --- Name: patient_invites; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: patient_invites; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.patient_invites ENABLE ROW LEVEL SECURITY; -- --- Name: patient_invites patient_invites_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_invites patient_invites_owner_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_invites_owner_all ON public.patient_invites TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: patient_invites patient_invites_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_invites patient_invites_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_invites_select ON public.patient_invites FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); -- --- Name: patient_invites patient_invites_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_invites patient_invites_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_invites_write ON public.patient_invites USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); -- --- Name: patient_patient_tag; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.patient_patient_tag ENABLE ROW LEVEL SECURITY; -- --- Name: patient_patient_tag patient_patient_tag_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag patient_patient_tag_owner_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_patient_tag_owner_all ON public.patient_patient_tag TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: patient_patient_tag patient_patient_tag_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag patient_patient_tag_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_patient_tag_select ON public.patient_patient_tag FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); -- --- Name: patient_patient_tag patient_patient_tag_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_patient_tag patient_patient_tag_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_patient_tag_write ON public.patient_patient_tag USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); -- --- Name: patient_tags; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: patient_status_history; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.patient_status_history ENABLE ROW LEVEL SECURITY; + +-- +-- Name: patient_support_contacts; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.patient_support_contacts ENABLE ROW LEVEL SECURITY; + +-- +-- Name: patient_tags; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.patient_tags ENABLE ROW LEVEL SECURITY; -- --- Name: patient_tags patient_tags_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_tags patient_tags_owner_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_tags_owner_all ON public.patient_tags TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: patient_tags patient_tags_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_tags patient_tags_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_tags_select ON public.patient_tags FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); -- --- Name: patient_tags patient_tags_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_tags patient_tags_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patient_tags_write ON public.patient_tags USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); -- --- Name: patients; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: patient_timeline; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.patient_timeline ENABLE ROW LEVEL SECURITY; + +-- +-- Name: patients; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.patients ENABLE ROW LEVEL SECURITY; -- --- Name: patients patients_delete; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patients patients_delete; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patients_delete ON public.patients FOR DELETE USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.delete'::text))); -- --- Name: patients patients_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patients patients_insert; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patients_insert ON public.patients FOR INSERT WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.create'::text))); -- --- Name: patients patients_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patients patients_owner_all; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patients_owner_all ON public.patients TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: patients patients_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patients patients_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patients_select ON public.patients FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); -- --- Name: patients patients_update; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patients patients_update; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY patients_update ON public.patients FOR UPDATE USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); -- --- Name: payment_settings; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: payment_settings; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.payment_settings ENABLE ROW LEVEL SECURITY; -- --- Name: payment_settings payment_settings: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: payment_settings payment_settings: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "payment_settings: owner full access" ON public.payment_settings USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: plan_features; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: plan_features; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.plan_features ENABLE ROW LEVEL SECURITY; -- --- Name: plan_features plan_features_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: plan_features plan_features_read_authenticated; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY plan_features_read_authenticated ON public.plan_features FOR SELECT TO authenticated USING (true); -- --- Name: plan_features plan_features_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: plan_features plan_features_write_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY plan_features_write_saas_admin ON public.plan_features TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: plans; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: plans; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.plans ENABLE ROW LEVEL SECURITY; -- --- Name: plans plans_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: plans plans_read_authenticated; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY plans_read_authenticated ON public.plans FOR SELECT TO authenticated USING (true); -- --- Name: plans plans_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: plans plans_write_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY plans_write_saas_admin ON public.plans TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: professional_pricing; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: professional_pricing; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.professional_pricing ENABLE ROW LEVEL SECURITY; -- --- Name: professional_pricing professional_pricing: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: professional_pricing professional_pricing: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "professional_pricing: owner full access" ON public.professional_pricing USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: profiles; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: profiles; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY; -- --- Name: profiles profiles_insert_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: profiles profiles_insert_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY profiles_insert_own ON public.profiles FOR INSERT WITH CHECK ((id = auth.uid())); -- --- Name: profiles profiles_read_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: profiles profiles_read_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY profiles_read_saas_admin ON public.profiles FOR SELECT USING (public.is_saas_admin()); -- --- Name: profiles profiles_select_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: profiles profiles_select_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY profiles_select_own ON public.profiles FOR SELECT USING ((id = auth.uid())); -- --- Name: profiles profiles_update_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: profiles profiles_update_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY profiles_update_own ON public.profiles FOR UPDATE USING ((id = auth.uid())) WITH CHECK ((id = auth.uid())); -- --- Name: login_carousel_slides public_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: patient_support_contacts psc: owner full access; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY "psc: owner full access" ON public.patient_support_contacts USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); + + +-- +-- Name: patient_status_history psh_insert; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY psh_insert ON public.patient_status_history FOR INSERT WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); + + +-- +-- Name: patient_status_history psh_select; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY psh_select ON public.patient_status_history FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); + + +-- +-- Name: patient_timeline pt_insert; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY pt_insert ON public.patient_timeline FOR INSERT WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); + + +-- +-- Name: patient_timeline pt_select; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY pt_select ON public.patient_timeline FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); + + +-- +-- Name: login_carousel_slides public_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY public_read ON public.login_carousel_slides FOR SELECT USING ((ativo = true)); -- --- Name: features read features (auth); Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: features read features (auth); Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "read features (auth)" ON public.features FOR SELECT TO authenticated USING (true); -- --- Name: plan_features read plan_features (auth); Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: plan_features read plan_features (auth); Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "read plan_features (auth)" ON public.plan_features FOR SELECT TO authenticated USING (true); -- --- Name: plans read plans (auth); Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: plans read plans (auth); Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "read plans (auth)" ON public.plans FOR SELECT TO authenticated USING (true); -- --- Name: recurrence_exceptions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: recurrence_exceptions; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.recurrence_exceptions ENABLE ROW LEVEL SECURITY; -- --- Name: recurrence_exceptions recurrence_exceptions_tenant; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: recurrence_exceptions recurrence_exceptions_tenant; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY recurrence_exceptions_tenant ON public.recurrence_exceptions TO authenticated USING ((tenant_id IN ( SELECT tenant_members.tenant_id @@ -18775,13 +20498,13 @@ CREATE POLICY recurrence_exceptions_tenant ON public.recurrence_exceptions TO au -- --- Name: recurrence_rule_services; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.recurrence_rule_services ENABLE ROW LEVEL SECURITY; -- --- Name: recurrence_rule_services recurrence_rule_services: clinic read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services recurrence_rule_services: clinic read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "recurrence_rule_services: clinic read" ON public.recurrence_rule_services FOR SELECT USING ((EXISTS ( SELECT 1 @@ -18790,7 +20513,7 @@ CREATE POLICY "recurrence_rule_services: clinic read" ON public.recurrence_rule_ -- --- Name: recurrence_rule_services recurrence_rule_services: clinic write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services recurrence_rule_services: clinic write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "recurrence_rule_services: clinic write" ON public.recurrence_rule_services USING ((EXISTS ( SELECT 1 @@ -18801,7 +20524,7 @@ CREATE POLICY "recurrence_rule_services: clinic write" ON public.recurrence_rule -- --- Name: recurrence_rule_services recurrence_rule_services: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: recurrence_rule_services recurrence_rule_services: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "recurrence_rule_services: owner full access" ON public.recurrence_rule_services TO authenticated USING ((EXISTS ( SELECT 1 @@ -18812,34 +20535,34 @@ CREATE POLICY "recurrence_rule_services: owner full access" ON public.recurrence -- --- Name: recurrence_rules; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.recurrence_rules ENABLE ROW LEVEL SECURITY; -- --- Name: recurrence_rules recurrence_rules_clinic_read; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules recurrence_rules_clinic_read; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY recurrence_rules_clinic_read ON public.recurrence_rules FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); -- --- Name: recurrence_rules recurrence_rules_clinic_write; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules recurrence_rules_clinic_write; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY recurrence_rules_clinic_write ON public.recurrence_rules USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); -- --- Name: recurrence_rules recurrence_rules_owner; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: recurrence_rules recurrence_rules_owner; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY recurrence_rules_owner ON public.recurrence_rules TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: subscription_intents_legacy saas_admin can read subscription_intents; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_legacy saas_admin can read subscription_intents; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "saas_admin can read subscription_intents" ON public.subscription_intents_legacy FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 @@ -18848,7 +20571,7 @@ CREATE POLICY "saas_admin can read subscription_intents" ON public.subscription_ -- --- Name: subscription_intents_legacy saas_admin can update subscription_intents; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_legacy saas_admin can update subscription_intents; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "saas_admin can update subscription_intents" ON public.subscription_intents_legacy FOR UPDATE TO authenticated USING ((EXISTS ( SELECT 1 @@ -18859,7 +20582,7 @@ CREATE POLICY "saas_admin can update subscription_intents" ON public.subscriptio -- --- Name: login_carousel_slides saas_admin_full; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: login_carousel_slides saas_admin_full; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY saas_admin_full ON public.login_carousel_slides USING ((EXISTS ( SELECT 1 @@ -18868,7 +20591,7 @@ CREATE POLICY saas_admin_full ON public.login_carousel_slides USING ((EXISTS ( S -- --- Name: saas_docs saas_admin_full_access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_docs saas_admin_full_access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY saas_admin_full_access ON public.saas_docs TO authenticated USING ((EXISTS ( SELECT 1 @@ -18879,117 +20602,124 @@ CREATE POLICY saas_admin_full_access ON public.saas_docs TO authenticated USING -- --- Name: saas_admins; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: saas_admins; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.saas_admins ENABLE ROW LEVEL SECURITY; -- --- Name: saas_admins saas_admins_select_self; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_admins saas_admins_select_self; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY saas_admins_select_self ON public.saas_admins FOR SELECT TO authenticated USING ((user_id = auth.uid())); -- --- Name: saas_doc_votos; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.saas_doc_votos ENABLE ROW LEVEL SECURITY; -- --- Name: saas_docs; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: saas_docs; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.saas_docs ENABLE ROW LEVEL SECURITY; -- --- Name: saas_faq; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: saas_faq; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.saas_faq ENABLE ROW LEVEL SECURITY; -- --- Name: saas_faq_itens; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: saas_faq_itens; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.saas_faq_itens ENABLE ROW LEVEL SECURITY; -- --- Name: agenda_bloqueios select own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: agenda_bloqueios select own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "select own" ON public.agenda_bloqueios FOR SELECT USING ((owner_id = auth.uid())); -- --- Name: services; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: twilio_subaccount_usage service_role_manage_usage; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY service_role_manage_usage ON public.twilio_subaccount_usage USING ((auth.role() = 'service_role'::text)); + + +-- +-- Name: services; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.services ENABLE ROW LEVEL SECURITY; -- --- Name: services services: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: services services: owner full access; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "services: owner full access" ON public.services USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); -- --- Name: subscription_events; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: subscription_events; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.subscription_events ENABLE ROW LEVEL SECURITY; -- --- Name: subscription_events subscription_events_read_saas; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscription_events subscription_events_read_saas; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscription_events_read_saas ON public.subscription_events FOR SELECT USING (public.is_saas_admin()); -- --- Name: subscription_events subscription_events_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscription_events subscription_events_write_saas; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscription_events_write_saas ON public.subscription_events FOR INSERT WITH CHECK (public.is_saas_admin()); -- --- Name: subscription_intents_legacy subscription_intents_insert_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_legacy subscription_intents_insert_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscription_intents_insert_own ON public.subscription_intents_legacy FOR INSERT TO authenticated WITH CHECK ((user_id = auth.uid())); -- --- Name: subscription_intents_legacy; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_legacy; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.subscription_intents_legacy ENABLE ROW LEVEL SECURITY; -- --- Name: subscription_intents_legacy subscription_intents_select_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscription_intents_legacy subscription_intents_select_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscription_intents_select_own ON public.subscription_intents_legacy FOR SELECT TO authenticated USING ((user_id = auth.uid())); -- --- Name: subscriptions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: subscriptions; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.subscriptions ENABLE ROW LEVEL SECURITY; -- --- Name: subscriptions subscriptions read own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions read own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "subscriptions read own" ON public.subscriptions FOR SELECT TO authenticated USING ((user_id = auth.uid())); -- --- Name: subscriptions subscriptions: read if linked owner_users; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions: read if linked owner_users; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "subscriptions: read if linked owner_users" ON public.subscriptions FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 @@ -18998,28 +20728,28 @@ CREATE POLICY "subscriptions: read if linked owner_users" ON public.subscription -- --- Name: subscriptions subscriptions_insert_own_personal; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_insert_own_personal; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscriptions_insert_own_personal ON public.subscriptions FOR INSERT TO authenticated WITH CHECK (((user_id = auth.uid()) AND (tenant_id IS NULL))); -- --- Name: subscriptions subscriptions_no_direct_update; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_no_direct_update; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscriptions_no_direct_update ON public.subscriptions FOR UPDATE TO authenticated USING (false) WITH CHECK (false); -- --- Name: subscriptions subscriptions_read_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_read_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscriptions_read_own ON public.subscriptions FOR SELECT TO authenticated USING (((user_id = auth.uid()) OR public.is_saas_admin())); -- --- Name: subscriptions subscriptions_select_for_tenant_members; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_select_for_tenant_members; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscriptions_select_for_tenant_members ON public.subscriptions FOR SELECT TO authenticated USING (((tenant_id IS NOT NULL) AND (EXISTS ( SELECT 1 @@ -19028,27 +20758,27 @@ CREATE POLICY subscriptions_select_for_tenant_members ON public.subscriptions FO -- --- Name: subscriptions subscriptions_select_own_personal; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_select_own_personal; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscriptions_select_own_personal ON public.subscriptions FOR SELECT TO authenticated USING (((user_id = auth.uid()) AND (tenant_id IS NULL))); -- --- Name: subscriptions subscriptions_update_only_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: subscriptions subscriptions_update_only_saas_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY subscriptions_update_only_saas_admin ON public.subscriptions FOR UPDATE TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: support_sessions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: support_sessions; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.support_sessions ENABLE ROW LEVEL SECURITY; -- --- Name: support_sessions support_sessions_saas_delete; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: support_sessions support_sessions_saas_delete; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY support_sessions_saas_delete ON public.support_sessions FOR DELETE USING (((auth.uid() = admin_id) AND (EXISTS ( SELECT 1 @@ -19057,7 +20787,7 @@ CREATE POLICY support_sessions_saas_delete ON public.support_sessions FOR DELETE -- --- Name: support_sessions support_sessions_saas_insert; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: support_sessions support_sessions_saas_insert; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY support_sessions_saas_insert ON public.support_sessions FOR INSERT WITH CHECK (((auth.uid() = admin_id) AND (EXISTS ( SELECT 1 @@ -19066,7 +20796,7 @@ CREATE POLICY support_sessions_saas_insert ON public.support_sessions FOR INSERT -- --- Name: support_sessions support_sessions_saas_select; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: support_sessions support_sessions_saas_select; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY support_sessions_saas_select ON public.support_sessions FOR SELECT USING (((auth.uid() = admin_id) AND (EXISTS ( SELECT 1 @@ -19075,60 +20805,69 @@ CREATE POLICY support_sessions_saas_select ON public.support_sessions FOR SELECT -- --- Name: email_templates_tenant tenant manages own overrides; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: email_templates_tenant tenant manages own overrides; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "tenant manages own overrides" ON public.email_templates_tenant USING ((tenant_id = auth.uid())) WITH CHECK ((tenant_id = auth.uid())); -- --- Name: email_layout_config tenant owns email layout config; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: email_layout_config tenant owns email layout config; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "tenant owns email layout config" ON public.email_layout_config USING ((tenant_id = auth.uid())) WITH CHECK ((tenant_id = auth.uid())); -- --- Name: tenant_members; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: tenant_members; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.tenant_members ENABLE ROW LEVEL SECURITY; -- --- Name: tenant_members tenant_members_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: tenant_members tenant_members_write_saas; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY tenant_members_write_saas ON public.tenant_members TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: tenant_modules; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: tenant_modules; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.tenant_modules ENABLE ROW LEVEL SECURITY; -- --- Name: tenant_modules tenant_modules_read_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: tenant_modules tenant_modules_read_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY tenant_modules_read_own ON public.tenant_modules FOR SELECT TO authenticated USING (((owner_id = auth.uid()) OR public.is_saas_admin())); -- --- Name: tenant_modules tenant_modules_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: tenant_modules tenant_modules_write_saas; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY tenant_modules_write_saas ON public.tenant_modules TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: tenants; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: twilio_subaccount_usage tenant_select_own_usage; Type: POLICY; Schema: public; Owner: - +-- + +CREATE POLICY tenant_select_own_usage ON public.twilio_subaccount_usage FOR SELECT USING ((tenant_id IN ( SELECT tenant_members.tenant_id + FROM public.tenant_members + WHERE (tenant_members.user_id = auth.uid())))); + + +-- +-- Name: tenants; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.tenants ENABLE ROW LEVEL SECURITY; -- --- Name: tenants tenants_read_members; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: tenants tenants_read_members; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY tenants_read_members ON public.tenants FOR SELECT TO authenticated USING ((public.is_saas_admin() OR (EXISTS ( SELECT 1 @@ -19137,20 +20876,20 @@ CREATE POLICY tenants_read_members ON public.tenants FOR SELECT TO authenticated -- --- Name: tenants tenants_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: tenants tenants_write_saas; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY tenants_write_saas ON public.tenants TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); -- --- Name: therapist_payout_records; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: therapist_payout_records; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.therapist_payout_records ENABLE ROW LEVEL SECURITY; -- --- Name: therapist_payout_records therapist_payout_records_self; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: therapist_payout_records therapist_payout_records_self; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY therapist_payout_records_self ON public.therapist_payout_records USING ((EXISTS ( SELECT 1 @@ -19161,7 +20900,7 @@ CREATE POLICY therapist_payout_records_self ON public.therapist_payout_records U -- --- Name: therapist_payout_records therapist_payout_records_tenant_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: therapist_payout_records therapist_payout_records_tenant_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY therapist_payout_records_tenant_admin ON public.therapist_payout_records FOR SELECT USING ((EXISTS ( SELECT 1 @@ -19170,303 +20909,372 @@ CREATE POLICY therapist_payout_records_tenant_admin ON public.therapist_payout_r -- --- Name: therapist_payouts; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: therapist_payouts; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.therapist_payouts ENABLE ROW LEVEL SECURITY; -- --- Name: therapist_payouts therapist_payouts_self; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: therapist_payouts therapist_payouts_self; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY therapist_payouts_self ON public.therapist_payouts USING ((auth.uid() = owner_id)) WITH CHECK ((auth.uid() = owner_id)); -- --- Name: therapist_payouts therapist_payouts_tenant_admin; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: therapist_payouts therapist_payouts_tenant_admin; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY therapist_payouts_tenant_admin ON public.therapist_payouts FOR SELECT USING (((tenant_id IS NOT NULL) AND public.is_tenant_admin(tenant_id))); -- --- Name: tenant_members tm_select_admin_all_members; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: tenant_members tm_select_admin_all_members; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY tm_select_admin_all_members ON public.tenant_members FOR SELECT TO authenticated USING (public.is_tenant_admin(tenant_id)); -- --- Name: tenant_members tm_select_own_membership; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: tenant_members tm_select_own_membership; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY tm_select_own_membership ON public.tenant_members FOR SELECT TO authenticated USING ((user_id = auth.uid())); -- --- Name: agenda_bloqueios update own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: twilio_subaccount_usage; Type: ROW SECURITY; Schema: public; Owner: - +-- + +ALTER TABLE public.twilio_subaccount_usage ENABLE ROW LEVEL SECURITY; + +-- +-- Name: agenda_bloqueios update own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY "update own" ON public.agenda_bloqueios FOR UPDATE USING ((owner_id = auth.uid())); -- --- Name: user_settings; Type: ROW SECURITY; Schema: public; Owner: supabase_admin +-- Name: user_settings; Type: ROW SECURITY; Schema: public; Owner: - -- ALTER TABLE public.user_settings ENABLE ROW LEVEL SECURITY; -- --- Name: user_settings user_settings_insert_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: user_settings user_settings_insert_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY user_settings_insert_own ON public.user_settings FOR INSERT WITH CHECK ((user_id = auth.uid())); -- --- Name: user_settings user_settings_select_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: user_settings user_settings_select_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY user_settings_select_own ON public.user_settings FOR SELECT USING ((user_id = auth.uid())); -- --- Name: user_settings user_settings_update_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: user_settings user_settings_update_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY user_settings_update_own ON public.user_settings FOR UPDATE USING ((user_id = auth.uid())) WITH CHECK ((user_id = auth.uid())); -- --- Name: saas_docs users_read_usuario_docs; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_docs users_read_usuario_docs; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY users_read_usuario_docs ON public.saas_docs FOR SELECT TO authenticated USING (((ativo = true) AND (tipo_acesso = 'usuario'::text))); -- --- Name: saas_doc_votos votos_select_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos votos_select_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY votos_select_own ON public.saas_doc_votos FOR SELECT TO authenticated USING ((user_id = auth.uid())); -- --- Name: saas_doc_votos votos_upsert_own; Type: POLICY; Schema: public; Owner: supabase_admin +-- Name: saas_doc_votos votos_upsert_own; Type: POLICY; Schema: public; Owner: - -- CREATE POLICY votos_upsert_own ON public.saas_doc_votos TO authenticated USING ((user_id = auth.uid())) WITH CHECK ((user_id = auth.uid())); -- --- Name: messages; Type: ROW SECURITY; Schema: realtime; Owner: supabase_realtime_admin +-- Name: messages; Type: ROW SECURITY; Schema: realtime; Owner: - -- ALTER TABLE realtime.messages ENABLE ROW LEVEL SECURITY; -- --- Name: objects agendador_storage_owner_delete; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects Allow authenticated updates; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "Allow authenticated updates" ON storage.objects FOR UPDATE TO authenticated USING ((bucket_id = ANY (ARRAY['avatars'::text, 'logos'::text]))); + + +-- +-- Name: objects Allow authenticated uploads; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "Allow authenticated uploads" ON storage.objects FOR INSERT TO authenticated WITH CHECK ((bucket_id = ANY (ARRAY['avatars'::text, 'logos'::text]))); + + +-- +-- Name: objects Public read; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "Public read" ON storage.objects FOR SELECT USING ((bucket_id = ANY (ARRAY['avatars'::text, 'logos'::text]))); + + +-- +-- Name: objects agendador_storage_owner_delete; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY agendador_storage_owner_delete ON storage.objects FOR DELETE TO authenticated USING (((bucket_id = 'agendador'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); -- --- Name: objects agendador_storage_owner_insert; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects agendador_storage_owner_insert; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY agendador_storage_owner_insert ON storage.objects FOR INSERT TO authenticated WITH CHECK (((bucket_id = 'agendador'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); -- --- Name: objects agendador_storage_owner_update; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects agendador_storage_owner_update; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY agendador_storage_owner_update ON storage.objects FOR UPDATE TO authenticated USING (((bucket_id = 'agendador'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); -- --- Name: objects agendador_storage_public_read; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects agendador_storage_public_read; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY agendador_storage_public_read ON storage.objects FOR SELECT USING ((bucket_id = 'agendador'::text)); -- --- Name: objects avatars authenticated upload; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars authenticated upload; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY "avatars authenticated upload" ON storage.objects FOR INSERT WITH CHECK (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); -- --- Name: objects avatars owner delete; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars owner delete; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY "avatars owner delete" ON storage.objects FOR DELETE USING (((bucket_id = 'avatars'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); -- --- Name: objects avatars owner update; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars owner update; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY "avatars owner update" ON storage.objects FOR UPDATE USING (((bucket_id = 'avatars'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); -- --- Name: objects avatars public read; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars public read; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY "avatars public read" ON storage.objects FOR SELECT USING ((bucket_id = 'avatars'::text)); -- --- Name: objects avatars_delete_own; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars_delete_own; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY avatars_delete_own ON storage.objects FOR DELETE TO authenticated USING (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))); -- --- Name: objects avatars_delete_own_folder; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars_delete_own_folder; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY avatars_delete_own_folder ON storage.objects FOR DELETE USING (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND (name ~~ (('owners/'::text || auth.uid()) || '/%'::text)))); -- --- Name: objects avatars_insert_own; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars_insert_own; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY avatars_insert_own ON storage.objects FOR INSERT TO authenticated WITH CHECK (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))); -- --- Name: objects avatars_insert_own_folder; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars_insert_own_folder; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY avatars_insert_own_folder ON storage.objects FOR INSERT WITH CHECK (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND (name ~~ (('owners/'::text || auth.uid()) || '/%'::text)))); -- --- Name: objects avatars_read; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars_read; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY avatars_read ON storage.objects FOR SELECT USING ((bucket_id = 'avatars'::text)); -- --- Name: objects avatars_select_own; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars_select_own; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY avatars_select_own ON storage.objects FOR SELECT TO authenticated USING (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))); -- --- Name: objects avatars_update_own; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars_update_own; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY avatars_update_own ON storage.objects FOR UPDATE TO authenticated USING (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))) WITH CHECK (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))); -- --- Name: objects avatars_update_own_folder; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects avatars_update_own_folder; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY avatars_update_own_folder ON storage.objects FOR UPDATE USING (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND (name ~~ (('owners/'::text || auth.uid()) || '/%'::text)))) WITH CHECK (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND (name ~~ (('owners/'::text || auth.uid()) || '/%'::text)))); -- --- Name: buckets; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.buckets ENABLE ROW LEVEL SECURITY; -- --- Name: buckets_analytics; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets_analytics; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.buckets_analytics ENABLE ROW LEVEL SECURITY; -- --- Name: buckets_vectors; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: buckets_vectors; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.buckets_vectors ENABLE ROW LEVEL SECURITY; -- --- Name: iceberg_namespaces; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects documents: authenticated delete; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "documents: authenticated delete" ON storage.objects FOR DELETE TO authenticated USING ((bucket_id = 'documents'::text)); + + +-- +-- Name: objects documents: authenticated read; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "documents: authenticated read" ON storage.objects FOR SELECT TO authenticated USING ((bucket_id = 'documents'::text)); + + +-- +-- Name: objects documents: authenticated upload; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "documents: authenticated upload" ON storage.objects FOR INSERT TO authenticated WITH CHECK ((bucket_id = 'documents'::text)); + + +-- +-- Name: objects generated-docs: authenticated delete; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "generated-docs: authenticated delete" ON storage.objects FOR DELETE TO authenticated USING ((bucket_id = 'generated-docs'::text)); + + +-- +-- Name: objects generated-docs: authenticated read; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "generated-docs: authenticated read" ON storage.objects FOR SELECT TO authenticated USING ((bucket_id = 'generated-docs'::text)); + + +-- +-- Name: objects generated-docs: authenticated upload; Type: POLICY; Schema: storage; Owner: - +-- + +CREATE POLICY "generated-docs: authenticated upload" ON storage.objects FOR INSERT TO authenticated WITH CHECK ((bucket_id = 'generated-docs'::text)); + + +-- +-- Name: iceberg_namespaces; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.iceberg_namespaces ENABLE ROW LEVEL SECURITY; -- --- Name: iceberg_tables; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: iceberg_tables; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.iceberg_tables ENABLE ROW LEVEL SECURITY; -- --- Name: objects intake_read_anon; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects intake_read_anon; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY intake_read_anon ON storage.objects FOR SELECT TO anon USING (((bucket_id = 'avatars'::text) AND (name ~~ 'intakes/%'::text))); -- --- Name: objects intake_read_public; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects intake_read_public; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY intake_read_public ON storage.objects FOR SELECT USING (((bucket_id = 'avatars'::text) AND (name ~~ 'intakes/%'::text))); -- --- Name: objects intake_upload_anon; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects intake_upload_anon; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY intake_upload_anon ON storage.objects FOR INSERT TO anon WITH CHECK (((bucket_id = 'avatars'::text) AND (name ~~ 'intakes/%'::text))); -- --- Name: objects intake_upload_public; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects intake_upload_public; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY intake_upload_public ON storage.objects FOR INSERT WITH CHECK (((bucket_id = 'avatars'::text) AND (name ~~ 'intakes/%'::text))); -- --- Name: migrations; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: migrations; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.migrations ENABLE ROW LEVEL SECURITY; -- --- Name: objects; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.objects ENABLE ROW LEVEL SECURITY; -- --- Name: objects public_read; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects public_read; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY public_read ON storage.objects FOR SELECT USING ((bucket_id = 'saas-docs'::text)); -- --- Name: s3_multipart_uploads; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.s3_multipart_uploads ENABLE ROW LEVEL SECURITY; -- --- Name: s3_multipart_uploads_parts; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: s3_multipart_uploads_parts; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.s3_multipart_uploads_parts ENABLE ROW LEVEL SECURITY; -- --- Name: objects saas_admin_delete; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects saas_admin_delete; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY saas_admin_delete ON storage.objects FOR DELETE TO authenticated USING (((bucket_id = 'saas-docs'::text) AND (EXISTS ( SELECT 1 @@ -19475,7 +21283,7 @@ CREATE POLICY saas_admin_delete ON storage.objects FOR DELETE TO authenticated U -- --- Name: objects saas_admin_upload; Type: POLICY; Schema: storage; Owner: supabase_storage_admin +-- Name: objects saas_admin_upload; Type: POLICY; Schema: storage; Owner: - -- CREATE POLICY saas_admin_upload ON storage.objects FOR INSERT TO authenticated WITH CHECK (((bucket_id = 'saas-docs'::text) AND (EXISTS ( SELECT 1 @@ -19484,6509 +21292,41 @@ CREATE POLICY saas_admin_upload ON storage.objects FOR INSERT TO authenticated W -- --- Name: vector_indexes; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin +-- Name: vector_indexes; Type: ROW SECURITY; Schema: storage; Owner: - -- ALTER TABLE storage.vector_indexes ENABLE ROW LEVEL SECURITY; -- --- Name: supabase_realtime; Type: PUBLICATION; Schema: -; Owner: postgres +-- Name: supabase_realtime; Type: PUBLICATION; Schema: -; Owner: - -- CREATE PUBLICATION supabase_realtime WITH (publish = 'insert, update, delete, truncate'); -ALTER PUBLICATION supabase_realtime OWNER TO postgres; - -- --- Name: supabase_realtime_messages_publication; Type: PUBLICATION; Schema: -; Owner: supabase_admin +-- Name: supabase_realtime_messages_publication; Type: PUBLICATION; Schema: -; Owner: - -- CREATE PUBLICATION supabase_realtime_messages_publication WITH (publish = 'insert, update, delete, truncate'); -ALTER PUBLICATION supabase_realtime_messages_publication OWNER TO supabase_admin; - -- --- Name: supabase_realtime notifications; Type: PUBLICATION TABLE; Schema: public; Owner: postgres +-- Name: supabase_realtime notifications; Type: PUBLICATION TABLE; Schema: public; Owner: - -- ALTER PUBLICATION supabase_realtime ADD TABLE ONLY public.notifications; -- --- Name: supabase_realtime_messages_publication messages; Type: PUBLICATION TABLE; Schema: realtime; Owner: supabase_admin +-- Name: supabase_realtime_messages_publication messages; Type: PUBLICATION TABLE; Schema: realtime; Owner: - -- ALTER PUBLICATION supabase_realtime_messages_publication ADD TABLE ONLY realtime.messages; -- --- Name: SCHEMA auth; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA auth TO anon; -GRANT USAGE ON SCHEMA auth TO authenticated; -GRANT USAGE ON SCHEMA auth TO service_role; -GRANT ALL ON SCHEMA auth TO supabase_auth_admin; -GRANT ALL ON SCHEMA auth TO dashboard_user; -GRANT USAGE ON SCHEMA auth TO postgres; - - --- --- Name: SCHEMA cron; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA cron TO postgres WITH GRANT OPTION; - - --- --- Name: SCHEMA extensions; Type: ACL; Schema: -; Owner: postgres --- - -GRANT USAGE ON SCHEMA extensions TO anon; -GRANT USAGE ON SCHEMA extensions TO authenticated; -GRANT USAGE ON SCHEMA extensions TO service_role; -GRANT ALL ON SCHEMA extensions TO dashboard_user; - - --- --- Name: SCHEMA net; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA net TO supabase_functions_admin; -GRANT USAGE ON SCHEMA net TO postgres; -GRANT USAGE ON SCHEMA net TO anon; -GRANT USAGE ON SCHEMA net TO authenticated; -GRANT USAGE ON SCHEMA net TO service_role; - - --- --- Name: SCHEMA public; Type: ACL; Schema: -; Owner: pg_database_owner --- - -GRANT USAGE ON SCHEMA public TO postgres; -GRANT USAGE ON SCHEMA public TO anon; -GRANT USAGE ON SCHEMA public TO authenticated; -GRANT USAGE ON SCHEMA public TO service_role; - - --- --- Name: SCHEMA realtime; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA realtime TO postgres; -GRANT USAGE ON SCHEMA realtime TO anon; -GRANT USAGE ON SCHEMA realtime TO authenticated; -GRANT USAGE ON SCHEMA realtime TO service_role; -GRANT ALL ON SCHEMA realtime TO supabase_realtime_admin; - - --- --- Name: SCHEMA storage; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA storage TO postgres WITH GRANT OPTION; -GRANT USAGE ON SCHEMA storage TO anon; -GRANT USAGE ON SCHEMA storage TO authenticated; -GRANT USAGE ON SCHEMA storage TO service_role; -GRANT ALL ON SCHEMA storage TO supabase_storage_admin WITH GRANT OPTION; -GRANT ALL ON SCHEMA storage TO dashboard_user; - - --- --- Name: SCHEMA supabase_functions; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA supabase_functions TO postgres; -GRANT USAGE ON SCHEMA supabase_functions TO anon; -GRANT USAGE ON SCHEMA supabase_functions TO authenticated; -GRANT USAGE ON SCHEMA supabase_functions TO service_role; -GRANT ALL ON SCHEMA supabase_functions TO supabase_functions_admin; - - --- --- Name: SCHEMA vault; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA vault TO postgres WITH GRANT OPTION; -GRANT USAGE ON SCHEMA vault TO service_role; - - --- --- Name: FUNCTION citextin(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citextin(cstring) TO postgres; -GRANT ALL ON FUNCTION public.citextin(cstring) TO anon; -GRANT ALL ON FUNCTION public.citextin(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.citextin(cstring) TO service_role; - - --- --- Name: FUNCTION citextout(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citextout(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citextout(public.citext) TO anon; -GRANT ALL ON FUNCTION public.citextout(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citextout(public.citext) TO service_role; - - --- --- Name: FUNCTION citextrecv(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citextrecv(internal) TO postgres; -GRANT ALL ON FUNCTION public.citextrecv(internal) TO anon; -GRANT ALL ON FUNCTION public.citextrecv(internal) TO authenticated; -GRANT ALL ON FUNCTION public.citextrecv(internal) TO service_role; - - --- --- Name: FUNCTION citextsend(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citextsend(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citextsend(public.citext) TO anon; -GRANT ALL ON FUNCTION public.citextsend(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citextsend(public.citext) TO service_role; - - --- --- Name: FUNCTION gbtreekey16_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey16_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey16_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey16_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey16_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey16_out(public.gbtreekey16); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey16_out(public.gbtreekey16) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey16_out(public.gbtreekey16) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey16_out(public.gbtreekey16) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey16_out(public.gbtreekey16) TO service_role; - - --- --- Name: FUNCTION gbtreekey2_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey2_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey2_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey2_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey2_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey2_out(public.gbtreekey2); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey2_out(public.gbtreekey2) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey2_out(public.gbtreekey2) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey2_out(public.gbtreekey2) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey2_out(public.gbtreekey2) TO service_role; - - --- --- Name: FUNCTION gbtreekey32_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey32_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey32_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey32_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey32_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey32_out(public.gbtreekey32); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey32_out(public.gbtreekey32) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey32_out(public.gbtreekey32) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey32_out(public.gbtreekey32) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey32_out(public.gbtreekey32) TO service_role; - - --- --- Name: FUNCTION gbtreekey4_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey4_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey4_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey4_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey4_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey4_out(public.gbtreekey4); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey4_out(public.gbtreekey4) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey4_out(public.gbtreekey4) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey4_out(public.gbtreekey4) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey4_out(public.gbtreekey4) TO service_role; - - --- --- Name: FUNCTION gbtreekey8_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey8_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey8_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey8_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey8_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey8_out(public.gbtreekey8); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey8_out(public.gbtreekey8) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey8_out(public.gbtreekey8) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey8_out(public.gbtreekey8) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey8_out(public.gbtreekey8) TO service_role; - - --- --- Name: FUNCTION gbtreekey_var_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey_var_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey_var_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey_var_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey_var_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey_var_out(public.gbtreekey_var); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey_var_out(public.gbtreekey_var) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey_var_out(public.gbtreekey_var) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey_var_out(public.gbtreekey_var) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey_var_out(public.gbtreekey_var) TO service_role; - - --- --- Name: FUNCTION gtrgm_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_in(cstring) TO service_role; - - --- --- Name: FUNCTION gtrgm_out(public.gtrgm); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_out(public.gtrgm) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_out(public.gtrgm) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_out(public.gtrgm) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_out(public.gtrgm) TO service_role; - - --- --- Name: FUNCTION citext(boolean); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext(boolean) TO postgres; -GRANT ALL ON FUNCTION public.citext(boolean) TO anon; -GRANT ALL ON FUNCTION public.citext(boolean) TO authenticated; -GRANT ALL ON FUNCTION public.citext(boolean) TO service_role; - - --- --- Name: FUNCTION citext(character); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext(character) TO postgres; -GRANT ALL ON FUNCTION public.citext(character) TO anon; -GRANT ALL ON FUNCTION public.citext(character) TO authenticated; -GRANT ALL ON FUNCTION public.citext(character) TO service_role; - - --- --- Name: FUNCTION citext(inet); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext(inet) TO postgres; -GRANT ALL ON FUNCTION public.citext(inet) TO anon; -GRANT ALL ON FUNCTION public.citext(inet) TO authenticated; -GRANT ALL ON FUNCTION public.citext(inet) TO service_role; - - --- --- Name: FUNCTION email(); Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON FUNCTION auth.email() TO dashboard_user; - - --- --- Name: FUNCTION jwt(); Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON FUNCTION auth.jwt() TO postgres; -GRANT ALL ON FUNCTION auth.jwt() TO dashboard_user; - - --- --- Name: FUNCTION role(); Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON FUNCTION auth.role() TO dashboard_user; - - --- --- Name: FUNCTION uid(); Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON FUNCTION auth.uid() TO dashboard_user; - - --- --- Name: FUNCTION alter_job(job_id bigint, schedule text, command text, database text, username text, active boolean); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.alter_job(job_id bigint, schedule text, command text, database text, username text, active boolean) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION job_cache_invalidate(); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.job_cache_invalidate() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION schedule(schedule text, command text); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.schedule(schedule text, command text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION schedule(job_name text, schedule text, command text); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.schedule(job_name text, schedule text, command text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION schedule_in_database(job_name text, schedule text, command text, database text, username text, active boolean); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.schedule_in_database(job_name text, schedule text, command text, database text, username text, active boolean) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION unschedule(job_id bigint); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.unschedule(job_id bigint) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION unschedule(job_name text); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.unschedule(job_name text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION armor(bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.armor(bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.armor(bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION armor(bytea, text[], text[]); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.armor(bytea, text[], text[]) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.armor(bytea, text[], text[]) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION crypt(text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.crypt(text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.crypt(text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION dearmor(text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.dearmor(text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.dearmor(text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION decrypt(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.decrypt(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.decrypt(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION decrypt_iv(bytea, bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.decrypt_iv(bytea, bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.decrypt_iv(bytea, bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION digest(bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.digest(bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.digest(bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION digest(text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.digest(text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.digest(text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION encrypt(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.encrypt(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.encrypt(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION encrypt_iv(bytea, bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.encrypt_iv(bytea, bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.encrypt_iv(bytea, bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION gen_random_bytes(integer); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.gen_random_bytes(integer) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.gen_random_bytes(integer) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION gen_random_uuid(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.gen_random_uuid() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.gen_random_uuid() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION gen_salt(text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.gen_salt(text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.gen_salt(text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION gen_salt(text, integer); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.gen_salt(text, integer) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.gen_salt(text, integer) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION grant_pg_cron_access(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION extensions.grant_pg_cron_access() FROM supabase_admin; -GRANT ALL ON FUNCTION extensions.grant_pg_cron_access() TO supabase_admin WITH GRANT OPTION; -GRANT ALL ON FUNCTION extensions.grant_pg_cron_access() TO dashboard_user; - - --- --- Name: FUNCTION grant_pg_graphql_access(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.grant_pg_graphql_access() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION grant_pg_net_access(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION extensions.grant_pg_net_access() FROM supabase_admin; -GRANT ALL ON FUNCTION extensions.grant_pg_net_access() TO supabase_admin WITH GRANT OPTION; -GRANT ALL ON FUNCTION extensions.grant_pg_net_access() TO dashboard_user; - - --- --- Name: FUNCTION hmac(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.hmac(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.hmac(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION hmac(text, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.hmac(text, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.hmac(text, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pg_stat_statements(showtext boolean, OUT userid oid, OUT dbid oid, OUT toplevel boolean, OUT queryid bigint, OUT query text, OUT plans bigint, OUT total_plan_time double precision, OUT min_plan_time double precision, OUT max_plan_time double precision, OUT mean_plan_time double precision, OUT stddev_plan_time double precision, OUT calls bigint, OUT total_exec_time double precision, OUT min_exec_time double precision, OUT max_exec_time double precision, OUT mean_exec_time double precision, OUT stddev_exec_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT shared_blk_read_time double precision, OUT shared_blk_write_time double precision, OUT local_blk_read_time double precision, OUT local_blk_write_time double precision, OUT temp_blk_read_time double precision, OUT temp_blk_write_time double precision, OUT wal_records bigint, OUT wal_fpi bigint, OUT wal_bytes numeric, OUT jit_functions bigint, OUT jit_generation_time double precision, OUT jit_inlining_count bigint, OUT jit_inlining_time double precision, OUT jit_optimization_count bigint, OUT jit_optimization_time double precision, OUT jit_emission_count bigint, OUT jit_emission_time double precision, OUT jit_deform_count bigint, OUT jit_deform_time double precision, OUT stats_since timestamp with time zone, OUT minmax_stats_since timestamp with time zone); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pg_stat_statements(showtext boolean, OUT userid oid, OUT dbid oid, OUT toplevel boolean, OUT queryid bigint, OUT query text, OUT plans bigint, OUT total_plan_time double precision, OUT min_plan_time double precision, OUT max_plan_time double precision, OUT mean_plan_time double precision, OUT stddev_plan_time double precision, OUT calls bigint, OUT total_exec_time double precision, OUT min_exec_time double precision, OUT max_exec_time double precision, OUT mean_exec_time double precision, OUT stddev_exec_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT shared_blk_read_time double precision, OUT shared_blk_write_time double precision, OUT local_blk_read_time double precision, OUT local_blk_write_time double precision, OUT temp_blk_read_time double precision, OUT temp_blk_write_time double precision, OUT wal_records bigint, OUT wal_fpi bigint, OUT wal_bytes numeric, OUT jit_functions bigint, OUT jit_generation_time double precision, OUT jit_inlining_count bigint, OUT jit_inlining_time double precision, OUT jit_optimization_count bigint, OUT jit_optimization_time double precision, OUT jit_emission_count bigint, OUT jit_emission_time double precision, OUT jit_deform_count bigint, OUT jit_deform_time double precision, OUT stats_since timestamp with time zone, OUT minmax_stats_since timestamp with time zone) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pg_stat_statements_info(OUT dealloc bigint, OUT stats_reset timestamp with time zone); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pg_stat_statements_info(OUT dealloc bigint, OUT stats_reset timestamp with time zone) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pg_stat_statements_reset(userid oid, dbid oid, queryid bigint, minmax_only boolean); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pg_stat_statements_reset(userid oid, dbid oid, queryid bigint, minmax_only boolean) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_armor_headers(text, OUT key text, OUT value text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_armor_headers(text, OUT key text, OUT value text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_armor_headers(text, OUT key text, OUT value text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_key_id(bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_key_id(bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_key_id(bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt(bytea, bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt(bytea, bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt_bytea(bytea, bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt_bytea(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt_bytea(bytea, bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_encrypt(text, bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt(text, bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt(text, bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_encrypt(text, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt(text, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt(text, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_encrypt_bytea(bytea, bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt_bytea(bytea, bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt_bytea(bytea, bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_encrypt_bytea(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt_bytea(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt_bytea(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_decrypt(bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt(bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt(bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_decrypt(bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt(bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt(bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_decrypt_bytea(bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt_bytea(bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt_bytea(bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_decrypt_bytea(bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt_bytea(bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt_bytea(bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_encrypt(text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt(text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt(text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_encrypt(text, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt(text, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt(text, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_encrypt_bytea(bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt_bytea(bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt_bytea(bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_encrypt_bytea(bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt_bytea(bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt_bytea(bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgrst_ddl_watch(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgrst_ddl_watch() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgrst_drop_watch(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgrst_drop_watch() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION set_graphql_placeholder(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.set_graphql_placeholder() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v1(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v1() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v1() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v1mc(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v1mc() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v1mc() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v3(namespace uuid, name text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v3(namespace uuid, name text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v3(namespace uuid, name text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v4(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v4() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v4() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v5(namespace uuid, name text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v5(namespace uuid, name text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v5(namespace uuid, name text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_nil(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_nil() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_nil() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_ns_dns(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_ns_dns() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_ns_dns() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_ns_oid(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_ns_oid() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_ns_oid() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_ns_url(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_ns_url() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_ns_url() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_ns_x500(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_ns_x500() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_ns_x500() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION graphql("operationName" text, query text, variables jsonb, extensions jsonb); Type: ACL; Schema: graphql_public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION graphql_public.graphql("operationName" text, query text, variables jsonb, extensions jsonb) TO postgres; -GRANT ALL ON FUNCTION graphql_public.graphql("operationName" text, query text, variables jsonb, extensions jsonb) TO anon; -GRANT ALL ON FUNCTION graphql_public.graphql("operationName" text, query text, variables jsonb, extensions jsonb) TO authenticated; -GRANT ALL ON FUNCTION graphql_public.graphql("operationName" text, query text, variables jsonb, extensions jsonb) TO service_role; - - --- --- Name: FUNCTION http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer); Type: ACL; Schema: net; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO postgres; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO anon; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO authenticated; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO service_role; - - --- --- Name: FUNCTION http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer); Type: ACL; Schema: net; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO postgres; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO anon; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO authenticated; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO service_role; - - --- --- Name: FUNCTION pg_reload_conf(); Type: ACL; Schema: pg_catalog; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION pg_catalog.pg_reload_conf() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION get_auth(p_usename text); Type: ACL; Schema: pgbouncer; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION pgbouncer.get_auth(p_usename text) FROM PUBLIC; -GRANT ALL ON FUNCTION pgbouncer.get_auth(p_usename text) TO pgbouncer; - - --- --- Name: FUNCTION __rls_ping(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.__rls_ping() TO postgres; -GRANT ALL ON FUNCTION public.__rls_ping() TO anon; -GRANT ALL ON FUNCTION public.__rls_ping() TO authenticated; -GRANT ALL ON FUNCTION public.__rls_ping() TO service_role; - - --- --- Name: TABLE subscriptions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscriptions TO postgres; -GRANT ALL ON TABLE public.subscriptions TO anon; -GRANT ALL ON TABLE public.subscriptions TO authenticated; -GRANT ALL ON TABLE public.subscriptions TO service_role; - - --- --- Name: FUNCTION activate_subscription_from_intent(p_intent_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) TO anon; -GRANT ALL ON FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) TO service_role; - - --- --- Name: FUNCTION admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) TO postgres; -GRANT ALL ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) TO anon; -GRANT ALL ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) TO authenticated; -GRANT ALL ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) TO service_role; - - --- --- Name: FUNCTION admin_delete_email_template_global(p_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.admin_delete_email_template_global(p_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.admin_delete_email_template_global(p_id uuid) TO anon; -GRANT ALL ON FUNCTION public.admin_delete_email_template_global(p_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.admin_delete_email_template_global(p_id uuid) TO service_role; - - --- --- Name: FUNCTION admin_fix_plan_target(p_plan_key text, p_new_target text); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) FROM PUBLIC; -GRANT ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) TO postgres; -GRANT ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) TO anon; -GRANT ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) TO authenticated; -GRANT ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) TO service_role; - - --- --- Name: FUNCTION admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) TO postgres; -GRANT ALL ON FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) TO anon; -GRANT ALL ON FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) TO authenticated; -GRANT ALL ON FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) TO service_role; - - --- --- Name: FUNCTION agenda_cfg_sync(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.agenda_cfg_sync() TO postgres; -GRANT ALL ON FUNCTION public.agenda_cfg_sync() TO anon; -GRANT ALL ON FUNCTION public.agenda_cfg_sync() TO authenticated; -GRANT ALL ON FUNCTION public.agenda_cfg_sync() TO service_role; - - --- --- Name: FUNCTION agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) TO postgres; -GRANT ALL ON FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) TO anon; -GRANT ALL ON FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) TO authenticated; -GRANT ALL ON FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) TO service_role; - - --- --- Name: FUNCTION agendador_gerar_slug(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.agendador_gerar_slug() TO postgres; -GRANT ALL ON FUNCTION public.agendador_gerar_slug() TO anon; -GRANT ALL ON FUNCTION public.agendador_gerar_slug() TO authenticated; -GRANT ALL ON FUNCTION public.agendador_gerar_slug() TO service_role; - - --- --- Name: FUNCTION agendador_slots_disponiveis(p_slug text, p_data date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) TO postgres; -GRANT ALL ON FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) TO anon; -GRANT ALL ON FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) TO authenticated; -GRANT ALL ON FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) TO service_role; - - --- --- Name: FUNCTION auto_create_financial_record_from_session(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.auto_create_financial_record_from_session() TO postgres; -GRANT ALL ON FUNCTION public.auto_create_financial_record_from_session() TO anon; -GRANT ALL ON FUNCTION public.auto_create_financial_record_from_session() TO authenticated; -GRANT ALL ON FUNCTION public.auto_create_financial_record_from_session() TO service_role; - - --- --- Name: FUNCTION can_delete_patient(p_patient_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.can_delete_patient(p_patient_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.can_delete_patient(p_patient_id uuid) TO anon; -GRANT ALL ON FUNCTION public.can_delete_patient(p_patient_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.can_delete_patient(p_patient_id uuid) TO service_role; - - --- --- Name: FUNCTION cancel_notifications_on_opt_out(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_notifications_on_opt_out() TO postgres; -GRANT ALL ON FUNCTION public.cancel_notifications_on_opt_out() TO anon; -GRANT ALL ON FUNCTION public.cancel_notifications_on_opt_out() TO authenticated; -GRANT ALL ON FUNCTION public.cancel_notifications_on_opt_out() TO service_role; - - --- --- Name: FUNCTION cancel_notifications_on_session_cancel(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_notifications_on_session_cancel() TO postgres; -GRANT ALL ON FUNCTION public.cancel_notifications_on_session_cancel() TO anon; -GRANT ALL ON FUNCTION public.cancel_notifications_on_session_cancel() TO authenticated; -GRANT ALL ON FUNCTION public.cancel_notifications_on_session_cancel() TO service_role; - - --- --- Name: FUNCTION cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) TO anon; -GRANT ALL ON FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) TO service_role; - - --- --- Name: FUNCTION cancel_recurrence_from(p_recurrence_id uuid, p_from_date date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) TO postgres; -GRANT ALL ON FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) TO anon; -GRANT ALL ON FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) TO authenticated; -GRANT ALL ON FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) TO service_role; - - --- --- Name: FUNCTION cancel_subscription(p_subscription_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_subscription(p_subscription_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.cancel_subscription(p_subscription_id uuid) TO anon; -GRANT ALL ON FUNCTION public.cancel_subscription(p_subscription_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.cancel_subscription(p_subscription_id uuid) TO service_role; - - --- --- Name: FUNCTION cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) TO postgres; -GRANT ALL ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) TO anon; -GRANT ALL ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) TO authenticated; -GRANT ALL ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) TO service_role; - - --- --- Name: FUNCTION cash_dist(money, money); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cash_dist(money, money) TO postgres; -GRANT ALL ON FUNCTION public.cash_dist(money, money) TO anon; -GRANT ALL ON FUNCTION public.cash_dist(money, money) TO authenticated; -GRANT ALL ON FUNCTION public.cash_dist(money, money) TO service_role; - - --- --- Name: FUNCTION change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) TO anon; -GRANT ALL ON FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) TO service_role; - - --- --- Name: FUNCTION citext_cmp(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_cmp(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_cmp(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_cmp(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_cmp(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_eq(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_eq(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_eq(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_eq(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_eq(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_ge(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_ge(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_ge(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_ge(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_ge(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_gt(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_gt(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_gt(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_gt(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_gt(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_hash(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_hash(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_hash(public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_hash(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_hash(public.citext) TO service_role; - - --- --- Name: FUNCTION citext_hash_extended(public.citext, bigint); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_hash_extended(public.citext, bigint) TO postgres; -GRANT ALL ON FUNCTION public.citext_hash_extended(public.citext, bigint) TO anon; -GRANT ALL ON FUNCTION public.citext_hash_extended(public.citext, bigint) TO authenticated; -GRANT ALL ON FUNCTION public.citext_hash_extended(public.citext, bigint) TO service_role; - - --- --- Name: FUNCTION citext_larger(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_larger(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_larger(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_larger(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_larger(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_le(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_le(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_le(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_le(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_le(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_lt(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_lt(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_lt(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_lt(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_lt(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_ne(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_ne(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_ne(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_ne(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_ne(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_cmp(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_cmp(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_cmp(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_cmp(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_cmp(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_ge(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_ge(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_ge(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_ge(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_ge(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_gt(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_gt(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_gt(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_gt(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_gt(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_le(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_le(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_le(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_le(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_le(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_lt(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_lt(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_lt(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_lt(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_lt(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_smaller(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_smaller(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_smaller(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_smaller(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_smaller(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION cleanup_notification_queue(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cleanup_notification_queue() TO postgres; -GRANT ALL ON FUNCTION public.cleanup_notification_queue() TO anon; -GRANT ALL ON FUNCTION public.cleanup_notification_queue() TO authenticated; -GRANT ALL ON FUNCTION public.cleanup_notification_queue() TO service_role; - - --- --- Name: FUNCTION create_clinic_tenant(p_name text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_clinic_tenant(p_name text) TO postgres; -GRANT ALL ON FUNCTION public.create_clinic_tenant(p_name text) TO anon; -GRANT ALL ON FUNCTION public.create_clinic_tenant(p_name text) TO authenticated; -GRANT ALL ON FUNCTION public.create_clinic_tenant(p_name text) TO service_role; - - --- --- Name: TABLE financial_records; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.financial_records TO postgres; -GRANT ALL ON TABLE public.financial_records TO anon; -GRANT ALL ON TABLE public.financial_records TO authenticated; -GRANT ALL ON TABLE public.financial_records TO service_role; - - --- --- Name: FUNCTION create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) TO postgres; -GRANT ALL ON FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) TO anon; -GRANT ALL ON FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) TO authenticated; -GRANT ALL ON FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) TO service_role; - - --- --- Name: FUNCTION create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) TO postgres; -GRANT ALL ON FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) TO anon; -GRANT ALL ON FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) TO authenticated; -GRANT ALL ON FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) TO service_role; - - --- --- Name: FUNCTION create_patient_intake_request_v2(p_token text, p_payload jsonb); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) FROM PUBLIC; -GRANT ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) TO postgres; -GRANT ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) TO anon; -GRANT ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) TO authenticated; -GRANT ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) TO service_role; - - --- --- Name: FUNCTION create_support_session(p_tenant_id uuid, p_ttl_minutes integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) TO postgres; -GRANT ALL ON FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) TO anon; -GRANT ALL ON FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) TO authenticated; -GRANT ALL ON FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) TO service_role; - - --- --- Name: TABLE therapist_payouts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.therapist_payouts TO postgres; -GRANT ALL ON TABLE public.therapist_payouts TO anon; -GRANT ALL ON TABLE public.therapist_payouts TO authenticated; -GRANT ALL ON TABLE public.therapist_payouts TO service_role; - - --- --- Name: FUNCTION create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) TO postgres; -GRANT ALL ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) TO anon; -GRANT ALL ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) TO authenticated; -GRANT ALL ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) TO service_role; - - --- --- Name: FUNCTION current_member_id(p_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.current_member_id(p_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.current_member_id(p_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.current_member_id(p_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.current_member_id(p_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION current_member_role(p_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.current_member_role(p_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.current_member_role(p_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.current_member_role(p_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.current_member_role(p_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION date_dist(date, date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.date_dist(date, date) TO postgres; -GRANT ALL ON FUNCTION public.date_dist(date, date) TO anon; -GRANT ALL ON FUNCTION public.date_dist(date, date) TO authenticated; -GRANT ALL ON FUNCTION public.date_dist(date, date) TO service_role; - - --- --- Name: FUNCTION debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) TO postgres; -GRANT ALL ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) TO anon; -GRANT ALL ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) TO authenticated; -GRANT ALL ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) TO service_role; - - --- --- Name: FUNCTION delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid); Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) TO anon; -GRANT ALL ON FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) TO service_role; - - --- --- Name: FUNCTION delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) TO anon; -GRANT ALL ON FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) TO service_role; - - --- --- Name: FUNCTION dev_list_auth_users(p_limit integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.dev_list_auth_users(p_limit integer) TO postgres; -GRANT ALL ON FUNCTION public.dev_list_auth_users(p_limit integer) TO anon; -GRANT ALL ON FUNCTION public.dev_list_auth_users(p_limit integer) TO authenticated; -GRANT ALL ON FUNCTION public.dev_list_auth_users(p_limit integer) TO service_role; - - --- --- Name: FUNCTION dev_list_custom_users(); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.dev_list_custom_users() FROM PUBLIC; -GRANT ALL ON FUNCTION public.dev_list_custom_users() TO postgres; -GRANT ALL ON FUNCTION public.dev_list_custom_users() TO anon; -GRANT ALL ON FUNCTION public.dev_list_custom_users() TO authenticated; -GRANT ALL ON FUNCTION public.dev_list_custom_users() TO service_role; - - --- --- Name: FUNCTION dev_list_intent_leads(); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.dev_list_intent_leads() FROM PUBLIC; -GRANT ALL ON FUNCTION public.dev_list_intent_leads() TO postgres; -GRANT ALL ON FUNCTION public.dev_list_intent_leads() TO anon; -GRANT ALL ON FUNCTION public.dev_list_intent_leads() TO authenticated; -GRANT ALL ON FUNCTION public.dev_list_intent_leads() TO service_role; - - --- --- Name: FUNCTION dev_public_debug_snapshot(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.dev_public_debug_snapshot() TO postgres; -GRANT ALL ON FUNCTION public.dev_public_debug_snapshot() TO anon; -GRANT ALL ON FUNCTION public.dev_public_debug_snapshot() TO authenticated; -GRANT ALL ON FUNCTION public.dev_public_debug_snapshot() TO service_role; - - --- --- Name: FUNCTION ensure_personal_tenant(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.ensure_personal_tenant() TO postgres; -GRANT ALL ON FUNCTION public.ensure_personal_tenant() TO anon; -GRANT ALL ON FUNCTION public.ensure_personal_tenant() TO authenticated; -GRANT ALL ON FUNCTION public.ensure_personal_tenant() TO service_role; - - --- --- Name: FUNCTION ensure_personal_tenant_for_user(p_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) TO service_role; - - --- --- Name: FUNCTION faq_votar(faq_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.faq_votar(faq_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.faq_votar(faq_id uuid) TO anon; -GRANT ALL ON FUNCTION public.faq_votar(faq_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.faq_votar(faq_id uuid) TO service_role; - - --- --- Name: FUNCTION fix_all_subscription_mismatches(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.fix_all_subscription_mismatches() TO postgres; -GRANT ALL ON FUNCTION public.fix_all_subscription_mismatches() TO anon; -GRANT ALL ON FUNCTION public.fix_all_subscription_mismatches() TO authenticated; -GRANT ALL ON FUNCTION public.fix_all_subscription_mismatches() TO service_role; - - --- --- Name: FUNCTION float4_dist(real, real); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.float4_dist(real, real) TO postgres; -GRANT ALL ON FUNCTION public.float4_dist(real, real) TO anon; -GRANT ALL ON FUNCTION public.float4_dist(real, real) TO authenticated; -GRANT ALL ON FUNCTION public.float4_dist(real, real) TO service_role; - - --- --- Name: FUNCTION float8_dist(double precision, double precision); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.float8_dist(double precision, double precision) TO postgres; -GRANT ALL ON FUNCTION public.float8_dist(double precision, double precision) TO anon; -GRANT ALL ON FUNCTION public.float8_dist(double precision, double precision) TO authenticated; -GRANT ALL ON FUNCTION public.float8_dist(double precision, double precision) TO service_role; - - --- --- Name: FUNCTION fn_agenda_regras_semanais_no_overlap(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.fn_agenda_regras_semanais_no_overlap() TO postgres; -GRANT ALL ON FUNCTION public.fn_agenda_regras_semanais_no_overlap() TO anon; -GRANT ALL ON FUNCTION public.fn_agenda_regras_semanais_no_overlap() TO authenticated; -GRANT ALL ON FUNCTION public.fn_agenda_regras_semanais_no_overlap() TO service_role; - - --- --- Name: FUNCTION gbt_bit_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_consistent(internal, bit, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_consistent(internal, bit, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_consistent(internal, bit, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_consistent(internal, bit, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_consistent(internal, bit, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_consistent(internal, boolean, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_consistent(internal, boolean, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_consistent(internal, boolean, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_consistent(internal, boolean, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_consistent(internal, boolean, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bpchar_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bpchar_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bpchar_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bpchar_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bpchar_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bpchar_consistent(internal, character, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bpchar_consistent(internal, character, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bpchar_consistent(internal, character, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bpchar_consistent(internal, character, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bpchar_consistent(internal, character, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_consistent(internal, bytea, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_consistent(internal, bytea, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_consistent(internal, bytea, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_consistent(internal, bytea, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_consistent(internal, bytea, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_consistent(internal, money, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_consistent(internal, money, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_consistent(internal, money, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_consistent(internal, money, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_consistent(internal, money, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_distance(internal, money, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_distance(internal, money, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_distance(internal, money, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_distance(internal, money, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_distance(internal, money, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_consistent(internal, date, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_consistent(internal, date, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_consistent(internal, date, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_consistent(internal, date, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_consistent(internal, date, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_distance(internal, date, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_distance(internal, date, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_distance(internal, date, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_distance(internal, date, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_distance(internal, date, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_decompress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_decompress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_decompress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_decompress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_decompress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_consistent(internal, anyenum, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_consistent(internal, anyenum, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_consistent(internal, anyenum, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_consistent(internal, anyenum, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_consistent(internal, anyenum, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_consistent(internal, real, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_consistent(internal, real, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_consistent(internal, real, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_consistent(internal, real, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_consistent(internal, real, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_distance(internal, real, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_distance(internal, real, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_distance(internal, real, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_distance(internal, real, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_distance(internal, real, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_consistent(internal, double precision, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_consistent(internal, double precision, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_consistent(internal, double precision, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_consistent(internal, double precision, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_consistent(internal, double precision, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_distance(internal, double precision, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_distance(internal, double precision, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_distance(internal, double precision, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_distance(internal, double precision, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_distance(internal, double precision, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_consistent(internal, inet, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_consistent(internal, inet, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_consistent(internal, inet, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_consistent(internal, inet, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_consistent(internal, inet, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_consistent(internal, smallint, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_consistent(internal, smallint, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_consistent(internal, smallint, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_consistent(internal, smallint, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_consistent(internal, smallint, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_distance(internal, smallint, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_distance(internal, smallint, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_distance(internal, smallint, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_distance(internal, smallint, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_distance(internal, smallint, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_consistent(internal, integer, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_consistent(internal, integer, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_consistent(internal, integer, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_consistent(internal, integer, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_consistent(internal, integer, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_distance(internal, integer, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_distance(internal, integer, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_distance(internal, integer, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_distance(internal, integer, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_distance(internal, integer, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_consistent(internal, bigint, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_consistent(internal, bigint, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_consistent(internal, bigint, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_consistent(internal, bigint, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_consistent(internal, bigint, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_distance(internal, bigint, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_distance(internal, bigint, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_distance(internal, bigint, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_distance(internal, bigint, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_distance(internal, bigint, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_consistent(internal, interval, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_consistent(internal, interval, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_consistent(internal, interval, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_consistent(internal, interval, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_consistent(internal, interval, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_decompress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_decompress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_decompress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_decompress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_decompress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_distance(internal, interval, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_distance(internal, interval, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_distance(internal, interval, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_distance(internal, interval, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_distance(internal, interval, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_consistent(internal, macaddr, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_consistent(internal, macaddr, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_consistent(internal, macaddr, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_consistent(internal, macaddr, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_consistent(internal, macaddr, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_consistent(internal, numeric, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_consistent(internal, numeric, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_consistent(internal, numeric, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_consistent(internal, numeric, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_consistent(internal, numeric, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_consistent(internal, oid, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_consistent(internal, oid, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_consistent(internal, oid, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_consistent(internal, oid, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_consistent(internal, oid, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_distance(internal, oid, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_distance(internal, oid, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_distance(internal, oid, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_distance(internal, oid, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_distance(internal, oid, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_consistent(internal, text, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_consistent(internal, text, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_consistent(internal, text, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_consistent(internal, text, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_consistent(internal, text, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_consistent(internal, time without time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_consistent(internal, time without time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_consistent(internal, time without time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_consistent(internal, time without time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_consistent(internal, time without time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_distance(internal, time without time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_distance(internal, time without time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_distance(internal, time without time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_distance(internal, time without time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_distance(internal, time without time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_timetz_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_timetz_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_timetz_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_timetz_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_timetz_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_tstz_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_tstz_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_tstz_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_tstz_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_tstz_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_consistent(internal, uuid, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_consistent(internal, uuid, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_consistent(internal, uuid, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_consistent(internal, uuid, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_consistent(internal, uuid, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_var_decompress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_var_decompress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_var_decompress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_var_decompress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_var_decompress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_var_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_var_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_var_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_var_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_var_fetch(internal) TO service_role; - - --- --- Name: FUNCTION get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) TO postgres; -GRANT ALL ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) TO anon; -GRANT ALL ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) TO authenticated; -GRANT ALL ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) TO service_role; - - --- --- Name: FUNCTION get_financial_summary(p_owner_id uuid, p_year integer, p_month integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) TO postgres; -GRANT ALL ON FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) TO anon; -GRANT ALL ON FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) TO authenticated; -GRANT ALL ON FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) TO service_role; - - --- --- Name: FUNCTION get_my_email(); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.get_my_email() FROM PUBLIC; -GRANT ALL ON FUNCTION public.get_my_email() TO postgres; -GRANT ALL ON FUNCTION public.get_my_email() TO anon; -GRANT ALL ON FUNCTION public.get_my_email() TO authenticated; -GRANT ALL ON FUNCTION public.get_my_email() TO service_role; - - --- --- Name: FUNCTION gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gin_extract_value_trgm(text, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gin_extract_value_trgm(text, internal) TO postgres; -GRANT ALL ON FUNCTION public.gin_extract_value_trgm(text, internal) TO anon; -GRANT ALL ON FUNCTION public.gin_extract_value_trgm(text, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gin_extract_value_trgm(text, internal) TO service_role; - - --- --- Name: FUNCTION gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_compress(internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_consistent(internal, text, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_consistent(internal, text, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_consistent(internal, text, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_consistent(internal, text, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_consistent(internal, text, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_decompress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_decompress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_decompress(internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_decompress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_decompress(internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_distance(internal, text, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_distance(internal, text, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_distance(internal, text, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_distance(internal, text, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_distance(internal, text, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_options(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_options(internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_options(internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_options(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_options(internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_same(public.gtrgm, public.gtrgm, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_same(public.gtrgm, public.gtrgm, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_same(public.gtrgm, public.gtrgm, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_same(public.gtrgm, public.gtrgm, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_same(public.gtrgm, public.gtrgm, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION guard_account_type_immutable(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_account_type_immutable() TO postgres; -GRANT ALL ON FUNCTION public.guard_account_type_immutable() TO anon; -GRANT ALL ON FUNCTION public.guard_account_type_immutable() TO authenticated; -GRANT ALL ON FUNCTION public.guard_account_type_immutable() TO service_role; - - --- --- Name: FUNCTION guard_locked_commitment(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_locked_commitment() TO postgres; -GRANT ALL ON FUNCTION public.guard_locked_commitment() TO anon; -GRANT ALL ON FUNCTION public.guard_locked_commitment() TO authenticated; -GRANT ALL ON FUNCTION public.guard_locked_commitment() TO service_role; - - --- --- Name: FUNCTION guard_no_change_core_plan_key(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_no_change_core_plan_key() TO postgres; -GRANT ALL ON FUNCTION public.guard_no_change_core_plan_key() TO anon; -GRANT ALL ON FUNCTION public.guard_no_change_core_plan_key() TO authenticated; -GRANT ALL ON FUNCTION public.guard_no_change_core_plan_key() TO service_role; - - --- --- Name: FUNCTION guard_no_change_plan_target(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_no_change_plan_target() TO postgres; -GRANT ALL ON FUNCTION public.guard_no_change_plan_target() TO anon; -GRANT ALL ON FUNCTION public.guard_no_change_plan_target() TO authenticated; -GRANT ALL ON FUNCTION public.guard_no_change_plan_target() TO service_role; - - --- --- Name: FUNCTION guard_no_delete_core_plans(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_no_delete_core_plans() TO postgres; -GRANT ALL ON FUNCTION public.guard_no_delete_core_plans() TO anon; -GRANT ALL ON FUNCTION public.guard_no_delete_core_plans() TO authenticated; -GRANT ALL ON FUNCTION public.guard_no_delete_core_plans() TO service_role; - - --- --- Name: FUNCTION guard_patient_cannot_own_tenant(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_patient_cannot_own_tenant() TO postgres; -GRANT ALL ON FUNCTION public.guard_patient_cannot_own_tenant() TO anon; -GRANT ALL ON FUNCTION public.guard_patient_cannot_own_tenant() TO authenticated; -GRANT ALL ON FUNCTION public.guard_patient_cannot_own_tenant() TO service_role; - - --- --- Name: FUNCTION guard_tenant_kind_immutable(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_tenant_kind_immutable() TO postgres; -GRANT ALL ON FUNCTION public.guard_tenant_kind_immutable() TO anon; -GRANT ALL ON FUNCTION public.guard_tenant_kind_immutable() TO authenticated; -GRANT ALL ON FUNCTION public.guard_tenant_kind_immutable() TO service_role; - - --- --- Name: FUNCTION handle_new_user(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.handle_new_user() TO postgres; -GRANT ALL ON FUNCTION public.handle_new_user() TO anon; -GRANT ALL ON FUNCTION public.handle_new_user() TO authenticated; -GRANT ALL ON FUNCTION public.handle_new_user() TO service_role; - - --- --- Name: FUNCTION handle_new_user_create_personal_tenant(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.handle_new_user_create_personal_tenant() TO postgres; -GRANT ALL ON FUNCTION public.handle_new_user_create_personal_tenant() TO anon; -GRANT ALL ON FUNCTION public.handle_new_user_create_personal_tenant() TO authenticated; -GRANT ALL ON FUNCTION public.handle_new_user_create_personal_tenant() TO service_role; - - --- --- Name: FUNCTION has_feature(p_owner_id uuid, p_feature_key text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) TO postgres; -GRANT ALL ON FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) TO anon; -GRANT ALL ON FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) TO authenticated; -GRANT ALL ON FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) TO service_role; - - --- --- Name: FUNCTION int2_dist(smallint, smallint); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.int2_dist(smallint, smallint) TO postgres; -GRANT ALL ON FUNCTION public.int2_dist(smallint, smallint) TO anon; -GRANT ALL ON FUNCTION public.int2_dist(smallint, smallint) TO authenticated; -GRANT ALL ON FUNCTION public.int2_dist(smallint, smallint) TO service_role; - - --- --- Name: FUNCTION int4_dist(integer, integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.int4_dist(integer, integer) TO postgres; -GRANT ALL ON FUNCTION public.int4_dist(integer, integer) TO anon; -GRANT ALL ON FUNCTION public.int4_dist(integer, integer) TO authenticated; -GRANT ALL ON FUNCTION public.int4_dist(integer, integer) TO service_role; - - --- --- Name: FUNCTION int8_dist(bigint, bigint); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.int8_dist(bigint, bigint) TO postgres; -GRANT ALL ON FUNCTION public.int8_dist(bigint, bigint) TO anon; -GRANT ALL ON FUNCTION public.int8_dist(bigint, bigint) TO authenticated; -GRANT ALL ON FUNCTION public.int8_dist(bigint, bigint) TO service_role; - - --- --- Name: FUNCTION interval_dist(interval, interval); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.interval_dist(interval, interval) TO postgres; -GRANT ALL ON FUNCTION public.interval_dist(interval, interval) TO anon; -GRANT ALL ON FUNCTION public.interval_dist(interval, interval) TO authenticated; -GRANT ALL ON FUNCTION public.interval_dist(interval, interval) TO service_role; - - --- --- Name: FUNCTION is_clinic_tenant(_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_clinic_tenant(_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.is_clinic_tenant(_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.is_clinic_tenant(_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.is_clinic_tenant(_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION is_saas_admin(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_saas_admin() TO postgres; -GRANT ALL ON FUNCTION public.is_saas_admin() TO anon; -GRANT ALL ON FUNCTION public.is_saas_admin() TO authenticated; -GRANT ALL ON FUNCTION public.is_saas_admin() TO service_role; - - --- --- Name: FUNCTION is_tenant_admin(p_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_tenant_admin(p_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.is_tenant_admin(p_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.is_tenant_admin(p_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.is_tenant_admin(p_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION is_tenant_member(_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_tenant_member(_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.is_tenant_member(_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.is_tenant_member(_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.is_tenant_member(_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION is_therapist_tenant(_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_therapist_tenant(_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.is_therapist_tenant(_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.is_therapist_tenant(_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.is_therapist_tenant(_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION jwt_email(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.jwt_email() TO postgres; -GRANT ALL ON FUNCTION public.jwt_email() TO anon; -GRANT ALL ON FUNCTION public.jwt_email() TO authenticated; -GRANT ALL ON FUNCTION public.jwt_email() TO service_role; - - --- --- Name: FUNCTION list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) TO postgres; -GRANT ALL ON FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) TO anon; -GRANT ALL ON FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) TO authenticated; -GRANT ALL ON FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) TO service_role; - - --- --- Name: FUNCTION mark_as_paid(p_financial_record_id uuid, p_payment_method text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) TO postgres; -GRANT ALL ON FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) TO anon; -GRANT ALL ON FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) TO authenticated; -GRANT ALL ON FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) TO service_role; - - --- --- Name: FUNCTION mark_payout_as_paid(p_payout_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) TO anon; -GRANT ALL ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) TO service_role; - - --- --- Name: FUNCTION my_tenants(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.my_tenants() TO postgres; -GRANT ALL ON FUNCTION public.my_tenants() TO anon; -GRANT ALL ON FUNCTION public.my_tenants() TO authenticated; -GRANT ALL ON FUNCTION public.my_tenants() TO service_role; - - --- --- Name: FUNCTION notice_track_click(p_notice_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notice_track_click(p_notice_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.notice_track_click(p_notice_id uuid) TO anon; -GRANT ALL ON FUNCTION public.notice_track_click(p_notice_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.notice_track_click(p_notice_id uuid) TO service_role; - - --- --- Name: FUNCTION notice_track_view(p_notice_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notice_track_view(p_notice_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.notice_track_view(p_notice_id uuid) TO anon; -GRANT ALL ON FUNCTION public.notice_track_view(p_notice_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.notice_track_view(p_notice_id uuid) TO service_role; - - --- --- Name: FUNCTION notify_on_intake(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notify_on_intake() TO postgres; -GRANT ALL ON FUNCTION public.notify_on_intake() TO anon; -GRANT ALL ON FUNCTION public.notify_on_intake() TO authenticated; -GRANT ALL ON FUNCTION public.notify_on_intake() TO service_role; - - --- --- Name: FUNCTION notify_on_scheduling(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notify_on_scheduling() TO postgres; -GRANT ALL ON FUNCTION public.notify_on_scheduling() TO anon; -GRANT ALL ON FUNCTION public.notify_on_scheduling() TO authenticated; -GRANT ALL ON FUNCTION public.notify_on_scheduling() TO service_role; - - --- --- Name: FUNCTION notify_on_session_status(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notify_on_session_status() TO postgres; -GRANT ALL ON FUNCTION public.notify_on_session_status() TO anon; -GRANT ALL ON FUNCTION public.notify_on_session_status() TO authenticated; -GRANT ALL ON FUNCTION public.notify_on_session_status() TO service_role; - - --- --- Name: FUNCTION oid_dist(oid, oid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.oid_dist(oid, oid) TO postgres; -GRANT ALL ON FUNCTION public.oid_dist(oid, oid) TO anon; -GRANT ALL ON FUNCTION public.oid_dist(oid, oid) TO authenticated; -GRANT ALL ON FUNCTION public.oid_dist(oid, oid) TO service_role; - - --- --- Name: FUNCTION on_new_user_seed_patient_groups(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.on_new_user_seed_patient_groups() TO postgres; -GRANT ALL ON FUNCTION public.on_new_user_seed_patient_groups() TO anon; -GRANT ALL ON FUNCTION public.on_new_user_seed_patient_groups() TO authenticated; -GRANT ALL ON FUNCTION public.on_new_user_seed_patient_groups() TO service_role; - - --- --- Name: FUNCTION patients_validate_member_consistency(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.patients_validate_member_consistency() TO postgres; -GRANT ALL ON FUNCTION public.patients_validate_member_consistency() TO anon; -GRANT ALL ON FUNCTION public.patients_validate_member_consistency() TO authenticated; -GRANT ALL ON FUNCTION public.patients_validate_member_consistency() TO service_role; - - --- --- Name: FUNCTION patients_validate_responsible_member_tenant(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.patients_validate_responsible_member_tenant() TO postgres; -GRANT ALL ON FUNCTION public.patients_validate_responsible_member_tenant() TO anon; -GRANT ALL ON FUNCTION public.patients_validate_responsible_member_tenant() TO authenticated; -GRANT ALL ON FUNCTION public.patients_validate_responsible_member_tenant() TO service_role; - - --- --- Name: FUNCTION populate_notification_queue(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.populate_notification_queue() TO postgres; -GRANT ALL ON FUNCTION public.populate_notification_queue() TO anon; -GRANT ALL ON FUNCTION public.populate_notification_queue() TO authenticated; -GRANT ALL ON FUNCTION public.populate_notification_queue() TO service_role; - - --- --- Name: FUNCTION prevent_promoting_to_system(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.prevent_promoting_to_system() TO postgres; -GRANT ALL ON FUNCTION public.prevent_promoting_to_system() TO anon; -GRANT ALL ON FUNCTION public.prevent_promoting_to_system() TO authenticated; -GRANT ALL ON FUNCTION public.prevent_promoting_to_system() TO service_role; - - --- --- Name: FUNCTION prevent_saas_membership(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.prevent_saas_membership() TO postgres; -GRANT ALL ON FUNCTION public.prevent_saas_membership() TO anon; -GRANT ALL ON FUNCTION public.prevent_saas_membership() TO authenticated; -GRANT ALL ON FUNCTION public.prevent_saas_membership() TO service_role; - - --- --- Name: FUNCTION prevent_system_group_changes(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.prevent_system_group_changes() TO postgres; -GRANT ALL ON FUNCTION public.prevent_system_group_changes() TO anon; -GRANT ALL ON FUNCTION public.prevent_system_group_changes() TO authenticated; -GRANT ALL ON FUNCTION public.prevent_system_group_changes() TO service_role; - - --- --- Name: FUNCTION provision_account_tenant(p_user_id uuid, p_kind text, p_name text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) TO postgres; -GRANT ALL ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) TO anon; -GRANT ALL ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) TO authenticated; -GRANT ALL ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) TO service_role; - - --- --- Name: FUNCTION reactivate_subscription(p_subscription_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.reactivate_subscription(p_subscription_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.reactivate_subscription(p_subscription_id uuid) TO anon; -GRANT ALL ON FUNCTION public.reactivate_subscription(p_subscription_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.reactivate_subscription(p_subscription_id uuid) TO service_role; - - --- --- Name: FUNCTION rebuild_owner_entitlements(p_owner_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) TO anon; -GRANT ALL ON FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) TO service_role; - - --- --- Name: FUNCTION regexp_match(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION regexp_match(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION regexp_matches(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION regexp_matches(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION regexp_replace(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION regexp_replace(public.citext, public.citext, text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text, text) TO service_role; - - --- --- Name: FUNCTION regexp_split_to_array(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION regexp_split_to_array(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION regexp_split_to_table(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION regexp_split_to_table(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION replace(public.citext, public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.replace(public.citext, public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.replace(public.citext, public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.replace(public.citext, public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.replace(public.citext, public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION revoke_support_session(p_token text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.revoke_support_session(p_token text) TO postgres; -GRANT ALL ON FUNCTION public.revoke_support_session(p_token text) TO anon; -GRANT ALL ON FUNCTION public.revoke_support_session(p_token text) TO authenticated; -GRANT ALL ON FUNCTION public.revoke_support_session(p_token text) TO service_role; - - --- --- Name: FUNCTION rotate_patient_invite_token(p_new_token text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.rotate_patient_invite_token(p_new_token text) TO postgres; -GRANT ALL ON FUNCTION public.rotate_patient_invite_token(p_new_token text) TO anon; -GRANT ALL ON FUNCTION public.rotate_patient_invite_token(p_new_token text) TO authenticated; -GRANT ALL ON FUNCTION public.rotate_patient_invite_token(p_new_token text) TO service_role; - - --- --- Name: FUNCTION saas_votar_doc(p_doc_id uuid, p_util boolean); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) TO postgres; -GRANT ALL ON FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) TO anon; -GRANT ALL ON FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) TO authenticated; -GRANT ALL ON FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) TO service_role; - - --- --- Name: FUNCTION safe_delete_patient(p_patient_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.safe_delete_patient(p_patient_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.safe_delete_patient(p_patient_id uuid) TO anon; -GRANT ALL ON FUNCTION public.safe_delete_patient(p_patient_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.safe_delete_patient(p_patient_id uuid) TO service_role; - - --- --- Name: FUNCTION sanitize_phone_br(raw_phone text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.sanitize_phone_br(raw_phone text) TO postgres; -GRANT ALL ON FUNCTION public.sanitize_phone_br(raw_phone text) TO anon; -GRANT ALL ON FUNCTION public.sanitize_phone_br(raw_phone text) TO authenticated; -GRANT ALL ON FUNCTION public.sanitize_phone_br(raw_phone text) TO service_role; - - --- --- Name: FUNCTION seed_default_financial_categories(p_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.seed_default_financial_categories(p_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.seed_default_financial_categories(p_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.seed_default_financial_categories(p_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.seed_default_financial_categories(p_user_id uuid) TO service_role; - - --- --- Name: FUNCTION seed_determined_commitments(p_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.seed_determined_commitments(p_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.seed_determined_commitments(p_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.seed_determined_commitments(p_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.seed_determined_commitments(p_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION set_insurance_plans_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_insurance_plans_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.set_insurance_plans_updated_at() TO anon; -GRANT ALL ON FUNCTION public.set_insurance_plans_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.set_insurance_plans_updated_at() TO service_role; - - --- --- Name: FUNCTION set_limit(real); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_limit(real) TO postgres; -GRANT ALL ON FUNCTION public.set_limit(real) TO anon; -GRANT ALL ON FUNCTION public.set_limit(real) TO authenticated; -GRANT ALL ON FUNCTION public.set_limit(real) TO service_role; - - --- --- Name: FUNCTION set_owner_id(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_owner_id() TO postgres; -GRANT ALL ON FUNCTION public.set_owner_id() TO anon; -GRANT ALL ON FUNCTION public.set_owner_id() TO authenticated; -GRANT ALL ON FUNCTION public.set_owner_id() TO service_role; - - --- --- Name: FUNCTION set_services_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_services_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.set_services_updated_at() TO anon; -GRANT ALL ON FUNCTION public.set_services_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.set_services_updated_at() TO service_role; - - --- --- Name: FUNCTION set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) TO postgres; -GRANT ALL ON FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) TO anon; -GRANT ALL ON FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) TO authenticated; -GRANT ALL ON FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) TO service_role; - - --- --- Name: FUNCTION set_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.set_updated_at() TO anon; -GRANT ALL ON FUNCTION public.set_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.set_updated_at() TO service_role; - - --- --- Name: FUNCTION set_updated_at_recurrence(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_updated_at_recurrence() TO postgres; -GRANT ALL ON FUNCTION public.set_updated_at_recurrence() TO anon; -GRANT ALL ON FUNCTION public.set_updated_at_recurrence() TO authenticated; -GRANT ALL ON FUNCTION public.set_updated_at_recurrence() TO service_role; - - --- --- Name: FUNCTION show_limit(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.show_limit() TO postgres; -GRANT ALL ON FUNCTION public.show_limit() TO anon; -GRANT ALL ON FUNCTION public.show_limit() TO authenticated; -GRANT ALL ON FUNCTION public.show_limit() TO service_role; - - --- --- Name: FUNCTION show_trgm(text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.show_trgm(text) TO postgres; -GRANT ALL ON FUNCTION public.show_trgm(text) TO anon; -GRANT ALL ON FUNCTION public.show_trgm(text) TO authenticated; -GRANT ALL ON FUNCTION public.show_trgm(text) TO service_role; - - --- --- Name: FUNCTION similarity(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.similarity(text, text) TO postgres; -GRANT ALL ON FUNCTION public.similarity(text, text) TO anon; -GRANT ALL ON FUNCTION public.similarity(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.similarity(text, text) TO service_role; - - --- --- Name: FUNCTION similarity_dist(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.similarity_dist(text, text) TO postgres; -GRANT ALL ON FUNCTION public.similarity_dist(text, text) TO anon; -GRANT ALL ON FUNCTION public.similarity_dist(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.similarity_dist(text, text) TO service_role; - - --- --- Name: FUNCTION similarity_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.similarity_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.similarity_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.similarity_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.similarity_op(text, text) TO service_role; - - --- --- Name: FUNCTION split_part(public.citext, public.citext, integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.split_part(public.citext, public.citext, integer) TO postgres; -GRANT ALL ON FUNCTION public.split_part(public.citext, public.citext, integer) TO anon; -GRANT ALL ON FUNCTION public.split_part(public.citext, public.citext, integer) TO authenticated; -GRANT ALL ON FUNCTION public.split_part(public.citext, public.citext, integer) TO service_role; - - --- --- Name: FUNCTION split_recurrence_at(p_recurrence_id uuid, p_from_date date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) TO postgres; -GRANT ALL ON FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) TO anon; -GRANT ALL ON FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) TO authenticated; -GRANT ALL ON FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity(text, text) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity_commutator_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity_commutator_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity_commutator_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity_commutator_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity_commutator_op(text, text) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity_dist_commutator_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_commutator_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_commutator_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_commutator_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_commutator_op(text, text) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity_dist_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_op(text, text) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity_op(text, text) TO service_role; - - --- --- Name: FUNCTION strpos(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strpos(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.strpos(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.strpos(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.strpos(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION subscription_intents_view_insert(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.subscription_intents_view_insert() TO postgres; -GRANT ALL ON FUNCTION public.subscription_intents_view_insert() TO anon; -GRANT ALL ON FUNCTION public.subscription_intents_view_insert() TO authenticated; -GRANT ALL ON FUNCTION public.subscription_intents_view_insert() TO service_role; - - --- --- Name: FUNCTION subscriptions_validate_scope(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.subscriptions_validate_scope() TO postgres; -GRANT ALL ON FUNCTION public.subscriptions_validate_scope() TO anon; -GRANT ALL ON FUNCTION public.subscriptions_validate_scope() TO authenticated; -GRANT ALL ON FUNCTION public.subscriptions_validate_scope() TO service_role; - - --- --- Name: FUNCTION sync_busy_mirror_agenda_eventos(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.sync_busy_mirror_agenda_eventos() TO postgres; -GRANT ALL ON FUNCTION public.sync_busy_mirror_agenda_eventos() TO anon; -GRANT ALL ON FUNCTION public.sync_busy_mirror_agenda_eventos() TO authenticated; -GRANT ALL ON FUNCTION public.sync_busy_mirror_agenda_eventos() TO service_role; - - --- --- Name: FUNCTION sync_overdue_financial_records(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.sync_overdue_financial_records() TO postgres; -GRANT ALL ON FUNCTION public.sync_overdue_financial_records() TO anon; -GRANT ALL ON FUNCTION public.sync_overdue_financial_records() TO authenticated; -GRANT ALL ON FUNCTION public.sync_overdue_financial_records() TO service_role; - - --- --- Name: FUNCTION tenant_accept_invite(p_token uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_accept_invite(p_token uuid) TO postgres; -GRANT ALL ON FUNCTION public.tenant_accept_invite(p_token uuid) TO anon; -GRANT ALL ON FUNCTION public.tenant_accept_invite(p_token uuid) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_accept_invite(p_token uuid) TO service_role; - - --- --- Name: TABLE tenant_members; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_members TO postgres; -GRANT SELECT,REFERENCES,TRIGGER,TRUNCATE,MAINTAIN ON TABLE public.tenant_members TO authenticated; -GRANT ALL ON TABLE public.tenant_members TO service_role; - - --- --- Name: FUNCTION tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO anon; -GRANT ALL ON FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO service_role; - - --- --- Name: FUNCTION tenant_feature_allowed(p_tenant_id uuid, p_feature_key text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) TO anon; -GRANT ALL ON FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) TO service_role; - - --- --- Name: FUNCTION tenant_feature_enabled(p_tenant_id uuid, p_feature_key text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) TO anon; -GRANT ALL ON FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) TO service_role; - - --- --- Name: FUNCTION tenant_features_guard_with_plan(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_features_guard_with_plan() TO postgres; -GRANT ALL ON FUNCTION public.tenant_features_guard_with_plan() TO anon; -GRANT ALL ON FUNCTION public.tenant_features_guard_with_plan() TO authenticated; -GRANT ALL ON FUNCTION public.tenant_features_guard_with_plan() TO service_role; - - --- --- Name: FUNCTION tenant_has_feature(_tenant_id uuid, _feature text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) TO anon; -GRANT ALL ON FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) TO service_role; - - --- --- Name: FUNCTION tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) FROM PUBLIC; -GRANT ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO anon; -GRANT ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO service_role; - - --- --- Name: FUNCTION tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) TO service_role; - - --- --- Name: FUNCTION tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) TO service_role; - - --- --- Name: FUNCTION tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) TO service_role; - - --- --- Name: FUNCTION tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) TO anon; -GRANT ALL ON FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) TO service_role; - - --- --- Name: FUNCTION tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) TO anon; -GRANT ALL ON FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) TO service_role; - - --- --- Name: FUNCTION tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) TO anon; -GRANT ALL ON FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) TO service_role; - - --- --- Name: FUNCTION texticlike(public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticlike(public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.texticlike(public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.texticlike(public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.texticlike(public.citext, text) TO service_role; - - --- --- Name: FUNCTION texticlike(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticlike(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.texticlike(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.texticlike(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.texticlike(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION texticnlike(public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticnlike(public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, text) TO service_role; - - --- --- Name: FUNCTION texticnlike(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticnlike(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION texticregexeq(public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, text) TO service_role; - - --- --- Name: FUNCTION texticregexeq(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION texticregexne(public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticregexne(public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, text) TO service_role; - - --- --- Name: FUNCTION texticregexne(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticregexne(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION time_dist(time without time zone, time without time zone); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.time_dist(time without time zone, time without time zone) TO postgres; -GRANT ALL ON FUNCTION public.time_dist(time without time zone, time without time zone) TO anon; -GRANT ALL ON FUNCTION public.time_dist(time without time zone, time without time zone) TO authenticated; -GRANT ALL ON FUNCTION public.time_dist(time without time zone, time without time zone) TO service_role; - - --- --- Name: FUNCTION toggle_plan(owner uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.toggle_plan(owner uuid) TO postgres; -GRANT ALL ON FUNCTION public.toggle_plan(owner uuid) TO anon; -GRANT ALL ON FUNCTION public.toggle_plan(owner uuid) TO authenticated; -GRANT ALL ON FUNCTION public.toggle_plan(owner uuid) TO service_role; - - --- --- Name: FUNCTION transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) TO postgres; -GRANT ALL ON FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) TO anon; -GRANT ALL ON FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) TO authenticated; -GRANT ALL ON FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) TO service_role; - - --- --- Name: FUNCTION translate(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.translate(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.translate(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.translate(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.translate(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION trg_fn_financial_records_auto_overdue(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.trg_fn_financial_records_auto_overdue() TO postgres; -GRANT ALL ON FUNCTION public.trg_fn_financial_records_auto_overdue() TO anon; -GRANT ALL ON FUNCTION public.trg_fn_financial_records_auto_overdue() TO authenticated; -GRANT ALL ON FUNCTION public.trg_fn_financial_records_auto_overdue() TO service_role; - - --- --- Name: FUNCTION ts_dist(timestamp without time zone, timestamp without time zone); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.ts_dist(timestamp without time zone, timestamp without time zone) TO postgres; -GRANT ALL ON FUNCTION public.ts_dist(timestamp without time zone, timestamp without time zone) TO anon; -GRANT ALL ON FUNCTION public.ts_dist(timestamp without time zone, timestamp without time zone) TO authenticated; -GRANT ALL ON FUNCTION public.ts_dist(timestamp without time zone, timestamp without time zone) TO service_role; - - --- --- Name: FUNCTION tstz_dist(timestamp with time zone, timestamp with time zone); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tstz_dist(timestamp with time zone, timestamp with time zone) TO postgres; -GRANT ALL ON FUNCTION public.tstz_dist(timestamp with time zone, timestamp with time zone) TO anon; -GRANT ALL ON FUNCTION public.tstz_dist(timestamp with time zone, timestamp with time zone) TO authenticated; -GRANT ALL ON FUNCTION public.tstz_dist(timestamp with time zone, timestamp with time zone) TO service_role; - - --- --- Name: FUNCTION unstick_notification_queue(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.unstick_notification_queue() TO postgres; -GRANT ALL ON FUNCTION public.unstick_notification_queue() TO anon; -GRANT ALL ON FUNCTION public.unstick_notification_queue() TO authenticated; -GRANT ALL ON FUNCTION public.unstick_notification_queue() TO service_role; - - --- --- Name: FUNCTION update_payment_settings_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.update_payment_settings_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.update_payment_settings_updated_at() TO anon; -GRANT ALL ON FUNCTION public.update_payment_settings_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.update_payment_settings_updated_at() TO service_role; - - --- --- Name: FUNCTION update_professional_pricing_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.update_professional_pricing_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.update_professional_pricing_updated_at() TO anon; -GRANT ALL ON FUNCTION public.update_professional_pricing_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.update_professional_pricing_updated_at() TO service_role; - - --- --- Name: FUNCTION user_has_feature(_user_id uuid, _feature text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.user_has_feature(_user_id uuid, _feature text) TO postgres; -GRANT ALL ON FUNCTION public.user_has_feature(_user_id uuid, _feature text) TO anon; -GRANT ALL ON FUNCTION public.user_has_feature(_user_id uuid, _feature text) TO authenticated; -GRANT ALL ON FUNCTION public.user_has_feature(_user_id uuid, _feature text) TO service_role; - - --- --- Name: FUNCTION validate_support_session(p_token text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.validate_support_session(p_token text) TO postgres; -GRANT ALL ON FUNCTION public.validate_support_session(p_token text) TO anon; -GRANT ALL ON FUNCTION public.validate_support_session(p_token text) TO authenticated; -GRANT ALL ON FUNCTION public.validate_support_session(p_token text) TO service_role; - - --- --- Name: FUNCTION whoami(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.whoami() TO postgres; -GRANT ALL ON FUNCTION public.whoami() TO anon; -GRANT ALL ON FUNCTION public.whoami() TO authenticated; -GRANT ALL ON FUNCTION public.whoami() TO service_role; - - --- --- Name: FUNCTION word_similarity(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity(text, text) TO service_role; - - --- --- Name: FUNCTION word_similarity_commutator_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity_commutator_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity_commutator_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity_commutator_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity_commutator_op(text, text) TO service_role; - - --- --- Name: FUNCTION word_similarity_dist_commutator_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity_dist_commutator_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity_dist_commutator_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity_dist_commutator_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity_dist_commutator_op(text, text) TO service_role; - - --- --- Name: FUNCTION word_similarity_dist_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity_dist_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity_dist_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity_dist_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity_dist_op(text, text) TO service_role; - - --- --- Name: FUNCTION word_similarity_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity_op(text, text) TO service_role; - - --- --- Name: FUNCTION apply_rls(wal jsonb, max_record_bytes integer); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO postgres; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO anon; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO authenticated; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO service_role; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO supabase_realtime_admin; - - --- --- Name: FUNCTION broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text) TO postgres; -GRANT ALL ON FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text) TO dashboard_user; - - --- --- Name: FUNCTION build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO postgres; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO anon; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO authenticated; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO service_role; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO supabase_realtime_admin; - - --- --- Name: FUNCTION "cast"(val text, type_ regtype); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO postgres; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO dashboard_user; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO anon; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO authenticated; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO service_role; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO supabase_realtime_admin; - - --- --- Name: FUNCTION check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO postgres; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO anon; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO authenticated; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO service_role; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO supabase_realtime_admin; - - --- --- Name: FUNCTION is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO postgres; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO anon; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO authenticated; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO service_role; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO supabase_realtime_admin; - - --- --- Name: FUNCTION list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO postgres; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO anon; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO authenticated; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO service_role; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO supabase_realtime_admin; - - --- --- Name: FUNCTION quote_wal2json(entity regclass); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO postgres; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO anon; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO authenticated; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO service_role; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO supabase_realtime_admin; - - --- --- Name: FUNCTION send(payload jsonb, event text, topic text, private boolean); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean) TO postgres; -GRANT ALL ON FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean) TO dashboard_user; - - --- --- Name: FUNCTION subscription_check_filters(); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO postgres; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO dashboard_user; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO anon; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO authenticated; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO service_role; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO supabase_realtime_admin; - - --- --- Name: FUNCTION to_regrole(role_name text); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO postgres; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO anon; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO authenticated; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO service_role; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO supabase_realtime_admin; - - --- --- Name: FUNCTION topic(); Type: ACL; Schema: realtime; Owner: supabase_realtime_admin --- - -GRANT ALL ON FUNCTION realtime.topic() TO postgres; -GRANT ALL ON FUNCTION realtime.topic() TO dashboard_user; - - --- --- Name: FUNCTION http_request(); Type: ACL; Schema: supabase_functions; Owner: supabase_functions_admin --- - -REVOKE ALL ON FUNCTION supabase_functions.http_request() FROM PUBLIC; -GRANT ALL ON FUNCTION supabase_functions.http_request() TO postgres; -GRANT ALL ON FUNCTION supabase_functions.http_request() TO anon; -GRANT ALL ON FUNCTION supabase_functions.http_request() TO authenticated; -GRANT ALL ON FUNCTION supabase_functions.http_request() TO service_role; - - --- --- Name: FUNCTION _crypto_aead_det_decrypt(message bytea, additional bytea, key_id bigint, context bytea, nonce bytea); Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION vault._crypto_aead_det_decrypt(message bytea, additional bytea, key_id bigint, context bytea, nonce bytea) TO postgres WITH GRANT OPTION; -GRANT ALL ON FUNCTION vault._crypto_aead_det_decrypt(message bytea, additional bytea, key_id bigint, context bytea, nonce bytea) TO service_role; - - --- --- Name: FUNCTION create_secret(new_secret text, new_name text, new_description text, new_key_id uuid); Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION vault.create_secret(new_secret text, new_name text, new_description text, new_key_id uuid) TO postgres WITH GRANT OPTION; -GRANT ALL ON FUNCTION vault.create_secret(new_secret text, new_name text, new_description text, new_key_id uuid) TO service_role; - - --- --- Name: FUNCTION update_secret(secret_id uuid, new_secret text, new_name text, new_description text, new_key_id uuid); Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION vault.update_secret(secret_id uuid, new_secret text, new_name text, new_description text, new_key_id uuid) TO postgres WITH GRANT OPTION; -GRANT ALL ON FUNCTION vault.update_secret(secret_id uuid, new_secret text, new_name text, new_description text, new_key_id uuid) TO service_role; - - --- --- Name: FUNCTION max(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.max(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.max(public.citext) TO anon; -GRANT ALL ON FUNCTION public.max(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.max(public.citext) TO service_role; - - --- --- Name: FUNCTION min(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.min(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.min(public.citext) TO anon; -GRANT ALL ON FUNCTION public.min(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.min(public.citext) TO service_role; - - --- --- Name: TABLE audit_log_entries; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.audit_log_entries TO dashboard_user; -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.audit_log_entries TO postgres; -GRANT SELECT ON TABLE auth.audit_log_entries TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE flow_state; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.flow_state TO postgres; -GRANT SELECT ON TABLE auth.flow_state TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.flow_state TO dashboard_user; - - --- --- Name: TABLE identities; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.identities TO postgres; -GRANT SELECT ON TABLE auth.identities TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.identities TO dashboard_user; - - --- --- Name: TABLE instances; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.instances TO dashboard_user; -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.instances TO postgres; -GRANT SELECT ON TABLE auth.instances TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE mfa_amr_claims; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.mfa_amr_claims TO postgres; -GRANT SELECT ON TABLE auth.mfa_amr_claims TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.mfa_amr_claims TO dashboard_user; - - --- --- Name: TABLE mfa_challenges; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.mfa_challenges TO postgres; -GRANT SELECT ON TABLE auth.mfa_challenges TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.mfa_challenges TO dashboard_user; - - --- --- Name: TABLE mfa_factors; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.mfa_factors TO postgres; -GRANT SELECT ON TABLE auth.mfa_factors TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.mfa_factors TO dashboard_user; - - --- --- Name: TABLE oauth_authorizations; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.oauth_authorizations TO postgres; -GRANT ALL ON TABLE auth.oauth_authorizations TO dashboard_user; - - --- --- Name: TABLE oauth_client_states; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.oauth_client_states TO postgres; -GRANT ALL ON TABLE auth.oauth_client_states TO dashboard_user; - - --- --- Name: TABLE oauth_clients; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.oauth_clients TO postgres; -GRANT ALL ON TABLE auth.oauth_clients TO dashboard_user; - - --- --- Name: TABLE oauth_consents; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.oauth_consents TO postgres; -GRANT ALL ON TABLE auth.oauth_consents TO dashboard_user; - - --- --- Name: TABLE one_time_tokens; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.one_time_tokens TO postgres; -GRANT SELECT ON TABLE auth.one_time_tokens TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.one_time_tokens TO dashboard_user; - - --- --- Name: TABLE refresh_tokens; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.refresh_tokens TO dashboard_user; -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.refresh_tokens TO postgres; -GRANT SELECT ON TABLE auth.refresh_tokens TO postgres WITH GRANT OPTION; - - --- --- Name: SEQUENCE refresh_tokens_id_seq; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON SEQUENCE auth.refresh_tokens_id_seq TO dashboard_user; -GRANT ALL ON SEQUENCE auth.refresh_tokens_id_seq TO postgres; - - --- --- Name: TABLE saml_providers; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.saml_providers TO postgres; -GRANT SELECT ON TABLE auth.saml_providers TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.saml_providers TO dashboard_user; - - --- --- Name: TABLE saml_relay_states; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.saml_relay_states TO postgres; -GRANT SELECT ON TABLE auth.saml_relay_states TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.saml_relay_states TO dashboard_user; - - --- --- Name: TABLE schema_migrations; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT SELECT ON TABLE auth.schema_migrations TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE sessions; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.sessions TO postgres; -GRANT SELECT ON TABLE auth.sessions TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.sessions TO dashboard_user; - - --- --- Name: TABLE sso_domains; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.sso_domains TO postgres; -GRANT SELECT ON TABLE auth.sso_domains TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.sso_domains TO dashboard_user; - - --- --- Name: TABLE sso_providers; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.sso_providers TO postgres; -GRANT SELECT ON TABLE auth.sso_providers TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.sso_providers TO dashboard_user; - - --- --- Name: TABLE users; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.users TO dashboard_user; -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.users TO postgres; -GRANT SELECT ON TABLE auth.users TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE job; Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT SELECT ON TABLE cron.job TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE job_run_details; Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON TABLE cron.job_run_details TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE pg_stat_statements; Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON TABLE extensions.pg_stat_statements TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE pg_stat_statements_info; Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON TABLE extensions.pg_stat_statements_info TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE addon_credits; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.addon_credits TO postgres; -GRANT ALL ON TABLE public.addon_credits TO anon; -GRANT ALL ON TABLE public.addon_credits TO authenticated; -GRANT ALL ON TABLE public.addon_credits TO service_role; - - --- --- Name: TABLE addon_products; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.addon_products TO postgres; -GRANT ALL ON TABLE public.addon_products TO anon; -GRANT ALL ON TABLE public.addon_products TO authenticated; -GRANT ALL ON TABLE public.addon_products TO service_role; - - --- --- Name: TABLE addon_transactions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.addon_transactions TO postgres; -GRANT ALL ON TABLE public.addon_transactions TO anon; -GRANT ALL ON TABLE public.addon_transactions TO authenticated; -GRANT ALL ON TABLE public.addon_transactions TO service_role; - - --- --- Name: TABLE agenda_bloqueios; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_bloqueios TO postgres; -GRANT ALL ON TABLE public.agenda_bloqueios TO anon; -GRANT ALL ON TABLE public.agenda_bloqueios TO authenticated; -GRANT ALL ON TABLE public.agenda_bloqueios TO service_role; - - --- --- Name: TABLE agenda_configuracoes; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_configuracoes TO postgres; -GRANT ALL ON TABLE public.agenda_configuracoes TO anon; -GRANT ALL ON TABLE public.agenda_configuracoes TO authenticated; -GRANT ALL ON TABLE public.agenda_configuracoes TO service_role; - - --- --- Name: TABLE agenda_eventos; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_eventos TO postgres; -GRANT ALL ON TABLE public.agenda_eventos TO anon; -GRANT ALL ON TABLE public.agenda_eventos TO authenticated; -GRANT ALL ON TABLE public.agenda_eventos TO service_role; - - --- --- Name: TABLE agenda_excecoes; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_excecoes TO postgres; -GRANT ALL ON TABLE public.agenda_excecoes TO anon; -GRANT ALL ON TABLE public.agenda_excecoes TO authenticated; -GRANT ALL ON TABLE public.agenda_excecoes TO service_role; - - --- --- Name: TABLE agenda_online_slots; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_online_slots TO postgres; -GRANT ALL ON TABLE public.agenda_online_slots TO anon; -GRANT ALL ON TABLE public.agenda_online_slots TO authenticated; -GRANT ALL ON TABLE public.agenda_online_slots TO service_role; - - --- --- Name: SEQUENCE agenda_online_slots_id_seq; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON SEQUENCE public.agenda_online_slots_id_seq TO postgres; -GRANT ALL ON SEQUENCE public.agenda_online_slots_id_seq TO anon; -GRANT ALL ON SEQUENCE public.agenda_online_slots_id_seq TO authenticated; -GRANT ALL ON SEQUENCE public.agenda_online_slots_id_seq TO service_role; - - --- --- Name: TABLE agenda_regras_semanais; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_regras_semanais TO postgres; -GRANT ALL ON TABLE public.agenda_regras_semanais TO anon; -GRANT ALL ON TABLE public.agenda_regras_semanais TO authenticated; -GRANT ALL ON TABLE public.agenda_regras_semanais TO service_role; - - --- --- Name: TABLE agenda_slots_bloqueados_semanais; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_slots_bloqueados_semanais TO postgres; -GRANT ALL ON TABLE public.agenda_slots_bloqueados_semanais TO anon; -GRANT ALL ON TABLE public.agenda_slots_bloqueados_semanais TO authenticated; -GRANT ALL ON TABLE public.agenda_slots_bloqueados_semanais TO service_role; - - --- --- Name: TABLE agenda_slots_regras; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_slots_regras TO postgres; -GRANT ALL ON TABLE public.agenda_slots_regras TO anon; -GRANT ALL ON TABLE public.agenda_slots_regras TO authenticated; -GRANT ALL ON TABLE public.agenda_slots_regras TO service_role; - - --- --- Name: TABLE agendador_configuracoes; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agendador_configuracoes TO postgres; -GRANT ALL ON TABLE public.agendador_configuracoes TO anon; -GRANT ALL ON TABLE public.agendador_configuracoes TO authenticated; -GRANT ALL ON TABLE public.agendador_configuracoes TO service_role; - - --- --- Name: TABLE agendador_solicitacoes; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agendador_solicitacoes TO postgres; -GRANT ALL ON TABLE public.agendador_solicitacoes TO anon; -GRANT ALL ON TABLE public.agendador_solicitacoes TO authenticated; -GRANT ALL ON TABLE public.agendador_solicitacoes TO service_role; - - --- --- Name: TABLE billing_contracts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.billing_contracts TO postgres; -GRANT ALL ON TABLE public.billing_contracts TO anon; -GRANT ALL ON TABLE public.billing_contracts TO authenticated; -GRANT ALL ON TABLE public.billing_contracts TO service_role; - - --- --- Name: TABLE commitment_services; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.commitment_services TO postgres; -GRANT ALL ON TABLE public.commitment_services TO anon; -GRANT ALL ON TABLE public.commitment_services TO authenticated; -GRANT ALL ON TABLE public.commitment_services TO service_role; - - --- --- Name: TABLE commitment_time_logs; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.commitment_time_logs TO postgres; -GRANT ALL ON TABLE public.commitment_time_logs TO anon; -GRANT ALL ON TABLE public.commitment_time_logs TO authenticated; -GRANT ALL ON TABLE public.commitment_time_logs TO service_role; - - --- --- Name: TABLE company_profiles; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.company_profiles TO postgres; -GRANT ALL ON TABLE public.company_profiles TO anon; -GRANT ALL ON TABLE public.company_profiles TO authenticated; -GRANT ALL ON TABLE public.company_profiles TO service_role; - - --- --- Name: TABLE current_tenant_id; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.current_tenant_id TO postgres; -GRANT ALL ON TABLE public.current_tenant_id TO anon; -GRANT ALL ON TABLE public.current_tenant_id TO authenticated; -GRANT ALL ON TABLE public.current_tenant_id TO service_role; - - --- --- Name: TABLE determined_commitment_fields; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.determined_commitment_fields TO postgres; -GRANT ALL ON TABLE public.determined_commitment_fields TO anon; -GRANT ALL ON TABLE public.determined_commitment_fields TO authenticated; -GRANT ALL ON TABLE public.determined_commitment_fields TO service_role; - - --- --- Name: TABLE determined_commitments; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.determined_commitments TO postgres; -GRANT ALL ON TABLE public.determined_commitments TO anon; -GRANT ALL ON TABLE public.determined_commitments TO authenticated; -GRANT ALL ON TABLE public.determined_commitments TO service_role; - - --- --- Name: TABLE dev_user_credentials; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.dev_user_credentials TO postgres; -GRANT ALL ON TABLE public.dev_user_credentials TO anon; -GRANT ALL ON TABLE public.dev_user_credentials TO authenticated; -GRANT ALL ON TABLE public.dev_user_credentials TO service_role; - - --- --- Name: TABLE email_layout_config; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.email_layout_config TO postgres; -GRANT ALL ON TABLE public.email_layout_config TO anon; -GRANT ALL ON TABLE public.email_layout_config TO authenticated; -GRANT ALL ON TABLE public.email_layout_config TO service_role; - - --- --- Name: TABLE email_templates_global; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.email_templates_global TO postgres; -GRANT ALL ON TABLE public.email_templates_global TO anon; -GRANT ALL ON TABLE public.email_templates_global TO authenticated; -GRANT ALL ON TABLE public.email_templates_global TO service_role; - - --- --- Name: TABLE email_templates_tenant; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.email_templates_tenant TO postgres; -GRANT ALL ON TABLE public.email_templates_tenant TO anon; -GRANT ALL ON TABLE public.email_templates_tenant TO authenticated; -GRANT ALL ON TABLE public.email_templates_tenant TO service_role; - - --- --- Name: TABLE entitlements_invalidation; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.entitlements_invalidation TO postgres; -GRANT ALL ON TABLE public.entitlements_invalidation TO anon; -GRANT ALL ON TABLE public.entitlements_invalidation TO authenticated; -GRANT ALL ON TABLE public.entitlements_invalidation TO service_role; - - --- --- Name: TABLE features; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.features TO postgres; -GRANT ALL ON TABLE public.features TO anon; -GRANT ALL ON TABLE public.features TO authenticated; -GRANT ALL ON TABLE public.features TO service_role; - - --- --- Name: TABLE feriados; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.feriados TO postgres; -GRANT ALL ON TABLE public.feriados TO anon; -GRANT ALL ON TABLE public.feriados TO authenticated; -GRANT ALL ON TABLE public.feriados TO service_role; - - --- --- Name: TABLE financial_categories; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.financial_categories TO postgres; -GRANT ALL ON TABLE public.financial_categories TO anon; -GRANT ALL ON TABLE public.financial_categories TO authenticated; -GRANT ALL ON TABLE public.financial_categories TO service_role; - - --- --- Name: TABLE financial_exceptions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.financial_exceptions TO postgres; -GRANT ALL ON TABLE public.financial_exceptions TO anon; -GRANT ALL ON TABLE public.financial_exceptions TO authenticated; -GRANT ALL ON TABLE public.financial_exceptions TO service_role; - - --- --- Name: TABLE global_notices; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.global_notices TO postgres; -GRANT ALL ON TABLE public.global_notices TO anon; -GRANT ALL ON TABLE public.global_notices TO authenticated; -GRANT ALL ON TABLE public.global_notices TO service_role; - - --- --- Name: TABLE insurance_plan_services; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.insurance_plan_services TO postgres; -GRANT ALL ON TABLE public.insurance_plan_services TO anon; -GRANT ALL ON TABLE public.insurance_plan_services TO authenticated; -GRANT ALL ON TABLE public.insurance_plan_services TO service_role; - - --- --- Name: TABLE insurance_plans; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.insurance_plans TO postgres; -GRANT ALL ON TABLE public.insurance_plans TO anon; -GRANT ALL ON TABLE public.insurance_plans TO authenticated; -GRANT ALL ON TABLE public.insurance_plans TO service_role; - - --- --- Name: TABLE login_carousel_slides; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.login_carousel_slides TO postgres; -GRANT ALL ON TABLE public.login_carousel_slides TO anon; -GRANT ALL ON TABLE public.login_carousel_slides TO authenticated; -GRANT ALL ON TABLE public.login_carousel_slides TO service_role; - - --- --- Name: TABLE module_features; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.module_features TO postgres; -GRANT ALL ON TABLE public.module_features TO anon; -GRANT ALL ON TABLE public.module_features TO authenticated; -GRANT ALL ON TABLE public.module_features TO service_role; - - --- --- Name: TABLE modules; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.modules TO postgres; -GRANT ALL ON TABLE public.modules TO anon; -GRANT ALL ON TABLE public.modules TO authenticated; -GRANT ALL ON TABLE public.modules TO service_role; - - --- --- Name: TABLE notice_dismissals; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notice_dismissals TO postgres; -GRANT ALL ON TABLE public.notice_dismissals TO anon; -GRANT ALL ON TABLE public.notice_dismissals TO authenticated; -GRANT ALL ON TABLE public.notice_dismissals TO service_role; - - --- --- Name: TABLE notification_channels; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_channels TO postgres; -GRANT ALL ON TABLE public.notification_channels TO anon; -GRANT ALL ON TABLE public.notification_channels TO authenticated; -GRANT ALL ON TABLE public.notification_channels TO service_role; - - --- --- Name: TABLE notification_logs; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_logs TO postgres; -GRANT ALL ON TABLE public.notification_logs TO anon; -GRANT ALL ON TABLE public.notification_logs TO authenticated; -GRANT ALL ON TABLE public.notification_logs TO service_role; - - --- --- Name: TABLE notification_preferences; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_preferences TO postgres; -GRANT ALL ON TABLE public.notification_preferences TO anon; -GRANT ALL ON TABLE public.notification_preferences TO authenticated; -GRANT ALL ON TABLE public.notification_preferences TO service_role; - - --- --- Name: TABLE notification_queue; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_queue TO postgres; -GRANT ALL ON TABLE public.notification_queue TO anon; -GRANT ALL ON TABLE public.notification_queue TO authenticated; -GRANT ALL ON TABLE public.notification_queue TO service_role; - - --- --- Name: TABLE notification_schedules; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_schedules TO postgres; -GRANT ALL ON TABLE public.notification_schedules TO anon; -GRANT ALL ON TABLE public.notification_schedules TO authenticated; -GRANT ALL ON TABLE public.notification_schedules TO service_role; - - --- --- Name: TABLE notification_templates; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_templates TO postgres; -GRANT ALL ON TABLE public.notification_templates TO anon; -GRANT ALL ON TABLE public.notification_templates TO authenticated; -GRANT ALL ON TABLE public.notification_templates TO service_role; - - --- --- Name: TABLE notifications; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notifications TO postgres; -GRANT ALL ON TABLE public.notifications TO anon; -GRANT ALL ON TABLE public.notifications TO authenticated; -GRANT ALL ON TABLE public.notifications TO service_role; - - --- --- Name: TABLE plan_features; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plan_features TO postgres; -GRANT ALL ON TABLE public.plan_features TO anon; -GRANT ALL ON TABLE public.plan_features TO authenticated; -GRANT ALL ON TABLE public.plan_features TO service_role; - - --- --- Name: TABLE tenant_modules; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_modules TO postgres; -GRANT ALL ON TABLE public.tenant_modules TO anon; -GRANT ALL ON TABLE public.tenant_modules TO authenticated; -GRANT ALL ON TABLE public.tenant_modules TO service_role; - - --- --- Name: TABLE owner_feature_entitlements; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.owner_feature_entitlements TO postgres; -GRANT ALL ON TABLE public.owner_feature_entitlements TO anon; -GRANT ALL ON TABLE public.owner_feature_entitlements TO authenticated; -GRANT ALL ON TABLE public.owner_feature_entitlements TO service_role; - - --- --- Name: TABLE owner_users; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.owner_users TO postgres; -GRANT ALL ON TABLE public.owner_users TO anon; -GRANT ALL ON TABLE public.owner_users TO authenticated; -GRANT ALL ON TABLE public.owner_users TO service_role; - - --- --- Name: TABLE patient_discounts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_discounts TO postgres; -GRANT ALL ON TABLE public.patient_discounts TO anon; -GRANT ALL ON TABLE public.patient_discounts TO authenticated; -GRANT ALL ON TABLE public.patient_discounts TO service_role; - - --- --- Name: TABLE patient_group_patient; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_group_patient TO postgres; -GRANT ALL ON TABLE public.patient_group_patient TO anon; -GRANT ALL ON TABLE public.patient_group_patient TO authenticated; -GRANT ALL ON TABLE public.patient_group_patient TO service_role; - - --- --- Name: TABLE patient_groups; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_groups TO postgres; -GRANT ALL ON TABLE public.patient_groups TO anon; -GRANT ALL ON TABLE public.patient_groups TO authenticated; -GRANT ALL ON TABLE public.patient_groups TO service_role; - - --- --- Name: TABLE patient_intake_requests; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_intake_requests TO postgres; -GRANT ALL ON TABLE public.patient_intake_requests TO authenticated; -GRANT ALL ON TABLE public.patient_intake_requests TO service_role; - - --- --- Name: TABLE patient_invites; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_invites TO postgres; -GRANT ALL ON TABLE public.patient_invites TO authenticated; -GRANT ALL ON TABLE public.patient_invites TO service_role; - - --- --- Name: TABLE patient_patient_tag; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_patient_tag TO postgres; -GRANT ALL ON TABLE public.patient_patient_tag TO anon; -GRANT ALL ON TABLE public.patient_patient_tag TO authenticated; -GRANT ALL ON TABLE public.patient_patient_tag TO service_role; - - --- --- Name: TABLE patient_tags; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_tags TO postgres; -GRANT ALL ON TABLE public.patient_tags TO anon; -GRANT ALL ON TABLE public.patient_tags TO authenticated; -GRANT ALL ON TABLE public.patient_tags TO service_role; - - --- --- Name: TABLE patients; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patients TO postgres; -GRANT ALL ON TABLE public.patients TO anon; -GRANT ALL ON TABLE public.patients TO authenticated; -GRANT ALL ON TABLE public.patients TO service_role; - - --- --- Name: TABLE payment_settings; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.payment_settings TO postgres; -GRANT ALL ON TABLE public.payment_settings TO anon; -GRANT ALL ON TABLE public.payment_settings TO authenticated; -GRANT ALL ON TABLE public.payment_settings TO service_role; - - --- --- Name: TABLE plan_prices; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plan_prices TO postgres; -GRANT ALL ON TABLE public.plan_prices TO anon; -GRANT ALL ON TABLE public.plan_prices TO authenticated; -GRANT ALL ON TABLE public.plan_prices TO service_role; - - --- --- Name: TABLE plan_public; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plan_public TO postgres; -GRANT ALL ON TABLE public.plan_public TO anon; -GRANT ALL ON TABLE public.plan_public TO authenticated; -GRANT ALL ON TABLE public.plan_public TO service_role; - - --- --- Name: TABLE plan_public_bullets; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plan_public_bullets TO postgres; -GRANT ALL ON TABLE public.plan_public_bullets TO anon; -GRANT ALL ON TABLE public.plan_public_bullets TO authenticated; -GRANT ALL ON TABLE public.plan_public_bullets TO service_role; - - --- --- Name: TABLE plans; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plans TO postgres; -GRANT ALL ON TABLE public.plans TO anon; -GRANT ALL ON TABLE public.plans TO authenticated; -GRANT ALL ON TABLE public.plans TO service_role; - - --- --- Name: TABLE professional_pricing; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.professional_pricing TO postgres; -GRANT ALL ON TABLE public.professional_pricing TO anon; -GRANT ALL ON TABLE public.professional_pricing TO authenticated; -GRANT ALL ON TABLE public.professional_pricing TO service_role; - - --- --- Name: TABLE profiles; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.profiles TO postgres; -GRANT ALL ON TABLE public.profiles TO anon; -GRANT ALL ON TABLE public.profiles TO authenticated; -GRANT ALL ON TABLE public.profiles TO service_role; - - --- --- Name: TABLE recurrence_exceptions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.recurrence_exceptions TO postgres; -GRANT ALL ON TABLE public.recurrence_exceptions TO anon; -GRANT ALL ON TABLE public.recurrence_exceptions TO authenticated; -GRANT ALL ON TABLE public.recurrence_exceptions TO service_role; - - --- --- Name: TABLE recurrence_rule_services; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.recurrence_rule_services TO postgres; -GRANT ALL ON TABLE public.recurrence_rule_services TO anon; -GRANT ALL ON TABLE public.recurrence_rule_services TO authenticated; -GRANT ALL ON TABLE public.recurrence_rule_services TO service_role; - - --- --- Name: TABLE recurrence_rules; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.recurrence_rules TO postgres; -GRANT ALL ON TABLE public.recurrence_rules TO anon; -GRANT ALL ON TABLE public.recurrence_rules TO authenticated; -GRANT ALL ON TABLE public.recurrence_rules TO service_role; - - --- --- Name: TABLE saas_admins; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_admins TO postgres; -GRANT ALL ON TABLE public.saas_admins TO anon; -GRANT ALL ON TABLE public.saas_admins TO authenticated; -GRANT ALL ON TABLE public.saas_admins TO service_role; - - --- --- Name: TABLE saas_doc_votos; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_doc_votos TO postgres; -GRANT ALL ON TABLE public.saas_doc_votos TO anon; -GRANT ALL ON TABLE public.saas_doc_votos TO authenticated; -GRANT ALL ON TABLE public.saas_doc_votos TO service_role; - - --- --- Name: TABLE saas_docs; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_docs TO postgres; -GRANT ALL ON TABLE public.saas_docs TO anon; -GRANT ALL ON TABLE public.saas_docs TO authenticated; -GRANT ALL ON TABLE public.saas_docs TO service_role; - - --- --- Name: TABLE saas_faq; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_faq TO postgres; -GRANT ALL ON TABLE public.saas_faq TO anon; -GRANT ALL ON TABLE public.saas_faq TO authenticated; -GRANT ALL ON TABLE public.saas_faq TO service_role; - - --- --- Name: TABLE saas_faq_itens; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_faq_itens TO postgres; -GRANT ALL ON TABLE public.saas_faq_itens TO anon; -GRANT ALL ON TABLE public.saas_faq_itens TO authenticated; -GRANT ALL ON TABLE public.saas_faq_itens TO service_role; - - --- --- Name: TABLE services; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.services TO postgres; -GRANT ALL ON TABLE public.services TO anon; -GRANT ALL ON TABLE public.services TO authenticated; -GRANT ALL ON TABLE public.services TO service_role; - - --- --- Name: TABLE subscription_events; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_events TO postgres; -GRANT ALL ON TABLE public.subscription_events TO anon; -GRANT ALL ON TABLE public.subscription_events TO authenticated; -GRANT ALL ON TABLE public.subscription_events TO service_role; - - --- --- Name: TABLE subscription_intents_personal; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_intents_personal TO postgres; -GRANT ALL ON TABLE public.subscription_intents_personal TO anon; -GRANT ALL ON TABLE public.subscription_intents_personal TO authenticated; -GRANT ALL ON TABLE public.subscription_intents_personal TO service_role; - - --- --- Name: TABLE subscription_intents_tenant; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_intents_tenant TO postgres; -GRANT ALL ON TABLE public.subscription_intents_tenant TO anon; -GRANT ALL ON TABLE public.subscription_intents_tenant TO authenticated; -GRANT ALL ON TABLE public.subscription_intents_tenant TO service_role; - - --- --- Name: TABLE subscription_intents; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_intents TO postgres; -GRANT ALL ON TABLE public.subscription_intents TO anon; -GRANT ALL ON TABLE public.subscription_intents TO authenticated; -GRANT ALL ON TABLE public.subscription_intents TO service_role; - - --- --- Name: TABLE subscription_intents_legacy; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_intents_legacy TO postgres; -GRANT ALL ON TABLE public.subscription_intents_legacy TO anon; -GRANT ALL ON TABLE public.subscription_intents_legacy TO authenticated; -GRANT ALL ON TABLE public.subscription_intents_legacy TO service_role; - - --- --- Name: TABLE support_sessions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.support_sessions TO postgres; -GRANT ALL ON TABLE public.support_sessions TO anon; -GRANT ALL ON TABLE public.support_sessions TO authenticated; -GRANT ALL ON TABLE public.support_sessions TO service_role; - - --- --- Name: TABLE tenant_feature_exceptions_log; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_feature_exceptions_log TO postgres; -GRANT ALL ON TABLE public.tenant_feature_exceptions_log TO anon; -GRANT ALL ON TABLE public.tenant_feature_exceptions_log TO authenticated; -GRANT ALL ON TABLE public.tenant_feature_exceptions_log TO service_role; - - --- --- Name: TABLE tenant_features; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_features TO postgres; -GRANT ALL ON TABLE public.tenant_features TO anon; -GRANT ALL ON TABLE public.tenant_features TO authenticated; -GRANT ALL ON TABLE public.tenant_features TO service_role; - - --- --- Name: TABLE tenant_invites; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_invites TO postgres; -GRANT ALL ON TABLE public.tenant_invites TO authenticated; -GRANT ALL ON TABLE public.tenant_invites TO service_role; - - --- --- Name: TABLE tenants; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenants TO postgres; -GRANT ALL ON TABLE public.tenants TO anon; -GRANT ALL ON TABLE public.tenants TO authenticated; -GRANT ALL ON TABLE public.tenants TO service_role; - - --- --- Name: TABLE therapist_payout_records; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.therapist_payout_records TO postgres; -GRANT ALL ON TABLE public.therapist_payout_records TO anon; -GRANT ALL ON TABLE public.therapist_payout_records TO authenticated; -GRANT ALL ON TABLE public.therapist_payout_records TO service_role; - - --- --- Name: TABLE user_settings; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.user_settings TO postgres; -GRANT ALL ON TABLE public.user_settings TO anon; -GRANT ALL ON TABLE public.user_settings TO authenticated; -GRANT ALL ON TABLE public.user_settings TO service_role; - - --- --- Name: TABLE v_auth_users_public; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_auth_users_public TO postgres; -GRANT ALL ON TABLE public.v_auth_users_public TO anon; -GRANT ALL ON TABLE public.v_auth_users_public TO authenticated; -GRANT ALL ON TABLE public.v_auth_users_public TO service_role; - - --- --- Name: TABLE v_cashflow_projection; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_cashflow_projection TO postgres; -GRANT ALL ON TABLE public.v_cashflow_projection TO anon; -GRANT ALL ON TABLE public.v_cashflow_projection TO authenticated; -GRANT ALL ON TABLE public.v_cashflow_projection TO service_role; - - --- --- Name: TABLE v_commitment_totals; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_commitment_totals TO postgres; -GRANT ALL ON TABLE public.v_commitment_totals TO anon; -GRANT ALL ON TABLE public.v_commitment_totals TO authenticated; -GRANT ALL ON TABLE public.v_commitment_totals TO service_role; - - --- --- Name: TABLE v_patient_groups_with_counts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_patient_groups_with_counts TO postgres; -GRANT ALL ON TABLE public.v_patient_groups_with_counts TO anon; -GRANT ALL ON TABLE public.v_patient_groups_with_counts TO authenticated; -GRANT ALL ON TABLE public.v_patient_groups_with_counts TO service_role; - - --- --- Name: TABLE v_plan_active_prices; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_plan_active_prices TO postgres; -GRANT ALL ON TABLE public.v_plan_active_prices TO anon; -GRANT ALL ON TABLE public.v_plan_active_prices TO authenticated; -GRANT ALL ON TABLE public.v_plan_active_prices TO service_role; - - --- --- Name: TABLE v_public_pricing; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_public_pricing TO postgres; -GRANT ALL ON TABLE public.v_public_pricing TO anon; -GRANT ALL ON TABLE public.v_public_pricing TO authenticated; -GRANT ALL ON TABLE public.v_public_pricing TO service_role; - - --- --- Name: TABLE v_subscription_feature_mismatch; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_subscription_feature_mismatch TO postgres; -GRANT ALL ON TABLE public.v_subscription_feature_mismatch TO anon; -GRANT ALL ON TABLE public.v_subscription_feature_mismatch TO authenticated; -GRANT ALL ON TABLE public.v_subscription_feature_mismatch TO service_role; - - --- --- Name: TABLE v_subscription_health; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_subscription_health TO postgres; -GRANT ALL ON TABLE public.v_subscription_health TO anon; -GRANT ALL ON TABLE public.v_subscription_health TO authenticated; -GRANT ALL ON TABLE public.v_subscription_health TO service_role; - - --- --- Name: TABLE v_subscription_health_v2; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_subscription_health_v2 TO postgres; -GRANT ALL ON TABLE public.v_subscription_health_v2 TO anon; -GRANT ALL ON TABLE public.v_subscription_health_v2 TO authenticated; -GRANT ALL ON TABLE public.v_subscription_health_v2 TO service_role; - - --- --- Name: TABLE v_tag_patient_counts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tag_patient_counts TO postgres; -GRANT ALL ON TABLE public.v_tag_patient_counts TO anon; -GRANT ALL ON TABLE public.v_tag_patient_counts TO authenticated; -GRANT ALL ON TABLE public.v_tag_patient_counts TO service_role; - - --- --- Name: TABLE v_tenant_active_subscription; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_active_subscription TO postgres; -GRANT ALL ON TABLE public.v_tenant_active_subscription TO anon; -GRANT ALL ON TABLE public.v_tenant_active_subscription TO authenticated; -GRANT ALL ON TABLE public.v_tenant_active_subscription TO service_role; - - --- --- Name: TABLE v_tenant_entitlements; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_entitlements TO postgres; -GRANT ALL ON TABLE public.v_tenant_entitlements TO anon; -GRANT ALL ON TABLE public.v_tenant_entitlements TO authenticated; -GRANT ALL ON TABLE public.v_tenant_entitlements TO service_role; - - --- --- Name: TABLE v_tenant_entitlements_full; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_entitlements_full TO postgres; -GRANT ALL ON TABLE public.v_tenant_entitlements_full TO anon; -GRANT ALL ON TABLE public.v_tenant_entitlements_full TO authenticated; -GRANT ALL ON TABLE public.v_tenant_entitlements_full TO service_role; - - --- --- Name: TABLE v_tenant_entitlements_json; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_entitlements_json TO postgres; -GRANT ALL ON TABLE public.v_tenant_entitlements_json TO anon; -GRANT ALL ON TABLE public.v_tenant_entitlements_json TO authenticated; -GRANT ALL ON TABLE public.v_tenant_entitlements_json TO service_role; - - --- --- Name: TABLE v_tenant_feature_exceptions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_feature_exceptions TO postgres; -GRANT ALL ON TABLE public.v_tenant_feature_exceptions TO anon; -GRANT ALL ON TABLE public.v_tenant_feature_exceptions TO authenticated; -GRANT ALL ON TABLE public.v_tenant_feature_exceptions TO service_role; - - --- --- Name: TABLE v_tenant_feature_mismatch; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_feature_mismatch TO postgres; -GRANT ALL ON TABLE public.v_tenant_feature_mismatch TO anon; -GRANT ALL ON TABLE public.v_tenant_feature_mismatch TO authenticated; -GRANT ALL ON TABLE public.v_tenant_feature_mismatch TO service_role; - - --- --- Name: TABLE v_tenant_members_with_profiles; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_members_with_profiles TO postgres; -GRANT ALL ON TABLE public.v_tenant_members_with_profiles TO anon; -GRANT ALL ON TABLE public.v_tenant_members_with_profiles TO authenticated; -GRANT ALL ON TABLE public.v_tenant_members_with_profiles TO service_role; - - --- --- Name: TABLE v_tenant_people; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_people TO postgres; -GRANT ALL ON TABLE public.v_tenant_people TO anon; -GRANT ALL ON TABLE public.v_tenant_people TO authenticated; -GRANT ALL ON TABLE public.v_tenant_people TO service_role; - - --- --- Name: TABLE v_tenant_staff; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_staff TO postgres; -GRANT ALL ON TABLE public.v_tenant_staff TO anon; -GRANT ALL ON TABLE public.v_tenant_staff TO authenticated; -GRANT ALL ON TABLE public.v_tenant_staff TO service_role; - - --- --- Name: TABLE v_user_active_subscription; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_user_active_subscription TO postgres; -GRANT ALL ON TABLE public.v_user_active_subscription TO anon; -GRANT ALL ON TABLE public.v_user_active_subscription TO authenticated; -GRANT ALL ON TABLE public.v_user_active_subscription TO service_role; - - --- --- Name: TABLE v_user_entitlements; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_user_entitlements TO postgres; -GRANT ALL ON TABLE public.v_user_entitlements TO anon; -GRANT ALL ON TABLE public.v_user_entitlements TO authenticated; -GRANT ALL ON TABLE public.v_user_entitlements TO service_role; - - --- --- Name: TABLE messages; Type: ACL; Schema: realtime; Owner: supabase_realtime_admin --- - -GRANT ALL ON TABLE realtime.messages TO postgres; -GRANT ALL ON TABLE realtime.messages TO dashboard_user; -GRANT SELECT,INSERT,UPDATE ON TABLE realtime.messages TO anon; -GRANT SELECT,INSERT,UPDATE ON TABLE realtime.messages TO authenticated; -GRANT SELECT,INSERT,UPDATE ON TABLE realtime.messages TO service_role; - - --- --- Name: TABLE messages_2026_03_20; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_20 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_20 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_21; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_21 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_21 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_22; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_22 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_22 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_23; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_23 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_23 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_24; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_24 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_24 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_25; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_25 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_25 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_26; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_26 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_26 TO dashboard_user; - - --- --- Name: TABLE schema_migrations; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.schema_migrations TO postgres; -GRANT ALL ON TABLE realtime.schema_migrations TO dashboard_user; -GRANT SELECT ON TABLE realtime.schema_migrations TO anon; -GRANT SELECT ON TABLE realtime.schema_migrations TO authenticated; -GRANT SELECT ON TABLE realtime.schema_migrations TO service_role; -GRANT ALL ON TABLE realtime.schema_migrations TO supabase_realtime_admin; - - --- --- Name: TABLE subscription; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.subscription TO postgres; -GRANT ALL ON TABLE realtime.subscription TO dashboard_user; -GRANT SELECT ON TABLE realtime.subscription TO anon; -GRANT SELECT ON TABLE realtime.subscription TO authenticated; -GRANT SELECT ON TABLE realtime.subscription TO service_role; -GRANT ALL ON TABLE realtime.subscription TO supabase_realtime_admin; - - --- --- Name: SEQUENCE subscription_id_seq; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON SEQUENCE realtime.subscription_id_seq TO postgres; -GRANT ALL ON SEQUENCE realtime.subscription_id_seq TO dashboard_user; -GRANT USAGE ON SEQUENCE realtime.subscription_id_seq TO anon; -GRANT USAGE ON SEQUENCE realtime.subscription_id_seq TO authenticated; -GRANT USAGE ON SEQUENCE realtime.subscription_id_seq TO service_role; -GRANT ALL ON SEQUENCE realtime.subscription_id_seq TO supabase_realtime_admin; - - --- --- Name: TABLE buckets; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.buckets TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE storage.buckets TO service_role; -GRANT ALL ON TABLE storage.buckets TO authenticated; -GRANT ALL ON TABLE storage.buckets TO anon; - - --- --- Name: TABLE buckets_analytics; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.buckets_analytics TO service_role; -GRANT ALL ON TABLE storage.buckets_analytics TO authenticated; -GRANT ALL ON TABLE storage.buckets_analytics TO anon; - - --- --- Name: TABLE buckets_vectors; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT SELECT ON TABLE storage.buckets_vectors TO service_role; -GRANT SELECT ON TABLE storage.buckets_vectors TO authenticated; -GRANT SELECT ON TABLE storage.buckets_vectors TO anon; - - --- --- Name: TABLE iceberg_namespaces; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.iceberg_namespaces TO service_role; -GRANT SELECT ON TABLE storage.iceberg_namespaces TO authenticated; -GRANT SELECT ON TABLE storage.iceberg_namespaces TO anon; - - --- --- Name: TABLE iceberg_tables; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.iceberg_tables TO service_role; -GRANT SELECT ON TABLE storage.iceberg_tables TO authenticated; -GRANT SELECT ON TABLE storage.iceberg_tables TO anon; - - --- --- Name: TABLE objects; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.objects TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE storage.objects TO service_role; -GRANT ALL ON TABLE storage.objects TO authenticated; -GRANT ALL ON TABLE storage.objects TO anon; - - --- --- Name: TABLE s3_multipart_uploads; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.s3_multipart_uploads TO service_role; -GRANT SELECT ON TABLE storage.s3_multipart_uploads TO authenticated; -GRANT SELECT ON TABLE storage.s3_multipart_uploads TO anon; - - --- --- Name: TABLE s3_multipart_uploads_parts; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.s3_multipart_uploads_parts TO service_role; -GRANT SELECT ON TABLE storage.s3_multipart_uploads_parts TO authenticated; -GRANT SELECT ON TABLE storage.s3_multipart_uploads_parts TO anon; - - --- --- Name: TABLE vector_indexes; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT SELECT ON TABLE storage.vector_indexes TO service_role; -GRANT SELECT ON TABLE storage.vector_indexes TO authenticated; -GRANT SELECT ON TABLE storage.vector_indexes TO anon; - - --- --- Name: TABLE hooks; Type: ACL; Schema: supabase_functions; Owner: supabase_functions_admin --- - -GRANT ALL ON TABLE supabase_functions.hooks TO postgres; -GRANT ALL ON TABLE supabase_functions.hooks TO anon; -GRANT ALL ON TABLE supabase_functions.hooks TO authenticated; -GRANT ALL ON TABLE supabase_functions.hooks TO service_role; - - --- --- Name: SEQUENCE hooks_id_seq; Type: ACL; Schema: supabase_functions; Owner: supabase_functions_admin --- - -GRANT ALL ON SEQUENCE supabase_functions.hooks_id_seq TO postgres; -GRANT ALL ON SEQUENCE supabase_functions.hooks_id_seq TO anon; -GRANT ALL ON SEQUENCE supabase_functions.hooks_id_seq TO authenticated; -GRANT ALL ON SEQUENCE supabase_functions.hooks_id_seq TO service_role; - - --- --- Name: TABLE migrations; Type: ACL; Schema: supabase_functions; Owner: supabase_functions_admin --- - -GRANT ALL ON TABLE supabase_functions.migrations TO postgres; -GRANT ALL ON TABLE supabase_functions.migrations TO anon; -GRANT ALL ON TABLE supabase_functions.migrations TO authenticated; -GRANT ALL ON TABLE supabase_functions.migrations TO service_role; - - --- --- Name: TABLE secrets; Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT SELECT,REFERENCES,DELETE,TRUNCATE ON TABLE vault.secrets TO postgres WITH GRANT OPTION; -GRANT SELECT,DELETE ON TABLE vault.secrets TO service_role; - - --- --- Name: TABLE decrypted_secrets; Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT SELECT,REFERENCES,DELETE,TRUNCATE ON TABLE vault.decrypted_secrets TO postgres WITH GRANT OPTION; -GRANT SELECT,DELETE ON TABLE vault.decrypted_secrets TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: auth; Owner: supabase_auth_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON SEQUENCES TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: auth; Owner: supabase_auth_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON FUNCTIONS TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: auth; Owner: supabase_auth_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON TABLES TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: cron; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA cron GRANT ALL ON SEQUENCES TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: cron; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA cron GRANT ALL ON FUNCTIONS TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: cron; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA cron GRANT ALL ON TABLES TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: extensions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA extensions GRANT ALL ON SEQUENCES TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: extensions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA extensions GRANT ALL ON FUNCTIONS TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: extensions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA extensions GRANT ALL ON TABLES TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: graphql; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: graphql; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: graphql; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: graphql_public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: graphql_public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: graphql_public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: realtime; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON SEQUENCES TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: realtime; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON FUNCTIONS TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: realtime; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON TABLES TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: storage; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: storage; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: storage; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: supabase_functions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: supabase_functions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: supabase_functions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON TABLES TO service_role; - - --- --- Name: issue_graphql_placeholder; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin +-- Name: issue_graphql_placeholder; Type: EVENT TRIGGER; Schema: -; Owner: - -- CREATE EVENT TRIGGER issue_graphql_placeholder ON sql_drop @@ -25994,10 +21334,8 @@ CREATE EVENT TRIGGER issue_graphql_placeholder ON sql_drop EXECUTE FUNCTION extensions.set_graphql_placeholder(); -ALTER EVENT TRIGGER issue_graphql_placeholder OWNER TO supabase_admin; - -- --- Name: issue_pg_cron_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin +-- Name: issue_pg_cron_access; Type: EVENT TRIGGER; Schema: -; Owner: - -- CREATE EVENT TRIGGER issue_pg_cron_access ON ddl_command_end @@ -26005,10 +21343,8 @@ CREATE EVENT TRIGGER issue_pg_cron_access ON ddl_command_end EXECUTE FUNCTION extensions.grant_pg_cron_access(); -ALTER EVENT TRIGGER issue_pg_cron_access OWNER TO supabase_admin; - -- --- Name: issue_pg_graphql_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin +-- Name: issue_pg_graphql_access; Type: EVENT TRIGGER; Schema: -; Owner: - -- CREATE EVENT TRIGGER issue_pg_graphql_access ON ddl_command_end @@ -26016,10 +21352,8 @@ CREATE EVENT TRIGGER issue_pg_graphql_access ON ddl_command_end EXECUTE FUNCTION extensions.grant_pg_graphql_access(); -ALTER EVENT TRIGGER issue_pg_graphql_access OWNER TO supabase_admin; - -- --- Name: issue_pg_net_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin +-- Name: issue_pg_net_access; Type: EVENT TRIGGER; Schema: -; Owner: - -- CREATE EVENT TRIGGER issue_pg_net_access ON ddl_command_end @@ -26027,31 +21361,25 @@ CREATE EVENT TRIGGER issue_pg_net_access ON ddl_command_end EXECUTE FUNCTION extensions.grant_pg_net_access(); -ALTER EVENT TRIGGER issue_pg_net_access OWNER TO supabase_admin; - -- --- Name: pgrst_ddl_watch; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin +-- Name: pgrst_ddl_watch; Type: EVENT TRIGGER; Schema: -; Owner: - -- CREATE EVENT TRIGGER pgrst_ddl_watch ON ddl_command_end EXECUTE FUNCTION extensions.pgrst_ddl_watch(); -ALTER EVENT TRIGGER pgrst_ddl_watch OWNER TO supabase_admin; - -- --- Name: pgrst_drop_watch; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin +-- Name: pgrst_drop_watch; Type: EVENT TRIGGER; Schema: -; Owner: - -- CREATE EVENT TRIGGER pgrst_drop_watch ON sql_drop EXECUTE FUNCTION extensions.pgrst_drop_watch(); -ALTER EVENT TRIGGER pgrst_drop_watch OWNER TO supabase_admin; - -- -- PostgreSQL database dump complete -- -\unrestrict ABfzP9IZJ8pAzvgt6E9jKpFn1phQ3b3Lgk09BZZTle5el6ODr77nIXlXnCf1PS1 +\unrestrict t3AqgfsPfrxKQ6xDOUZgLcwOmqGEQFr9QmWZe441K296WP9E1M31r17ZcywnfKW diff --git a/database-novo/schema/01_extensions/extensions.sql b/database-novo/schema/01_extensions/extensions.sql index 0816a7d..3274258 100644 --- a/database-novo/schema/01_extensions/extensions.sql +++ b/database-novo/schema/01_extensions/extensions.sql @@ -1,256 +1,14 @@ --- ============================================================================= --- AgenciaPsi — Extensions e Schemas --- Extraído de schema.sql (2026-03-23) --- ============================================================================= - --- --- PostgreSQL database dump --- - -\restrict ABfzP9IZJ8pAzvgt6E9jKpFn1phQ3b3Lgk09BZZTle5el6ODr77nIXlXnCf1PS1 - --- Dumped from database version 17.6 --- Dumped by pg_dump version 17.6 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET transaction_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SELECT pg_catalog.set_config('search_path', '', false); -SET check_function_bodies = false; -SET xmloption = content; -SET client_min_messages = warning; -SET row_security = off; - --- --- Name: _realtime; Type: SCHEMA; Schema: -; Owner: postgres --- - -CREATE SCHEMA _realtime; - - -ALTER SCHEMA _realtime OWNER TO postgres; - --- --- Name: auth; Type: SCHEMA; Schema: -; Owner: supabase_admin --- - -CREATE SCHEMA auth; - - -ALTER SCHEMA auth OWNER TO supabase_admin; - --- --- Name: pg_cron; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS pg_cron WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION pg_cron; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION pg_cron IS 'Job scheduler for PostgreSQL'; - - --- --- Name: extensions; Type: SCHEMA; Schema: -; Owner: postgres --- - -CREATE SCHEMA extensions; - - -ALTER SCHEMA extensions OWNER TO postgres; - --- --- Name: graphql; Type: SCHEMA; Schema: -; Owner: supabase_admin --- - -CREATE SCHEMA graphql; - - -ALTER SCHEMA graphql OWNER TO supabase_admin; - --- --- Name: graphql_public; Type: SCHEMA; Schema: -; Owner: supabase_admin --- - -CREATE SCHEMA graphql_public; - - -ALTER SCHEMA graphql_public OWNER TO supabase_admin; - --- --- Name: pg_net; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS pg_net WITH SCHEMA extensions; - - --- --- Name: EXTENSION pg_net; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION pg_net IS 'Async HTTP'; - - --- --- Name: pgbouncer; Type: SCHEMA; Schema: -; Owner: pgbouncer --- - -CREATE SCHEMA pgbouncer; - - -ALTER SCHEMA pgbouncer OWNER TO pgbouncer; - --- --- Name: realtime; Type: SCHEMA; Schema: -; Owner: supabase_admin --- - -CREATE SCHEMA realtime; - - -ALTER SCHEMA realtime OWNER TO supabase_admin; - --- --- Name: storage; Type: SCHEMA; Schema: -; Owner: supabase_admin --- - -CREATE SCHEMA storage; - - -ALTER SCHEMA storage OWNER TO supabase_admin; - --- --- Name: supabase_functions; Type: SCHEMA; Schema: -; Owner: supabase_admin --- - -CREATE SCHEMA supabase_functions; - - -ALTER SCHEMA supabase_functions OWNER TO supabase_admin; - --- --- Name: vault; Type: SCHEMA; Schema: -; Owner: supabase_admin --- - -CREATE SCHEMA vault; - - -ALTER SCHEMA vault OWNER TO supabase_admin; - --- --- Name: btree_gist; Type: EXTENSION; Schema: -; Owner: - --- +-- Extensions +-- Gerado automaticamente em 2026-04-17T12:23:04.148Z +-- Total: 10 CREATE EXTENSION IF NOT EXISTS btree_gist WITH SCHEMA public; - - --- --- Name: EXTENSION btree_gist; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION btree_gist IS 'support for indexing common datatypes in GiST'; - - --- --- Name: citext; Type: EXTENSION; Schema: -; Owner: - --- - CREATE EXTENSION IF NOT EXISTS citext WITH SCHEMA public; - - --- --- Name: EXTENSION citext; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION citext IS 'data type for case-insensitive character strings'; - - --- --- Name: pg_graphql; Type: EXTENSION; Schema: -; Owner: - --- - +CREATE EXTENSION IF NOT EXISTS pg_cron WITH SCHEMA pg_catalog; CREATE EXTENSION IF NOT EXISTS pg_graphql WITH SCHEMA graphql; - - --- --- Name: EXTENSION pg_graphql; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION pg_graphql IS 'pg_graphql: GraphQL support'; - - --- --- Name: pg_stat_statements; Type: EXTENSION; Schema: -; Owner: - --- - +CREATE EXTENSION IF NOT EXISTS pg_net WITH SCHEMA extensions; CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA extensions; - - --- --- Name: EXTENSION pg_stat_statements; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION pg_stat_statements IS 'track planning and execution statistics of all SQL statements executed'; - - --- --- Name: pg_trgm; Type: EXTENSION; Schema: -; Owner: - --- - CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public; - - --- --- Name: EXTENSION pg_trgm; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION pg_trgm IS 'text similarity measurement and index searching based on trigrams'; - - --- --- Name: pgcrypto; Type: EXTENSION; Schema: -; Owner: - --- - CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA extensions; - - --- --- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions'; - - --- --- Name: supabase_vault; Type: EXTENSION; Schema: -; Owner: - --- - CREATE EXTENSION IF NOT EXISTS supabase_vault WITH SCHEMA vault; - - --- --- Name: EXTENSION supabase_vault; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION supabase_vault IS 'Supabase Vault Extension'; - - --- --- Name: uuid-ossp; Type: EXTENSION; Schema: -; Owner: - --- - CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA extensions; - - --- --- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)'; - - diff --git a/database-novo/schema/02_types/auth_types.sql b/database-novo/schema/02_types/auth_types.sql deleted file mode 100644 index 2650239..0000000 --- a/database-novo/schema/02_types/auth_types.sql +++ /dev/null @@ -1,123 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Types (Enums) — auth schema --- ============================================================================= - --- --- Name: aal_level; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.aal_level AS ENUM ( - 'aal1', - 'aal2', - 'aal3' -); - - -ALTER TYPE auth.aal_level OWNER TO supabase_auth_admin; - --- --- Name: code_challenge_method; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.code_challenge_method AS ENUM ( - 's256', - 'plain' -); - - -ALTER TYPE auth.code_challenge_method OWNER TO supabase_auth_admin; - --- --- Name: factor_status; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.factor_status AS ENUM ( - 'unverified', - 'verified' -); - - -ALTER TYPE auth.factor_status OWNER TO supabase_auth_admin; - --- --- Name: factor_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.factor_type AS ENUM ( - 'totp', - 'webauthn', - 'phone' -); - - -ALTER TYPE auth.factor_type OWNER TO supabase_auth_admin; - --- --- Name: oauth_authorization_status; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.oauth_authorization_status AS ENUM ( - 'pending', - 'approved', - 'denied', - 'expired' -); - - -ALTER TYPE auth.oauth_authorization_status OWNER TO supabase_auth_admin; - --- --- Name: oauth_client_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.oauth_client_type AS ENUM ( - 'public', - 'confidential' -); - - -ALTER TYPE auth.oauth_client_type OWNER TO supabase_auth_admin; - --- --- Name: oauth_registration_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.oauth_registration_type AS ENUM ( - 'dynamic', - 'manual' -); - - -ALTER TYPE auth.oauth_registration_type OWNER TO supabase_auth_admin; - --- --- Name: oauth_response_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.oauth_response_type AS ENUM ( - 'code' -); - - -ALTER TYPE auth.oauth_response_type OWNER TO supabase_auth_admin; - --- --- Name: one_time_token_type; Type: TYPE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TYPE auth.one_time_token_type AS ENUM ( - 'confirmation_token', - 'reauthentication_token', - 'recovery_token', - 'email_change_token_new', - 'email_change_token_current', - 'phone_change_token' -); - - -ALTER TYPE auth.one_time_token_type OWNER TO supabase_auth_admin; - --- --- Name: commitment_log_source; Type: TYPE; Schema: public; Owner: supabase_admin --- - diff --git a/database-novo/schema/02_types/infra_types.sql b/database-novo/schema/02_types/infra_types.sql deleted file mode 100644 index 6239c17..0000000 --- a/database-novo/schema/02_types/infra_types.sql +++ /dev/null @@ -1,88 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Types — realtime + storage schemas --- ============================================================================= - -CREATE TYPE realtime.action AS ENUM ( - 'INSERT', - 'UPDATE', - 'DELETE', - 'TRUNCATE', - 'ERROR' -); - - -ALTER TYPE realtime.action OWNER TO supabase_admin; - --- --- Name: equality_op; Type: TYPE; Schema: realtime; Owner: supabase_admin --- - -CREATE TYPE realtime.equality_op AS ENUM ( - 'eq', - 'neq', - 'lt', - 'lte', - 'gt', - 'gte', - 'in' -); - - -ALTER TYPE realtime.equality_op OWNER TO supabase_admin; - --- --- Name: user_defined_filter; Type: TYPE; Schema: realtime; Owner: supabase_admin --- - -CREATE TYPE realtime.user_defined_filter AS ( - column_name text, - op realtime.equality_op, - value text -); - - -ALTER TYPE realtime.user_defined_filter OWNER TO supabase_admin; - --- --- Name: wal_column; Type: TYPE; Schema: realtime; Owner: supabase_admin --- - -CREATE TYPE realtime.wal_column AS ( - name text, - type_name text, - type_oid oid, - value jsonb, - is_pkey boolean, - is_selectable boolean -); - - -ALTER TYPE realtime.wal_column OWNER TO supabase_admin; - --- --- Name: wal_rls; Type: TYPE; Schema: realtime; Owner: supabase_admin --- - -CREATE TYPE realtime.wal_rls AS ( - wal jsonb, - is_rls_enabled boolean, - subscription_ids uuid[], - errors text[] -); - - -ALTER TYPE realtime.wal_rls OWNER TO supabase_admin; - --- --- Name: buckettype; Type: TYPE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TYPE storage.buckettype AS ENUM ( - 'STANDARD', - 'ANALYTICS', - 'VECTOR' -); - - -ALTER TYPE storage.buckettype OWNER TO supabase_storage_admin; - diff --git a/database-novo/schema/02_types/public_types.sql b/database-novo/schema/02_types/public_types.sql deleted file mode 100644 index 62acd16..0000000 --- a/database-novo/schema/02_types/public_types.sql +++ /dev/null @@ -1,137 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Types (Enums) — public schema --- ============================================================================= --- commitment_log_source, determined_field_type, financial_record_type, --- recurrence_exception_type, recurrence_type, status_agenda_serie, --- status_evento_agenda, status_excecao_agenda, tipo_evento_agenda, --- tipo_excecao_agenda --- ============================================================================= - -CREATE TYPE public.commitment_log_source AS ENUM ( - 'manual', - 'auto' -); - - -ALTER TYPE public.commitment_log_source OWNER TO supabase_admin; - --- --- Name: determined_field_type; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.determined_field_type AS ENUM ( - 'text', - 'textarea', - 'number', - 'date', - 'select', - 'boolean' -); - - -ALTER TYPE public.determined_field_type OWNER TO supabase_admin; - --- --- Name: financial_record_type; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.financial_record_type AS ENUM ( - 'receita', - 'despesa' -); - - -ALTER TYPE public.financial_record_type OWNER TO supabase_admin; - --- --- Name: recurrence_exception_type; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.recurrence_exception_type AS ENUM ( - 'cancel_session', - 'reschedule_session', - 'patient_missed', - 'therapist_canceled', - 'holiday_block' -); - - -ALTER TYPE public.recurrence_exception_type OWNER TO supabase_admin; - --- --- Name: recurrence_type; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.recurrence_type AS ENUM ( - 'weekly', - 'biweekly', - 'monthly', - 'yearly', - 'custom_weekdays' -); - - -ALTER TYPE public.recurrence_type OWNER TO supabase_admin; - --- --- Name: status_agenda_serie; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.status_agenda_serie AS ENUM ( - 'ativo', - 'pausado', - 'cancelado' -); - - -ALTER TYPE public.status_agenda_serie OWNER TO supabase_admin; - --- --- Name: status_evento_agenda; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.status_evento_agenda AS ENUM ( - 'agendado', - 'realizado', - 'faltou', - 'cancelado', - 'remarcar' -); - - -ALTER TYPE public.status_evento_agenda OWNER TO supabase_admin; - --- --- Name: status_excecao_agenda; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.status_excecao_agenda AS ENUM ( - 'pendente', - 'ativo', - 'arquivado' -); - - -ALTER TYPE public.status_excecao_agenda OWNER TO supabase_admin; - --- --- Name: tipo_evento_agenda; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.tipo_evento_agenda AS ENUM ( - 'sessao', - 'bloqueio' -); - - -ALTER TYPE public.tipo_evento_agenda OWNER TO supabase_admin; - --- --- Name: tipo_excecao_agenda; Type: TYPE; Schema: public; Owner: supabase_admin --- - -CREATE TYPE public.tipo_excecao_agenda AS ENUM ( - 'bloqueio', - 'horario_extra' -); - diff --git a/database-novo/schema/03_functions/_all.sql b/database-novo/schema/03_functions/_all.sql new file mode 100644 index 0000000..5a465d8 --- /dev/null +++ b/database-novo/schema/03_functions/_all.sql @@ -0,0 +1,6302 @@ +-- All Functions +-- Gerado automaticamente em 2026-04-17T12:23:05.224Z +-- Total: 165 + +CREATE FUNCTION auth.email() RETURNS text + LANGUAGE sql STABLE + AS $$ + select + coalesce( + nullif(current_setting('request.jwt.claim.email', true), ''), + (nullif(current_setting('request.jwt.claims', true), '')::jsonb ->> 'email') + )::text +$$; + +CREATE FUNCTION auth.jwt() RETURNS jsonb + LANGUAGE sql STABLE + AS $$ + select + coalesce( + nullif(current_setting('request.jwt.claim', true), ''), + nullif(current_setting('request.jwt.claims', true), '') + )::jsonb +$$; + +CREATE FUNCTION auth.role() RETURNS text + LANGUAGE sql STABLE + AS $$ + select + coalesce( + nullif(current_setting('request.jwt.claim.role', true), ''), + (nullif(current_setting('request.jwt.claims', true), '')::jsonb ->> 'role') + )::text +$$; + +CREATE FUNCTION auth.uid() RETURNS uuid + LANGUAGE sql STABLE + AS $$ + select + coalesce( + nullif(current_setting('request.jwt.claim.sub', true), ''), + (nullif(current_setting('request.jwt.claims', true), '')::jsonb ->> 'sub') + )::uuid +$$; + +CREATE FUNCTION extensions.grant_pg_cron_access() RETURNS event_trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF EXISTS ( + SELECT + FROM pg_event_trigger_ddl_commands() AS ev + JOIN pg_extension AS ext + ON ev.objid = ext.oid + WHERE ext.extname = 'pg_cron' + ) + THEN + grant usage on schema cron to postgres with grant option; + + alter default privileges in schema cron grant all on tables to postgres with grant option; + alter default privileges in schema cron grant all on functions to postgres with grant option; + alter default privileges in schema cron grant all on sequences to postgres with grant option; + + alter default privileges for user supabase_admin in schema cron grant all + on sequences to postgres with grant option; + alter default privileges for user supabase_admin in schema cron grant all + on tables to postgres with grant option; + alter default privileges for user supabase_admin in schema cron grant all + on functions to postgres with grant option; + + grant all privileges on all tables in schema cron to postgres with grant option; + revoke all on table cron.job from postgres; + grant select on table cron.job to postgres with grant option; + END IF; +END; +$$; + +CREATE FUNCTION extensions.grant_pg_graphql_access() RETURNS event_trigger + LANGUAGE plpgsql + AS $_$ +DECLARE + func_is_graphql_resolve bool; +BEGIN + func_is_graphql_resolve = ( + SELECT n.proname = 'resolve' + FROM pg_event_trigger_ddl_commands() AS ev + LEFT JOIN pg_catalog.pg_proc AS n + ON ev.objid = n.oid + ); + + IF func_is_graphql_resolve + THEN + -- Update public wrapper to pass all arguments through to the pg_graphql resolve func + DROP FUNCTION IF EXISTS graphql_public.graphql; + create or replace function graphql_public.graphql( + "operationName" text default null, + query text default null, + variables jsonb default null, + extensions jsonb default null + ) + returns jsonb + language sql + as $$ + select graphql.resolve( + query := query, + variables := coalesce(variables, '{}'), + "operationName" := "operationName", + extensions := extensions + ); + $$; + + -- This hook executes when `graphql.resolve` is created. That is not necessarily the last + -- function in the extension so we need to grant permissions on existing entities AND + -- update default permissions to any others that are created after `graphql.resolve` + grant usage on schema graphql to postgres, anon, authenticated, service_role; + grant select on all tables in schema graphql to postgres, anon, authenticated, service_role; + grant execute on all functions in schema graphql to postgres, anon, authenticated, service_role; + grant all on all sequences in schema graphql to postgres, anon, authenticated, service_role; + alter default privileges in schema graphql grant all on tables to postgres, anon, authenticated, service_role; + alter default privileges in schema graphql grant all on functions to postgres, anon, authenticated, service_role; + alter default privileges in schema graphql grant all on sequences to postgres, anon, authenticated, service_role; + + -- Allow postgres role to allow granting usage on graphql and graphql_public schemas to custom roles + grant usage on schema graphql_public to postgres with grant option; + grant usage on schema graphql to postgres with grant option; + END IF; + +END; +$_$; + +CREATE FUNCTION extensions.grant_pg_net_access() RETURNS event_trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF EXISTS ( + SELECT 1 + FROM pg_event_trigger_ddl_commands() AS ev + JOIN pg_extension AS ext + ON ev.objid = ext.oid + WHERE ext.extname = 'pg_net' + ) + THEN + GRANT USAGE ON SCHEMA net TO supabase_functions_admin, postgres, anon, authenticated, service_role; + + ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY DEFINER; + ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SECURITY DEFINER; + + ALTER function net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) SET search_path = net; + ALTER function net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) SET search_path = net; + + REVOKE ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; + REVOKE ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; + + GRANT EXECUTE ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin, postgres, anon, authenticated, service_role; + GRANT EXECUTE ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin, postgres, anon, authenticated, service_role; + END IF; +END; +$$; + +CREATE FUNCTION extensions.pgrst_ddl_watch() RETURNS event_trigger + LANGUAGE plpgsql + AS $$ +DECLARE + cmd record; +BEGIN + FOR cmd IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + IF cmd.command_tag IN ( + 'CREATE SCHEMA', 'ALTER SCHEMA' + , 'CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO', 'ALTER TABLE' + , 'CREATE FOREIGN TABLE', 'ALTER FOREIGN TABLE' + , 'CREATE VIEW', 'ALTER VIEW' + , 'CREATE MATERIALIZED VIEW', 'ALTER MATERIALIZED VIEW' + , 'CREATE FUNCTION', 'ALTER FUNCTION' + , 'CREATE TRIGGER' + , 'CREATE TYPE', 'ALTER TYPE' + , 'CREATE RULE' + , 'COMMENT' + ) + -- don't notify in case of CREATE TEMP table or other objects created on pg_temp + AND cmd.schema_name is distinct from 'pg_temp' + THEN + NOTIFY pgrst, 'reload schema'; + END IF; + END LOOP; +END; $$; + +CREATE FUNCTION extensions.pgrst_drop_watch() RETURNS event_trigger + LANGUAGE plpgsql + AS $$ +DECLARE + obj record; +BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() + LOOP + IF obj.object_type IN ( + 'schema' + , 'table' + , 'foreign table' + , 'view' + , 'materialized view' + , 'function' + , 'trigger' + , 'type' + , 'rule' + ) + AND obj.is_temporary IS false -- no pg_temp objects + THEN + NOTIFY pgrst, 'reload schema'; + END IF; + END LOOP; +END; $$; + +CREATE FUNCTION extensions.set_graphql_placeholder() RETURNS event_trigger + LANGUAGE plpgsql + AS $_$ + DECLARE + graphql_is_dropped bool; + BEGIN + graphql_is_dropped = ( + SELECT ev.schema_name = 'graphql_public' + FROM pg_event_trigger_dropped_objects() AS ev + WHERE ev.schema_name = 'graphql_public' + ); + + IF graphql_is_dropped + THEN + create or replace function graphql_public.graphql( + "operationName" text default null, + query text default null, + variables jsonb default null, + extensions jsonb default null + ) + returns jsonb + language plpgsql + as $$ + DECLARE + server_version float; + BEGIN + server_version = (SELECT (SPLIT_PART((select version()), ' ', 2))::float); + + IF server_version >= 14 THEN + RETURN jsonb_build_object( + 'errors', jsonb_build_array( + jsonb_build_object( + 'message', 'pg_graphql extension is not enabled.' + ) + ) + ); + ELSE + RETURN jsonb_build_object( + 'errors', jsonb_build_array( + jsonb_build_object( + 'message', 'pg_graphql is only available on projects running Postgres 14 onwards.' + ) + ) + ); + END IF; + END; + $$; + END IF; + + END; +$_$; + +CREATE FUNCTION pgbouncer.get_auth(p_usename text) RETURNS TABLE(username text, password text) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO '' + AS $_$ +begin + raise debug 'PgBouncer auth request: %', p_usename; + + return query + select + rolname::text, + case when rolvaliduntil < now() + then null + else rolpassword::text + end + from pg_authid + where rolname=$1 and rolcanlogin; +end; +$_$; + +CREATE FUNCTION public.__rls_ping() RETURNS text + LANGUAGE sql STABLE + AS $$ + select 'ok'::text; +$$; + +CREATE FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_intent record; + v_sub public.subscriptions; + v_days int; + v_user_id uuid; + v_plan_id uuid; + v_target text; +begin + -- l?? pela VIEW unificada + select * into v_intent + from public.subscription_intents + where id = p_intent_id; + + if not found then + raise exception 'Intent n??o encontrado: %', p_intent_id; + end if; + + if v_intent.status <> 'paid' then + raise exception 'Intent precisa estar paid para ativar assinatura'; + end if; + + -- resolve target e plan_id via plans.key + select p.id, p.target + into v_plan_id, v_target + from public.plans p + where p.key = v_intent.plan_key + limit 1; + + if v_plan_id is null then + raise exception 'Plano n??o encontrado em plans.key = %', v_intent.plan_key; + end if; + + v_target := lower(coalesce(v_target, '')); + + -- ??? supervisor adicionado + if v_target not in ('clinic', 'therapist', 'supervisor') then + raise exception 'Target inv??lido em plans.target: %', v_target; + end if; + + -- regra por target + if v_target = 'clinic' then + if v_intent.tenant_id is null then + raise exception 'Intent sem tenant_id'; + end if; + else + -- therapist ou supervisor: vinculado ao user + v_user_id := v_intent.user_id; + if v_user_id is null then + v_user_id := v_intent.created_by_user_id; + end if; + end if; + + if v_target in ('therapist', 'supervisor') and v_user_id is null then + raise exception 'N??o foi poss??vel determinar user_id para assinatura %.', v_target; + end if; + + -- cancela assinatura ativa anterior + if v_target = 'clinic' then + update public.subscriptions + set status = 'cancelled', + cancelled_at = now() + where tenant_id = v_intent.tenant_id + and plan_id = v_plan_id + and status = 'active'; + else + -- therapist ou supervisor + update public.subscriptions + set status = 'cancelled', + cancelled_at = now() + where user_id = v_user_id + and plan_id = v_plan_id + and status = 'active' + and tenant_id is null; + end if; + + -- dura????o do plano (30 dias para mensal) + v_days := case + when lower(coalesce(v_intent.interval, 'month')) = 'year' then 365 + else 30 + end; + + -- cria nova assinatura + insert into public.subscriptions ( + user_id, + plan_id, + status, + started_at, + expires_at, + cancelled_at, + activated_at, + tenant_id, + plan_key, + interval, + source, + created_at, + updated_at + ) + values ( + case when v_target = 'clinic' then null else v_user_id end, + v_plan_id, + 'active', + now(), + now() + make_interval(days => v_days), + null, + now(), + case when v_target = 'clinic' then v_intent.tenant_id else null end, + v_intent.plan_key, + v_intent.interval, + 'manual', + now(), + now() + ) + returning * into v_sub; + + -- grava v??nculo intent ??? subscription + if v_target = 'clinic' then + update public.subscription_intents_tenant + set subscription_id = v_sub.id + where id = p_intent_id; + else + update public.subscription_intents_personal + set subscription_id = v_sub.id + where id = p_intent_id; + end if; + + return v_sub; +end; +$$; + +CREATE FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Cr??dito manual'::text, p_payment_method text DEFAULT 'manual'::text, p_price_cents integer DEFAULT 0) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_credit addon_credits%ROWTYPE; + v_balance_before INTEGER; + v_balance_after INTEGER; + v_tx_id UUID; +BEGIN + -- Upsert addon_credits + INSERT INTO addon_credits (tenant_id, addon_type, balance, total_purchased) + VALUES (p_tenant_id, p_addon_type, 0, 0) + ON CONFLICT (tenant_id, addon_type) DO NOTHING; + + -- Lock e leitura + SELECT * INTO v_credit + FROM addon_credits + WHERE tenant_id = p_tenant_id AND addon_type = p_addon_type + FOR UPDATE; + + v_balance_before := v_credit.balance; + v_balance_after := v_credit.balance + p_amount; + + -- Atualiza saldo + UPDATE addon_credits + SET balance = v_balance_after, + total_purchased = total_purchased + p_amount, + low_balance_notified = CASE WHEN v_balance_after > COALESCE(low_balance_threshold, 10) THEN false ELSE low_balance_notified END, + updated_at = now() + WHERE id = v_credit.id; + + -- Registra transa????o + INSERT INTO addon_transactions ( + tenant_id, addon_type, type, amount, + balance_before, balance_after, + product_id, description, + admin_user_id, payment_method, price_cents + ) VALUES ( + p_tenant_id, p_addon_type, 'purchase', p_amount, + v_balance_before, v_balance_after, + p_product_id, p_description, + auth.uid(), p_payment_method, p_price_cents + ) + RETURNING id INTO v_tx_id; + + RETURN jsonb_build_object( + 'success', true, + 'transaction_id', v_tx_id, + 'balance_before', v_balance_before, + 'balance_after', v_balance_after + ); +END; +$$; + +CREATE FUNCTION public.admin_delete_email_template_global(p_id uuid) RETURNS boolean + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + DELETE FROM public.email_templates_global WHERE id = p_id; + IF NOT FOUND THEN + RAISE EXCEPTION 'Template com id % n??o encontrado', p_id; + END IF; + RETURN true; +END; +$$; + +CREATE FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_plan_id uuid; +begin + -- (opcional) restringe targets v??lidos + if p_new_target not in ('clinic','therapist') then + raise exception 'Target inv??lido: %', p_new_target using errcode='P0001'; + end if; + + -- trava o plano + select id into v_plan_id + from public.plans + where key = p_plan_key + for update; + + if v_plan_id is null then + raise exception 'Plano n??o encontrado: %', p_plan_key using errcode='P0001'; + end if; + + -- seguran??a: n??o mexer se existe subscription + if exists (select 1 from public.subscriptions s where s.plan_id = v_plan_id) then + raise exception 'Plano % possui subscriptions. Migra????o bloqueada.', p_plan_key using errcode='P0001'; + end if; + + -- liga bypass SOMENTE nesta transa????o + perform set_config('app.plan_migration_bypass', '1', true); + + update public.plans + set target = p_new_target + where id = v_plan_id; + +end +$$; + +CREATE FUNCTION public.admin_upsert_email_template_global(p_id uuid DEFAULT NULL::uuid, p_key text DEFAULT NULL::text, p_domain text DEFAULT NULL::text, p_channel text DEFAULT 'email'::text, p_subject text DEFAULT NULL::text, p_body_html text DEFAULT NULL::text, p_body_text text DEFAULT NULL::text, p_is_active boolean DEFAULT true, p_variables jsonb DEFAULT '{}'::jsonb) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_result jsonb; + v_id uuid; +BEGIN + -- UPDATE existente + IF p_id IS NOT NULL THEN + UPDATE public.email_templates_global + SET + subject = COALESCE(p_subject, subject), + body_html = COALESCE(p_body_html, body_html), + body_text = p_body_text, + is_active = p_is_active, + variables = COALESCE(p_variables, variables), + version = version + 1 + WHERE id = p_id + RETURNING to_jsonb(email_templates_global.*) INTO v_result; + + IF v_result IS NULL THEN + RAISE EXCEPTION 'Template com id % n??o encontrado', p_id; + END IF; + + RETURN v_result; + END IF; + + -- INSERT novo + IF p_key IS NULL OR p_domain IS NULL OR p_subject IS NULL OR p_body_html IS NULL THEN + RAISE EXCEPTION 'key, domain, subject e body_html s??o obrigat??rios para novo template'; + END IF; + + INSERT INTO public.email_templates_global (key, domain, channel, subject, body_html, body_text, is_active, variables) + VALUES (p_key, p_domain, p_channel, p_subject, p_body_html, p_body_text, p_is_active, p_variables) + RETURNING to_jsonb(email_templates_global.*) INTO v_result; + + RETURN v_result; +END; +$$; + +CREATE FUNCTION public.agenda_cfg_sync() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if new.agenda_view_mode = 'custom' then + new.usar_horario_admin_custom := true; + new.admin_inicio_visualizacao := new.agenda_custom_start; + new.admin_fim_visualizacao := new.agenda_custom_end; + else + new.usar_horario_admin_custom := false; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) RETURNS TABLE(data date, tem_slots boolean) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_owner_id uuid; + v_antecedencia int; + v_agora timestamptz; + v_data date; + v_data_inicio date; + v_data_fim date; + v_db_dow int; + v_tem_slot boolean; + v_bloqueado boolean; +BEGIN + SELECT c.owner_id, c.antecedencia_minima_horas + INTO v_owner_id, v_antecedencia + FROM public.agendador_configuracoes c + WHERE c.link_slug = p_slug AND c.ativo = true + LIMIT 1; + + IF v_owner_id IS NULL THEN RETURN; END IF; + + v_agora := now(); + v_data_inicio := make_date(p_ano, p_mes, 1); + v_data_fim := (v_data_inicio + interval '1 month' - interval '1 day')::date; + + v_data := v_data_inicio; + WHILE v_data <= v_data_fim LOOP + v_db_dow := extract(dow from v_data::timestamp)::int; + + -- ?????? Dia inteiro bloqueado? (agenda_bloqueios) ??????????????????????????????????????????????????????????????????????????? + SELECT EXISTS ( + SELECT 1 FROM public.agenda_bloqueios b + WHERE b.owner_id = v_owner_id + AND b.data_inicio <= v_data + AND COALESCE(b.data_fim, v_data) >= v_data + AND b.hora_inicio IS NULL -- bloqueio de dia inteiro + AND ( + (NOT b.recorrente) + OR (b.recorrente AND b.dia_semana = v_db_dow) + ) + ) INTO v_bloqueado; + + IF v_bloqueado THEN + v_data := v_data + 1; + CONTINUE; + END IF; + + -- ?????? Tem slots dispon??veis no dia? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????? + SELECT EXISTS ( + SELECT 1 FROM public.agenda_online_slots s + WHERE s.owner_id = v_owner_id + AND s.weekday = v_db_dow + AND s.enabled = true + AND (v_data::text || ' ' || s.time::text)::timestamp + AT TIME ZONE 'America/Sao_Paulo' + >= v_agora + (v_antecedencia || ' hours')::interval + ) INTO v_tem_slot; + + IF v_tem_slot THEN + data := v_data; + tem_slots := true; + RETURN NEXT; + END IF; + + v_data := v_data + 1; + END LOOP; +END; +$$; + +CREATE FUNCTION public.agendador_gerar_slug() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + v_slug text; + v_exists boolean; +BEGIN + -- s?? gera se ativou e n??o tem slug ainda + IF NEW.ativo = true AND (NEW.link_slug IS NULL OR NEW.link_slug = '') THEN + LOOP + v_slug := lower(substring(replace(gen_random_uuid()::text, '-', ''), 1, 8)); + SELECT EXISTS ( + SELECT 1 FROM public.agendador_configuracoes + WHERE link_slug = v_slug AND owner_id <> NEW.owner_id + ) INTO v_exists; + EXIT WHEN NOT v_exists; + END LOOP; + NEW.link_slug := v_slug; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) RETURNS TABLE(hora time without time zone, disponivel boolean) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_owner_id uuid; + v_duracao int; + v_antecedencia int; + v_agora timestamptz; + v_db_dow int; + v_slot time; + v_slot_fim time; + v_slot_ts timestamptz; + v_ocupado boolean; + -- loop de recorr??ncias + v_rule RECORD; + v_rule_start_dow int; + v_first_occ date; + v_day_diff int; + v_ex_type text; +BEGIN + SELECT c.owner_id, c.duracao_sessao_min, c.antecedencia_minima_horas + INTO v_owner_id, v_duracao, v_antecedencia + FROM public.agendador_configuracoes c + WHERE c.link_slug = p_slug AND c.ativo = true + LIMIT 1; + + IF v_owner_id IS NULL THEN RETURN; END IF; + + v_agora := now(); + v_db_dow := extract(dow from p_data::timestamp)::int; + + -- ?????? Dia inteiro bloqueado? (agenda_bloqueios sem hora) ????????????????????????????????????????????????????????? + -- Se sim, n??o h?? nenhum slot dispon??vel ??? retorna vazio. + IF EXISTS ( + SELECT 1 FROM public.agenda_bloqueios b + WHERE b.owner_id = v_owner_id + AND b.data_inicio <= p_data + AND COALESCE(b.data_fim, p_data) >= p_data + AND b.hora_inicio IS NULL -- bloqueio de dia inteiro + AND ( + (NOT b.recorrente) + OR (b.recorrente AND b.dia_semana = v_db_dow) + ) + ) THEN + RETURN; + END IF; + + FOR v_slot IN + SELECT s.time + FROM public.agenda_online_slots s + WHERE s.owner_id = v_owner_id + AND s.weekday = v_db_dow + AND s.enabled = true + ORDER BY s.time + LOOP + v_slot_fim := v_slot + (v_duracao || ' minutes')::interval; + v_ocupado := false; + + -- ?????? Anteced??ncia m??nima ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + v_slot_ts := (p_data::text || ' ' || v_slot::text)::timestamp + AT TIME ZONE 'America/Sao_Paulo'; + IF v_slot_ts < v_agora + (v_antecedencia || ' hours')::interval THEN + v_ocupado := true; + END IF; + + -- ?????? Bloqueio de hor??rio espec??fico (agenda_bloqueios com hora) ????????????????????????????????? + IF NOT v_ocupado THEN + SELECT EXISTS ( + SELECT 1 FROM public.agenda_bloqueios b + WHERE b.owner_id = v_owner_id + AND b.data_inicio <= p_data + AND COALESCE(b.data_fim, p_data) >= p_data + AND b.hora_inicio IS NOT NULL + AND b.hora_inicio < v_slot_fim + AND b.hora_fim > v_slot + AND ( + (NOT b.recorrente) + OR (b.recorrente AND b.dia_semana = v_db_dow) + ) + ) INTO v_ocupado; + END IF; + + -- ?????? Eventos avulsos internos (agenda_eventos) ???????????????????????????????????????????????????????????????????????????????????? + IF NOT v_ocupado THEN + SELECT EXISTS ( + SELECT 1 FROM public.agenda_eventos e + WHERE e.owner_id = v_owner_id + AND e.status::text NOT IN ('cancelado', 'faltou') + AND (e.inicio_em AT TIME ZONE 'America/Sao_Paulo')::date = p_data + AND (e.inicio_em AT TIME ZONE 'America/Sao_Paulo')::time < v_slot_fim + AND (e.fim_em AT TIME ZONE 'America/Sao_Paulo')::time > v_slot + ) INTO v_ocupado; + END IF; + + -- ?????? Recorr??ncias ativas (recurrence_rules) ????????????????????????????????????????????????????????????????????????????????????????????? + IF NOT v_ocupado THEN + FOR v_rule IN + SELECT + r.id, + r.start_date::date AS start_date, + r.end_date::date AS end_date, + r.start_time::time AS start_time, + r.end_time::time AS end_time, + COALESCE(r.interval, 1)::int AS interval + FROM public.recurrence_rules r + WHERE r.owner_id = v_owner_id + AND r.status = 'ativo' + AND p_data >= r.start_date::date + AND (r.end_date IS NULL OR p_data <= r.end_date::date) + AND v_db_dow = ANY(r.weekdays) + AND r.start_time::time < v_slot_fim + AND r.end_time::time > v_slot + LOOP + v_rule_start_dow := extract(dow from v_rule.start_date)::int; + v_first_occ := v_rule.start_date + + (((v_db_dow - v_rule_start_dow + 7) % 7))::int; + v_day_diff := (p_data - v_first_occ)::int; + + IF v_day_diff >= 0 AND v_day_diff % (7 * v_rule.interval) = 0 THEN + v_ex_type := NULL; + SELECT ex.type INTO v_ex_type + FROM public.recurrence_exceptions ex + WHERE ex.recurrence_id = v_rule.id + AND ex.original_date = p_data + LIMIT 1; + + IF v_ex_type IS NULL OR v_ex_type NOT IN ( + 'cancel_session', 'patient_missed', + 'therapist_canceled', 'holiday_block', + 'reschedule_session' + ) THEN + v_ocupado := true; + EXIT; + END IF; + END IF; + END LOOP; + END IF; + + -- ?????? Recorr??ncias remarcadas para este dia ???????????????????????????????????????????????????????????????????????????????????????????????? + IF NOT v_ocupado THEN + SELECT EXISTS ( + SELECT 1 + FROM public.recurrence_exceptions ex + JOIN public.recurrence_rules r ON r.id = ex.recurrence_id + WHERE r.owner_id = v_owner_id + AND r.status = 'ativo' + AND ex.type = 'reschedule_session' + AND ex.new_date = p_data + AND COALESCE(ex.new_start_time, r.start_time)::time < v_slot_fim + AND COALESCE(ex.new_end_time, r.end_time)::time > v_slot + ) INTO v_ocupado; + END IF; + + -- ?????? Solicita????es p??blicas pendentes ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + IF NOT v_ocupado THEN + SELECT EXISTS ( + SELECT 1 FROM public.agendador_solicitacoes sol + WHERE sol.owner_id = v_owner_id + AND sol.status = 'pendente' + AND sol.data_solicitada = p_data + AND sol.hora_solicitada = v_slot + AND (sol.reservado_ate IS NULL OR sol.reservado_ate > v_agora) + ) INTO v_ocupado; + END IF; + + hora := v_slot; + disponivel := NOT v_ocupado; + RETURN NEXT; + END LOOP; +END; +$$; + +CREATE FUNCTION public.auto_create_financial_record_from_session() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_price NUMERIC(10,2); + v_services_total NUMERIC(10,2); + v_already_billed BOOLEAN; +BEGIN + -- ?????? Guards de sa??da r??pida ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + -- S?? processa quando o status muda PARA 'realizado' + IF NEW.status::TEXT <> 'realizado' THEN + RETURN NEW; + END IF; + + -- S?? processa quando houve mudan??a real de status + IF OLD.status IS NOT DISTINCT FROM NEW.status THEN + RETURN NEW; + END IF; + + -- S?? sess??es (n??o bloqueios, feriados, etc.) + IF NEW.tipo::TEXT <> 'sessao' THEN + RETURN NEW; + END IF; + + -- Paciente obrigat??rio para vincular a cobran??a + IF NEW.patient_id IS NULL THEN + RETURN NEW; + END IF; + + -- Sess??es de pacote t??m cobran??a gerenciada por billing_contract + IF NEW.billing_contract_id IS NOT NULL THEN + RETURN NEW; + END IF; + + -- Idempot??ncia: j?? existe financial_record para este evento? + SELECT billed INTO v_already_billed + FROM public.agenda_eventos + WHERE id = NEW.id; + + IF v_already_billed = TRUE THEN + -- Confirma no financial_records tamb??m (dupla verifica????o) + IF EXISTS ( + SELECT 1 FROM public.financial_records + WHERE agenda_evento_id = NEW.id AND deleted_at IS NULL + ) THEN + RETURN NEW; + END IF; + END IF; + + -- ?????? Busca do pre??o ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + v_price := NULL; + + -- Prioridade 1: soma dos servi??os da regra de recorr??ncia + IF NEW.recurrence_id IS NOT NULL THEN + SELECT COALESCE(SUM(rrs.final_price), 0) + INTO v_services_total + FROM public.recurrence_rule_services rrs + WHERE rrs.rule_id = NEW.recurrence_id; + + IF v_services_total > 0 THEN + v_price := v_services_total; + END IF; + + -- Prioridade 2: price direto da regra (fallback se sem servi??os) + IF v_price IS NULL OR v_price = 0 THEN + SELECT price INTO v_price + FROM public.recurrence_rules + WHERE id = NEW.recurrence_id; + END IF; + END IF; + + -- Prioridade 3: price do pr??prio evento de agenda + IF v_price IS NULL OR v_price = 0 THEN + v_price := NEW.price; + END IF; + + -- Sem pre??o ??? n??o criar registro (n??o ?? erro, apenas skip silencioso) + IF v_price IS NULL OR v_price <= 0 THEN + RETURN NEW; + END IF; + + -- ?????? Cria????o do financial_record ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + INSERT INTO public.financial_records ( + owner_id, + tenant_id, + patient_id, + agenda_evento_id, + type, + amount, + discount_amount, + final_amount, + clinic_fee_pct, + clinic_fee_amount, + status, + due_date + -- payment_method: NULL at?? o momento do pagamento (mark_as_paid preenche) + ) VALUES ( + NEW.owner_id, + NEW.tenant_id, + NEW.patient_id, + NEW.id, + 'receita', + v_price, + 0, + v_price, + 0, -- clinic_fee_pct: sem campo de configura????o global no schema atual. + 0, -- clinic_fee_amount: calculado manualmente ou via update posterior. + 'pending', + (NEW.inicio_em::DATE + 7) -- vencimento padr??o: 7 dias ap??s a sess??o + ); + + -- ?????? Marca sess??o como billed ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + -- UPDATE em billed (n??o em status) ??? n??o re-dispara este trigger + UPDATE public.agenda_eventos + SET billed = TRUE + WHERE id = NEW.id; + + RETURN NEW; + +EXCEPTION + WHEN OTHERS THEN + -- Log silencioso: nunca bloquear a agenda por falha financeira + RAISE WARNING '[auto_create_financial_record_from_session] evento=% erro=%', + NEW.id, SQLERRM; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.can_delete_patient(p_patient_id uuid) RETURNS boolean + LANGUAGE sql STABLE SECURITY DEFINER + AS $$ + SELECT NOT EXISTS ( + SELECT 1 FROM public.agenda_eventos WHERE patient_id = p_patient_id + UNION ALL + SELECT 1 FROM public.recurrence_rules WHERE patient_id = p_patient_id + UNION ALL + SELECT 1 FROM public.billing_contracts WHERE patient_id = p_patient_id + ); +$$; + +CREATE FUNCTION public.cancel_notifications_on_opt_out() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + -- WhatsApp opt-out + IF OLD.whatsapp_opt_in = true AND NEW.whatsapp_opt_in = false THEN + PERFORM public.cancel_patient_pending_notifications( + NEW.patient_id, 'whatsapp' + ); + END IF; + -- Email opt-out + IF OLD.email_opt_in = true AND NEW.email_opt_in = false THEN + PERFORM public.cancel_patient_pending_notifications( + NEW.patient_id, 'email' + ); + END IF; + -- SMS opt-out + IF OLD.sms_opt_in = true AND NEW.sms_opt_in = false THEN + PERFORM public.cancel_patient_pending_notifications( + NEW.patient_id, 'sms' + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.cancel_notifications_on_session_cancel() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF NEW.status IN ('cancelado', 'excluido') + AND OLD.status NOT IN ('cancelado', 'excluido') + THEN + PERFORM public.cancel_patient_pending_notifications( + NEW.patient_id, NULL, NEW.id + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text DEFAULT NULL::text, p_evento_id uuid DEFAULT NULL::uuid) RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_canceled integer; +BEGIN + UPDATE public.notification_queue + SET status = 'cancelado', + updated_at = now() + WHERE patient_id = p_patient_id + AND status IN ('pendente', 'processando') + AND (p_channel IS NULL OR channel = p_channel) + AND (p_evento_id IS NULL OR agenda_evento_id = p_evento_id); + + GET DIAGNOSTICS v_canceled = ROW_COUNT; + RETURN v_canceled; +END; +$$; + +CREATE FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + UPDATE public.recurrence_rules + SET + end_date = p_from_date - INTERVAL '1 day', + open_ended = false, + status = CASE + WHEN p_from_date <= start_date THEN 'cancelado' + ELSE status + END, + updated_at = now() + WHERE id = p_recurrence_id; +END; +$$; + +CREATE FUNCTION public.cancel_subscription(p_subscription_id uuid) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_sub public.subscriptions; + v_owner_type text; + v_owner_ref uuid; +begin + + select * + into v_sub + from public.subscriptions + where id = p_subscription_id + for update; + + if not found then + raise exception 'Subscription n??o encontrada'; + end if; + + if v_sub.status = 'canceled' then + return v_sub; + end if; + + if v_sub.tenant_id is not null then + v_owner_type := 'clinic'; + v_owner_ref := v_sub.tenant_id; + elsif v_sub.user_id is not null then + v_owner_type := 'therapist'; + v_owner_ref := v_sub.user_id; + else + v_owner_type := null; + v_owner_ref := null; + end if; + + update public.subscriptions + set status = 'canceled', + cancel_at_period_end = false, + updated_at = now() + where id = p_subscription_id + returning * into v_sub; + + insert into public.subscription_events( + subscription_id, + owner_id, + owner_type, + owner_ref, + event_type, + old_plan_id, + new_plan_id, + created_by, + reason, + source, + metadata + ) + values ( + v_sub.id, + v_owner_ref, + v_owner_type, + v_owner_ref, + 'canceled', + v_sub.plan_id, + v_sub.plan_id, + auth.uid(), + 'Cancelamento manual via admin', + 'admin_panel', + jsonb_build_object('previous_status', 'active') + ); + + if v_owner_ref is not null then + insert into public.entitlements_invalidation(owner_id, changed_at) + values (v_owner_ref, now()) + on conflict (owner_id) + do update set changed_at = excluded.changed_at; + end if; + + return v_sub; + +end; +$$; + +CREATE FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone DEFAULT now()) RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_count integer; +BEGIN + UPDATE public.agenda_eventos + SET status = 'cancelado', + updated_at = now() + WHERE serie_id = p_serie_id + AND inicio_em >= p_a_partir_de + AND status NOT IN ('realizado', 'cancelado'); + + GET DIAGNOSTICS v_count = ROW_COUNT; + RETURN v_count; +END; +$$; + +CREATE FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_sub public.subscriptions; + v_old_plan uuid; + v_new_key text; + + v_owner_type text; + v_owner_ref uuid; + + v_new_target text; + v_sub_target text; +begin + select * + into v_sub + from public.subscriptions + where id = p_subscription_id + for update; + + if not found then + raise exception 'Subscription n??o encontrada'; + end if; + + v_old_plan := v_sub.plan_id; + + if v_old_plan = p_new_plan_id then + return v_sub; + end if; + + select key, target + into v_new_key, v_new_target + from public.plans + where id = p_new_plan_id; + + if v_new_key is null then + raise exception 'Plano n??o encontrado'; + end if; + + v_new_target := lower(coalesce(v_new_target, '')); + + v_sub_target := case + when v_sub.tenant_id is not null then 'clinic' + else 'therapist' + end; + + if v_new_target <> v_sub_target then + raise exception 'Plano inv??lido para este tipo de assinatura. Assinatura ?? % e o plano ?? %.', + v_sub_target, v_new_target + using errcode = 'P0001'; + end if; + + if v_sub.tenant_id is not null then + v_owner_type := 'clinic'; + v_owner_ref := v_sub.tenant_id; + elsif v_sub.user_id is not null then + v_owner_type := 'therapist'; + v_owner_ref := v_sub.user_id; + else + v_owner_type := null; + v_owner_ref := null; + end if; + + update public.subscriptions + set plan_id = p_new_plan_id, + plan_key = v_new_key, + updated_at = now() + where id = p_subscription_id + returning * into v_sub; + + insert into public.subscription_events( + subscription_id, + owner_id, + owner_type, + owner_ref, + event_type, + old_plan_id, + new_plan_id, + created_by, + reason, + source, + metadata + ) + values ( + v_sub.id, + v_owner_ref, + v_owner_type, + v_owner_ref, + 'plan_changed', + v_old_plan, + p_new_plan_id, + auth.uid(), + 'Plan change via DEV menu', + 'dev_menu', + jsonb_build_object( + 'previous_plan', v_old_plan, + 'new_plan', p_new_plan_id, + 'new_plan_key', v_new_key, + 'new_plan_target', v_new_target + ) + ); + + if v_owner_ref is not null then + insert into public.entitlements_invalidation (owner_id, changed_at) + values (v_owner_ref, now()) + on conflict (owner_id) + do update set changed_at = excluded.changed_at; + end if; + + return v_sub; +end; +$$; + +CREATE FUNCTION public.cleanup_notification_queue() RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_deleted integer; +BEGIN + DELETE FROM public.notification_queue + WHERE status IN ('enviado', 'cancelado', 'ignorado') + AND created_at < now() - interval '90 days'; + + GET DIAGNOSTICS v_deleted = ROW_COUNT; + RETURN v_deleted; +END; +$$; + +CREATE FUNCTION public.create_clinic_tenant(p_name text) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_uid uuid; + v_tenant uuid; + v_name text; +begin + v_uid := auth.uid(); + if v_uid is null then + raise exception 'Not authenticated'; + end if; + + v_name := nullif(trim(coalesce(p_name, '')), ''); + if v_name is null then + v_name := 'Cl??nica'; + end if; + + insert into public.tenants (name, kind, created_at) + values (v_name, 'clinic', now()) + returning id into v_tenant; + + insert into public.tenant_members (tenant_id, user_id, role, status, created_at) + values (v_tenant, v_uid, 'tenant_admin', 'active', now()); + + return v_tenant; +end; +$$; + +CREATE FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) RETURNS SETOF public.financial_records + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_existing public.financial_records%ROWTYPE; + v_new public.financial_records%ROWTYPE; +BEGIN + -- Idempot??ncia: retorna o registro existente se j?? foi criado + SELECT * INTO v_existing + FROM public.financial_records + WHERE agenda_evento_id = p_agenda_evento_id + AND deleted_at IS NULL + LIMIT 1; + + IF FOUND THEN + RETURN NEXT v_existing; + RETURN; + END IF; + + -- Cria o novo registro + INSERT INTO public.financial_records ( + tenant_id, + owner_id, + patient_id, + agenda_evento_id, + amount, + discount_amount, + final_amount, + status, + due_date + ) VALUES ( + p_tenant_id, + p_owner_id, + p_patient_id, + p_agenda_evento_id, + p_amount, + 0, + p_amount, + 'pending', + p_due_date + ) + RETURNING * INTO v_new; + + -- Marca o evento da agenda como billed = true + UPDATE public.agenda_eventos + SET billed = TRUE + WHERE id = p_agenda_evento_id; + + RETURN NEXT v_new; +END; +$$; + +CREATE FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text DEFAULT NULL::text, p_phone text DEFAULT NULL::text, p_notes text DEFAULT NULL::text, p_consent boolean DEFAULT false) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + v_owner uuid; + v_active boolean; + v_expires timestamptz; + v_max_uses int; + v_uses int; + v_id uuid; +begin + select owner_id, active, expires_at, max_uses, uses + into v_owner, v_active, v_expires, v_max_uses, v_uses + from public.patient_invites + where token = p_token + limit 1; + + if v_owner is null then + raise exception 'Token inv??lido'; + end if; + + if v_active is not true then + raise exception 'Link desativado'; + end if; + + if v_expires is not null and now() > v_expires then + raise exception 'Link expirado'; + end if; + + if v_max_uses is not null and v_uses >= v_max_uses then + raise exception 'Limite de uso atingido'; + end if; + + if p_name is null or length(trim(p_name)) = 0 then + raise exception 'Nome ?? obrigat??rio'; + end if; + + insert into public.patient_intake_requests + (owner_id, token, name, email, phone, notes, consent, status) + values + (v_owner, p_token, trim(p_name), + nullif(lower(trim(p_email)), ''), + nullif(trim(p_phone), ''), + nullif(trim(p_notes), ''), + coalesce(p_consent, false), + 'new') + returning id into v_id; + + update public.patient_invites + set uses = uses + 1 + where token = p_token; + + return v_id; +end; +$$; + +CREATE FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $_$ +declare + v_owner_id uuid; + v_intake_id uuid; + v_birth_raw text; + v_birth date; +begin + select owner_id + into v_owner_id + from public.patient_invites + where token = p_token; + + if v_owner_id is null then + raise exception 'Token inv??lido ou expirado'; + end if; + + v_birth_raw := nullif(trim(coalesce( + p_payload->>'data_nascimento', + '' + )), ''); + + v_birth := case + when v_birth_raw is null then null + when v_birth_raw ~ '^\d{4}-\d{2}-\d{2}$' then v_birth_raw::date + when v_birth_raw ~ '^\d{2}-\d{2}-\d{4}$' then to_date(v_birth_raw, 'DD-MM-YYYY') + else null + end; + + insert into public.patient_intake_requests ( + owner_id, + token, + status, + consent, + + nome_completo, + email_principal, + telefone, + + avatar_url, -- ???? AQUI + + data_nascimento, + cpf, + rg, + genero, + estado_civil, + profissao, + escolaridade, + nacionalidade, + naturalidade, + + cep, + pais, + cidade, + estado, + endereco, + numero, + complemento, + bairro, + + observacoes, + notas_internas, + + encaminhado_por, + onde_nos_conheceu + ) + values ( + v_owner_id, + p_token, + 'new', + coalesce((p_payload->>'consent')::boolean, false), + + nullif(trim(p_payload->>'nome_completo'), ''), + nullif(trim(p_payload->>'email_principal'), ''), + nullif(regexp_replace(coalesce(p_payload->>'telefone',''), '\D', '', 'g'), ''), + + nullif(trim(p_payload->>'avatar_url'), ''), -- ???? AQUI + + v_birth, + nullif(regexp_replace(coalesce(p_payload->>'cpf',''), '\D', '', 'g'), ''), + nullif(trim(p_payload->>'rg'), ''), + nullif(trim(p_payload->>'genero'), ''), + nullif(trim(p_payload->>'estado_civil'), ''), + nullif(trim(p_payload->>'profissao'), ''), + nullif(trim(p_payload->>'escolaridade'), ''), + nullif(trim(p_payload->>'nacionalidade'), ''), + nullif(trim(p_payload->>'naturalidade'), ''), + + nullif(regexp_replace(coalesce(p_payload->>'cep',''), '\D', '', 'g'), ''), + nullif(trim(p_payload->>'pais'), ''), + nullif(trim(p_payload->>'cidade'), ''), + nullif(trim(p_payload->>'estado'), ''), + nullif(trim(p_payload->>'endereco'), ''), + nullif(trim(p_payload->>'numero'), ''), + nullif(trim(p_payload->>'complemento'), ''), + nullif(trim(p_payload->>'bairro'), ''), + + nullif(trim(p_payload->>'observacoes'), ''), + nullif(trim(p_payload->>'notas_internas'), ''), + + nullif(trim(p_payload->>'encaminhado_por'), ''), + nullif(trim(p_payload->>'onde_nos_conheceu'), '') + ) + returning id into v_intake_id; + + return v_intake_id; +end; +$_$; + +CREATE FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer DEFAULT 60) RETURNS json + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_admin_id uuid; + v_role text; + v_token text; + v_expires timestamp with time zone; + v_session support_sessions; +BEGIN + -- Verifica autentica????o + v_admin_id := auth.uid(); + IF v_admin_id IS NULL THEN + RAISE EXCEPTION 'N??o autenticado.' USING ERRCODE = 'P0001'; + END IF; + + -- Verifica role saas_admin + SELECT role INTO v_role + FROM public.profiles + WHERE id = v_admin_id; + + IF v_role <> 'saas_admin' THEN + RAISE EXCEPTION 'Acesso negado. Somente saas_admin pode criar sess??es de suporte.' + USING ERRCODE = 'P0002'; + END IF; + + -- Valida TTL (1 a 120 minutos) + IF p_ttl_minutes < 1 OR p_ttl_minutes > 120 THEN + RAISE EXCEPTION 'TTL inv??lido. Use entre 1 e 120 minutos.' + USING ERRCODE = 'P0003'; + END IF; + + -- Valida tenant + IF NOT EXISTS (SELECT 1 FROM public.tenants WHERE id = p_tenant_id) THEN + RAISE EXCEPTION 'Tenant n??o encontrado.' + USING ERRCODE = 'P0004'; + END IF; + + -- Gera token ??nico (64 chars hex, sem pgcrypto) + v_token := replace(gen_random_uuid()::text, '-', '') || replace(gen_random_uuid()::text, '-', ''); + v_expires := now() + (p_ttl_minutes || ' minutes')::interval; + + -- Insere sess??o + INSERT INTO public.support_sessions (tenant_id, admin_id, token, expires_at) + VALUES (p_tenant_id, v_admin_id, v_token, v_expires) + RETURNING * INTO v_session; + + RETURN json_build_object( + 'token', v_session.token, + 'expires_at', v_session.expires_at, + 'session_id', v_session.id + ); +END; +$$; + +CREATE FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) RETURNS public.therapist_payouts + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_payout public.therapist_payouts%ROWTYPE; + v_total_sessions INTEGER; + v_gross NUMERIC(10,2); + v_clinic_fee NUMERIC(10,2); + v_net NUMERIC(10,2); +BEGIN + -- ?????? Verifica????o de permiss??o ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + -- Apenas o pr??prio terapeuta ou o tenant_admin pode criar o repasse + IF auth.uid() <> p_therapist_id AND NOT public.is_tenant_admin(p_tenant_id) THEN + RAISE EXCEPTION 'Sem permiss??o para criar repasse para este terapeuta.'; + END IF; + + -- ?????? Verifica se j?? existe repasse para o mesmo per??odo ??????????????????????????????????????????????????? + IF EXISTS ( + SELECT 1 FROM public.therapist_payouts + WHERE owner_id = p_therapist_id + AND tenant_id = p_tenant_id + AND period_start = p_period_start + AND period_end = p_period_end + AND status <> 'cancelled' + ) THEN + RAISE EXCEPTION + 'J?? existe um repasse ativo para o per??odo % a % deste terapeuta.', + p_period_start, p_period_end; + END IF; + + -- ?????? Agrega os financial_records eleg??veis ?????????????????????????????????????????????????????????????????????????????????????????? + -- Eleg??veis: paid, receita, owner=terapeuta, tenant correto, paid_at no per??odo, + -- n??o soft-deleted, ainda n??o vinculados a nenhum payout. + SELECT + COUNT(*) AS total_sessions, + COALESCE(SUM(amount), 0) AS gross_amount, + COALESCE(SUM(clinic_fee_amount), 0) AS clinic_fee_total, + COALESCE(SUM(net_amount), 0) AS net_amount + INTO + v_total_sessions, v_gross, v_clinic_fee, v_net + FROM public.financial_records fr + WHERE fr.owner_id = p_therapist_id + AND fr.tenant_id = p_tenant_id + AND fr.type = 'receita' + AND fr.status = 'paid' + AND fr.deleted_at IS NULL + AND fr.paid_at::DATE BETWEEN p_period_start AND p_period_end + AND NOT EXISTS ( + SELECT 1 FROM public.therapist_payout_records tpr + WHERE tpr.financial_record_id = fr.id + ); + + -- Sem registros eleg??veis ??? n??o criar payout vazio + IF v_total_sessions = 0 THEN + RAISE EXCEPTION + 'Nenhum registro financeiro eleg??vel encontrado para o per??odo % a %.', + p_period_start, p_period_end; + END IF; + + -- ?????? Cria o repasse ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + INSERT INTO public.therapist_payouts ( + owner_id, + tenant_id, + period_start, + period_end, + total_sessions, + gross_amount, + clinic_fee_total, + net_amount, + status + ) VALUES ( + p_therapist_id, + p_tenant_id, + p_period_start, + p_period_end, + v_total_sessions, + v_gross, + v_clinic_fee, + v_net, + 'pending' + ) + RETURNING * INTO v_payout; + + -- ?????? Vincula os financial_records ao repasse ???????????????????????????????????????????????????????????????????????????????????? + INSERT INTO public.therapist_payout_records (payout_id, financial_record_id) + SELECT v_payout.id, fr.id + FROM public.financial_records fr + WHERE fr.owner_id = p_therapist_id + AND fr.tenant_id = p_tenant_id + AND fr.type = 'receita' + AND fr.status = 'paid' + AND fr.deleted_at IS NULL + AND fr.paid_at::DATE BETWEEN p_period_start AND p_period_end + AND NOT EXISTS ( + SELECT 1 FROM public.therapist_payout_records tpr + WHERE tpr.financial_record_id = fr.id + ); + + RETURN v_payout; +END; +$$; + +CREATE FUNCTION public.current_member_id(p_tenant_id uuid) RETURNS uuid + LANGUAGE sql STABLE + AS $$ + select tm.id + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + limit 1 +$$; + +CREATE FUNCTION public.current_member_role(p_tenant_id uuid) RETURNS text + LANGUAGE sql STABLE + AS $$ + select tm.role + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + limit 1 +$$; + +CREATE FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Consumo'::text) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_credit addon_credits%ROWTYPE; + v_balance_before INTEGER; + v_balance_after INTEGER; +BEGIN + -- Lock e leitura + SELECT * INTO v_credit + FROM addon_credits + WHERE tenant_id = p_tenant_id AND addon_type = p_addon_type AND is_active = true + FOR UPDATE; + + IF NOT FOUND THEN + RETURN jsonb_build_object('success', false, 'reason', 'no_credits', 'balance', 0); + END IF; + + -- Verifica saldo + IF v_credit.balance <= 0 THEN + RETURN jsonb_build_object('success', false, 'reason', 'insufficient_balance', 'balance', 0); + END IF; + + -- Verifica rate limit di??rio + IF v_credit.daily_limit IS NOT NULL THEN + -- Reset se passou do dia + IF v_credit.daily_reset_at IS NULL OR v_credit.daily_reset_at < date_trunc('day', now()) THEN + UPDATE addon_credits SET daily_used = 0, daily_reset_at = date_trunc('day', now()) + interval '1 day' WHERE id = v_credit.id; + v_credit.daily_used := 0; + END IF; + + IF v_credit.daily_used >= v_credit.daily_limit THEN + RETURN jsonb_build_object('success', false, 'reason', 'daily_limit_reached', 'balance', v_credit.balance); + END IF; + END IF; + + -- Verifica rate limit hor??rio + IF v_credit.hourly_limit IS NOT NULL THEN + IF v_credit.hourly_reset_at IS NULL OR v_credit.hourly_reset_at < date_trunc('hour', now()) THEN + UPDATE addon_credits SET hourly_used = 0, hourly_reset_at = date_trunc('hour', now()) + interval '1 hour' WHERE id = v_credit.id; + v_credit.hourly_used := 0; + END IF; + + IF v_credit.hourly_used >= v_credit.hourly_limit THEN + RETURN jsonb_build_object('success', false, 'reason', 'hourly_limit_reached', 'balance', v_credit.balance); + END IF; + END IF; + + -- Verifica expira????o + IF v_credit.expires_at IS NOT NULL AND v_credit.expires_at < now() THEN + RETURN jsonb_build_object('success', false, 'reason', 'credits_expired', 'balance', v_credit.balance); + END IF; + + v_balance_before := v_credit.balance; + v_balance_after := v_credit.balance - 1; + + -- Debita + UPDATE addon_credits + SET balance = v_balance_after, + total_consumed = total_consumed + 1, + daily_used = COALESCE(daily_used, 0) + 1, + hourly_used = COALESCE(hourly_used, 0) + 1, + updated_at = now() + WHERE id = v_credit.id; + + -- Registra transa????o + INSERT INTO addon_transactions ( + tenant_id, addon_type, type, amount, + balance_before, balance_after, + queue_id, description + ) VALUES ( + p_tenant_id, p_addon_type, 'consume', -1, + v_balance_before, v_balance_after, + p_queue_id, p_description + ); + + RETURN jsonb_build_object( + 'success', true, + 'balance_before', v_balance_before, + 'balance_after', v_balance_after + ); +END; +$$; + +CREATE FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + v_is_native boolean; + v_fields int := 0; + v_logs int := 0; + v_parent int := 0; +begin + if auth.uid() is null then + raise exception 'Not authenticated'; + end if; + + if not exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + and tm.status = 'active' + ) then + raise exception 'Not allowed'; + end if; + + select dc.is_native + into v_is_native + from public.determined_commitments dc + where dc.tenant_id = p_tenant_id + and dc.id = p_commitment_id; + + if v_is_native is null then + raise exception 'Commitment not found'; + end if; + + if v_is_native = true then + raise exception 'Cannot delete native commitment'; + end if; + + delete from public.determined_commitment_fields + where tenant_id = p_tenant_id + and commitment_id = p_commitment_id; + get diagnostics v_fields = row_count; + + delete from public.commitment_time_logs + where tenant_id = p_tenant_id + and commitment_id = p_commitment_id; + get diagnostics v_logs = row_count; + + delete from public.determined_commitments + where tenant_id = p_tenant_id + and id = p_commitment_id; + get diagnostics v_parent = row_count; + + if v_parent <> 1 then + raise exception 'Parent not deleted (RLS/owner issue).'; + end if; + + return jsonb_build_object( + 'ok', true, + 'deleted', jsonb_build_object( + 'fields', v_fields, + 'logs', v_logs, + 'commitment', v_parent + ) + ); +end; +$$; + +CREATE FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + v_is_native boolean; + v_fields_deleted int := 0; + v_logs_deleted int := 0; + v_commitment_deleted int := 0; +begin + if auth.uid() is null then + raise exception 'Not authenticated'; + end if; + + if not exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + and tm.status = 'active' + ) then + raise exception 'Not allowed'; + end if; + + select dc.is_native + into v_is_native + from public.determined_commitments dc + where dc.tenant_id = p_tenant_id + and dc.id = p_commitment_id; + + if v_is_native is null then + raise exception 'Commitment not found for tenant'; + end if; + + if v_is_native = true then + raise exception 'Cannot delete native commitment'; + end if; + + delete from public.determined_commitment_fields f + where f.tenant_id = p_tenant_id + and f.commitment_id = p_commitment_id; + get diagnostics v_fields_deleted = row_count; + + delete from public.commitment_time_logs l + where l.tenant_id = p_tenant_id + and l.commitment_id = p_commitment_id; + get diagnostics v_logs_deleted = row_count; + + delete from public.determined_commitments dc + where dc.tenant_id = p_tenant_id + and dc.id = p_commitment_id; + get diagnostics v_commitment_deleted = row_count; + + if v_commitment_deleted <> 1 then + raise exception 'Delete did not remove the commitment (tenant mismatch?)'; + end if; + + return jsonb_build_object( + 'ok', true, + 'tenant_id', p_tenant_id, + 'commitment_id', p_commitment_id, + 'deleted', jsonb_build_object( + 'fields', v_fields_deleted, + 'logs', v_logs_deleted, + 'commitment', v_commitment_deleted + ) + ); +end; +$$; + +CREATE FUNCTION public.dev_list_auth_users(p_limit integer DEFAULT 50) RETURNS TABLE(id uuid, email text, created_at timestamp with time zone) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ +begin + -- s?? saas_admin pode ver + if not exists ( + select 1 + from public.profiles p + where p.id = auth.uid() + and p.role = 'saas_admin' + ) then + return; + end if; + + return query + select + u.id, + u.email, + u.created_at + from auth.users u + order by u.created_at desc + limit greatest(1, least(coalesce(p_limit, 50), 500)); +end; +$$; + +CREATE FUNCTION public.dev_list_custom_users() RETURNS TABLE(user_id uuid, email text, created_at timestamp with time zone, global_role text, tenant_role text, tenant_id uuid, password_dev text, kind text) + LANGUAGE sql SECURITY DEFINER + SET search_path TO 'public' + AS $$ + with base as ( + select + u.id as user_id, + lower(u.email) as email, + u.created_at + from auth.users u + where lower(u.email) not in ( + 'clinic@agenciapsi.com.br', + 'therapist@agenciapsi.com.br', + 'patient@agenciapsi.com.br', + 'saas@agenciapsi.com.br' + ) + ), + prof as ( + select p.id, p.role as global_role + from public.profiles p + ), + last_membership as ( + select distinct on (tm.user_id) + tm.user_id, + tm.tenant_id, + tm.role as tenant_role, + tm.created_at + from public.tenant_members tm + where tm.status = 'active' + order by tm.user_id, tm.created_at desc + ) + select + b.user_id, + b.email, + b.created_at, + pr.global_role, + lm.tenant_role, + lm.tenant_id, + dc.password_dev, + dc.kind + from base b + left join prof pr on pr.id = b.user_id + left join last_membership lm on lm.user_id = b.user_id + left join public.dev_user_credentials dc on lower(dc.email) = b.email + order by b.created_at desc; +$$; + +CREATE FUNCTION public.dev_list_intent_leads() RETURNS TABLE(email text, last_intent_at timestamp with time zone, plan_key text, billing_interval text, status text, tenant_id uuid) + LANGUAGE sql SECURITY DEFINER + SET search_path TO 'public' + AS $$ + select + lower(si.email) as email, + max(si.created_at) as last_intent_at, + (array_agg(si.plan_key order by si.created_at desc))[1] as plan_key, + (array_agg(si.interval order by si.created_at desc))[1] as billing_interval, + (array_agg(si.status order by si.created_at desc))[1] as status, + (array_agg(si.tenant_id order by si.created_at desc))[1] as tenant_id + from public.subscription_intents si + where si.email is not null + and not exists ( + select 1 + from auth.users au + where lower(au.email) = lower(si.email) + ) + group by lower(si.email) + order by max(si.created_at) desc; +$$; + +CREATE FUNCTION public.dev_public_debug_snapshot() RETURNS TABLE(users_total integer, tenants_total integer, intents_new_total integer, latest_intents jsonb) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $_$ +declare + v_latest jsonb; +begin + select jsonb_agg( + jsonb_build_object( + 'created_at', si.created_at, + 'email_masked', + regexp_replace(lower(si.email), '(^.).*(@.*$)', '\1***\2'), + 'plan_key', si.plan_key, + 'status', si.status + ) + order by si.created_at desc + ) + into v_latest + from ( + select si.* + from public.subscription_intents si + where si.email is not null + order by si.created_at desc + limit 5 + ) si; + + return query + select + (select count(*)::int from auth.users) as users_total, + (select count(*)::int from public.tenants) as tenants_total, + (select count(*)::int from public.subscription_intents where status = 'new') as intents_new_total, + coalesce(v_latest, '[]'::jsonb) as latest_intents; +end; +$_$; + +CREATE FUNCTION public.ensure_personal_tenant() RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_uid uuid; + v_existing uuid; +BEGIN + v_uid := auth.uid(); + IF v_uid IS NULL THEN + RAISE EXCEPTION 'Not authenticated'; + END IF; + + SELECT tm.tenant_id INTO v_existing + FROM public.tenant_members tm + JOIN public.tenants t ON t.id = tm.tenant_id + WHERE tm.user_id = v_uid + AND tm.status = 'active' + AND t.kind IN ('therapist', 'saas') + ORDER BY tm.created_at DESC + LIMIT 1; + + IF v_existing IS NOT NULL THEN + RETURN v_existing; + END IF; + + RETURN public.provision_account_tenant(v_uid, 'therapist'); +END; +$$; + +CREATE FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_uid uuid; + v_existing uuid; + v_tenant uuid; + v_email text; + v_name text; +begin + v_uid := p_user_id; + if v_uid is null then + raise exception 'Missing user id'; + end if; + + -- s?? considera tenant pessoal (kind='saas') + select tm.tenant_id + into v_existing + from public.tenant_members tm + join public.tenants t on t.id = tm.tenant_id + where tm.user_id = v_uid + and tm.status = 'active' + and t.kind = 'saas' + order by tm.created_at desc + limit 1; + + if v_existing is not null then + return v_existing; + end if; + + select email into v_email + from auth.users + where id = v_uid; + + v_name := coalesce(split_part(v_email, '@', 1), 'Conta'); + + insert into public.tenants (name, kind, created_at) + values (v_name || ' (Pessoal)', 'saas', now()) + returning id into v_tenant; + + insert into public.tenant_members (tenant_id, user_id, role, status, created_at) + values (v_tenant, v_uid, 'tenant_admin', 'active', now()); + + return v_tenant; +end; +$$; + +CREATE FUNCTION public.faq_votar(faq_id uuid) RETURNS void + LANGUAGE sql SECURITY DEFINER + AS $$ + update public.saas_faq + set votos = votos + 1, + updated_at = now() + where id = faq_id + and ativo = true; +$$; + +CREATE FUNCTION public.fix_all_subscription_mismatches() RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + r record; +begin + for r in + select distinct s.user_id as owner_id + from public.subscriptions s + where s.status = 'active' + and s.user_id is not null + loop + perform public.rebuild_owner_entitlements(r.owner_id); + end loop; +end; +$$; + +CREATE FUNCTION public.fn_agenda_regras_semanais_no_overlap() RETURNS trigger + LANGUAGE plpgsql + AS $$ +declare + v_count int; +begin + if new.ativo is false then + return new; + end if; + + select count(*) into v_count + from public.agenda_regras_semanais r + where r.owner_id = new.owner_id + and r.dia_semana = new.dia_semana + and r.ativo is true + and (tg_op = 'INSERT' or r.id <> new.id) + and (new.hora_inicio < r.hora_fim and new.hora_fim > r.hora_inicio); + + if v_count > 0 then + raise exception 'Janela sobreposta: j?? existe uma regra ativa nesse intervalo.'; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.fn_document_signature_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_patient_id uuid; + v_tenant_id uuid; + v_doc_nome text; +BEGIN + IF NEW.status = 'assinado' AND (OLD.status IS NULL OR OLD.status <> 'assinado') THEN + SELECT d.patient_id, d.tenant_id, d.nome_original + INTO v_patient_id, v_tenant_id, v_doc_nome + FROM public.documents d + WHERE d.id = NEW.documento_id; + + IF v_patient_id IS NOT NULL THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, evento_tipo, + titulo, descricao, icone_cor, + link_ref_tipo, link_ref_id, + gerado_por, ocorrido_em + ) VALUES ( + v_patient_id, + v_tenant_id, + 'documento_assinado', + 'Documento assinado: ' || COALESCE(v_doc_nome, 'documento'), + 'Assinado por ' || COALESCE(NEW.signatario_nome, NEW.signatario_tipo), + 'green', + 'documento', + NEW.documento_id, + NEW.signatario_id, + NEW.assinado_em + ); + END IF; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.fn_documents_timeline_insert() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, evento_tipo, + titulo, descricao, icone_cor, + link_ref_tipo, link_ref_id, + gerado_por, ocorrido_em + ) VALUES ( + NEW.patient_id, + NEW.tenant_id, + 'documento_adicionado', + 'Documento adicionado: ' || COALESCE(NEW.nome_original, 'arquivo'), + 'Tipo: ' || COALESCE(NEW.tipo_documento, 'outro'), + 'blue', + 'documento', + NEW.id, + NEW.uploaded_by, + NEW.uploaded_at + ); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text DEFAULT 'month'::text) RETURNS TABLE(group_key text, group_label text, total_receitas numeric, total_despesas numeric, saldo numeric, total_pendente numeric, total_overdue numeric, count_records bigint) + LANGUAGE sql STABLE SECURITY DEFINER + SET search_path TO 'public' + AS $$ + + -- ?????? Valida p_group_by antes de executar ?????????????????????????????????????????????????????????????????????????????????????????????????????? + -- (lan??a erro se valor inv??lido; plpgsql seria necess??rio para isso em SQL puro, + -- ent??o usamos um CTE de valida????o com CASE WHEN para retornar vazio em vez de erro) + + WITH base AS ( + SELECT + fr.type, + fr.amount, + fr.final_amount, + fr.status, + fr.deleted_at, + -- Chave de agrupamento calculada conforme p_group_by + CASE p_group_by + WHEN 'month' THEN TO_CHAR( + COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), + 'YYYY-MM' + ) + WHEN 'week' THEN TO_CHAR( + COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), + 'IYYY-"W"IW' + ) + WHEN 'category' THEN COALESCE(fr.category_id::TEXT, fr.category, 'sem_categoria') + WHEN 'patient' THEN COALESCE(fr.patient_id::TEXT, 'sem_paciente') + ELSE NULL -- group_by inv??lido ??? group_key NULL ??? retorno vazio + END AS gkey, + -- Label leg??vel (enriquecido via JOIN abaixo quando poss??vel) + CASE p_group_by + WHEN 'month' THEN TO_CHAR( + COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), + 'YYYY-MM' + ) + WHEN 'week' THEN TO_CHAR( + COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), + 'IYYY-"W"IW' + ) + WHEN 'category' THEN COALESCE(fc.name, fr.category, 'Sem categoria') + WHEN 'patient' THEN COALESCE(p.nome_completo, fr.patient_id::TEXT, 'Sem paciente') + ELSE NULL + END AS glabel + FROM public.financial_records fr + LEFT JOIN public.financial_categories fc + ON fc.id = fr.category_id + LEFT JOIN public.patients p + ON p.id = fr.patient_id + WHERE fr.owner_id = p_owner_id + AND fr.deleted_at IS NULL + AND COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE) + BETWEEN p_start_date AND p_end_date + ) + + SELECT + gkey AS group_key, + glabel AS group_label, + + COALESCE(SUM(final_amount) FILTER (WHERE type = 'receita' AND status = 'paid'), 0) + AS total_receitas, + + COALESCE(SUM(final_amount) FILTER (WHERE type = 'despesa' AND status = 'paid'), 0) + AS total_despesas, + + COALESCE(SUM(final_amount) FILTER (WHERE type = 'receita' AND status = 'paid'), 0) + - COALESCE(SUM(final_amount) FILTER (WHERE type = 'despesa' AND status = 'paid'), 0) + AS saldo, + + COALESCE(SUM(final_amount) FILTER (WHERE status = 'pending'), 0) AS total_pendente, + + COALESCE(SUM(final_amount) FILTER (WHERE status = 'overdue'), 0) AS total_overdue, + + COUNT(*) AS count_records + + FROM base + WHERE gkey IS NOT NULL -- descarta p_group_by inv??lido + GROUP BY gkey, glabel + ORDER BY gkey ASC; + +$$; + +CREATE FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) RETURNS TABLE(total_receitas numeric, total_despesas numeric, total_pendente numeric, saldo_liquido numeric, total_repasse numeric, count_receitas bigint, count_despesas bigint) + LANGUAGE sql STABLE SECURITY DEFINER + SET search_path TO 'public' + AS $$ + SELECT + -- Receitas pagas no per??odo + COALESCE(SUM(amount) FILTER ( + WHERE type = 'receita' AND status = 'paid' + ), 0) AS total_receitas, + + -- Despesas pagas no per??odo + COALESCE(SUM(amount) FILTER ( + WHERE type = 'despesa' AND status = 'paid' + ), 0) AS total_despesas, + + -- Tudo pendente ou vencido (receitas + despesas) + COALESCE(SUM(amount) FILTER ( + WHERE status IN ('pending', 'overdue') + ), 0) AS total_pendente, + + -- Saldo l??quido (receitas pagas ??? despesas pagas) + COALESCE(SUM(amount) FILTER ( + WHERE type = 'receita' AND status = 'paid' + ), 0) + - COALESCE(SUM(amount) FILTER ( + WHERE type = 'despesa' AND status = 'paid' + ), 0) AS saldo_liquido, + + -- Total repassado ?? cl??nica (apenas receitas pagas) + COALESCE(SUM(clinic_fee_amount) FILTER ( + WHERE type = 'receita' AND status = 'paid' + ), 0) AS total_repasse, + + -- Contadores (excluindo soft-deleted) + COUNT(*) FILTER (WHERE type = 'receita' AND deleted_at IS NULL) AS count_receitas, + COUNT(*) FILTER (WHERE type = 'despesa' AND deleted_at IS NULL) AS count_despesas + + FROM public.financial_records + WHERE owner_id = p_owner_id + AND deleted_at IS NULL + AND EXTRACT(YEAR FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_year + AND EXTRACT(MONTH FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_month; +$$; + +CREATE FUNCTION public.get_my_email() RETURNS text + LANGUAGE sql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ + select lower(email) + from auth.users + where id = auth.uid(); +$$; + +CREATE FUNCTION public.guard_account_type_immutable() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF OLD.account_type <> 'free' AND NEW.account_type IS DISTINCT FROM OLD.account_type THEN + RAISE EXCEPTION 'account_type ?? imut??vel ap??s escolha (atual: "%" para tentativa: "%"). Para mudar de perfil, crie uma nova conta.', OLD.account_type, NEW.account_type + USING ERRCODE = 'P0001'; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.guard_locked_commitment() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if (old.is_locked = true) then + if (tg_op = 'DELETE') then + raise exception 'Compromisso bloqueado n??o pode ser exclu??do.'; + end if; + + if (tg_op = 'UPDATE') then + if (new.active = false) then + raise exception 'Compromisso bloqueado n??o pode ser desativado.'; + end if; + + -- trava renomear (mant??m o "Sess??o" sempre igual) + if (new.name is distinct from old.name) then + raise exception 'Compromisso bloqueado n??o pode ser renomeado.'; + end if; + + -- se quiser travar descri????o tamb??m, descomente: + -- if (new.description is distinct from old.description) then + -- raise exception 'Compromisso bloqueado n??o pode alterar descri????o.'; + -- end if; + end if; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.guard_no_change_core_plan_key() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') + and new.key is distinct from old.key then + raise exception 'N??o ?? permitido alterar a key do plano padr??o (%).', old.key + using errcode = 'P0001'; + end if; + + return new; +end $$; + +CREATE FUNCTION public.guard_no_change_plan_target() RETURNS trigger + LANGUAGE plpgsql + AS $$ +declare + v_bypass text; +begin + -- bypass controlado por sess??o/transa????o: + -- s?? passa se app.plan_migration_bypass = '1' + v_bypass := current_setting('app.plan_migration_bypass', true); + + if v_bypass = '1' then + return new; + end if; + + -- comportamento original (bloqueia qualquer mudan??a) + if new.target is distinct from old.target then + raise exception 'N??o ?? permitido alterar target do plano (%) de % para %.', + old.key, old.target, new.target + using errcode = 'P0001'; + end if; + + return new; +end +$$; + +CREATE FUNCTION public.guard_no_delete_core_plans() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') then + raise exception 'Plano padr??o (%) n??o pode ser removido.', old.key + using errcode = 'P0001'; + end if; + + return old; +end $$; + +CREATE FUNCTION public.guard_patient_cannot_own_tenant() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + v_account_type text; +BEGIN + SELECT account_type INTO v_account_type + FROM public.profiles + WHERE id = NEW.user_id; + + IF v_account_type = 'patient' AND NEW.role IN ('tenant_admin', 'therapist') THEN + RAISE EXCEPTION 'Usu??rio com perfil "patient" n??o pode ser propriet??rio ou terapeuta de um tenant. Se tornou profissional? Crie uma nova conta.' + USING ERRCODE = 'P0001'; + END IF; + + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.guard_tenant_kind_immutable() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF NEW.kind IS DISTINCT FROM OLD.kind THEN + RAISE EXCEPTION 'tenants.kind ?? imut??vel ap??s cria????o. Tentativa de alterar "%" para "%".', OLD.kind, NEW.kind + USING ERRCODE = 'P0001'; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.handle_new_user() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + INSERT INTO public.profiles (id, role, account_type) + VALUES (NEW.id, 'portal_user', 'free') + ON CONFLICT (id) DO NOTHING; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.handle_new_user_create_personal_tenant() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + -- Desabilitado. Tenant criado no onboarding via provision_account_tenant(). + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 + from public.owner_feature_entitlements e + where e.owner_id = p_owner_id + and e.feature_key = p_feature_key + ); +$$; + +CREATE FUNCTION public.is_clinic_tenant(_tenant_id uuid) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + SELECT EXISTS ( + SELECT 1 FROM public.tenants t + WHERE t.id = _tenant_id + AND t.kind IN ('clinic', 'clinic_coworking', 'clinic_reception', 'clinic_full') + ); +$$; + +CREATE FUNCTION public.is_saas_admin() RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 from public.saas_admins sa + where sa.user_id = auth.uid() + ); +$$; + +CREATE FUNCTION public.is_tenant_admin(p_tenant_id uuid) RETURNS boolean + LANGUAGE sql STABLE SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ + select exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + and tm.role = 'tenant_admin' + and tm.status = 'active' + ); +$$; + +CREATE FUNCTION public.is_tenant_member(_tenant_id uuid) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 + from public.tenant_members m + where m.tenant_id = _tenant_id + and m.user_id = auth.uid() + and m.status = 'active' + ); +$$; + +CREATE FUNCTION public.is_therapist_tenant(_tenant_id uuid) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + SELECT EXISTS ( + SELECT 1 FROM public.tenants t + WHERE t.id = _tenant_id AND t.kind = 'therapist' + ); +$$; + +CREATE FUNCTION public.jwt_email() RETURNS text + LANGUAGE sql STABLE + AS $$ + select nullif(lower(current_setting('request.jwt.claim.email', true)), ''); +$$; + +CREATE FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer DEFAULT NULL::integer, p_month integer DEFAULT NULL::integer, p_type text DEFAULT NULL::text, p_status text DEFAULT NULL::text, p_patient_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0) RETURNS SETOF public.financial_records + LANGUAGE sql STABLE SECURITY DEFINER + SET search_path TO 'public' + AS $$ + SELECT * + FROM public.financial_records + WHERE owner_id = p_owner_id + AND deleted_at IS NULL + AND (p_type IS NULL OR type::TEXT = p_type) + AND (p_status IS NULL OR status = p_status) + AND (p_patient_id IS NULL OR patient_id = p_patient_id) + AND (p_year IS NULL OR EXTRACT(YEAR FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_year) + AND (p_month IS NULL OR EXTRACT(MONTH FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_month) + ORDER BY COALESCE(paid_at, due_date::TIMESTAMPTZ, created_at) DESC + LIMIT p_limit + OFFSET p_offset; +$$; + +CREATE FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) RETURNS SETOF public.financial_records + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_record public.financial_records%ROWTYPE; +BEGIN + -- Garante que o registro pertence ao usu??rio autenticado (RLS n??o aplica em SECURITY DEFINER) + SELECT * INTO v_record + FROM public.financial_records + WHERE id = p_financial_record_id + AND owner_id = auth.uid() + AND deleted_at IS NULL; + + IF NOT FOUND THEN + RAISE EXCEPTION 'Registro financeiro n??o encontrado ou sem permiss??o.'; + END IF; + + IF v_record.status NOT IN ('pending', 'overdue') THEN + RAISE EXCEPTION 'Apenas cobran??as pendentes ou vencidas podem ser marcadas como pagas.'; + END IF; + + UPDATE public.financial_records + SET status = 'paid', + paid_at = NOW(), + payment_method = p_payment_method, + updated_at = NOW() + WHERE id = p_financial_record_id + RETURNING * INTO v_record; + + RETURN NEXT v_record; +END; +$$; + +CREATE FUNCTION public.mark_payout_as_paid(p_payout_id uuid) RETURNS public.therapist_payouts + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_payout public.therapist_payouts%ROWTYPE; +BEGIN + -- Busca o payout + SELECT * INTO v_payout + FROM public.therapist_payouts + WHERE id = p_payout_id; + + IF NOT FOUND THEN + RAISE EXCEPTION 'Repasse n??o encontrado: %', p_payout_id; + END IF; + + -- Verifica permiss??o: apenas tenant_admin do tenant do repasse + IF NOT public.is_tenant_admin(v_payout.tenant_id) THEN + RAISE EXCEPTION 'Apenas o administrador da cl??nica pode marcar repasses como pagos.'; + END IF; + + -- Verifica status + IF v_payout.status <> 'pending' THEN + RAISE EXCEPTION + 'Repasse j?? est?? com status ''%''. Apenas repasses pendentes podem ser pagos.', + v_payout.status; + END IF; + + -- Atualiza + UPDATE public.therapist_payouts + SET + status = 'paid', + paid_at = NOW(), + updated_at = NOW() + WHERE id = p_payout_id + RETURNING * INTO v_payout; + + RETURN v_payout; +END; +$$; + +CREATE FUNCTION public.my_tenants() RETURNS TABLE(tenant_id uuid, role text, status text, kind text) + LANGUAGE sql STABLE + AS $$ + select + tm.tenant_id, + tm.role, + tm.status, + t.kind + from public.tenant_members tm + join public.tenants t on t.id = tm.tenant_id + where tm.user_id = auth.uid(); +$$; + +CREATE FUNCTION public.notice_track_click(p_notice_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +begin + update public.global_notices + set clicks_count = clicks_count + 1 + where id = p_notice_id; +end; +$$; + +CREATE FUNCTION public.notice_track_view(p_notice_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +begin + update public.global_notices + set views_count = views_count + 1 + where id = p_notice_id; +end; +$$; + +CREATE FUNCTION public.notify_on_intake() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF NEW.status = 'new' THEN + INSERT INTO public.notifications ( + owner_id, + tenant_id, + type, + ref_id, + ref_table, + payload + ) + VALUES ( + NEW.owner_id, + NEW.tenant_id, + 'new_patient', + NEW.id, + 'patient_intake_requests', + jsonb_build_object( + 'title', 'Novo cadastro externo', + 'detail', COALESCE(NEW.nome_completo, 'Paciente'), + 'deeplink', '/therapist/patients/cadastro/recebidos', + 'avatar_initials', upper(left(COALESCE(NEW.nome_completo, '?'), 2)) + ) + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.notify_on_scheduling() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ BEGIN IF NEW.status = 'pendente' THEN + INSERT INTO public.notifications ( owner_id, tenant_id, type, ref_id, ref_table, payload ) VALUES ( + NEW.owner_id, NEW.tenant_id, + 'new_scheduling', NEW.id, 'agendador_solicitacoes', jsonb_build_object( 'title', 'Nova solicita????o de agendamento', 'detail', COALESCE(NEW.paciente_nome, 'Paciente') || ' ' || COALESCE(NEW.paciente_sobrenome, '') || ' ??? ' || COALESCE(NEW.tipo, ''), 'deeplink', '/therapist/agendamentos-recebidos', 'avatar_initials', upper(left(COALESCE(NEW.paciente_nome, '?'), 1) || left(COALESCE(NEW.paciente_sobrenome, ''), 1)) ) ); END IF; RETURN NEW; END; $$; + +CREATE FUNCTION public.notify_on_session_status() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_nome text; +BEGIN + IF NEW.status IN ('faltou', 'cancelado') AND OLD.status IS DISTINCT FROM NEW.status THEN + + SELECT nome_completo + INTO v_nome + FROM public.patients + WHERE id = NEW.patient_id + LIMIT 1; + + INSERT INTO public.notifications ( + owner_id, + tenant_id, + type, + ref_id, + ref_table, + payload + ) + VALUES ( + NEW.owner_id, + NEW.tenant_id, + 'session_status', + NEW.id, + 'agenda_eventos', + jsonb_build_object( + 'title', CASE WHEN NEW.status = 'faltou' THEN 'Paciente faltou' ELSE 'Sess??o cancelada' END, + 'detail', COALESCE(v_nome, 'Paciente') || ' ??? ' || to_char(NEW.inicio_em, 'DD/MM HH24:MI'), + 'deeplink', '/therapist/agenda', + 'avatar_initials', upper(left(COALESCE(v_nome, '?'), 2)) + ) + ); + + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.on_new_user_seed_patient_groups() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ + BEGIN + PERFORM public.seed_default_patient_groups(NEW.id); + RETURN NEW; + END; + $$; + +CREATE FUNCTION public.patients_validate_member_consistency() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + v_tenant_responsible uuid; + v_tenant_therapist uuid; +BEGIN + -- responsible_member sempre deve existir e ser do tenant + SELECT tenant_id INTO v_tenant_responsible + FROM public.tenant_members + WHERE id = NEW.responsible_member_id; + + IF v_tenant_responsible IS NULL THEN + RAISE EXCEPTION 'Responsible member not found'; + END IF; + + IF NEW.tenant_id IS NULL THEN + RAISE EXCEPTION 'tenant_id is required'; + END IF; + + IF v_tenant_responsible <> NEW.tenant_id THEN + RAISE EXCEPTION 'Responsible member must belong to the same tenant'; + END IF; + + -- therapist scope: therapist_member_id deve existir e ser do mesmo tenant + IF NEW.patient_scope = 'therapist' THEN + IF NEW.therapist_member_id IS NULL THEN + RAISE EXCEPTION 'therapist_member_id is required when patient_scope=therapist'; + END IF; + + SELECT tenant_id INTO v_tenant_therapist + FROM public.tenant_members + WHERE id = NEW.therapist_member_id; + + IF v_tenant_therapist IS NULL THEN + RAISE EXCEPTION 'Therapist member not found'; + END IF; + + IF v_tenant_therapist <> NEW.tenant_id THEN + RAISE EXCEPTION 'Therapist member must belong to the same tenant'; + END IF; + END IF; + + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.patients_validate_responsible_member_tenant() RETURNS trigger + LANGUAGE plpgsql + AS $$ +declare + m_tenant uuid; +begin + select tenant_id into m_tenant + from public.tenant_members + where id = new.responsible_member_id; + + if m_tenant is null then + raise exception 'Responsible member not found'; + end if; + + if new.tenant_id is null then + raise exception 'tenant_id is required'; + end if; + + if m_tenant <> new.tenant_id then + raise exception 'Responsible member must belong to the same tenant'; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.populate_notification_queue() RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + INSERT INTO public.notification_queue ( + tenant_id, owner_id, agenda_evento_id, patient_id, + channel, template_key, schedule_key, + resolved_vars, recipient_address, + scheduled_at, idempotency_key + ) + SELECT + ae.tenant_id, + ae.owner_id, + ae.id AS agenda_evento_id, + ae.patient_id, + ch.channel, + 'session.' || REPLACE(ns.event_type, '_sessao', '') || '.' || ch.channel, + ns.schedule_key, + jsonb_build_object( + 'nome_paciente', COALESCE(p.nome_completo, 'Paciente'), + 'data_sessao', TO_CHAR(ae.inicio_em AT TIME ZONE 'America/Sao_Paulo', 'DD/MM/YYYY'), + 'hora_sessao', TO_CHAR(ae.inicio_em AT TIME ZONE 'America/Sao_Paulo', 'HH24:MI'), + 'nome_terapeuta', COALESCE(prof.full_name, 'Terapeuta'), + 'modalidade', COALESCE(ae.modalidade, 'Presencial'), + 'titulo', COALESCE(ae.titulo, 'Sess??o') + ), + CASE ch.channel + WHEN 'whatsapp' THEN COALESCE(p.telefone, '') + WHEN 'sms' THEN COALESCE(p.telefone, '') + WHEN 'email' THEN COALESCE(p.email_principal, '') + END, + CASE + WHEN (ae.inicio_em - (ns.offset_minutes || ' minutes')::interval)::time + < ns.allowed_time_start + THEN DATE_TRUNC('day', ae.inicio_em - (ns.offset_minutes || ' minutes')::interval) + + ns.allowed_time_start + WHEN (ae.inicio_em - (ns.offset_minutes || ' minutes')::interval)::time + > ns.allowed_time_end + THEN DATE_TRUNC('day', ae.inicio_em - (ns.offset_minutes || ' minutes')::interval) + + ns.allowed_time_start + ELSE ae.inicio_em - (ns.offset_minutes || ' minutes')::interval + END, + ae.id::text || ':' || ns.schedule_key || ':' || ch.channel || ':' + || ae.inicio_em::date::text + FROM public.agenda_eventos ae + JOIN public.patients p ON p.id = ae.patient_id + LEFT JOIN public.profiles prof ON prof.id = ae.owner_id + JOIN public.notification_schedules ns + ON ns.owner_id = ae.owner_id + AND ns.is_active = true + AND ns.deleted_at IS NULL + AND ns.trigger_type = 'before_event' + AND ns.event_type = 'lembrete_sessao' + JOIN public.notification_channels nc + ON nc.owner_id = ae.owner_id + AND nc.is_active = true + AND nc.deleted_at IS NULL + CROSS JOIN LATERAL ( + SELECT 'whatsapp' AS channel WHERE ns.whatsapp_enabled AND nc.channel = 'whatsapp' + UNION ALL + SELECT 'email' AS channel WHERE ns.email_enabled AND nc.channel = 'email' + UNION ALL + SELECT 'sms' AS channel WHERE ns.sms_enabled AND nc.channel = 'sms' + ) ch + LEFT JOIN public.notification_preferences np + ON np.patient_id = ae.patient_id + AND np.owner_id = ae.owner_id + AND np.deleted_at IS NULL + WHERE + ae.inicio_em > now() + AND ae.inicio_em <= now() + interval '48 hours' + AND ae.status NOT IN ('cancelado', 'faltou') + AND CASE ch.channel + WHEN 'whatsapp' THEN COALESCE(p.telefone, '') != '' + WHEN 'sms' THEN COALESCE(p.telefone, '') != '' + WHEN 'email' THEN COALESCE(p.email_principal, '') != '' + END + AND CASE ch.channel + WHEN 'whatsapp' THEN COALESCE(np.whatsapp_opt_in, true) + WHEN 'email' THEN COALESCE(np.email_opt_in, true) + WHEN 'sms' THEN COALESCE(np.sms_opt_in, false) + END + AND EXISTS ( + SELECT 1 FROM public.profiles tp + WHERE tp.id = ae.owner_id + AND COALESCE(tp.notify_reminders, true) = true + ) + ON CONFLICT (idempotency_key) DO NOTHING; +END; +$$; + +CREATE FUNCTION public.prevent_promoting_to_system() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if new.is_system = true and old.is_system is distinct from true then + raise exception 'N??o ?? permitido transformar um grupo comum em grupo do sistema.'; + end if; + return new; +end; +$$; + +CREATE FUNCTION public.prevent_saas_membership() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF EXISTS ( + SELECT 1 + FROM public.profiles + WHERE id = NEW.user_id + AND role = 'saas_admin' + ) THEN + RAISE EXCEPTION 'SaaS admin cannot belong to tenant'; + END IF; + + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.prevent_system_group_changes() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + -- Se for grupo do sistema, regras r??gidas: + if old.is_system = true then + + -- nunca pode deletar + if tg_op = 'DELETE' then + raise exception 'Grupos padr??o do sistema n??o podem ser alterados ou exclu??dos.'; + end if; + + if tg_op = 'UPDATE' then + -- permite SOMENTE mudar tenant_id e/ou updated_at + -- qualquer mudan??a de conte??do permanece proibida + if + new.nome is distinct from old.nome or + new.descricao is distinct from old.descricao or + new.cor is distinct from old.cor or + new.is_active is distinct from old.is_active or + new.is_system is distinct from old.is_system or + new.owner_id is distinct from old.owner_id or + new.therapist_id is distinct from old.therapist_id or + new.created_at is distinct from old.created_at + then + raise exception 'Grupos padr??o do sistema n??o podem ser alterados ou exclu??dos.'; + end if; + + -- chegou aqui: s?? tenant_id/updated_at mudaram -> ok + return new; + end if; + + end if; + + -- n??o-system: deixa passar + if tg_op = 'DELETE' then + return old; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text DEFAULT NULL::text) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_tenant_id uuid; + v_account_type text; + v_name text; +BEGIN + IF p_kind NOT IN ('therapist', 'clinic_coworking', 'clinic_reception', 'clinic_full') THEN + RAISE EXCEPTION 'kind inv??lido: "%". Use: therapist, clinic_coworking, clinic_reception, clinic_full.', p_kind + USING ERRCODE = 'P0001'; + END IF; + + v_account_type := CASE WHEN p_kind = 'therapist' THEN 'therapist' ELSE 'clinic' END; + + IF EXISTS ( + SELECT 1 + FROM public.tenant_members tm + JOIN public.tenants t ON t.id = tm.tenant_id + WHERE tm.user_id = p_user_id + AND tm.role = 'tenant_admin' + AND tm.status = 'active' + AND t.kind = p_kind + ) THEN + RAISE EXCEPTION 'Usu??rio j?? possui um tenant do tipo "%".', p_kind + USING ERRCODE = 'P0001'; + END IF; + + v_name := COALESCE( + NULLIF(TRIM(p_name), ''), + ( + SELECT COALESCE(NULLIF(TRIM(pr.full_name), ''), SPLIT_PART(au.email, '@', 1)) + FROM public.profiles pr + JOIN auth.users au ON au.id = pr.id + WHERE pr.id = p_user_id + ), + 'Conta' + ); + + INSERT INTO public.tenants (name, kind, created_at) + VALUES (v_name, p_kind, now()) + RETURNING id INTO v_tenant_id; + + INSERT INTO public.tenant_members (tenant_id, user_id, role, status, created_at) + VALUES (v_tenant_id, p_user_id, 'tenant_admin', 'active', now()); + + UPDATE public.profiles + SET account_type = v_account_type + WHERE id = p_user_id; + + PERFORM public.seed_determined_commitments(v_tenant_id); + + RETURN v_tenant_id; +END; +$$; + +CREATE FUNCTION public.reactivate_subscription(p_subscription_id uuid) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_sub public.subscriptions; + v_owner_type text; + v_owner_ref uuid; +begin + + select * + into v_sub + from public.subscriptions + where id = p_subscription_id + for update; + + if not found then + raise exception 'Subscription n??o encontrada'; + end if; + + if v_sub.status = 'active' then + return v_sub; + end if; + + if v_sub.tenant_id is not null then + v_owner_type := 'clinic'; + v_owner_ref := v_sub.tenant_id; + elsif v_sub.user_id is not null then + v_owner_type := 'therapist'; + v_owner_ref := v_sub.user_id; + else + v_owner_type := null; + v_owner_ref := null; + end if; + + update public.subscriptions + set status = 'active', + cancel_at_period_end = false, + updated_at = now() + where id = p_subscription_id + returning * into v_sub; + + insert into public.subscription_events( + subscription_id, + owner_id, + owner_type, + owner_ref, + event_type, + old_plan_id, + new_plan_id, + created_by, + reason, + source, + metadata + ) + values ( + v_sub.id, + v_owner_ref, + v_owner_type, + v_owner_ref, + 'reactivated', + v_sub.plan_id, + v_sub.plan_id, + auth.uid(), + 'Reativa????o manual via admin', + 'admin_panel', + jsonb_build_object('previous_status', 'canceled') + ); + + if v_owner_ref is not null then + insert into public.entitlements_invalidation(owner_id, changed_at) + values (v_owner_ref, now()) + on conflict (owner_id) + do update set changed_at = excluded.changed_at; + end if; + + return v_sub; + +end; +$$; + +CREATE FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_plan_id uuid; +begin + -- Plano ativo do owner (owner = subscriptions.user_id) + select s.plan_id + into v_plan_id + from public.subscriptions s + where s.user_id = p_owner_id + and s.status = 'active' + order by s.created_at desc + limit 1; + + -- Sempre zera entitlements do owner (rebuild) + delete from public.owner_feature_entitlements e + where e.owner_id = p_owner_id; + + -- Se n??o tem assinatura ativa, acabou + if v_plan_id is null then + return; + end if; + + -- Recria entitlements esperados pelo plano + insert into public.owner_feature_entitlements (owner_id, feature_key, sources, limits_list) + select + p_owner_id as owner_id, + f.key as feature_key, + array['plan'::text] as sources, + '{}'::jsonb as limits_list + from public.plan_features pf + join public.features f on f.id = pf.feature_id + where pf.plan_id = v_plan_id; + +end; +$$; + +CREATE FUNCTION public.revoke_support_session(p_token text) RETURNS boolean + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_admin_id uuid; + v_role text; +BEGIN + v_admin_id := auth.uid(); + IF v_admin_id IS NULL THEN + RAISE EXCEPTION 'N??o autenticado.' USING ERRCODE = 'P0001'; + END IF; + + SELECT role INTO v_role FROM public.profiles WHERE id = v_admin_id; + IF v_role <> 'saas_admin' THEN + RAISE EXCEPTION 'Acesso negado.' USING ERRCODE = 'P0002'; + END IF; + + DELETE FROM public.support_sessions + WHERE token = p_token + AND admin_id = v_admin_id; + + RETURN FOUND; +END; +$$; + +CREATE FUNCTION public.rotate_patient_invite_token(p_new_token text) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + v_uid uuid; + v_id uuid; +begin + -- pega o usu??rio logado + v_uid := auth.uid(); + if v_uid is null then + raise exception 'Usu??rio n??o autenticado'; + end if; + + -- desativa tokens antigos ativos do usu??rio + update public.patient_invites + set active = false + where owner_id = v_uid + and active = true; + + -- cria novo token + insert into public.patient_invites (owner_id, token, active) + values (v_uid, p_new_token, true) + returning id into v_id; + + return v_id; +end; +$$; + +CREATE FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_uid uuid := auth.uid(); + v_voto_antigo boolean; +begin + if v_uid is null then + raise exception 'N??o autenticado'; + end if; + + -- Verifica se j?? votou + select util into v_voto_antigo + from public.saas_doc_votos + where doc_id = p_doc_id and user_id = v_uid; + + if found then + -- J?? votou igual ??? cancela o voto (toggle) + if v_voto_antigo = p_util then + delete from public.saas_doc_votos + where doc_id = p_doc_id and user_id = v_uid; + + update public.saas_docs set + votos_util = greatest(0, votos_util - (case when p_util then 1 else 0 end)), + votos_nao_util = greatest(0, votos_nao_util - (case when not p_util then 1 else 0 end)), + updated_at = now() + where id = p_doc_id; + + return jsonb_build_object('acao', 'removido', 'util', null); + else + -- Mudou de voto + update public.saas_doc_votos set util = p_util, updated_at = now() + where doc_id = p_doc_id and user_id = v_uid; + + update public.saas_docs set + votos_util = greatest(0, votos_util + (case when p_util then 1 else -1 end)), + votos_nao_util = greatest(0, votos_nao_util + (case when not p_util then 1 else -1 end)), + updated_at = now() + where id = p_doc_id; + + return jsonb_build_object('acao', 'atualizado', 'util', p_util); + end if; + else + -- Primeiro voto + insert into public.saas_doc_votos (doc_id, user_id, util) + values (p_doc_id, v_uid, p_util); + + update public.saas_docs set + votos_util = votos_util + (case when p_util then 1 else 0 end), + votos_nao_util = votos_nao_util + (case when not p_util then 1 else 0 end), + updated_at = now() + where id = p_doc_id; + + return jsonb_build_object('acao', 'registrado', 'util', p_util); + end if; +end; +$$; + +CREATE FUNCTION public.safe_delete_patient(p_patient_id uuid) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + -- Bloqueia se houver hist??rico + IF NOT public.can_delete_patient(p_patient_id) THEN + RETURN jsonb_build_object( + 'ok', false, + 'error', 'has_history', + 'message', 'Este paciente possui hist??rico cl??nico ou financeiro e n??o pode ser removido. Voc?? pode desativar ou arquivar o paciente.' + ); + END IF; + + -- Verifica ownership via RLS (owner_id ou responsible_member_id) + IF NOT EXISTS ( + SELECT 1 FROM public.patients + WHERE id = p_patient_id + AND ( + owner_id = auth.uid() + OR responsible_member_id IN ( + SELECT id FROM public.tenant_members WHERE user_id = auth.uid() + ) + ) + ) THEN + RETURN jsonb_build_object( + 'ok', false, + 'error', 'forbidden', + 'message', 'Sem permiss??o para excluir este paciente.' + ); + END IF; + + DELETE FROM public.patients WHERE id = p_patient_id; + + RETURN jsonb_build_object('ok', true); +END; +$$; + +CREATE FUNCTION public.sanitize_phone_br(raw_phone text) RETURNS text + LANGUAGE plpgsql IMMUTABLE + AS $$ DECLARE digits text; + BEGIN + digits := regexp_replace(COALESCE(raw_phone, ''), '[^0-9]', '', 'g'); + IF digits = '' THEN RETURN ''; END IF; + IF length(digits) = 10 OR length(digits) = 11 THEN + digits := '55' || digits; + END IF; + RETURN digits; + END; $$; + +CREATE FUNCTION public.seed_default_financial_categories(p_user_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + INSERT INTO public.financial_categories (user_id, name, type, color, icon, sort_order) + VALUES + (p_user_id, 'Sess??o', 'receita', '#22c55e', 'pi pi-heart', 1), + (p_user_id, 'Supervis??o', 'receita', '#6366f1', 'pi pi-users', 2), + (p_user_id, 'Conv??nio', 'receita', '#3b82f6', 'pi pi-building', 3), + (p_user_id, 'Grupo terap??utico', 'receita', '#f59e0b', 'pi pi-sitemap', 4), + (p_user_id, 'Outro (receita)', 'receita', '#8b5cf6', 'pi pi-plus-circle', 5), + (p_user_id, 'Aluguel sala', 'despesa', '#ef4444', 'pi pi-home', 1), + (p_user_id, 'Plataforma/SaaS', 'despesa', '#f97316', 'pi pi-desktop', 2), + (p_user_id, 'Repasse cl??nica', 'despesa', '#64748b', 'pi pi-arrow-right-arrow-left', 3), + (p_user_id, 'Supervis??o (custo)', 'despesa', '#6366f1', 'pi pi-users', 4), + (p_user_id, 'Outro (despesa)', 'despesa', '#94a3b8', 'pi pi-minus-circle', 5) + ON CONFLICT DO NOTHING; +END; +$$; + +CREATE FUNCTION public.seed_default_patient_groups(p_tenant_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_owner_id uuid; +BEGIN + -- busca o owner (tenant_admin) do tenant + SELECT user_id INTO v_owner_id + FROM public.tenant_members + WHERE tenant_id = p_tenant_id + AND role = 'tenant_admin' + AND status = 'active' + LIMIT 1; + + IF v_owner_id IS NULL THEN + RETURN; + END IF; + + INSERT INTO public.patient_groups (owner_id, nome, cor, is_system, tenant_id) + VALUES + (v_owner_id, 'Crian??as', '#60a5fa', true, p_tenant_id), + (v_owner_id, 'Adolescentes', '#a78bfa', true, p_tenant_id), + (v_owner_id, 'Idosos', '#34d399', true, p_tenant_id) + ON CONFLICT (owner_id, nome) DO NOTHING; +END; +$$; + +CREATE FUNCTION public.seed_determined_commitments(p_tenant_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_id uuid; +begin + -- Sess??o (locked + sempre ativa) + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'session' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'session', true, true, 'Sess??o', 'Sess??o com paciente'); + end if; + + -- Leitura + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'reading' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'reading', false, true, 'Leitura', 'Praticar leitura'); + end if; + + -- Supervis??o + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'supervision' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'supervision', false, true, 'Supervis??o', 'Supervis??o'); + end if; + + -- Aula ??? (corrigido) + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'class' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'class', false, false, 'Aula', 'Dar aula'); + end if; + + -- An??lise pessoal + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'analysis' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'analysis', false, true, 'An??lise Pessoal', 'Minha an??lise pessoal'); + end if; + + -- ------------------------------------------------------- + -- Campos padr??o (idempotentes por (commitment_id, key)) + -- ------------------------------------------------------- + + -- Leitura + select id into v_id + from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'reading' + limit 1; + + if v_id is not null then + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'book') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'book', 'Livro', 'text', false, 10); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'author') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'author', 'Autor', 'text', false, 20); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); + end if; + end if; + + -- Supervis??o + select id into v_id + from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'supervision' + limit 1; + + if v_id is not null then + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'supervisor') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'supervisor', 'Supervisor', 'text', false, 10); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'topic') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'topic', 'Assunto', 'text', false, 20); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); + end if; + end if; + + -- Aula + select id into v_id + from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'class' + limit 1; + + if v_id is not null then + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'theme') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'theme', 'Tema', 'text', false, 10); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'group') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'group', 'Turma', 'text', false, 20); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); + end if; + end if; + + -- An??lise + select id into v_id + from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'analysis' + limit 1; + + if v_id is not null then + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'analyst') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'analyst', 'Analista', 'text', false, 10); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'focus') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'focus', 'Foco', 'text', false, 20); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); + end if; + end if; +end; +$$; + +CREATE FUNCTION public.set_insurance_plans_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN NEW.updated_at = now(); RETURN NEW; END; $$; + +CREATE FUNCTION public.set_medicos_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.set_owner_id() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if new.owner_id is null then + new.owner_id := auth.uid(); + end if; + return new; +end; +$$; + +CREATE FUNCTION public.set_services_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text DEFAULT NULL::text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +begin + -- ??? S?? owner ou admin do tenant podem alterar features + if not exists ( + select 1 from public.tenant_members + where tenant_id = p_tenant_id + and user_id = auth.uid() + and role in ('owner', 'admin') + and status = 'active' + ) then + raise exception 'Acesso negado: apenas owner/admin pode alterar features do tenant.'; + end if; + + insert into public.tenant_features (tenant_id, feature_key, enabled) + values (p_tenant_id, p_feature_key, p_enabled) + on conflict (tenant_id, feature_key) + do update set enabled = excluded.enabled; + + insert into public.tenant_feature_exceptions_log ( + tenant_id, feature_key, enabled, reason, created_by + ) values ( + p_tenant_id, p_feature_key, p_enabled, p_reason, auth.uid() + ); +end; +$$; + +CREATE FUNCTION public.set_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.set_updated_at_recurrence() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN NEW.updated_at = now(); RETURN NEW; END; +$$; + +CREATE FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_old public.recurrence_rules; + v_new_id uuid; +BEGIN + -- busca a regra original + SELECT * INTO v_old + FROM public.recurrence_rules + WHERE id = p_recurrence_id; + + IF NOT FOUND THEN + RAISE EXCEPTION 'recurrence_rule % n??o encontrada', p_recurrence_id; + END IF; + + -- encerra a regra antiga na data anterior + UPDATE public.recurrence_rules + SET + end_date = p_from_date - INTERVAL '1 day', + open_ended = false, + updated_at = now() + WHERE id = p_recurrence_id; + + -- cria nova regra a partir de p_from_date + INSERT INTO public.recurrence_rules ( + tenant_id, owner_id, therapist_id, patient_id, + determined_commitment_id, type, interval, weekdays, + start_time, end_time, timezone, duration_min, + start_date, end_date, max_occurrences, open_ended, + modalidade, titulo_custom, observacoes, extra_fields, status + ) + SELECT + tenant_id, owner_id, therapist_id, patient_id, + determined_commitment_id, type, interval, weekdays, + start_time, end_time, timezone, duration_min, + p_from_date, v_old.end_date, v_old.max_occurrences, v_old.open_ended, + modalidade, titulo_custom, observacoes, extra_fields, status + FROM public.recurrence_rules + WHERE id = p_recurrence_id + RETURNING id INTO v_new_id; + + RETURN v_new_id; +END; +$$; + +CREATE FUNCTION public.subscription_intents_view_insert() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_target text; + v_plan_id uuid; +begin + select p.id, p.target into v_plan_id, v_target + from public.plans p + where p.key = new.plan_key; + + if v_plan_id is null then + raise exception 'Plano inv??lido: plan_key=%', new.plan_key; + end if; + + if lower(v_target) = 'clinic' then + if new.tenant_id is null then + raise exception 'Inten????o clinic exige tenant_id.'; + end if; + + insert into public.subscription_intents_tenant ( + id, tenant_id, created_by_user_id, email, + plan_id, plan_key, interval, amount_cents, currency, + status, source, notes, created_at, paid_at + ) values ( + coalesce(new.id, gen_random_uuid()), + new.tenant_id, new.created_by_user_id, new.email, + v_plan_id, new.plan_key, coalesce(new.interval,'month'), + new.amount_cents, coalesce(new.currency,'BRL'), + coalesce(new.status,'pending'), coalesce(new.source,'manual'), + new.notes, coalesce(new.created_at, now()), new.paid_at + ); + + new.plan_target := 'clinic'; + return new; + end if; + + -- therapist ou supervisor ??? tabela personal + if lower(v_target) in ('therapist', 'supervisor') then + insert into public.subscription_intents_personal ( + id, user_id, created_by_user_id, email, + plan_id, plan_key, interval, amount_cents, currency, + status, source, notes, created_at, paid_at + ) values ( + coalesce(new.id, gen_random_uuid()), + new.user_id, new.created_by_user_id, new.email, + v_plan_id, new.plan_key, coalesce(new.interval,'month'), + new.amount_cents, coalesce(new.currency,'BRL'), + coalesce(new.status,'pending'), coalesce(new.source,'manual'), + new.notes, coalesce(new.created_at, now()), new.paid_at + ); + + new.plan_target := lower(v_target); -- 'therapist' ou 'supervisor' + return new; + end if; + + raise exception 'Target de plano n??o suportado: %', v_target; +end; +$$; + +CREATE FUNCTION public.subscriptions_validate_scope() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + v_target text; +BEGIN + SELECT lower(p.target) INTO v_target + FROM public.plans p + WHERE p.id = NEW.plan_id; + + IF v_target IS NULL THEN + RAISE EXCEPTION 'Plano inv??lido (target nulo).'; + END IF; + + IF v_target = 'clinic' THEN + IF NEW.tenant_id IS NULL THEN + RAISE EXCEPTION 'Assinatura clinic exige tenant_id.'; + END IF; + IF NEW.user_id IS NOT NULL THEN + RAISE EXCEPTION 'Assinatura clinic n??o pode ter user_id (XOR).'; + END IF; + + ELSIF v_target IN ('therapist', 'supervisor') THEN + -- supervisor ?? pessoal como therapist + IF NEW.tenant_id IS NOT NULL THEN + RAISE EXCEPTION 'Assinatura % n??o deve ter tenant_id.', v_target; + END IF; + IF NEW.user_id IS NULL THEN + RAISE EXCEPTION 'Assinatura % exige user_id.', v_target; + END IF; + + ELSIF v_target = 'patient' THEN + IF NEW.tenant_id IS NOT NULL THEN + RAISE EXCEPTION 'Assinatura patient n??o deve ter tenant_id.'; + END IF; + IF NEW.user_id IS NULL THEN + RAISE EXCEPTION 'Assinatura patient exige user_id.'; + END IF; + + ELSE + RAISE EXCEPTION 'Target de plano inv??lido: %', v_target; + END IF; + + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.sync_busy_mirror_agenda_eventos() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + clinic_tenant uuid; + is_personal boolean; + should_mirror boolean; +begin + -- Anti-recurs??o: espelho n??o espelha + if (tg_op <> 'DELETE') then + if new.mirror_of_event_id is not null then + return new; + end if; + else + if old.mirror_of_event_id is not null then + return old; + end if; + end if; + + -- Define se ?? pessoal e se deve espelhar + if (tg_op = 'DELETE') then + is_personal := (old.tenant_id = old.owner_id); + should_mirror := (old.visibility_scope in ('busy_only','private')); + else + is_personal := (new.tenant_id = new.owner_id); + should_mirror := (new.visibility_scope in ('busy_only','private')); + end if; + + -- Se n??o ?? pessoal, n??o faz nada + if not is_personal then + if (tg_op = 'DELETE') then + return old; + end if; + return new; + end if; + + -- DELETE: remove espelhos existentes + if (tg_op = 'DELETE') then + delete from public.agenda_eventos e + where e.mirror_of_event_id = old.id + and e.mirror_source = 'personal_busy_mirror'; + + return old; + end if; + + -- INSERT/UPDATE: + -- Se n??o deve espelhar, remove espelhos e sai + if not should_mirror then + delete from public.agenda_eventos e + where e.mirror_of_event_id = new.id + and e.mirror_source = 'personal_busy_mirror'; + + return new; + end if; + + -- Para cada cl??nica onde o usu??rio ?? therapist active, cria/atualiza o "Ocupado" + for clinic_tenant in + select tm.tenant_id + from public.tenant_members tm + where tm.user_id = new.owner_id + and tm.role = 'therapist' + and tm.status = 'active' + and tm.tenant_id <> new.owner_id + loop + insert into public.agenda_eventos ( + tenant_id, + owner_id, + terapeuta_id, + paciente_id, + tipo, + status, + titulo, + observacoes, + inicio_em, + fim_em, + mirror_of_event_id, + mirror_source, + visibility_scope, + created_at, + updated_at + ) values ( + clinic_tenant, + new.owner_id, + new.owner_id, + null, + 'bloqueio'::public.tipo_evento_agenda, + 'agendado'::public.status_evento_agenda, + 'Ocupado', + null, + new.inicio_em, + new.fim_em, + new.id, + 'personal_busy_mirror', + 'public', + now(), + now() + ) + on conflict (tenant_id, mirror_of_event_id) where mirror_of_event_id is not null + do update set + owner_id = excluded.owner_id, + terapeuta_id = excluded.terapeuta_id, + tipo = excluded.tipo, + status = excluded.status, + titulo = excluded.titulo, + observacoes = excluded.observacoes, + inicio_em = excluded.inicio_em, + fim_em = excluded.fim_em, + updated_at = now(); + end loop; + + -- Limpa espelhos de cl??nicas onde o v??nculo therapist active n??o existe mais + delete from public.agenda_eventos e + where e.mirror_of_event_id = new.id + and e.mirror_source = 'personal_busy_mirror' + and not exists ( + select 1 + from public.tenant_members tm + where tm.user_id = new.owner_id + and tm.role = 'therapist' + and tm.status = 'active' + and tm.tenant_id = e.tenant_id + ); + + return new; +end; +$$; + +CREATE FUNCTION public.sync_overdue_financial_records() RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_count integer; +BEGIN + UPDATE public.financial_records + SET + status = 'overdue', + updated_at = NOW() + WHERE status = 'pending' + AND due_date IS NOT NULL + AND due_date < CURRENT_DATE + AND deleted_at IS NULL; + + GET DIAGNOSTICS v_count = ROW_COUNT; + RETURN v_count; +END; +$$; + +CREATE FUNCTION public.tenant_accept_invite(p_token uuid) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ +declare + v_uid uuid; + v_email text; + v_invite public.tenant_invites%rowtype; +begin + -- 1) precisa estar autenticado + v_uid := auth.uid(); + if v_uid is null then + raise exception 'not_authenticated' using errcode = 'P0001'; + end if; + + -- 2) pega email real do usu??rio logado sem depender do JWT claim + select u.email + into v_email + from auth.users u + where u.id = v_uid; + + if v_email is null or length(trim(v_email)) = 0 then + raise exception 'missing_user_email' using errcode = 'P0001'; + end if; + + -- 3) carrega o invite e trava linha (evita 2 aceites concorrentes) + select * + into v_invite + from public.tenant_invites i + where i.token = p_token + for update; + + if not found then + raise exception 'invite_not_found' using errcode = 'P0001'; + end if; + + -- 4) valida????es de estado + if v_invite.revoked_at is not null then + raise exception 'invite_revoked' using errcode = 'P0001'; + end if; + + if v_invite.accepted_at is not null then + raise exception 'invite_already_accepted' using errcode = 'P0001'; + end if; + + if v_invite.expires_at is not null and v_invite.expires_at <= now() then + raise exception 'invite_expired' using errcode = 'P0001'; + end if; + + -- 5) valida email (case-insensitive) + if lower(trim(v_invite.email)) <> lower(trim(v_email)) then + raise exception 'email_mismatch' using errcode = 'P0001'; + end if; + + -- 6) consome o invite + update public.tenant_invites + set accepted_at = now(), + accepted_by = v_uid + where id = v_invite.id; + + -- 7) cria ou reativa o membership + insert into public.tenant_members (tenant_id, user_id, role, status, created_at) + values (v_invite.tenant_id, v_uid, v_invite.role, 'active', now()) + on conflict (tenant_id, user_id) + do update set + role = excluded.role, + status = 'active'; + + -- 8) retorno ??til pro front (voc?? j?? tenta ler tenant_id no AcceptInvitePage) + return jsonb_build_object( + 'ok', true, + 'tenant_id', v_invite.tenant_id, + 'role', v_invite.role + ); +end; +$$; + +CREATE FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text DEFAULT 'therapist'::text) RETURNS public.tenant_members + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ +declare + v_target_uid uuid; + v_member public.tenant_members%rowtype; + v_is_admin boolean; + v_email text; +begin + if p_tenant_id is null then + raise exception 'tenant_id ?? obrigat??rio'; + end if; + + v_email := lower(trim(coalesce(p_email, ''))); + if v_email = '' then + raise exception 'email ?? obrigat??rio'; + end if; + + -- valida role permitida + if p_role not in ('tenant_admin','therapist','secretary','patient') then + raise exception 'role inv??lida: %', p_role; + end if; + + -- apenas admin do tenant (role real no banco) + select exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + and tm.role = 'tenant_admin' + and coalesce(tm.status,'active') = 'active' + ) into v_is_admin; + + if not v_is_admin then + raise exception 'sem permiss??o: apenas admin da cl??nica pode adicionar membros'; + end if; + + -- acha usu??rio pelo e-mail no Supabase Auth + select u.id + into v_target_uid + from auth.users u + where lower(u.email) = v_email + limit 1; + + if v_target_uid is null then + raise exception 'nenhum usu??rio encontrado com este e-mail'; + end if; + + -- cria ou reativa membro + insert into public.tenant_members (tenant_id, user_id, role, status) + values (p_tenant_id, v_target_uid, p_role, 'active') + on conflict (tenant_id, user_id) + do update set + role = excluded.role, + status = 'active' + returning * into v_member; + + return v_member; +end; +$$; + +CREATE FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 + from public.v_tenant_entitlements v + where v.tenant_id = p_tenant_id + and v.feature_key = p_feature_key + and coalesce(v.allowed, false) = true + ); +$$; + +CREATE FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select coalesce( + (select tf.enabled + from public.tenant_features tf + where tf.tenant_id = p_tenant_id and tf.feature_key = p_feature_key), + false + ); +$$; + +CREATE FUNCTION public.tenant_features_guard_with_plan() RETURNS trigger + LANGUAGE plpgsql + AS $$ +declare + v_allowed boolean; +begin + -- s?? valida quando est?? habilitando + if new.enabled is distinct from true then + return new; + end if; + + -- permitido pelo plano do tenant? + select exists ( + select 1 + from public.v_tenant_entitlements_full v + where v.tenant_id = new.tenant_id + and v.feature_key = new.feature_key + and v.allowed = true + ) + into v_allowed; + + if not v_allowed then + raise exception 'Feature % n??o permitida pelo plano atual do tenant %.', + new.feature_key, new.tenant_id + using errcode = 'P0001'; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select + exists ( + select 1 + from public.v_tenant_entitlements e + where e.tenant_id = _tenant_id + and e.feature_key = _feature + and e.allowed = true + ) + or exists ( + select 1 + from public.tenant_features tf + where tf.tenant_id = _tenant_id + and tf.feature_key = _feature + and tf.enabled = true + ); +$$; + +CREATE FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ +declare + v_email text; + v_my_email text; + v_token uuid; + v_updated int; +begin + -- valida????es b??sicas + if p_tenant_id is null then + raise exception 'tenant_id inv??lido' using errcode = 'P0001'; + end if; + + v_email := lower(trim(coalesce(p_email, ''))); + if v_email = '' then + raise exception 'Informe um email' using errcode = 'P0001'; + end if; + + -- role permitido (ajuste se quiser) + if p_role is null or p_role not in ('therapist', 'secretary') then + raise exception 'Role inv??lido (use therapist/secretary)' using errcode = 'P0001'; + end if; + + -- ??? bloqueio: auto-convite + v_my_email := public.get_my_email(); + if v_my_email is not null and v_email = v_my_email then + raise exception 'Voc?? n??o pode convidar o seu pr??prio email.' using errcode = 'P0001'; + end if; + + -- ??? bloqueio: j?? ?? membro ativo do tenant + if exists ( + select 1 + from tenant_members tm + join auth.users au on au.id = tm.user_id + where tm.tenant_id = p_tenant_id + and tm.status = 'active' + and lower(au.email) = v_email + ) then + raise exception 'Este email j?? est?? vinculado a esta cl??nica.' using errcode = 'P0001'; + end if; + + -- ??? permiss??o: s?? admin do tenant pode convidar + if not exists ( + select 1 + from tenant_members me + where me.tenant_id = p_tenant_id + and me.user_id = auth.uid() + and me.status = 'active' + and me.role in ('tenant_admin','clinic_admin') + ) then + raise exception 'Sem permiss??o para convidar membros.' using errcode = 'P0001'; + end if; + + -- Gera token (reenvio simples / regenera????o) + v_token := gen_random_uuid(); + + -- 1) tenta "regerar" um convite pendente existente (mesmo email) + update tenant_invites + set token = v_token, + role = p_role, + created_at = now(), + expires_at = now() + interval '7 days', + accepted_at = null, + revoked_at = null + where tenant_id = p_tenant_id + and lower(email) = v_email + and accepted_at is null + and revoked_at is null; + + get diagnostics v_updated = row_count; + + -- 2) se n??o atualizou nada, cria convite novo + if v_updated = 0 then + insert into tenant_invites (tenant_id, email, role, token, created_at, expires_at) + values (p_tenant_id, v_email, p_role, v_token, now(), now() + interval '7 days'); + end if; + + return v_token; +end; +$$; + +CREATE FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + update public.tenant_members + set status = 'active' + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +declare + v_role text; +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + if p_member_user_id = auth.uid() then + raise exception 'cannot_remove_self'; + end if; + + -- pega role atual do membro (se n??o existir, erro) + select role into v_role + from public.tenant_members + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if v_role is null then + raise exception 'membership_not_found'; + end if; + + -- trava: se for therapist, n??o pode remover com eventos futuros + if v_role = 'therapist' then + if exists ( + select 1 + from public.agenda_eventos e + where e.owner_id = p_tenant_id + and e.terapeuta_id = p_member_user_id + and e.inicio_em >= now() + and e.status::text not in ('cancelado','cancelled','canceled') + limit 1 + ) then + raise exception 'cannot_remove_therapist_with_future_events'; + end if; + end if; + + update public.tenant_members + set status = 'inactive' + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + if p_member_user_id = auth.uid() then + raise exception 'cannot_remove_self'; + end if; + + update public.tenant_members + set status = 'inactive' + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +declare + v_email text; +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + v_email := lower(trim(p_email)); + + update public.tenant_invites + set revoked_at = now(), + revoked_by = auth.uid() + where tenant_id = p_tenant_id + and lower(email) = v_email + and role = p_role + and accepted_at is null + and revoked_at is null; + + if not found then + raise exception 'invite_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + -- valida status (adapte aos seus valores reais) + if p_new_status not in ('active','inactive','suspended','invited') then + raise exception 'invalid_status: %', p_new_status; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + -- evita desativar a si mesmo (opcional) + if p_member_user_id = auth.uid() and p_new_status <> 'active' then + raise exception 'cannot_disable_self'; + end if; + + update public.tenant_members + set status = p_new_status + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +begin + -- exige auth + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + -- valida role + if p_new_role not in ('tenant_admin','therapist','secretary','patient') then + raise exception 'invalid_role: %', p_new_role; + end if; + + -- somente tenant_admin ativo pode alterar role + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + -- evita o admin remover o pr??prio admin sem querer (opcional mas recomendado) + if p_member_user_id = auth.uid() and p_new_role <> 'tenant_admin' then + raise exception 'cannot_demote_self'; + end if; + + update public.tenant_members + set role = p_new_role + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.toggle_plan(owner uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + current_key text; + new_key text; +begin + select p.key into current_key + from subscriptions s + join plans p on p.id = s.plan_id + where s.owner_id = owner + and s.status = 'active'; + + new_key := case + when current_key = 'pro' then 'free' + else 'pro' + end; + + update subscriptions s + set plan_id = p.id + from plans p + where p.key = new_key + and s.owner_id = owner + and s.status = 'active'; +end; +$$; + +CREATE FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text DEFAULT NULL::text, p_metadata jsonb DEFAULT NULL::jsonb) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_sub public.subscriptions; + v_uid uuid; + v_is_allowed boolean := false; +begin + v_uid := auth.uid(); + + select * + into v_sub + from public.subscriptions + where id = p_subscription_id; + + if not found then + raise exception 'Assinatura n??o encontrada'; + end if; + + -- ===================================================== + -- ???? BLOCO DE AUTORIZA????O + -- ===================================================== + + -- 1) SaaS admin pode tudo + if is_saas_admin() then + v_is_allowed := true; + end if; + + -- 2) Assinatura pessoal (therapist) + if not v_is_allowed + and v_sub.tenant_id is null + and v_sub.user_id = v_uid then + v_is_allowed := true; + end if; + + -- 3) Assinatura de clinic (tenant) + if not v_is_allowed + and v_sub.tenant_id is not null then + + if exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = v_sub.tenant_id + and tm.user_id = v_uid + and tm.status = 'active' + and tm.role = 'tenant_admin' + ) then + v_is_allowed := true; + end if; + + end if; + + if not v_is_allowed then + raise exception 'Sem permiss??o para transicionar esta assinatura'; + end if; + + -- ===================================================== + -- ???? TRANSI????O + -- ===================================================== + + update public.subscriptions + set status = p_to_status, + updated_at = now(), + cancelled_at = case when p_to_status = 'cancelled' then now() else cancelled_at end, + suspended_at = case when p_to_status = 'suspended' then now() else suspended_at end, + past_due_since = case when p_to_status = 'past_due' then now() else past_due_since end, + expired_at = case when p_to_status = 'expired' then now() else expired_at end, + activated_at = case when p_to_status = 'active' then now() else activated_at end + where id = p_subscription_id + returning * into v_sub; + + -- ===================================================== + -- ???? EVENT LOG + -- ===================================================== + + insert into public.subscription_events ( + subscription_id, + owner_id, + event_type, + created_at, + created_by, + source, + reason, + metadata, + owner_type, + owner_ref + ) + values ( + v_sub.id, + coalesce(v_sub.tenant_id, v_sub.user_id), + 'status_changed', + now(), + v_uid, + 'manual_transition', + p_reason, + p_metadata, + case when v_sub.tenant_id is not null then 'tenant' else 'personal' end, + coalesce(v_sub.tenant_id, v_sub.user_id) + ); + + return v_sub; +end; +$$; + +CREATE FUNCTION public.trg_fn_financial_records_auto_overdue() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + IF NEW.status = 'pending' + AND NEW.due_date IS NOT NULL + AND NEW.due_date < CURRENT_DATE + THEN + NEW.status := 'overdue'; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.trg_fn_patient_risco_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF OLD.risco_elevado IS DISTINCT FROM NEW.risco_elevado THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, + evento_tipo, titulo, descricao, icone_cor, + gerado_por, ocorrido_em + ) VALUES ( + NEW.id, NEW.tenant_id, + CASE WHEN NEW.risco_elevado THEN 'risco_sinalizado' ELSE 'risco_removido' END, + CASE WHEN NEW.risco_elevado THEN 'Risco elevado sinalizado' ELSE 'Sinalização de risco removida' END, + NEW.risco_nota, + CASE WHEN NEW.risco_elevado THEN 'red' ELSE 'green' END, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.trg_fn_patient_status_history() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF (TG_OP = 'INSERT') OR (OLD.status IS DISTINCT FROM NEW.status) THEN + INSERT INTO public.patient_status_history ( + patient_id, tenant_id, + status_anterior, status_novo, + motivo, encaminhado_para, data_saida, + alterado_por, alterado_em + ) VALUES ( + NEW.id, NEW.tenant_id, + CASE WHEN TG_OP = 'INSERT' THEN NULL ELSE OLD.status END, + NEW.status, + NEW.motivo_saida, + NEW.encaminhado_para, + NEW.data_saida, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.trg_fn_patient_status_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF (TG_OP = 'INSERT') OR (OLD.status IS DISTINCT FROM NEW.status) THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, + evento_tipo, titulo, descricao, icone_cor, + gerado_por, ocorrido_em + ) VALUES ( + NEW.id, NEW.tenant_id, + 'status_alterado', + 'Status alterado para ' || NEW.status, + CASE + WHEN TG_OP = 'INSERT' THEN 'Paciente cadastrado' + ELSE 'De ' || OLD.status || ' → ' || NEW.status || + CASE WHEN NEW.motivo_saida IS NOT NULL THEN ' · ' || NEW.motivo_saida ELSE '' END + END, + CASE NEW.status + WHEN 'Ativo' THEN 'green' + WHEN 'Alta' THEN 'blue' + WHEN 'Inativo' THEN 'gray' + WHEN 'Encaminhado' THEN 'amber' + WHEN 'Arquivado' THEN 'gray' + ELSE 'gray' + END, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.trg_set_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN + NEW.updated_at = now(); + RETURN NEW; + END; + $$; + +CREATE FUNCTION public.unstick_notification_queue() RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_unstuck integer; +BEGIN + UPDATE public.notification_queue + SET status = 'pendente', + attempts = attempts + 1, + last_error = 'Timeout: preso em processando por >10min', + next_retry_at = now() + interval '2 minutes' + WHERE status = 'processando' + AND updated_at < now() - interval '10 minutes'; + + GET DIAGNOSTICS v_unstuck = ROW_COUNT; + RETURN v_unstuck; +END; +$$; + +CREATE FUNCTION public.update_payment_settings_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.update_professional_pricing_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.user_has_feature(_user_id uuid, _feature text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 + from public.v_user_entitlements e + where e.user_id = _user_id + and e.feature_key = _feature + and e.allowed = true + ); +$$; + +CREATE FUNCTION public.validate_support_session(p_token text) RETURNS json + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_session support_sessions; +BEGIN + IF p_token IS NULL OR length(trim(p_token)) < 32 THEN + RETURN json_build_object('valid', false, 'tenant_id', null); + END IF; + + SELECT * INTO v_session + FROM public.support_sessions + WHERE token = p_token + AND expires_at > now() + LIMIT 1; + + IF NOT FOUND THEN + RETURN json_build_object('valid', false, 'tenant_id', null); + END IF; + + RETURN json_build_object( + 'valid', true, + 'tenant_id', v_session.tenant_id + ); +END; +$$; + +CREATE FUNCTION public.whoami() RETURNS TABLE(uid uuid, role text) + LANGUAGE sql STABLE + AS $$ + select auth.uid() as uid, auth.role() as role; +$$; + +CREATE FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer DEFAULT (1024 * 1024)) RETURNS SETOF realtime.wal_rls + LANGUAGE plpgsql + AS $$ +declare +-- Regclass of the table e.g. public.notes +entity_ regclass = (quote_ident(wal ->> 'schema') || '.' || quote_ident(wal ->> 'table'))::regclass; + +-- I, U, D, T: insert, update ... +action realtime.action = ( + case wal ->> 'action' + when 'I' then 'INSERT' + when 'U' then 'UPDATE' + when 'D' then 'DELETE' + else 'ERROR' + end +); + +-- Is row level security enabled for the table +is_rls_enabled bool = relrowsecurity from pg_class where oid = entity_; + +subscriptions realtime.subscription[] = array_agg(subs) + from + realtime.subscription subs + where + subs.entity = entity_; + +-- Subscription vars +roles regrole[] = array_agg(distinct us.claims_role::text) + from + unnest(subscriptions) us; + +working_role regrole; +claimed_role regrole; +claims jsonb; + +subscription_id uuid; +subscription_has_access bool; +visible_to_subscription_ids uuid[] = '{}'; + +-- structured info for wal's columns +columns realtime.wal_column[]; +-- previous identity values for update/delete +old_columns realtime.wal_column[]; + +error_record_exceeds_max_size boolean = octet_length(wal::text) > max_record_bytes; + +-- Primary jsonb output for record +output jsonb; + +begin +perform set_config('role', null, true); + +columns = + array_agg( + ( + x->>'name', + x->>'type', + x->>'typeoid', + realtime.cast( + (x->'value') #>> '{}', + coalesce( + (x->>'typeoid')::regtype, -- null when wal2json version <= 2.4 + (x->>'type')::regtype + ) + ), + (pks ->> 'name') is not null, + true + )::realtime.wal_column + ) + from + jsonb_array_elements(wal -> 'columns') x + left join jsonb_array_elements(wal -> 'pk') pks + on (x ->> 'name') = (pks ->> 'name'); + +old_columns = + array_agg( + ( + x->>'name', + x->>'type', + x->>'typeoid', + realtime.cast( + (x->'value') #>> '{}', + coalesce( + (x->>'typeoid')::regtype, -- null when wal2json version <= 2.4 + (x->>'type')::regtype + ) + ), + (pks ->> 'name') is not null, + true + )::realtime.wal_column + ) + from + jsonb_array_elements(wal -> 'identity') x + left join jsonb_array_elements(wal -> 'pk') pks + on (x ->> 'name') = (pks ->> 'name'); + +for working_role in select * from unnest(roles) loop + + -- Update `is_selectable` for columns and old_columns + columns = + array_agg( + ( + c.name, + c.type_name, + c.type_oid, + c.value, + c.is_pkey, + pg_catalog.has_column_privilege(working_role, entity_, c.name, 'SELECT') + )::realtime.wal_column + ) + from + unnest(columns) c; + + old_columns = + array_agg( + ( + c.name, + c.type_name, + c.type_oid, + c.value, + c.is_pkey, + pg_catalog.has_column_privilege(working_role, entity_, c.name, 'SELECT') + )::realtime.wal_column + ) + from + unnest(old_columns) c; + + if action <> 'DELETE' and count(1) = 0 from unnest(columns) c where c.is_pkey then + return next ( + jsonb_build_object( + 'schema', wal ->> 'schema', + 'table', wal ->> 'table', + 'type', action + ), + is_rls_enabled, + -- subscriptions is already filtered by entity + (select array_agg(s.subscription_id) from unnest(subscriptions) as s where claims_role = working_role), + array['Error 400: Bad Request, no primary key'] + )::realtime.wal_rls; + + -- The claims role does not have SELECT permission to the primary key of entity + elsif action <> 'DELETE' and sum(c.is_selectable::int) <> count(1) from unnest(columns) c where c.is_pkey then + return next ( + jsonb_build_object( + 'schema', wal ->> 'schema', + 'table', wal ->> 'table', + 'type', action + ), + is_rls_enabled, + (select array_agg(s.subscription_id) from unnest(subscriptions) as s where claims_role = working_role), + array['Error 401: Unauthorized'] + )::realtime.wal_rls; + + else + output = jsonb_build_object( + 'schema', wal ->> 'schema', + 'table', wal ->> 'table', + 'type', action, + 'commit_timestamp', to_char( + ((wal ->> 'timestamp')::timestamptz at time zone 'utc'), + 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"' + ), + 'columns', ( + select + jsonb_agg( + jsonb_build_object( + 'name', pa.attname, + 'type', pt.typname + ) + order by pa.attnum asc + ) + from + pg_attribute pa + join pg_type pt + on pa.atttypid = pt.oid + where + attrelid = entity_ + and attnum > 0 + and pg_catalog.has_column_privilege(working_role, entity_, pa.attname, 'SELECT') + ) + ) + -- Add "record" key for insert and update + || case + when action in ('INSERT', 'UPDATE') then + jsonb_build_object( + 'record', + ( + select + jsonb_object_agg( + -- if unchanged toast, get column name and value from old record + coalesce((c).name, (oc).name), + case + when (c).name is null then (oc).value + else (c).value + end + ) + from + unnest(columns) c + full outer join unnest(old_columns) oc + on (c).name = (oc).name + where + coalesce((c).is_selectable, (oc).is_selectable) + and ( not error_record_exceeds_max_size or (octet_length((c).value::text) <= 64)) + ) + ) + else '{}'::jsonb + end + -- Add "old_record" key for update and delete + || case + when action = 'UPDATE' then + jsonb_build_object( + 'old_record', + ( + select jsonb_object_agg((c).name, (c).value) + from unnest(old_columns) c + where + (c).is_selectable + and ( not error_record_exceeds_max_size or (octet_length((c).value::text) <= 64)) + ) + ) + when action = 'DELETE' then + jsonb_build_object( + 'old_record', + ( + select jsonb_object_agg((c).name, (c).value) + from unnest(old_columns) c + where + (c).is_selectable + and ( not error_record_exceeds_max_size or (octet_length((c).value::text) <= 64)) + and ( not is_rls_enabled or (c).is_pkey ) -- if RLS enabled, we can't secure deletes so filter to pkey + ) + ) + else '{}'::jsonb + end; + + -- Create the prepared statement + if is_rls_enabled and action <> 'DELETE' then + if (select 1 from pg_prepared_statements where name = 'walrus_rls_stmt' limit 1) > 0 then + deallocate walrus_rls_stmt; + end if; + execute realtime.build_prepared_statement_sql('walrus_rls_stmt', entity_, columns); + end if; + + visible_to_subscription_ids = '{}'; + + for subscription_id, claims in ( + select + subs.subscription_id, + subs.claims + from + unnest(subscriptions) subs + where + subs.entity = entity_ + and subs.claims_role = working_role + and ( + realtime.is_visible_through_filters(columns, subs.filters) + or ( + action = 'DELETE' + and realtime.is_visible_through_filters(old_columns, subs.filters) + ) + ) + ) loop + + if not is_rls_enabled or action = 'DELETE' then + visible_to_subscription_ids = visible_to_subscription_ids || subscription_id; + else + -- Check if RLS allows the role to see the record + perform + -- Trim leading and trailing quotes from working_role because set_config + -- doesn't recognize the role as valid if they are included + set_config('role', trim(both '"' from working_role::text), true), + set_config('request.jwt.claims', claims::text, true); + + execute 'execute walrus_rls_stmt' into subscription_has_access; + + if subscription_has_access then + visible_to_subscription_ids = visible_to_subscription_ids || subscription_id; + end if; + end if; + end loop; + + perform set_config('role', null, true); + + return next ( + output, + is_rls_enabled, + visible_to_subscription_ids, + case + when error_record_exceeds_max_size then array['Error 413: Payload Too Large'] + else '{}' + end + )::realtime.wal_rls; + + end if; +end loop; + +perform set_config('role', null, true); +end; +$$; + +CREATE FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text DEFAULT 'ROW'::text) RETURNS void + LANGUAGE plpgsql + AS $$ +DECLARE + -- Declare a variable to hold the JSONB representation of the row + row_data jsonb := '{}'::jsonb; +BEGIN + IF level = 'STATEMENT' THEN + RAISE EXCEPTION 'function can only be triggered for each row, not for each statement'; + END IF; + -- Check the operation type and handle accordingly + IF operation = 'INSERT' OR operation = 'UPDATE' OR operation = 'DELETE' THEN + row_data := jsonb_build_object('old_record', OLD, 'record', NEW, 'operation', operation, 'table', table_name, 'schema', table_schema); + PERFORM realtime.send (row_data, event_name, topic_name); + ELSE + RAISE EXCEPTION 'Unexpected operation type: %', operation; + END IF; +EXCEPTION + WHEN OTHERS THEN + RAISE EXCEPTION 'Failed to process the row: %', SQLERRM; +END; + +$$; + +CREATE FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) RETURNS text + LANGUAGE sql + AS $$ + /* + Builds a sql string that, if executed, creates a prepared statement to + tests retrive a row from *entity* by its primary key columns. + Example + select realtime.build_prepared_statement_sql('public.notes', '{"id"}'::text[], '{"bigint"}'::text[]) + */ + select + 'prepare ' || prepared_statement_name || ' as + select + exists( + select + 1 + from + ' || entity || ' + where + ' || string_agg(quote_ident(pkc.name) || '=' || quote_nullable(pkc.value #>> '{}') , ' and ') || ' + )' + from + unnest(columns) pkc + where + pkc.is_pkey + group by + entity + $$; + +CREATE FUNCTION realtime."cast"(val text, type_ regtype) RETURNS jsonb + LANGUAGE plpgsql IMMUTABLE + AS $$ + declare + res jsonb; + begin + execute format('select to_jsonb(%L::'|| type_::text || ')', val) into res; + return res; + end + $$; + +CREATE FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) RETURNS boolean + LANGUAGE plpgsql IMMUTABLE + AS $$ + /* + Casts *val_1* and *val_2* as type *type_* and check the *op* condition for truthiness + */ + declare + op_symbol text = ( + case + when op = 'eq' then '=' + when op = 'neq' then '!=' + when op = 'lt' then '<' + when op = 'lte' then '<=' + when op = 'gt' then '>' + when op = 'gte' then '>=' + when op = 'in' then '= any' + else 'UNKNOWN OP' + end + ); + res boolean; + begin + execute format( + 'select %L::'|| type_::text || ' ' || op_symbol + || ' ( %L::' + || ( + case + when op = 'in' then type_::text || '[]' + else type_::text end + ) + || ')', val_1, val_2) into res; + return res; + end; + $$; + +CREATE FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$ + /* + Should the record be visible (true) or filtered out (false) after *filters* are applied + */ + select + -- Default to allowed when no filters present + $2 is null -- no filters. this should not happen because subscriptions has a default + or array_length($2, 1) is null -- array length of an empty array is null + or bool_and( + coalesce( + realtime.check_equality_op( + op:=f.op, + type_:=coalesce( + col.type_oid::regtype, -- null when wal2json version <= 2.4 + col.type_name::regtype + ), + -- cast jsonb to text + val_1:=col.value #>> '{}', + val_2:=f.value + ), + false -- if null, filter does not match + ) + ) + from + unnest(filters) f + join unnest(columns) col + on f.column_name = col.name; + $_$; + +CREATE FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) RETURNS SETOF realtime.wal_rls + LANGUAGE sql + SET log_min_messages TO 'fatal' + AS $$ + with pub as ( + select + concat_ws( + ',', + case when bool_or(pubinsert) then 'insert' else null end, + case when bool_or(pubupdate) then 'update' else null end, + case when bool_or(pubdelete) then 'delete' else null end + ) as w2j_actions, + coalesce( + string_agg( + realtime.quote_wal2json(format('%I.%I', schemaname, tablename)::regclass), + ',' + ) filter (where ppt.tablename is not null and ppt.tablename not like '% %'), + '' + ) w2j_add_tables + from + pg_publication pp + left join pg_publication_tables ppt + on pp.pubname = ppt.pubname + where + pp.pubname = publication + group by + pp.pubname + limit 1 + ), + w2j as ( + select + x.*, pub.w2j_add_tables + from + pub, + pg_logical_slot_get_changes( + slot_name, null, max_changes, + 'include-pk', 'true', + 'include-transaction', 'false', + 'include-timestamp', 'true', + 'include-type-oids', 'true', + 'format-version', '2', + 'actions', pub.w2j_actions, + 'add-tables', pub.w2j_add_tables + ) x + ) + select + xyz.wal, + xyz.is_rls_enabled, + xyz.subscription_ids, + xyz.errors + from + w2j, + realtime.apply_rls( + wal := w2j.data::jsonb, + max_record_bytes := max_record_bytes + ) xyz(wal, is_rls_enabled, subscription_ids, errors) + where + w2j.w2j_add_tables <> '' + and xyz.subscription_ids[1] is not null + $$; + +CREATE FUNCTION realtime.quote_wal2json(entity regclass) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $$ + select + ( + select string_agg('' || ch,'') + from unnest(string_to_array(nsp.nspname::text, null)) with ordinality x(ch, idx) + where + not (x.idx = 1 and x.ch = '"') + and not ( + x.idx = array_length(string_to_array(nsp.nspname::text, null), 1) + and x.ch = '"' + ) + ) + || '.' + || ( + select string_agg('' || ch,'') + from unnest(string_to_array(pc.relname::text, null)) with ordinality x(ch, idx) + where + not (x.idx = 1 and x.ch = '"') + and not ( + x.idx = array_length(string_to_array(nsp.nspname::text, null), 1) + and x.ch = '"' + ) + ) + from + pg_class pc + join pg_namespace nsp + on pc.relnamespace = nsp.oid + where + pc.oid = entity + $$; + +CREATE FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean DEFAULT true) RETURNS void + LANGUAGE plpgsql + AS $$ +DECLARE + generated_id uuid; + final_payload jsonb; +BEGIN + BEGIN + -- Generate a new UUID for the id + generated_id := gen_random_uuid(); + + -- Check if payload has an 'id' key, if not, add the generated UUID + IF payload ? 'id' THEN + final_payload := payload; + ELSE + final_payload := jsonb_set(payload, '{id}', to_jsonb(generated_id)); + END IF; + + -- Set the topic configuration + EXECUTE format('SET LOCAL realtime.topic TO %L', topic); + + -- Attempt to insert the message + INSERT INTO realtime.messages (id, payload, event, topic, private, extension) + VALUES (generated_id, final_payload, event, topic, private, 'broadcast'); + EXCEPTION + WHEN OTHERS THEN + -- Capture and notify the error + RAISE WARNING 'ErrorSendingBroadcastMessage: %', SQLERRM; + END; +END; +$$; + +CREATE FUNCTION realtime.subscription_check_filters() RETURNS trigger + LANGUAGE plpgsql + AS $$ + /* + Validates that the user defined filters for a subscription: + - refer to valid columns that the claimed role may access + - values are coercable to the correct column type + */ + declare + col_names text[] = coalesce( + array_agg(c.column_name order by c.ordinal_position), + '{}'::text[] + ) + from + information_schema.columns c + where + format('%I.%I', c.table_schema, c.table_name)::regclass = new.entity + and pg_catalog.has_column_privilege( + (new.claims ->> 'role'), + format('%I.%I', c.table_schema, c.table_name)::regclass, + c.column_name, + 'SELECT' + ); + filter realtime.user_defined_filter; + col_type regtype; + + in_val jsonb; + begin + for filter in select * from unnest(new.filters) loop + -- Filtered column is valid + if not filter.column_name = any(col_names) then + raise exception 'invalid column for filter %', filter.column_name; + end if; + + -- Type is sanitized and safe for string interpolation + col_type = ( + select atttypid::regtype + from pg_catalog.pg_attribute + where attrelid = new.entity + and attname = filter.column_name + ); + if col_type is null then + raise exception 'failed to lookup type for column %', filter.column_name; + end if; + + -- Set maximum number of entries for in filter + if filter.op = 'in'::realtime.equality_op then + in_val = realtime.cast(filter.value, (col_type::text || '[]')::regtype); + if coalesce(jsonb_array_length(in_val), 0) > 100 then + raise exception 'too many values for `in` filter. Maximum 100'; + end if; + else + -- raises an exception if value is not coercable to type + perform realtime.cast(filter.value, col_type); + end if; + + end loop; + + -- Apply consistent order to filters so the unique constraint on + -- (subscription_id, entity, filters) can't be tricked by a different filter order + new.filters = coalesce( + array_agg(f order by f.column_name, f.op, f.value), + '{}' + ) from unnest(new.filters) f; + + return new; + end; + $$; + +CREATE FUNCTION realtime.to_regrole(role_name text) RETURNS regrole + LANGUAGE sql IMMUTABLE + AS $$ select role_name::regrole $$; + +CREATE FUNCTION realtime.topic() RETURNS text + LANGUAGE sql STABLE + AS $$ +select nullif(current_setting('realtime.topic', true), '')::text; +$$; + +CREATE FUNCTION storage.can_insert_object(bucketid text, name text, owner uuid, metadata jsonb) RETURNS void + LANGUAGE plpgsql + AS $$ +BEGIN + INSERT INTO "storage"."objects" ("bucket_id", "name", "owner", "metadata") VALUES (bucketid, name, owner, metadata); + -- hack to rollback the successful insert + RAISE sqlstate 'PT200' using + message = 'ROLLBACK', + detail = 'rollback successful insert'; +END +$$; + +CREATE FUNCTION storage.enforce_bucket_name_length() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if length(new.name) > 100 then + raise exception 'bucket name "%" is too long (% characters). Max is 100.', new.name, length(new.name); + end if; + return new; +end; +$$; + +CREATE FUNCTION storage.extension(name text) RETURNS text + LANGUAGE plpgsql + AS $$ +DECLARE +_parts text[]; +_filename text; +BEGIN + select string_to_array(name, '/') into _parts; + select _parts[array_length(_parts,1)] into _filename; + -- @todo return the last part instead of 2 + return reverse(split_part(reverse(_filename), '.', 1)); +END +$$; + +CREATE FUNCTION storage.filename(name text) RETURNS text + LANGUAGE plpgsql + AS $$ +DECLARE +_parts text[]; +BEGIN + select string_to_array(name, '/') into _parts; + return _parts[array_length(_parts,1)]; +END +$$; + +CREATE FUNCTION storage.foldername(name text) RETURNS text[] + LANGUAGE plpgsql + AS $$ +DECLARE +_parts text[]; +BEGIN + select string_to_array(name, '/') into _parts; + return _parts[1:array_length(_parts,1)-1]; +END +$$; + +CREATE FUNCTION storage.get_common_prefix(p_key text, p_prefix text, p_delimiter text) RETURNS text + LANGUAGE sql IMMUTABLE + AS $$ +SELECT CASE + WHEN position(p_delimiter IN substring(p_key FROM length(p_prefix) + 1)) > 0 + THEN left(p_key, length(p_prefix) + position(p_delimiter IN substring(p_key FROM length(p_prefix) + 1))) + ELSE NULL +END; +$$; + +CREATE FUNCTION storage.get_size_by_bucket() RETURNS TABLE(size bigint, bucket_id text) + LANGUAGE plpgsql + AS $$ +BEGIN + return query + select sum((metadata->>'size')::int) as size, obj.bucket_id + from "storage".objects as obj + group by obj.bucket_id; +END +$$; + +CREATE FUNCTION storage.list_multipart_uploads_with_delimiter(bucket_id text, prefix_param text, delimiter_param text, max_keys integer DEFAULT 100, next_key_token text DEFAULT ''::text, next_upload_token text DEFAULT ''::text) RETURNS TABLE(key text, id text, created_at timestamp with time zone) + LANGUAGE plpgsql + AS $_$ +BEGIN + RETURN QUERY EXECUTE + 'SELECT DISTINCT ON(key COLLATE "C") * from ( + SELECT + CASE + WHEN position($2 IN substring(key from length($1) + 1)) > 0 THEN + substring(key from 1 for length($1) + position($2 IN substring(key from length($1) + 1))) + ELSE + key + END AS key, id, created_at + FROM + storage.s3_multipart_uploads + WHERE + bucket_id = $5 AND + key ILIKE $1 || ''%'' AND + CASE + WHEN $4 != '''' AND $6 = '''' THEN + CASE + WHEN position($2 IN substring(key from length($1) + 1)) > 0 THEN + substring(key from 1 for length($1) + position($2 IN substring(key from length($1) + 1))) COLLATE "C" > $4 + ELSE + key COLLATE "C" > $4 + END + ELSE + true + END AND + CASE + WHEN $6 != '''' THEN + id COLLATE "C" > $6 + ELSE + true + END + ORDER BY + key COLLATE "C" ASC, created_at ASC) as e order by key COLLATE "C" LIMIT $3' + USING prefix_param, delimiter_param, max_keys, next_key_token, bucket_id, next_upload_token; +END; +$_$; + +CREATE FUNCTION storage.list_objects_with_delimiter(_bucket_id text, prefix_param text, delimiter_param text, max_keys integer DEFAULT 100, start_after text DEFAULT ''::text, next_token text DEFAULT ''::text, sort_order text DEFAULT 'asc'::text) RETURNS TABLE(name text, id uuid, metadata jsonb, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone) + LANGUAGE plpgsql STABLE + AS $_$ +DECLARE + v_peek_name TEXT; + v_current RECORD; + v_common_prefix TEXT; + + -- Configuration + v_is_asc BOOLEAN; + v_prefix TEXT; + v_start TEXT; + v_upper_bound TEXT; + v_file_batch_size INT; + + -- Seek state + v_next_seek TEXT; + v_count INT := 0; + + -- Dynamic SQL for batch query only + v_batch_query TEXT; + +BEGIN + -- ======================================================================== + -- INITIALIZATION + -- ======================================================================== + v_is_asc := lower(coalesce(sort_order, 'asc')) = 'asc'; + v_prefix := coalesce(prefix_param, ''); + v_start := CASE WHEN coalesce(next_token, '') <> '' THEN next_token ELSE coalesce(start_after, '') END; + v_file_batch_size := LEAST(GREATEST(max_keys * 2, 100), 1000); + + -- Calculate upper bound for prefix filtering (bytewise, using COLLATE "C") + IF v_prefix = '' THEN + v_upper_bound := NULL; + ELSIF right(v_prefix, 1) = delimiter_param THEN + v_upper_bound := left(v_prefix, -1) || chr(ascii(delimiter_param) + 1); + ELSE + v_upper_bound := left(v_prefix, -1) || chr(ascii(right(v_prefix, 1)) + 1); + END IF; + + -- Build batch query (dynamic SQL - called infrequently, amortized over many rows) + IF v_is_asc THEN + IF v_upper_bound IS NOT NULL THEN + v_batch_query := 'SELECT o.name, o.id, o.updated_at, o.created_at, o.last_accessed_at, o.metadata ' || + 'FROM storage.objects o WHERE o.bucket_id = $1 AND o.name COLLATE "C" >= $2 ' || + 'AND o.name COLLATE "C" < $3 ORDER BY o.name COLLATE "C" ASC LIMIT $4'; + ELSE + v_batch_query := 'SELECT o.name, o.id, o.updated_at, o.created_at, o.last_accessed_at, o.metadata ' || + 'FROM storage.objects o WHERE o.bucket_id = $1 AND o.name COLLATE "C" >= $2 ' || + 'ORDER BY o.name COLLATE "C" ASC LIMIT $4'; + END IF; + ELSE + IF v_upper_bound IS NOT NULL THEN + v_batch_query := 'SELECT o.name, o.id, o.updated_at, o.created_at, o.last_accessed_at, o.metadata ' || + 'FROM storage.objects o WHERE o.bucket_id = $1 AND o.name COLLATE "C" < $2 ' || + 'AND o.name COLLATE "C" >= $3 ORDER BY o.name COLLATE "C" DESC LIMIT $4'; + ELSE + v_batch_query := 'SELECT o.name, o.id, o.updated_at, o.created_at, o.last_accessed_at, o.metadata ' || + 'FROM storage.objects o WHERE o.bucket_id = $1 AND o.name COLLATE "C" < $2 ' || + 'ORDER BY o.name COLLATE "C" DESC LIMIT $4'; + END IF; + END IF; + + -- ======================================================================== + -- SEEK INITIALIZATION: Determine starting position + -- ======================================================================== + IF v_start = '' THEN + IF v_is_asc THEN + v_next_seek := v_prefix; + ELSE + -- DESC without cursor: find the last item in range + IF v_upper_bound IS NOT NULL THEN + SELECT o.name INTO v_next_seek FROM storage.objects o + WHERE o.bucket_id = _bucket_id AND o.name COLLATE "C" >= v_prefix AND o.name COLLATE "C" < v_upper_bound + ORDER BY o.name COLLATE "C" DESC LIMIT 1; + ELSIF v_prefix <> '' THEN + SELECT o.name INTO v_next_seek FROM storage.objects o + WHERE o.bucket_id = _bucket_id AND o.name COLLATE "C" >= v_prefix + ORDER BY o.name COLLATE "C" DESC LIMIT 1; + ELSE + SELECT o.name INTO v_next_seek FROM storage.objects o + WHERE o.bucket_id = _bucket_id + ORDER BY o.name COLLATE "C" DESC LIMIT 1; + END IF; + + IF v_next_seek IS NOT NULL THEN + v_next_seek := v_next_seek || delimiter_param; + ELSE + RETURN; + END IF; + END IF; + ELSE + -- Cursor provided: determine if it refers to a folder or leaf + IF EXISTS ( + SELECT 1 FROM storage.objects o + WHERE o.bucket_id = _bucket_id + AND o.name COLLATE "C" LIKE v_start || delimiter_param || '%' + LIMIT 1 + ) THEN + -- Cursor refers to a folder + IF v_is_asc THEN + v_next_seek := v_start || chr(ascii(delimiter_param) + 1); + ELSE + v_next_seek := v_start || delimiter_param; + END IF; + ELSE + -- Cursor refers to a leaf object + IF v_is_asc THEN + v_next_seek := v_start || delimiter_param; + ELSE + v_next_seek := v_start; + END IF; + END IF; + END IF; + + -- ======================================================================== + -- MAIN LOOP: Hybrid peek-then-batch algorithm + -- Uses STATIC SQL for peek (hot path) and DYNAMIC SQL for batch + -- ======================================================================== + LOOP + EXIT WHEN v_count >= max_keys; + + -- STEP 1: PEEK using STATIC SQL (plan cached, very fast) + IF v_is_asc THEN + IF v_upper_bound IS NOT NULL THEN + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = _bucket_id AND o.name COLLATE "C" >= v_next_seek AND o.name COLLATE "C" < v_upper_bound + ORDER BY o.name COLLATE "C" ASC LIMIT 1; + ELSE + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = _bucket_id AND o.name COLLATE "C" >= v_next_seek + ORDER BY o.name COLLATE "C" ASC LIMIT 1; + END IF; + ELSE + IF v_upper_bound IS NOT NULL THEN + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = _bucket_id AND o.name COLLATE "C" < v_next_seek AND o.name COLLATE "C" >= v_prefix + ORDER BY o.name COLLATE "C" DESC LIMIT 1; + ELSIF v_prefix <> '' THEN + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = _bucket_id AND o.name COLLATE "C" < v_next_seek AND o.name COLLATE "C" >= v_prefix + ORDER BY o.name COLLATE "C" DESC LIMIT 1; + ELSE + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = _bucket_id AND o.name COLLATE "C" < v_next_seek + ORDER BY o.name COLLATE "C" DESC LIMIT 1; + END IF; + END IF; + + EXIT WHEN v_peek_name IS NULL; + + -- STEP 2: Check if this is a FOLDER or FILE + v_common_prefix := storage.get_common_prefix(v_peek_name, v_prefix, delimiter_param); + + IF v_common_prefix IS NOT NULL THEN + -- FOLDER: Emit and skip to next folder (no heap access needed) + name := rtrim(v_common_prefix, delimiter_param); + id := NULL; + updated_at := NULL; + created_at := NULL; + last_accessed_at := NULL; + metadata := NULL; + RETURN NEXT; + v_count := v_count + 1; + + -- Advance seek past the folder range + IF v_is_asc THEN + v_next_seek := left(v_common_prefix, -1) || chr(ascii(delimiter_param) + 1); + ELSE + v_next_seek := v_common_prefix; + END IF; + ELSE + -- FILE: Batch fetch using DYNAMIC SQL (overhead amortized over many rows) + -- For ASC: upper_bound is the exclusive upper limit (< condition) + -- For DESC: prefix is the inclusive lower limit (>= condition) + FOR v_current IN EXECUTE v_batch_query USING _bucket_id, v_next_seek, + CASE WHEN v_is_asc THEN COALESCE(v_upper_bound, v_prefix) ELSE v_prefix END, v_file_batch_size + LOOP + v_common_prefix := storage.get_common_prefix(v_current.name, v_prefix, delimiter_param); + + IF v_common_prefix IS NOT NULL THEN + -- Hit a folder: exit batch, let peek handle it + v_next_seek := v_current.name; + EXIT; + END IF; + + -- Emit file + name := v_current.name; + id := v_current.id; + updated_at := v_current.updated_at; + created_at := v_current.created_at; + last_accessed_at := v_current.last_accessed_at; + metadata := v_current.metadata; + RETURN NEXT; + v_count := v_count + 1; + + -- Advance seek past this file + IF v_is_asc THEN + v_next_seek := v_current.name || delimiter_param; + ELSE + v_next_seek := v_current.name; + END IF; + + EXIT WHEN v_count >= max_keys; + END LOOP; + END IF; + END LOOP; +END; +$_$; + +CREATE FUNCTION storage.operation() RETURNS text + LANGUAGE plpgsql STABLE + AS $$ +BEGIN + RETURN current_setting('storage.operation', true); +END; +$$; + +CREATE FUNCTION storage.protect_delete() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + -- Check if storage.allow_delete_query is set to 'true' + IF COALESCE(current_setting('storage.allow_delete_query', true), 'false') != 'true' THEN + RAISE EXCEPTION 'Direct deletion from storage tables is not allowed. Use the Storage API instead.' + USING HINT = 'This prevents accidental data loss from orphaned objects.', + ERRCODE = '42501'; + END IF; + RETURN NULL; +END; +$$; + +CREATE FUNCTION storage.search(prefix text, bucketname text, limits integer DEFAULT 100, levels integer DEFAULT 1, offsets integer DEFAULT 0, search text DEFAULT ''::text, sortcolumn text DEFAULT 'name'::text, sortorder text DEFAULT 'asc'::text) RETURNS TABLE(name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) + LANGUAGE plpgsql STABLE + AS $_$ +DECLARE + v_peek_name TEXT; + v_current RECORD; + v_common_prefix TEXT; + v_delimiter CONSTANT TEXT := '/'; + + -- Configuration + v_limit INT; + v_prefix TEXT; + v_prefix_lower TEXT; + v_is_asc BOOLEAN; + v_order_by TEXT; + v_sort_order TEXT; + v_upper_bound TEXT; + v_file_batch_size INT; + + -- Dynamic SQL for batch query only + v_batch_query TEXT; + + -- Seek state + v_next_seek TEXT; + v_count INT := 0; + v_skipped INT := 0; +BEGIN + -- ======================================================================== + -- INITIALIZATION + -- ======================================================================== + v_limit := LEAST(coalesce(limits, 100), 1500); + v_prefix := coalesce(prefix, '') || coalesce(search, ''); + v_prefix_lower := lower(v_prefix); + v_is_asc := lower(coalesce(sortorder, 'asc')) = 'asc'; + v_file_batch_size := LEAST(GREATEST(v_limit * 2, 100), 1000); + + -- Validate sort column + CASE lower(coalesce(sortcolumn, 'name')) + WHEN 'name' THEN v_order_by := 'name'; + WHEN 'updated_at' THEN v_order_by := 'updated_at'; + WHEN 'created_at' THEN v_order_by := 'created_at'; + WHEN 'last_accessed_at' THEN v_order_by := 'last_accessed_at'; + ELSE v_order_by := 'name'; + END CASE; + + v_sort_order := CASE WHEN v_is_asc THEN 'asc' ELSE 'desc' END; + + -- ======================================================================== + -- NON-NAME SORTING: Use path_tokens approach (unchanged) + -- ======================================================================== + IF v_order_by != 'name' THEN + RETURN QUERY EXECUTE format( + $sql$ + WITH folders AS ( + SELECT path_tokens[$1] AS folder + FROM storage.objects + WHERE objects.name ILIKE $2 || '%%' + AND bucket_id = $3 + AND array_length(objects.path_tokens, 1) <> $1 + GROUP BY folder + ORDER BY folder %s + ) + (SELECT folder AS "name", + NULL::uuid AS id, + NULL::timestamptz AS updated_at, + NULL::timestamptz AS created_at, + NULL::timestamptz AS last_accessed_at, + NULL::jsonb AS metadata FROM folders) + UNION ALL + (SELECT path_tokens[$1] AS "name", + id, updated_at, created_at, last_accessed_at, metadata + FROM storage.objects + WHERE objects.name ILIKE $2 || '%%' + AND bucket_id = $3 + AND array_length(objects.path_tokens, 1) = $1 + ORDER BY %I %s) + LIMIT $4 OFFSET $5 + $sql$, v_sort_order, v_order_by, v_sort_order + ) USING levels, v_prefix, bucketname, v_limit, offsets; + RETURN; + END IF; + + -- ======================================================================== + -- NAME SORTING: Hybrid skip-scan with batch optimization + -- ======================================================================== + + -- Calculate upper bound for prefix filtering + IF v_prefix_lower = '' THEN + v_upper_bound := NULL; + ELSIF right(v_prefix_lower, 1) = v_delimiter THEN + v_upper_bound := left(v_prefix_lower, -1) || chr(ascii(v_delimiter) + 1); + ELSE + v_upper_bound := left(v_prefix_lower, -1) || chr(ascii(right(v_prefix_lower, 1)) + 1); + END IF; + + -- Build batch query (dynamic SQL - called infrequently, amortized over many rows) + IF v_is_asc THEN + IF v_upper_bound IS NOT NULL THEN + v_batch_query := 'SELECT o.name, o.id, o.updated_at, o.created_at, o.last_accessed_at, o.metadata ' || + 'FROM storage.objects o WHERE o.bucket_id = $1 AND lower(o.name) COLLATE "C" >= $2 ' || + 'AND lower(o.name) COLLATE "C" < $3 ORDER BY lower(o.name) COLLATE "C" ASC LIMIT $4'; + ELSE + v_batch_query := 'SELECT o.name, o.id, o.updated_at, o.created_at, o.last_accessed_at, o.metadata ' || + 'FROM storage.objects o WHERE o.bucket_id = $1 AND lower(o.name) COLLATE "C" >= $2 ' || + 'ORDER BY lower(o.name) COLLATE "C" ASC LIMIT $4'; + END IF; + ELSE + IF v_upper_bound IS NOT NULL THEN + v_batch_query := 'SELECT o.name, o.id, o.updated_at, o.created_at, o.last_accessed_at, o.metadata ' || + 'FROM storage.objects o WHERE o.bucket_id = $1 AND lower(o.name) COLLATE "C" < $2 ' || + 'AND lower(o.name) COLLATE "C" >= $3 ORDER BY lower(o.name) COLLATE "C" DESC LIMIT $4'; + ELSE + v_batch_query := 'SELECT o.name, o.id, o.updated_at, o.created_at, o.last_accessed_at, o.metadata ' || + 'FROM storage.objects o WHERE o.bucket_id = $1 AND lower(o.name) COLLATE "C" < $2 ' || + 'ORDER BY lower(o.name) COLLATE "C" DESC LIMIT $4'; + END IF; + END IF; + + -- Initialize seek position + IF v_is_asc THEN + v_next_seek := v_prefix_lower; + ELSE + -- DESC: find the last item in range first (static SQL) + IF v_upper_bound IS NOT NULL THEN + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = bucketname AND lower(o.name) COLLATE "C" >= v_prefix_lower AND lower(o.name) COLLATE "C" < v_upper_bound + ORDER BY lower(o.name) COLLATE "C" DESC LIMIT 1; + ELSIF v_prefix_lower <> '' THEN + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = bucketname AND lower(o.name) COLLATE "C" >= v_prefix_lower + ORDER BY lower(o.name) COLLATE "C" DESC LIMIT 1; + ELSE + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = bucketname + ORDER BY lower(o.name) COLLATE "C" DESC LIMIT 1; + END IF; + + IF v_peek_name IS NOT NULL THEN + v_next_seek := lower(v_peek_name) || v_delimiter; + ELSE + RETURN; + END IF; + END IF; + + -- ======================================================================== + -- MAIN LOOP: Hybrid peek-then-batch algorithm + -- Uses STATIC SQL for peek (hot path) and DYNAMIC SQL for batch + -- ======================================================================== + LOOP + EXIT WHEN v_count >= v_limit; + + -- STEP 1: PEEK using STATIC SQL (plan cached, very fast) + IF v_is_asc THEN + IF v_upper_bound IS NOT NULL THEN + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = bucketname AND lower(o.name) COLLATE "C" >= v_next_seek AND lower(o.name) COLLATE "C" < v_upper_bound + ORDER BY lower(o.name) COLLATE "C" ASC LIMIT 1; + ELSE + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = bucketname AND lower(o.name) COLLATE "C" >= v_next_seek + ORDER BY lower(o.name) COLLATE "C" ASC LIMIT 1; + END IF; + ELSE + IF v_upper_bound IS NOT NULL THEN + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = bucketname AND lower(o.name) COLLATE "C" < v_next_seek AND lower(o.name) COLLATE "C" >= v_prefix_lower + ORDER BY lower(o.name) COLLATE "C" DESC LIMIT 1; + ELSIF v_prefix_lower <> '' THEN + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = bucketname AND lower(o.name) COLLATE "C" < v_next_seek AND lower(o.name) COLLATE "C" >= v_prefix_lower + ORDER BY lower(o.name) COLLATE "C" DESC LIMIT 1; + ELSE + SELECT o.name INTO v_peek_name FROM storage.objects o + WHERE o.bucket_id = bucketname AND lower(o.name) COLLATE "C" < v_next_seek + ORDER BY lower(o.name) COLLATE "C" DESC LIMIT 1; + END IF; + END IF; + + EXIT WHEN v_peek_name IS NULL; + + -- STEP 2: Check if this is a FOLDER or FILE + v_common_prefix := storage.get_common_prefix(lower(v_peek_name), v_prefix_lower, v_delimiter); + + IF v_common_prefix IS NOT NULL THEN + -- FOLDER: Handle offset, emit if needed, skip to next folder + IF v_skipped < offsets THEN + v_skipped := v_skipped + 1; + ELSE + name := split_part(rtrim(v_common_prefix, v_delimiter), v_delimiter, levels); + id := NULL; + updated_at := NULL; + created_at := NULL; + last_accessed_at := NULL; + metadata := NULL; + RETURN NEXT; + v_count := v_count + 1; + END IF; + + -- Advance seek past the folder range + IF v_is_asc THEN + v_next_seek := lower(left(v_common_prefix, -1)) || chr(ascii(v_delimiter) + 1); + ELSE + v_next_seek := lower(v_common_prefix); + END IF; + ELSE + -- FILE: Batch fetch using DYNAMIC SQL (overhead amortized over many rows) + -- For ASC: upper_bound is the exclusive upper limit (< condition) + -- For DESC: prefix_lower is the inclusive lower limit (>= condition) + FOR v_current IN EXECUTE v_batch_query + USING bucketname, v_next_seek, + CASE WHEN v_is_asc THEN COALESCE(v_upper_bound, v_prefix_lower) ELSE v_prefix_lower END, v_file_batch_size + LOOP + v_common_prefix := storage.get_common_prefix(lower(v_current.name), v_prefix_lower, v_delimiter); + + IF v_common_prefix IS NOT NULL THEN + -- Hit a folder: exit batch, let peek handle it + v_next_seek := lower(v_current.name); + EXIT; + END IF; + + -- Handle offset skipping + IF v_skipped < offsets THEN + v_skipped := v_skipped + 1; + ELSE + -- Emit file + name := split_part(v_current.name, v_delimiter, levels); + id := v_current.id; + updated_at := v_current.updated_at; + created_at := v_current.created_at; + last_accessed_at := v_current.last_accessed_at; + metadata := v_current.metadata; + RETURN NEXT; + v_count := v_count + 1; + END IF; + + -- Advance seek past this file + IF v_is_asc THEN + v_next_seek := lower(v_current.name) || v_delimiter; + ELSE + v_next_seek := lower(v_current.name); + END IF; + + EXIT WHEN v_count >= v_limit; + END LOOP; + END IF; + END LOOP; +END; +$_$; + +CREATE FUNCTION storage.search_by_timestamp(p_prefix text, p_bucket_id text, p_limit integer, p_level integer, p_start_after text, p_sort_order text, p_sort_column text, p_sort_column_after text) RETURNS TABLE(key text, name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) + LANGUAGE plpgsql STABLE + AS $_$ +DECLARE + v_cursor_op text; + v_query text; + v_prefix text; +BEGIN + v_prefix := coalesce(p_prefix, ''); + + IF p_sort_order = 'asc' THEN + v_cursor_op := '>'; + ELSE + v_cursor_op := '<'; + END IF; + + v_query := format($sql$ + WITH raw_objects AS ( + SELECT + o.name AS obj_name, + o.id AS obj_id, + o.updated_at AS obj_updated_at, + o.created_at AS obj_created_at, + o.last_accessed_at AS obj_last_accessed_at, + o.metadata AS obj_metadata, + storage.get_common_prefix(o.name, $1, '/') AS common_prefix + FROM storage.objects o + WHERE o.bucket_id = $2 + AND o.name COLLATE "C" LIKE $1 || '%%' + ), + -- Aggregate common prefixes (folders) + -- Both created_at and updated_at use MIN(obj_created_at) to match the old prefixes table behavior + aggregated_prefixes AS ( + SELECT + rtrim(common_prefix, '/') AS name, + NULL::uuid AS id, + MIN(obj_created_at) AS updated_at, + MIN(obj_created_at) AS created_at, + NULL::timestamptz AS last_accessed_at, + NULL::jsonb AS metadata, + TRUE AS is_prefix + FROM raw_objects + WHERE common_prefix IS NOT NULL + GROUP BY common_prefix + ), + leaf_objects AS ( + SELECT + obj_name AS name, + obj_id AS id, + obj_updated_at AS updated_at, + obj_created_at AS created_at, + obj_last_accessed_at AS last_accessed_at, + obj_metadata AS metadata, + FALSE AS is_prefix + FROM raw_objects + WHERE common_prefix IS NULL + ), + combined AS ( + SELECT * FROM aggregated_prefixes + UNION ALL + SELECT * FROM leaf_objects + ), + filtered AS ( + SELECT * + FROM combined + WHERE ( + $5 = '' + OR ROW( + date_trunc('milliseconds', %I), + name COLLATE "C" + ) %s ROW( + COALESCE(NULLIF($6, '')::timestamptz, 'epoch'::timestamptz), + $5 + ) + ) + ) + SELECT + split_part(name, '/', $3) AS key, + name, + id, + updated_at, + created_at, + last_accessed_at, + metadata + FROM filtered + ORDER BY + COALESCE(date_trunc('milliseconds', %I), 'epoch'::timestamptz) %s, + name COLLATE "C" %s + LIMIT $4 + $sql$, + p_sort_column, + v_cursor_op, + p_sort_column, + p_sort_order, + p_sort_order + ); + + RETURN QUERY EXECUTE v_query + USING v_prefix, p_bucket_id, p_level, p_limit, p_start_after, p_sort_column_after; +END; +$_$; + +CREATE FUNCTION storage.search_v2(prefix text, bucket_name text, limits integer DEFAULT 100, levels integer DEFAULT 1, start_after text DEFAULT ''::text, sort_order text DEFAULT 'asc'::text, sort_column text DEFAULT 'name'::text, sort_column_after text DEFAULT ''::text) RETURNS TABLE(key text, name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) + LANGUAGE plpgsql STABLE + AS $$ +DECLARE + v_sort_col text; + v_sort_ord text; + v_limit int; +BEGIN + -- Cap limit to maximum of 1500 records + v_limit := LEAST(coalesce(limits, 100), 1500); + + -- Validate and normalize sort_order + v_sort_ord := lower(coalesce(sort_order, 'asc')); + IF v_sort_ord NOT IN ('asc', 'desc') THEN + v_sort_ord := 'asc'; + END IF; + + -- Validate and normalize sort_column + v_sort_col := lower(coalesce(sort_column, 'name')); + IF v_sort_col NOT IN ('name', 'updated_at', 'created_at') THEN + v_sort_col := 'name'; + END IF; + + -- Route to appropriate implementation + IF v_sort_col = 'name' THEN + -- Use list_objects_with_delimiter for name sorting (most efficient: O(k * log n)) + RETURN QUERY + SELECT + split_part(l.name, '/', levels) AS key, + l.name AS name, + l.id, + l.updated_at, + l.created_at, + l.last_accessed_at, + l.metadata + FROM storage.list_objects_with_delimiter( + bucket_name, + coalesce(prefix, ''), + '/', + v_limit, + start_after, + '', + v_sort_ord + ) l; + ELSE + -- Use aggregation approach for timestamp sorting + -- Not efficient for large datasets but supports correct pagination + RETURN QUERY SELECT * FROM storage.search_by_timestamp( + prefix, bucket_name, v_limit, levels, start_after, + v_sort_ord, v_sort_col, sort_column_after + ); + END IF; +END; +$$; + +CREATE FUNCTION storage.update_updated_at_column() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION supabase_functions.http_request() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'supabase_functions' + AS $$ + DECLARE + request_id bigint; + payload jsonb; + url text := TG_ARGV[0]::text; + method text := TG_ARGV[1]::text; + headers jsonb DEFAULT '{}'::jsonb; + params jsonb DEFAULT '{}'::jsonb; + timeout_ms integer DEFAULT 1000; + BEGIN + IF url IS NULL OR url = 'null' THEN + RAISE EXCEPTION 'url argument is missing'; + END IF; + + IF method IS NULL OR method = 'null' THEN + RAISE EXCEPTION 'method argument is missing'; + END IF; + + IF TG_ARGV[2] IS NULL OR TG_ARGV[2] = 'null' THEN + headers = '{"Content-Type": "application/json"}'::jsonb; + ELSE + headers = TG_ARGV[2]::jsonb; + END IF; + + IF TG_ARGV[3] IS NULL OR TG_ARGV[3] = 'null' THEN + params = '{}'::jsonb; + ELSE + params = TG_ARGV[3]::jsonb; + END IF; + + IF TG_ARGV[4] IS NULL OR TG_ARGV[4] = 'null' THEN + timeout_ms = 1000; + ELSE + timeout_ms = TG_ARGV[4]::integer; + END IF; + + CASE + WHEN method = 'GET' THEN + SELECT http_get INTO request_id FROM net.http_get( + url, + params, + headers, + timeout_ms + ); + WHEN method = 'POST' THEN + payload = jsonb_build_object( + 'old_record', OLD, + 'record', NEW, + 'type', TG_OP, + 'table', TG_TABLE_NAME, + 'schema', TG_TABLE_SCHEMA + ); + + SELECT http_post INTO request_id FROM net.http_post( + url, + payload, + params, + headers, + timeout_ms + ); + ELSE + RAISE EXCEPTION 'method argument % is invalid', method; + END CASE; + + INSERT INTO supabase_functions.hooks + (hook_table_id, hook_name, request_id) + VALUES + (TG_RELID, TG_NAME, request_id); + + RETURN NEW; + END +$$; diff --git a/database-novo/schema/03_functions/agenda.sql b/database-novo/schema/03_functions/agenda.sql deleted file mode 100644 index 15e55c3..0000000 --- a/database-novo/schema/03_functions/agenda.sql +++ /dev/null @@ -1,650 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Functions — Agenda --- ============================================================================= --- agenda_cfg_sync, agendador_dias_disponiveis, agendador_gerar_slug, --- agendador_slots_disponiveis, cancel_recurrence_from, --- cancelar_eventos_serie, fn_agenda_regras_semanais_no_overlap, --- split_recurrence_at, sync_busy_mirror, set_updated_at_recurrence --- ============================================================================= - -CREATE FUNCTION public.agenda_cfg_sync() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - if new.agenda_view_mode = 'custom' then - new.usar_horario_admin_custom := true; - new.admin_inicio_visualizacao := new.agenda_custom_start; - new.admin_fim_visualizacao := new.agenda_custom_end; - else - new.usar_horario_admin_custom := false; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.agenda_cfg_sync() OWNER TO supabase_admin; - --- --- Name: agendador_dias_disponiveis(text, integer, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) RETURNS TABLE(data date, tem_slots boolean) - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_owner_id uuid; - v_antecedencia int; - v_agora timestamptz; - v_data date; - v_data_inicio date; - v_data_fim date; - v_db_dow int; - v_tem_slot boolean; - v_bloqueado boolean; -BEGIN - SELECT c.owner_id, c.antecedencia_minima_horas - INTO v_owner_id, v_antecedencia - FROM public.agendador_configuracoes c - WHERE c.link_slug = p_slug AND c.ativo = true - LIMIT 1; - - IF v_owner_id IS NULL THEN RETURN; END IF; - - v_agora := now(); - v_data_inicio := make_date(p_ano, p_mes, 1); - v_data_fim := (v_data_inicio + interval '1 month' - interval '1 day')::date; - - v_data := v_data_inicio; - WHILE v_data <= v_data_fim LOOP - v_db_dow := extract(dow from v_data::timestamp)::int; - - -- ── Dia inteiro bloqueado? (agenda_bloqueios) ───────────────────────── - SELECT EXISTS ( - SELECT 1 FROM public.agenda_bloqueios b - WHERE b.owner_id = v_owner_id - AND b.data_inicio <= v_data - AND COALESCE(b.data_fim, v_data) >= v_data - AND b.hora_inicio IS NULL -- bloqueio de dia inteiro - AND ( - (NOT b.recorrente) - OR (b.recorrente AND b.dia_semana = v_db_dow) - ) - ) INTO v_bloqueado; - - IF v_bloqueado THEN - v_data := v_data + 1; - CONTINUE; - END IF; - - -- ── Tem slots disponíveis no dia? ───────────────────────────────────── - SELECT EXISTS ( - SELECT 1 FROM public.agenda_online_slots s - WHERE s.owner_id = v_owner_id - AND s.weekday = v_db_dow - AND s.enabled = true - AND (v_data::text || ' ' || s.time::text)::timestamp - AT TIME ZONE 'America/Sao_Paulo' - >= v_agora + (v_antecedencia || ' hours')::interval - ) INTO v_tem_slot; - - IF v_tem_slot THEN - data := v_data; - tem_slots := true; - RETURN NEXT; - END IF; - - v_data := v_data + 1; - END LOOP; -END; -$$; - - -ALTER FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) OWNER TO supabase_admin; - --- --- Name: agendador_gerar_slug(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.agendador_gerar_slug() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_slug text; - v_exists boolean; -BEGIN - -- só gera se ativou e não tem slug ainda - IF NEW.ativo = true AND (NEW.link_slug IS NULL OR NEW.link_slug = '') THEN - LOOP - v_slug := lower(substring(replace(gen_random_uuid()::text, '-', ''), 1, 8)); - SELECT EXISTS ( - SELECT 1 FROM public.agendador_configuracoes - WHERE link_slug = v_slug AND owner_id <> NEW.owner_id - ) INTO v_exists; - EXIT WHEN NOT v_exists; - END LOOP; - NEW.link_slug := v_slug; - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.agendador_gerar_slug() OWNER TO supabase_admin; - --- --- Name: agendador_slots_disponiveis(text, date); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) RETURNS TABLE(hora time without time zone, disponivel boolean) -CREATE FUNCTION public.agendador_gerar_slug() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_slug text; - v_exists boolean; -BEGIN - -- só gera se ativou e não tem slug ainda - IF NEW.ativo = true AND (NEW.link_slug IS NULL OR NEW.link_slug = '') THEN - LOOP - v_slug := lower(substring(replace(gen_random_uuid()::text, '-', ''), 1, 8)); - SELECT EXISTS ( - SELECT 1 FROM public.agendador_configuracoes - WHERE link_slug = v_slug AND owner_id <> NEW.owner_id - ) INTO v_exists; - EXIT WHEN NOT v_exists; - END LOOP; - NEW.link_slug := v_slug; - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.agendador_gerar_slug() OWNER TO supabase_admin; - --- --- Name: agendador_slots_disponiveis(text, date); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) RETURNS TABLE(hora time without time zone, disponivel boolean) - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_owner_id uuid; - v_duracao int; - v_antecedencia int; - v_agora timestamptz; - v_db_dow int; - v_slot time; - v_slot_fim time; - v_slot_ts timestamptz; - v_ocupado boolean; - -- loop de recorrências - v_rule RECORD; - v_rule_start_dow int; - v_first_occ date; - v_day_diff int; - v_ex_type text; -BEGIN - SELECT c.owner_id, c.duracao_sessao_min, c.antecedencia_minima_horas - INTO v_owner_id, v_duracao, v_antecedencia - FROM public.agendador_configuracoes c - WHERE c.link_slug = p_slug AND c.ativo = true - LIMIT 1; - - IF v_owner_id IS NULL THEN RETURN; END IF; - - v_agora := now(); - v_db_dow := extract(dow from p_data::timestamp)::int; - - -- ── Dia inteiro bloqueado? (agenda_bloqueios sem hora) ─────────────────── - -- Se sim, não há nenhum slot disponível — retorna vazio. - IF EXISTS ( - SELECT 1 FROM public.agenda_bloqueios b - WHERE b.owner_id = v_owner_id - AND b.data_inicio <= p_data - AND COALESCE(b.data_fim, p_data) >= p_data - AND b.hora_inicio IS NULL -- bloqueio de dia inteiro - AND ( - (NOT b.recorrente) - OR (b.recorrente AND b.dia_semana = v_db_dow) - ) - ) THEN - RETURN; - END IF; - - FOR v_slot IN - SELECT s.time - FROM public.agenda_online_slots s - WHERE s.owner_id = v_owner_id - AND s.weekday = v_db_dow - AND s.enabled = true - ORDER BY s.time - LOOP - v_slot_fim := v_slot + (v_duracao || ' minutes')::interval; - v_ocupado := false; - - -- ── Antecedência mínima ────────────────────────────────────────────────── - v_slot_ts := (p_data::text || ' ' || v_slot::text)::timestamp - AT TIME ZONE 'America/Sao_Paulo'; - IF v_slot_ts < v_agora + (v_antecedencia || ' hours')::interval THEN - v_ocupado := true; - END IF; - - -- ── Bloqueio de horário específico (agenda_bloqueios com hora) ─────────── - IF NOT v_ocupado THEN - SELECT EXISTS ( - SELECT 1 FROM public.agenda_bloqueios b - WHERE b.owner_id = v_owner_id - AND b.data_inicio <= p_data - AND COALESCE(b.data_fim, p_data) >= p_data - AND b.hora_inicio IS NOT NULL - AND b.hora_inicio < v_slot_fim - AND b.hora_fim > v_slot - AND ( - (NOT b.recorrente) - OR (b.recorrente AND b.dia_semana = v_db_dow) - ) - ) INTO v_ocupado; - END IF; - - -- ── Eventos avulsos internos (agenda_eventos) ──────────────────────────── - IF NOT v_ocupado THEN - SELECT EXISTS ( - SELECT 1 FROM public.agenda_eventos e - WHERE e.owner_id = v_owner_id - AND e.status::text NOT IN ('cancelado', 'faltou') - AND (e.inicio_em AT TIME ZONE 'America/Sao_Paulo')::date = p_data - AND (e.inicio_em AT TIME ZONE 'America/Sao_Paulo')::time < v_slot_fim - AND (e.fim_em AT TIME ZONE 'America/Sao_Paulo')::time > v_slot - ) INTO v_ocupado; - END IF; - - -- ── Recorrências ativas (recurrence_rules) ─────────────────────────────── - IF NOT v_ocupado THEN - FOR v_rule IN - SELECT - r.id, - r.start_date::date AS start_date, - r.end_date::date AS end_date, - r.start_time::time AS start_time, - r.end_time::time AS end_time, - COALESCE(r.interval, 1)::int AS interval - FROM public.recurrence_rules r - WHERE r.owner_id = v_owner_id - AND r.status = 'ativo' - AND p_data >= r.start_date::date - AND (r.end_date IS NULL OR p_data <= r.end_date::date) - AND v_db_dow = ANY(r.weekdays) - AND r.start_time::time < v_slot_fim - AND r.end_time::time > v_slot - LOOP - v_rule_start_dow := extract(dow from v_rule.start_date)::int; - v_first_occ := v_rule.start_date - + (((v_db_dow - v_rule_start_dow + 7) % 7))::int; - v_day_diff := (p_data - v_first_occ)::int; - - IF v_day_diff >= 0 AND v_day_diff % (7 * v_rule.interval) = 0 THEN - v_ex_type := NULL; - SELECT ex.type INTO v_ex_type - FROM public.recurrence_exceptions ex - WHERE ex.recurrence_id = v_rule.id - AND ex.original_date = p_data - LIMIT 1; - - IF v_ex_type IS NULL OR v_ex_type NOT IN ( - 'cancel_session', 'patient_missed', - 'therapist_canceled', 'holiday_block', - 'reschedule_session' - ) THEN - v_ocupado := true; - EXIT; - END IF; - END IF; - END LOOP; - END IF; - - -- ── Recorrências remarcadas para este dia ──────────────────────────────── - IF NOT v_ocupado THEN - SELECT EXISTS ( - SELECT 1 - FROM public.recurrence_exceptions ex - JOIN public.recurrence_rules r ON r.id = ex.recurrence_id - WHERE r.owner_id = v_owner_id - AND r.status = 'ativo' - AND ex.type = 'reschedule_session' - AND ex.new_date = p_data - AND COALESCE(ex.new_start_time, r.start_time)::time < v_slot_fim - AND COALESCE(ex.new_end_time, r.end_time)::time > v_slot - ) INTO v_ocupado; - END IF; - - -- ── Solicitações públicas pendentes ────────────────────────────────────── - IF NOT v_ocupado THEN - SELECT EXISTS ( - SELECT 1 FROM public.agendador_solicitacoes sol - WHERE sol.owner_id = v_owner_id - AND sol.status = 'pendente' - AND sol.data_solicitada = p_data - AND sol.hora_solicitada = v_slot - AND (sol.reservado_ate IS NULL OR sol.reservado_ate > v_agora) - ) INTO v_ocupado; - END IF; - - hora := v_slot; - disponivel := NOT v_ocupado; - RETURN NEXT; - END LOOP; -END; -$$; - - -ALTER FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) OWNER TO supabase_admin; - --- --- Name: auto_create_financial_record_from_session(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.auto_create_financial_record_from_session() RETURNS trigger -CREATE FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -BEGIN - UPDATE public.recurrence_rules - SET - end_date = p_from_date - INTERVAL '1 day', - open_ended = false, - status = CASE - WHEN p_from_date <= start_date THEN 'cancelado' - ELSE status - END, - updated_at = now() - WHERE id = p_recurrence_id; -END; -$$; - - -ALTER FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) OWNER TO supabase_admin; - --- --- Name: cancel_subscription(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.cancel_subscription(p_subscription_id uuid) RETURNS public.subscriptions -CREATE FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone DEFAULT now()) RETURNS integer - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_count integer; -BEGIN - UPDATE public.agenda_eventos - SET status = 'cancelado', - updated_at = now() - WHERE serie_id = p_serie_id - AND inicio_em >= p_a_partir_de - AND status NOT IN ('realizado', 'cancelado'); - - GET DIAGNOSTICS v_count = ROW_COUNT; - RETURN v_count; -END; -$$; - - -ALTER FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) OWNER TO supabase_admin; - --- --- Name: FUNCTION cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) IS 'Cancela todos os eventos futuros de uma série a partir de p_a_partir_de (inclusive). - Não cancela eventos já realizados.'; - - --- --- Name: change_subscription_plan(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) RETURNS public.subscriptions -CREATE FUNCTION public.fn_agenda_regras_semanais_no_overlap() RETURNS trigger - LANGUAGE plpgsql - AS $$ -declare - v_count int; -begin - if new.ativo is false then - return new; - end if; - - select count(*) into v_count - from public.agenda_regras_semanais r - where r.owner_id = new.owner_id - and r.dia_semana = new.dia_semana - and r.ativo is true - and (tg_op = 'INSERT' or r.id <> new.id) - and (new.hora_inicio < r.hora_fim and new.hora_fim > r.hora_inicio); - - if v_count > 0 then - raise exception 'Janela sobreposta: já existe uma regra ativa nesse intervalo.'; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.fn_agenda_regras_semanais_no_overlap() OWNER TO supabase_admin; - --- --- Name: get_financial_report(uuid, date, date, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text DEFAULT 'month'::text) RETURNS TABLE(group_key text, group_label text, total_receitas numeric, total_despesas numeric, saldo numeric, total_pendente numeric, total_overdue numeric, count_records bigint) -CREATE FUNCTION public.set_updated_at_recurrence() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN NEW.updated_at = now(); RETURN NEW; END; -$$; - - -ALTER FUNCTION public.set_updated_at_recurrence() OWNER TO supabase_admin; - --- --- Name: split_recurrence_at(uuid, date); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_old public.recurrence_rules; - v_new_id uuid; -BEGIN - -- busca a regra original - SELECT * INTO v_old - FROM public.recurrence_rules - WHERE id = p_recurrence_id; - - IF NOT FOUND THEN - RAISE EXCEPTION 'recurrence_rule % não encontrada', p_recurrence_id; - END IF; - - -- encerra a regra antiga na data anterior - UPDATE public.recurrence_rules - SET - end_date = p_from_date - INTERVAL '1 day', - open_ended = false, - updated_at = now() - WHERE id = p_recurrence_id; - - -- cria nova regra a partir de p_from_date - INSERT INTO public.recurrence_rules ( - tenant_id, owner_id, therapist_id, patient_id, - determined_commitment_id, type, interval, weekdays, - start_time, end_time, timezone, duration_min, - start_date, end_date, max_occurrences, open_ended, - modalidade, titulo_custom, observacoes, extra_fields, status - ) - SELECT - tenant_id, owner_id, therapist_id, patient_id, - determined_commitment_id, type, interval, weekdays, - start_time, end_time, timezone, duration_min, - p_from_date, v_old.end_date, v_old.max_occurrences, v_old.open_ended, - modalidade, titulo_custom, observacoes, extra_fields, status - FROM public.recurrence_rules - WHERE id = p_recurrence_id - RETURNING id INTO v_new_id; - - RETURN v_new_id; -END; -$$; - - -ALTER FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) OWNER TO supabase_admin; - --- --- Name: subscription_intents_view_insert(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.subscription_intents_view_insert() RETURNS trigger -CREATE FUNCTION public.sync_busy_mirror_agenda_eventos() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -declare - clinic_tenant uuid; - is_personal boolean; - should_mirror boolean; -begin - -- Anti-recursão: espelho não espelha - if (tg_op <> 'DELETE') then - if new.mirror_of_event_id is not null then - return new; - end if; - else - if old.mirror_of_event_id is not null then - return old; - end if; - end if; - - -- Define se é pessoal e se deve espelhar - if (tg_op = 'DELETE') then - is_personal := (old.tenant_id = old.owner_id); - should_mirror := (old.visibility_scope in ('busy_only','private')); - else - is_personal := (new.tenant_id = new.owner_id); - should_mirror := (new.visibility_scope in ('busy_only','private')); - end if; - - -- Se não é pessoal, não faz nada - if not is_personal then - if (tg_op = 'DELETE') then - return old; - end if; - return new; - end if; - - -- DELETE: remove espelhos existentes - if (tg_op = 'DELETE') then - delete from public.agenda_eventos e - where e.mirror_of_event_id = old.id - and e.mirror_source = 'personal_busy_mirror'; - - return old; - end if; - - -- INSERT/UPDATE: - -- Se não deve espelhar, remove espelhos e sai - if not should_mirror then - delete from public.agenda_eventos e - where e.mirror_of_event_id = new.id - and e.mirror_source = 'personal_busy_mirror'; - - return new; - end if; - - -- Para cada clínica onde o usuário é therapist active, cria/atualiza o "Ocupado" - for clinic_tenant in - select tm.tenant_id - from public.tenant_members tm - where tm.user_id = new.owner_id - and tm.role = 'therapist' - and tm.status = 'active' - and tm.tenant_id <> new.owner_id - loop - insert into public.agenda_eventos ( - tenant_id, - owner_id, - terapeuta_id, - paciente_id, - tipo, - status, - titulo, - observacoes, - inicio_em, - fim_em, - mirror_of_event_id, - mirror_source, - visibility_scope, - created_at, - updated_at - ) values ( - clinic_tenant, - new.owner_id, - new.owner_id, - null, - 'bloqueio'::public.tipo_evento_agenda, - 'agendado'::public.status_evento_agenda, - 'Ocupado', - null, - new.inicio_em, - new.fim_em, - new.id, - 'personal_busy_mirror', - 'public', - now(), - now() - ) - on conflict (tenant_id, mirror_of_event_id) where mirror_of_event_id is not null - do update set - owner_id = excluded.owner_id, - terapeuta_id = excluded.terapeuta_id, - tipo = excluded.tipo, - status = excluded.status, - titulo = excluded.titulo, - observacoes = excluded.observacoes, - inicio_em = excluded.inicio_em, - fim_em = excluded.fim_em, - updated_at = now(); - end loop; - - -- Limpa espelhos de clínicas onde o vínculo therapist active não existe mais - delete from public.agenda_eventos e - where e.mirror_of_event_id = new.id - and e.mirror_source = 'personal_busy_mirror' - and not exists ( - select 1 - from public.tenant_members tm - where tm.user_id = new.owner_id - and tm.role = 'therapist' - and tm.status = 'active' - and tm.tenant_id = e.tenant_id - ); - - return new; -end; -$$; - - -ALTER FUNCTION public.sync_busy_mirror_agenda_eventos() OWNER TO supabase_admin; - --- --- Name: sync_overdue_financial_records(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.sync_overdue_financial_records() RETURNS integer diff --git a/database-novo/schema/03_functions/auth.sql b/database-novo/schema/03_functions/auth.sql index a8b366d..c646c30 100644 --- a/database-novo/schema/03_functions/auth.sql +++ b/database-novo/schema/03_functions/auth.sql @@ -1,11 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Functions — auth schema --- auth.email(), auth.jwt(), auth.role(), auth.uid() --- ============================================================================= - --- --- Name: email(); Type: FUNCTION; Schema: auth; Owner: supabase_auth_admin --- +-- Functions: auth +-- Gerado automaticamente em 2026-04-17T12:23:05.221Z +-- Total: 4 CREATE FUNCTION auth.email() RETURNS text LANGUAGE sql STABLE @@ -17,20 +12,6 @@ CREATE FUNCTION auth.email() RETURNS text )::text $$; - -ALTER FUNCTION auth.email() OWNER TO supabase_auth_admin; - --- --- Name: FUNCTION email(); Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON FUNCTION auth.email() IS 'Deprecated. Use auth.jwt() -> ''email'' instead.'; - - --- --- Name: jwt(); Type: FUNCTION; Schema: auth; Owner: supabase_auth_admin --- - CREATE FUNCTION auth.jwt() RETURNS jsonb LANGUAGE sql STABLE AS $$ @@ -41,13 +22,6 @@ CREATE FUNCTION auth.jwt() RETURNS jsonb )::jsonb $$; - -ALTER FUNCTION auth.jwt() OWNER TO supabase_auth_admin; - --- --- Name: role(); Type: FUNCTION; Schema: auth; Owner: supabase_auth_admin --- - CREATE FUNCTION auth.role() RETURNS text LANGUAGE sql STABLE AS $$ @@ -58,20 +32,6 @@ CREATE FUNCTION auth.role() RETURNS text )::text $$; - -ALTER FUNCTION auth.role() OWNER TO supabase_auth_admin; - --- --- Name: FUNCTION role(); Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON FUNCTION auth.role() IS 'Deprecated. Use auth.jwt() -> ''role'' instead.'; - - --- --- Name: uid(); Type: FUNCTION; Schema: auth; Owner: supabase_auth_admin --- - CREATE FUNCTION auth.uid() RETURNS uuid LANGUAGE sql STABLE AS $$ @@ -81,13 +41,3 @@ CREATE FUNCTION auth.uid() RETURNS uuid (nullif(current_setting('request.jwt.claims', true), '')::jsonb ->> 'sub') )::uuid $$; - - -ALTER FUNCTION auth.uid() OWNER TO supabase_auth_admin; - --- --- Name: FUNCTION uid(); Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON FUNCTION auth.uid() IS 'Deprecated. Use auth.jwt() -> ''sub'' instead.'; - diff --git a/database-novo/schema/03_functions/billing.sql b/database-novo/schema/03_functions/billing.sql deleted file mode 100644 index 20de4e3..0000000 --- a/database-novo/schema/03_functions/billing.sql +++ /dev/null @@ -1,1283 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Functions — Plans, Subscriptions, Billing --- ============================================================================= --- activate_subscription_from_intent, cancel_subscription, --- change_subscription_plan, toggle_plan, transition_subscription, --- reactivate_subscription, rebuild_owner_entitlements, --- fix_all_subscription_mismatches, subscription_intents_view_insert, --- subscriptions_validate_scope, admin_fix_plan_target, --- set_tenant_feature_exception, guard_no_change_core_plan_key, etc. --- ============================================================================= - -CREATE FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) RETURNS public.subscriptions - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_intent record; - v_sub public.subscriptions; - v_days int; - v_user_id uuid; - v_plan_id uuid; - v_target text; -begin - -- lê pela VIEW unificada - select * into v_intent - from public.subscription_intents - where id = p_intent_id; - - if not found then - raise exception 'Intent não encontrado: %', p_intent_id; - end if; - - if v_intent.status <> 'paid' then - raise exception 'Intent precisa estar paid para ativar assinatura'; - end if; - - -- resolve target e plan_id via plans.key - select p.id, p.target - into v_plan_id, v_target - from public.plans p - where p.key = v_intent.plan_key - limit 1; - - if v_plan_id is null then - raise exception 'Plano não encontrado em plans.key = %', v_intent.plan_key; - end if; - - v_target := lower(coalesce(v_target, '')); - - -- ✅ supervisor adicionado - if v_target not in ('clinic', 'therapist', 'supervisor') then - raise exception 'Target inválido em plans.target: %', v_target; - end if; - - -- regra por target - if v_target = 'clinic' then - if v_intent.tenant_id is null then - raise exception 'Intent sem tenant_id'; - end if; - else - -- therapist ou supervisor: vinculado ao user - v_user_id := v_intent.user_id; - if v_user_id is null then - v_user_id := v_intent.created_by_user_id; - end if; - end if; - - if v_target in ('therapist', 'supervisor') and v_user_id is null then - raise exception 'Não foi possível determinar user_id para assinatura %.', v_target; - end if; - - -- cancela assinatura ativa anterior - if v_target = 'clinic' then - update public.subscriptions - set status = 'cancelled', - cancelled_at = now() - where tenant_id = v_intent.tenant_id - and plan_id = v_plan_id - and status = 'active'; - else - -- therapist ou supervisor - update public.subscriptions - set status = 'cancelled', - cancelled_at = now() - where user_id = v_user_id - and plan_id = v_plan_id - and status = 'active' - and tenant_id is null; - end if; - - -- duração do plano (30 dias para mensal) - v_days := case - when lower(coalesce(v_intent.interval, 'month')) = 'year' then 365 - else 30 - end; - - -- cria nova assinatura - insert into public.subscriptions ( - user_id, - plan_id, - status, - started_at, - expires_at, - cancelled_at, - activated_at, - tenant_id, - plan_key, - interval, - source, - created_at, - updated_at - ) - values ( - case when v_target = 'clinic' then null else v_user_id end, - v_plan_id, - 'active', - now(), - now() + make_interval(days => v_days), - null, - now(), - case when v_target = 'clinic' then v_intent.tenant_id else null end, - v_intent.plan_key, - v_intent.interval, - 'manual', - now(), - now() - ) - returning * into v_sub; - - -- grava vínculo intent → subscription - if v_target = 'clinic' then - update public.subscription_intents_tenant - set subscription_id = v_sub.id - where id = p_intent_id; - else - update public.subscription_intents_personal - set subscription_id = v_sub.id - where id = p_intent_id; - end if; - - return v_sub; -end; -$$; - - -ALTER FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) OWNER TO supabase_admin; - --- --- Name: admin_credit_addon(uuid, text, integer, uuid, text, text, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Crédito manual'::text, p_payment_method text DEFAULT 'manual'::text, p_price_cents integer DEFAULT 0) RETURNS jsonb -CREATE FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Crédito manual'::text, p_payment_method text DEFAULT 'manual'::text, p_price_cents integer DEFAULT 0) RETURNS jsonb - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_credit addon_credits%ROWTYPE; - v_balance_before INTEGER; - v_balance_after INTEGER; - v_tx_id UUID; -BEGIN - -- Upsert addon_credits - INSERT INTO addon_credits (tenant_id, addon_type, balance, total_purchased) - VALUES (p_tenant_id, p_addon_type, 0, 0) - ON CONFLICT (tenant_id, addon_type) DO NOTHING; - - -- Lock e leitura - SELECT * INTO v_credit - FROM addon_credits - WHERE tenant_id = p_tenant_id AND addon_type = p_addon_type - FOR UPDATE; - - v_balance_before := v_credit.balance; - v_balance_after := v_credit.balance + p_amount; - - -- Atualiza saldo - UPDATE addon_credits - SET balance = v_balance_after, - total_purchased = total_purchased + p_amount, - low_balance_notified = CASE WHEN v_balance_after > COALESCE(low_balance_threshold, 10) THEN false ELSE low_balance_notified END, - updated_at = now() - WHERE id = v_credit.id; - - -- Registra transação - INSERT INTO addon_transactions ( - tenant_id, addon_type, type, amount, - balance_before, balance_after, - product_id, description, - admin_user_id, payment_method, price_cents - ) VALUES ( - p_tenant_id, p_addon_type, 'purchase', p_amount, - v_balance_before, v_balance_after, - p_product_id, p_description, - auth.uid(), p_payment_method, p_price_cents - ) - RETURNING id INTO v_tx_id; - - RETURN jsonb_build_object( - 'success', true, - 'transaction_id', v_tx_id, - 'balance_before', v_balance_before, - 'balance_after', v_balance_after - ); -END; -$$; - - -ALTER FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) OWNER TO supabase_admin; - --- --- Name: FUNCTION admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) IS 'Admin adiciona créditos de add-on a um tenant. Cria registro se não existir.'; - - --- --- Name: admin_delete_email_template_global(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.admin_delete_email_template_global(p_id uuid) RETURNS boolean -CREATE FUNCTION public.admin_delete_email_template_global(p_id uuid) RETURNS boolean - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -BEGIN - DELETE FROM public.email_templates_global WHERE id = p_id; - IF NOT FOUND THEN - RAISE EXCEPTION 'Template com id % não encontrado', p_id; - END IF; - RETURN true; -END; -$$; - - -ALTER FUNCTION public.admin_delete_email_template_global(p_id uuid) OWNER TO supabase_admin; - --- --- Name: admin_fix_plan_target(text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) RETURNS void -CREATE FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_plan_id uuid; -begin - -- (opcional) restringe targets válidos - if p_new_target not in ('clinic','therapist') then - raise exception 'Target inválido: %', p_new_target using errcode='P0001'; - end if; - - -- trava o plano - select id into v_plan_id - from public.plans - where key = p_plan_key - for update; - - if v_plan_id is null then - raise exception 'Plano não encontrado: %', p_plan_key using errcode='P0001'; - end if; - - -- segurança: não mexer se existe subscription - if exists (select 1 from public.subscriptions s where s.plan_id = v_plan_id) then - raise exception 'Plano % possui subscriptions. Migração bloqueada.', p_plan_key using errcode='P0001'; - end if; - - -- liga bypass SOMENTE nesta transação - perform set_config('app.plan_migration_bypass', '1', true); - - update public.plans - set target = p_new_target - where id = v_plan_id; - -end -$$; - - -ALTER FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) OWNER TO supabase_admin; - --- --- Name: admin_upsert_email_template_global(uuid, text, text, text, text, text, text, boolean, jsonb); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.admin_upsert_email_template_global(p_id uuid DEFAULT NULL::uuid, p_key text DEFAULT NULL::text, p_domain text DEFAULT NULL::text, p_channel text DEFAULT 'email'::text, p_subject text DEFAULT NULL::text, p_body_html text DEFAULT NULL::text, p_body_text text DEFAULT NULL::text, p_is_active boolean DEFAULT true, p_variables jsonb DEFAULT '{}'::jsonb) RETURNS jsonb -CREATE FUNCTION public.admin_upsert_email_template_global(p_id uuid DEFAULT NULL::uuid, p_key text DEFAULT NULL::text, p_domain text DEFAULT NULL::text, p_channel text DEFAULT 'email'::text, p_subject text DEFAULT NULL::text, p_body_html text DEFAULT NULL::text, p_body_text text DEFAULT NULL::text, p_is_active boolean DEFAULT true, p_variables jsonb DEFAULT '{}'::jsonb) RETURNS jsonb - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_result jsonb; - v_id uuid; -BEGIN - -- UPDATE existente - IF p_id IS NOT NULL THEN - UPDATE public.email_templates_global - SET - subject = COALESCE(p_subject, subject), - body_html = COALESCE(p_body_html, body_html), - body_text = p_body_text, - is_active = p_is_active, - variables = COALESCE(p_variables, variables), - version = version + 1 - WHERE id = p_id - RETURNING to_jsonb(email_templates_global.*) INTO v_result; - - IF v_result IS NULL THEN - RAISE EXCEPTION 'Template com id % não encontrado', p_id; - END IF; - - RETURN v_result; - END IF; - - -- INSERT novo - IF p_key IS NULL OR p_domain IS NULL OR p_subject IS NULL OR p_body_html IS NULL THEN - RAISE EXCEPTION 'key, domain, subject e body_html são obrigatórios para novo template'; - END IF; - - INSERT INTO public.email_templates_global (key, domain, channel, subject, body_html, body_text, is_active, variables) - VALUES (p_key, p_domain, p_channel, p_subject, p_body_html, p_body_text, p_is_active, p_variables) - RETURNING to_jsonb(email_templates_global.*) INTO v_result; - - RETURN v_result; -END; -$$; - - -ALTER FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) OWNER TO supabase_admin; - --- --- Name: agenda_cfg_sync(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.agenda_cfg_sync() RETURNS trigger -CREATE FUNCTION public.cancel_subscription(p_subscription_id uuid) RETURNS public.subscriptions - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_sub public.subscriptions; - v_owner_type text; - v_owner_ref uuid; -begin - - select * - into v_sub - from public.subscriptions - where id = p_subscription_id - for update; - - if not found then - raise exception 'Subscription não encontrada'; - end if; - - if v_sub.status = 'canceled' then - return v_sub; - end if; - - if v_sub.tenant_id is not null then - v_owner_type := 'clinic'; - v_owner_ref := v_sub.tenant_id; - elsif v_sub.user_id is not null then - v_owner_type := 'therapist'; - v_owner_ref := v_sub.user_id; - else - v_owner_type := null; - v_owner_ref := null; - end if; - - update public.subscriptions - set status = 'canceled', - cancel_at_period_end = false, - updated_at = now() - where id = p_subscription_id - returning * into v_sub; - - insert into public.subscription_events( - subscription_id, - owner_id, - owner_type, - owner_ref, - event_type, - old_plan_id, - new_plan_id, - created_by, - reason, - source, - metadata - ) - values ( - v_sub.id, - v_owner_ref, - v_owner_type, - v_owner_ref, - 'canceled', - v_sub.plan_id, - v_sub.plan_id, - auth.uid(), - 'Cancelamento manual via admin', - 'admin_panel', - jsonb_build_object('previous_status', 'active') - ); - - if v_owner_ref is not null then - insert into public.entitlements_invalidation(owner_id, changed_at) - values (v_owner_ref, now()) - on conflict (owner_id) - do update set changed_at = excluded.changed_at; - end if; - - return v_sub; - -end; -$$; - - -ALTER FUNCTION public.cancel_subscription(p_subscription_id uuid) OWNER TO supabase_admin; - --- --- Name: cancelar_eventos_serie(uuid, timestamp with time zone); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone DEFAULT now()) RETURNS integer -CREATE FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) RETURNS public.subscriptions - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_sub public.subscriptions; - v_old_plan uuid; - v_new_key text; - - v_owner_type text; - v_owner_ref uuid; - - v_new_target text; - v_sub_target text; -begin - select * - into v_sub - from public.subscriptions - where id = p_subscription_id - for update; - - if not found then - raise exception 'Subscription não encontrada'; - end if; - - v_old_plan := v_sub.plan_id; - - if v_old_plan = p_new_plan_id then - return v_sub; - end if; - - select key, target - into v_new_key, v_new_target - from public.plans - where id = p_new_plan_id; - - if v_new_key is null then - raise exception 'Plano não encontrado'; - end if; - - v_new_target := lower(coalesce(v_new_target, '')); - - v_sub_target := case - when v_sub.tenant_id is not null then 'clinic' - else 'therapist' - end; - - if v_new_target <> v_sub_target then - raise exception 'Plano inválido para este tipo de assinatura. Assinatura é % e o plano é %.', - v_sub_target, v_new_target - using errcode = 'P0001'; - end if; - - if v_sub.tenant_id is not null then - v_owner_type := 'clinic'; - v_owner_ref := v_sub.tenant_id; - elsif v_sub.user_id is not null then - v_owner_type := 'therapist'; - v_owner_ref := v_sub.user_id; - else - v_owner_type := null; - v_owner_ref := null; - end if; - - update public.subscriptions - set plan_id = p_new_plan_id, - plan_key = v_new_key, - updated_at = now() - where id = p_subscription_id - returning * into v_sub; - - insert into public.subscription_events( - subscription_id, - owner_id, - owner_type, - owner_ref, - event_type, - old_plan_id, - new_plan_id, - created_by, - reason, - source, - metadata - ) - values ( - v_sub.id, - v_owner_ref, - v_owner_type, - v_owner_ref, - 'plan_changed', - v_old_plan, - p_new_plan_id, - auth.uid(), - 'Plan change via DEV menu', - 'dev_menu', - jsonb_build_object( - 'previous_plan', v_old_plan, - 'new_plan', p_new_plan_id, - 'new_plan_key', v_new_key, - 'new_plan_target', v_new_target - ) - ); - - if v_owner_ref is not null then - insert into public.entitlements_invalidation (owner_id, changed_at) - values (v_owner_ref, now()) - on conflict (owner_id) - do update set changed_at = excluded.changed_at; - end if; - - return v_sub; -end; -$$; - - -ALTER FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) OWNER TO supabase_admin; - --- --- Name: cleanup_notification_queue(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.cleanup_notification_queue() RETURNS integer -CREATE FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Consumo'::text) RETURNS jsonb - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_credit addon_credits%ROWTYPE; - v_balance_before INTEGER; - v_balance_after INTEGER; -BEGIN - -- Lock e leitura - SELECT * INTO v_credit - FROM addon_credits - WHERE tenant_id = p_tenant_id AND addon_type = p_addon_type AND is_active = true - FOR UPDATE; - - IF NOT FOUND THEN - RETURN jsonb_build_object('success', false, 'reason', 'no_credits', 'balance', 0); - END IF; - - -- Verifica saldo - IF v_credit.balance <= 0 THEN - RETURN jsonb_build_object('success', false, 'reason', 'insufficient_balance', 'balance', 0); - END IF; - - -- Verifica rate limit diário - IF v_credit.daily_limit IS NOT NULL THEN - -- Reset se passou do dia - IF v_credit.daily_reset_at IS NULL OR v_credit.daily_reset_at < date_trunc('day', now()) THEN - UPDATE addon_credits SET daily_used = 0, daily_reset_at = date_trunc('day', now()) + interval '1 day' WHERE id = v_credit.id; - v_credit.daily_used := 0; - END IF; - - IF v_credit.daily_used >= v_credit.daily_limit THEN - RETURN jsonb_build_object('success', false, 'reason', 'daily_limit_reached', 'balance', v_credit.balance); - END IF; - END IF; - - -- Verifica rate limit horário - IF v_credit.hourly_limit IS NOT NULL THEN - IF v_credit.hourly_reset_at IS NULL OR v_credit.hourly_reset_at < date_trunc('hour', now()) THEN - UPDATE addon_credits SET hourly_used = 0, hourly_reset_at = date_trunc('hour', now()) + interval '1 hour' WHERE id = v_credit.id; - v_credit.hourly_used := 0; - END IF; - - IF v_credit.hourly_used >= v_credit.hourly_limit THEN - RETURN jsonb_build_object('success', false, 'reason', 'hourly_limit_reached', 'balance', v_credit.balance); - END IF; - END IF; - - -- Verifica expiração - IF v_credit.expires_at IS NOT NULL AND v_credit.expires_at < now() THEN - RETURN jsonb_build_object('success', false, 'reason', 'credits_expired', 'balance', v_credit.balance); - END IF; - - v_balance_before := v_credit.balance; - v_balance_after := v_credit.balance - 1; - - -- Debita - UPDATE addon_credits - SET balance = v_balance_after, - total_consumed = total_consumed + 1, - daily_used = COALESCE(daily_used, 0) + 1, - hourly_used = COALESCE(hourly_used, 0) + 1, - updated_at = now() - WHERE id = v_credit.id; - - -- Registra transação - INSERT INTO addon_transactions ( - tenant_id, addon_type, type, amount, - balance_before, balance_after, - queue_id, description - ) VALUES ( - p_tenant_id, p_addon_type, 'consume', -1, - v_balance_before, v_balance_after, - p_queue_id, p_description - ); - - RETURN jsonb_build_object( - 'success', true, - 'balance_before', v_balance_before, - 'balance_after', v_balance_after - ); -END; -$$; - - -ALTER FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) OWNER TO supabase_admin; - --- --- Name: FUNCTION debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) IS 'Debita 1 crédito de add-on. Verifica saldo, rate limits e expiração.'; - - --- --- Name: delete_commitment_full(uuid, uuid); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb -CREATE FUNCTION public.fix_all_subscription_mismatches() RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - r record; -begin - for r in - select distinct s.user_id as owner_id - from public.subscriptions s - where s.status = 'active' - and s.user_id is not null - loop - perform public.rebuild_owner_entitlements(r.owner_id); - end loop; -end; -$$; - - -ALTER FUNCTION public.fix_all_subscription_mismatches() OWNER TO supabase_admin; - --- --- Name: fn_agenda_regras_semanais_no_overlap(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.fn_agenda_regras_semanais_no_overlap() RETURNS trigger - LANGUAGE plpgsql - AS $$ -declare - v_count int; -begin - if new.ativo is false then - return new; - end if; - - select count(*) into v_count - from public.agenda_regras_semanais r - where r.owner_id = new.owner_id - and r.dia_semana = new.dia_semana - and r.ativo is true - and (tg_op = 'INSERT' or r.id <> new.id) - and (new.hora_inicio < r.hora_fim and new.hora_fim > r.hora_inicio); - - if v_count > 0 then - raise exception 'Janela sobreposta: já existe uma regra ativa nesse intervalo.'; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.fn_agenda_regras_semanais_no_overlap() OWNER TO supabase_admin; - --- --- Name: get_financial_report(uuid, date, date, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text DEFAULT 'month'::text) RETURNS TABLE(group_key text, group_label text, total_receitas numeric, total_despesas numeric, saldo numeric, total_pendente numeric, total_overdue numeric, count_records bigint) -CREATE FUNCTION public.guard_no_change_core_plan_key() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') - and new.key is distinct from old.key then - raise exception 'Não é permitido alterar a key do plano padrão (%).', old.key - using errcode = 'P0001'; - end if; - - return new; -end $$; - - -ALTER FUNCTION public.guard_no_change_core_plan_key() OWNER TO supabase_admin; - --- --- Name: guard_no_change_plan_target(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_no_change_plan_target() RETURNS trigger - LANGUAGE plpgsql - AS $$ -declare - v_bypass text; -begin - -- bypass controlado por sessão/transação: - -- só passa se app.plan_migration_bypass = '1' - v_bypass := current_setting('app.plan_migration_bypass', true); - - if v_bypass = '1' then - return new; - end if; - - -- comportamento original (bloqueia qualquer mudança) - if new.target is distinct from old.target then - raise exception 'Não é permitido alterar target do plano (%) de % para %.', - old.key, old.target, new.target - using errcode = 'P0001'; - end if; - - return new; -end -$$; - - -ALTER FUNCTION public.guard_no_change_plan_target() OWNER TO supabase_admin; - --- --- Name: guard_no_delete_core_plans(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_no_delete_core_plans() RETURNS trigger -CREATE FUNCTION public.guard_no_change_plan_target() RETURNS trigger - LANGUAGE plpgsql - AS $$ -declare - v_bypass text; -begin - -- bypass controlado por sessão/transação: - -- só passa se app.plan_migration_bypass = '1' - v_bypass := current_setting('app.plan_migration_bypass', true); - - if v_bypass = '1' then - return new; - end if; - - -- comportamento original (bloqueia qualquer mudança) - if new.target is distinct from old.target then - raise exception 'Não é permitido alterar target do plano (%) de % para %.', - old.key, old.target, new.target - using errcode = 'P0001'; - end if; - - return new; -end -$$; - - -ALTER FUNCTION public.guard_no_change_plan_target() OWNER TO supabase_admin; - --- --- Name: guard_no_delete_core_plans(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_no_delete_core_plans() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') then - raise exception 'Plano padrão (%) não pode ser removido.', old.key - using errcode = 'P0001'; - end if; - - return old; -end $$; - - -ALTER FUNCTION public.guard_no_delete_core_plans() OWNER TO supabase_admin; - --- --- Name: guard_patient_cannot_own_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_patient_cannot_own_tenant() RETURNS trigger -CREATE FUNCTION public.guard_no_delete_core_plans() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') then - raise exception 'Plano padrão (%) não pode ser removido.', old.key - using errcode = 'P0001'; - end if; - - return old; -end $$; - - -ALTER FUNCTION public.guard_no_delete_core_plans() OWNER TO supabase_admin; - --- --- Name: guard_patient_cannot_own_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_patient_cannot_own_tenant() RETURNS trigger -CREATE FUNCTION public.reactivate_subscription(p_subscription_id uuid) RETURNS public.subscriptions - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_sub public.subscriptions; - v_owner_type text; - v_owner_ref uuid; -begin - - select * - into v_sub - from public.subscriptions - where id = p_subscription_id - for update; - - if not found then - raise exception 'Subscription não encontrada'; - end if; - - if v_sub.status = 'active' then - return v_sub; - end if; - - if v_sub.tenant_id is not null then - v_owner_type := 'clinic'; - v_owner_ref := v_sub.tenant_id; - elsif v_sub.user_id is not null then - v_owner_type := 'therapist'; - v_owner_ref := v_sub.user_id; - else - v_owner_type := null; - v_owner_ref := null; - end if; - - update public.subscriptions - set status = 'active', - cancel_at_period_end = false, - updated_at = now() - where id = p_subscription_id - returning * into v_sub; - - insert into public.subscription_events( - subscription_id, - owner_id, - owner_type, - owner_ref, - event_type, - old_plan_id, - new_plan_id, - created_by, - reason, - source, - metadata - ) - values ( - v_sub.id, - v_owner_ref, - v_owner_type, - v_owner_ref, - 'reactivated', - v_sub.plan_id, - v_sub.plan_id, - auth.uid(), - 'Reativação manual via admin', - 'admin_panel', - jsonb_build_object('previous_status', 'canceled') - ); - - if v_owner_ref is not null then - insert into public.entitlements_invalidation(owner_id, changed_at) - values (v_owner_ref, now()) - on conflict (owner_id) - do update set changed_at = excluded.changed_at; - end if; - - return v_sub; - -end; -$$; - - -ALTER FUNCTION public.reactivate_subscription(p_subscription_id uuid) OWNER TO supabase_admin; - --- --- Name: rebuild_owner_entitlements(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) RETURNS void -CREATE FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_plan_id uuid; -begin - -- Plano ativo do owner (owner = subscriptions.user_id) - select s.plan_id - into v_plan_id - from public.subscriptions s - where s.user_id = p_owner_id - and s.status = 'active' - order by s.created_at desc - limit 1; - - -- Sempre zera entitlements do owner (rebuild) - delete from public.owner_feature_entitlements e - where e.owner_id = p_owner_id; - - -- Se não tem assinatura ativa, acabou - if v_plan_id is null then - return; - end if; - - -- Recria entitlements esperados pelo plano - insert into public.owner_feature_entitlements (owner_id, feature_key, sources, limits_list) - select - p_owner_id as owner_id, - f.key as feature_key, - array['plan'::text] as sources, - '{}'::jsonb as limits_list - from public.plan_features pf - join public.features f on f.id = pf.feature_id - where pf.plan_id = v_plan_id; - -end; -$$; - - -ALTER FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) OWNER TO supabase_admin; - --- --- Name: revoke_support_session(text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.revoke_support_session(p_token text) RETURNS boolean -CREATE FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text DEFAULT NULL::text) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -begin - -- ✅ Só owner ou admin do tenant podem alterar features - if not exists ( - select 1 from public.tenant_members - where tenant_id = p_tenant_id - and user_id = auth.uid() - and role in ('owner', 'admin') - and status = 'active' - ) then - raise exception 'Acesso negado: apenas owner/admin pode alterar features do tenant.'; - end if; - - insert into public.tenant_features (tenant_id, feature_key, enabled) - values (p_tenant_id, p_feature_key, p_enabled) - on conflict (tenant_id, feature_key) - do update set enabled = excluded.enabled; - - insert into public.tenant_feature_exceptions_log ( - tenant_id, feature_key, enabled, reason, created_by - ) values ( - p_tenant_id, p_feature_key, p_enabled, p_reason, auth.uid() - ); -end; -$$; - - -ALTER FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) OWNER TO supabase_admin; - --- --- Name: set_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.set_updated_at() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - NEW.updated_at = now(); - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.set_updated_at() OWNER TO supabase_admin; - --- --- Name: set_updated_at_recurrence(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.set_updated_at_recurrence() RETURNS trigger -CREATE FUNCTION public.subscription_intents_view_insert() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_target text; - v_plan_id uuid; -begin - select p.id, p.target into v_plan_id, v_target - from public.plans p - where p.key = new.plan_key; - - if v_plan_id is null then - raise exception 'Plano inválido: plan_key=%', new.plan_key; - end if; - - if lower(v_target) = 'clinic' then - if new.tenant_id is null then - raise exception 'Intenção clinic exige tenant_id.'; - end if; - - insert into public.subscription_intents_tenant ( - id, tenant_id, created_by_user_id, email, - plan_id, plan_key, interval, amount_cents, currency, - status, source, notes, created_at, paid_at - ) values ( - coalesce(new.id, gen_random_uuid()), - new.tenant_id, new.created_by_user_id, new.email, - v_plan_id, new.plan_key, coalesce(new.interval,'month'), - new.amount_cents, coalesce(new.currency,'BRL'), - coalesce(new.status,'pending'), coalesce(new.source,'manual'), - new.notes, coalesce(new.created_at, now()), new.paid_at - ); - - new.plan_target := 'clinic'; - return new; - end if; - - -- therapist ou supervisor → tabela personal - if lower(v_target) in ('therapist', 'supervisor') then - insert into public.subscription_intents_personal ( - id, user_id, created_by_user_id, email, - plan_id, plan_key, interval, amount_cents, currency, - status, source, notes, created_at, paid_at - ) values ( - coalesce(new.id, gen_random_uuid()), - new.user_id, new.created_by_user_id, new.email, - v_plan_id, new.plan_key, coalesce(new.interval,'month'), - new.amount_cents, coalesce(new.currency,'BRL'), - coalesce(new.status,'pending'), coalesce(new.source,'manual'), - new.notes, coalesce(new.created_at, now()), new.paid_at - ); - - new.plan_target := lower(v_target); -- 'therapist' ou 'supervisor' - return new; - end if; - - raise exception 'Target de plano não suportado: %', v_target; -end; -$$; - - -ALTER FUNCTION public.subscription_intents_view_insert() OWNER TO supabase_admin; - --- --- Name: subscriptions_validate_scope(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.subscriptions_validate_scope() RETURNS trigger -CREATE FUNCTION public.subscriptions_validate_scope() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_target text; -BEGIN - SELECT lower(p.target) INTO v_target - FROM public.plans p - WHERE p.id = NEW.plan_id; - - IF v_target IS NULL THEN - RAISE EXCEPTION 'Plano inválido (target nulo).'; - END IF; - - IF v_target = 'clinic' THEN - IF NEW.tenant_id IS NULL THEN - RAISE EXCEPTION 'Assinatura clinic exige tenant_id.'; - END IF; - IF NEW.user_id IS NOT NULL THEN - RAISE EXCEPTION 'Assinatura clinic não pode ter user_id (XOR).'; - END IF; - - ELSIF v_target IN ('therapist', 'supervisor') THEN - -- supervisor é pessoal como therapist - IF NEW.tenant_id IS NOT NULL THEN - RAISE EXCEPTION 'Assinatura % não deve ter tenant_id.', v_target; - END IF; - IF NEW.user_id IS NULL THEN - RAISE EXCEPTION 'Assinatura % exige user_id.', v_target; - END IF; - - ELSIF v_target = 'patient' THEN - IF NEW.tenant_id IS NOT NULL THEN - RAISE EXCEPTION 'Assinatura patient não deve ter tenant_id.'; - END IF; - IF NEW.user_id IS NULL THEN - RAISE EXCEPTION 'Assinatura patient exige user_id.'; - END IF; - - ELSE - RAISE EXCEPTION 'Target de plano inválido: %', v_target; - END IF; - - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.subscriptions_validate_scope() OWNER TO supabase_admin; - --- --- Name: sync_busy_mirror_agenda_eventos(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.sync_busy_mirror_agenda_eventos() RETURNS trigger -CREATE FUNCTION public.toggle_plan(owner uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - current_key text; - new_key text; -begin - select p.key into current_key - from subscriptions s - join plans p on p.id = s.plan_id - where s.owner_id = owner - and s.status = 'active'; - - new_key := case - when current_key = 'pro' then 'free' - else 'pro' - end; - - update subscriptions s - set plan_id = p.id - from plans p - where p.key = new_key - and s.owner_id = owner - and s.status = 'active'; -end; -$$; - - -ALTER FUNCTION public.toggle_plan(owner uuid) OWNER TO supabase_admin; - --- --- Name: transition_subscription(uuid, text, text, jsonb); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text DEFAULT NULL::text, p_metadata jsonb DEFAULT NULL::jsonb) RETURNS public.subscriptions -CREATE FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text DEFAULT NULL::text, p_metadata jsonb DEFAULT NULL::jsonb) RETURNS public.subscriptions - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_sub public.subscriptions; - v_uid uuid; - v_is_allowed boolean := false; -begin - v_uid := auth.uid(); - - select * - into v_sub - from public.subscriptions - where id = p_subscription_id; - - if not found then - raise exception 'Assinatura não encontrada'; - end if; - - -- ===================================================== - -- 🔐 BLOCO DE AUTORIZAÇÃO - -- ===================================================== - - -- 1) SaaS admin pode tudo - if is_saas_admin() then - v_is_allowed := true; - end if; - - -- 2) Assinatura pessoal (therapist) - if not v_is_allowed - and v_sub.tenant_id is null - and v_sub.user_id = v_uid then - v_is_allowed := true; - end if; - - -- 3) Assinatura de clinic (tenant) - if not v_is_allowed - and v_sub.tenant_id is not null then - - if exists ( - select 1 - from public.tenant_members tm - where tm.tenant_id = v_sub.tenant_id - and tm.user_id = v_uid - and tm.status = 'active' - and tm.role = 'tenant_admin' - ) then - v_is_allowed := true; - end if; - - end if; - - if not v_is_allowed then - raise exception 'Sem permissão para transicionar esta assinatura'; - end if; - - -- ===================================================== - -- 🧠 TRANSIÇÃO - -- ===================================================== - - update public.subscriptions - set status = p_to_status, - updated_at = now(), - cancelled_at = case when p_to_status = 'cancelled' then now() else cancelled_at end, - suspended_at = case when p_to_status = 'suspended' then now() else suspended_at end, - past_due_since = case when p_to_status = 'past_due' then now() else past_due_since end, - expired_at = case when p_to_status = 'expired' then now() else expired_at end, - activated_at = case when p_to_status = 'active' then now() else activated_at end - where id = p_subscription_id - returning * into v_sub; - - -- ===================================================== - -- 🧾 EVENT LOG - -- ===================================================== - - insert into public.subscription_events ( - subscription_id, - owner_id, - event_type, - created_at, - created_by, - source, - reason, - metadata, - owner_type, - owner_ref - ) - values ( - v_sub.id, - coalesce(v_sub.tenant_id, v_sub.user_id), - 'status_changed', - now(), - v_uid, - 'manual_transition', - p_reason, - p_metadata, - case when v_sub.tenant_id is not null then 'tenant' else 'personal' end, - coalesce(v_sub.tenant_id, v_sub.user_id) - ); - - return v_sub; -end; -$$; - - -ALTER FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) OWNER TO supabase_admin; - --- --- Name: trg_fn_financial_records_auto_overdue(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.trg_fn_financial_records_auto_overdue() RETURNS trigger diff --git a/database-novo/schema/03_functions/core.sql b/database-novo/schema/03_functions/core.sql deleted file mode 100644 index 68924cb..0000000 --- a/database-novo/schema/03_functions/core.sql +++ /dev/null @@ -1,2350 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Functions — Core (profiles, tenants, membros, auth) --- ============================================================================= --- handle_new_user, ensure_personal_tenant, whoami, my_tenants, --- tenant_add_member, tenant_remove_member, tenant_invite, guards, etc. --- ============================================================================= - -CREATE FUNCTION public.__rls_ping() RETURNS text - LANGUAGE sql STABLE - AS $$ - select 'ok'::text; -$$; - - -ALTER FUNCTION public.__rls_ping() OWNER TO supabase_admin; - -SET default_tablespace = ''; - -SET default_table_access_method = heap; - --- --- Name: subscriptions; Type: TABLE; Schema: public; Owner: supabase_admin --- - - -CREATE FUNCTION public.ensure_personal_tenant() RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_uid uuid; - v_existing uuid; -BEGIN - v_uid := auth.uid(); - IF v_uid IS NULL THEN - RAISE EXCEPTION 'Not authenticated'; - END IF; - - SELECT tm.tenant_id INTO v_existing - FROM public.tenant_members tm - JOIN public.tenants t ON t.id = tm.tenant_id - WHERE tm.user_id = v_uid - AND tm.status = 'active' - AND t.kind IN ('therapist', 'saas') - ORDER BY tm.created_at DESC - LIMIT 1; - - IF v_existing IS NOT NULL THEN - RETURN v_existing; - END IF; - - RETURN public.provision_account_tenant(v_uid, 'therapist'); -END; -$$; - - -ALTER FUNCTION public.ensure_personal_tenant() OWNER TO supabase_admin; - --- --- Name: ensure_personal_tenant_for_user(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_uid uuid; - v_existing uuid; - v_tenant uuid; - v_email text; - v_name text; -begin - v_uid := p_user_id; - if v_uid is null then - raise exception 'Missing user id'; - end if; - - -- só considera tenant pessoal (kind='saas') - select tm.tenant_id - into v_existing - from public.tenant_members tm - join public.tenants t on t.id = tm.tenant_id - where tm.user_id = v_uid - and tm.status = 'active' - and t.kind = 'saas' - order by tm.created_at desc - limit 1; - - if v_existing is not null then - return v_existing; - end if; - - select email into v_email - from auth.users - where id = v_uid; - - v_name := coalesce(split_part(v_email, '@', 1), 'Conta'); - - insert into public.tenants (name, kind, created_at) - values (v_name || ' (Pessoal)', 'saas', now()) - returning id into v_tenant; - - insert into public.tenant_members (tenant_id, user_id, role, status, created_at) - values (v_tenant, v_uid, 'tenant_admin', 'active', now()); - - return v_tenant; -end; -$$; - - -ALTER FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) OWNER TO supabase_admin; - --- --- Name: faq_votar(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.faq_votar(faq_id uuid) RETURNS void -CREATE FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_uid uuid; - v_existing uuid; - v_tenant uuid; - v_email text; - v_name text; -begin - v_uid := p_user_id; - if v_uid is null then - raise exception 'Missing user id'; - end if; - - -- só considera tenant pessoal (kind='saas') - select tm.tenant_id - into v_existing - from public.tenant_members tm - join public.tenants t on t.id = tm.tenant_id - where tm.user_id = v_uid - and tm.status = 'active' - and t.kind = 'saas' - order by tm.created_at desc - limit 1; - - if v_existing is not null then - return v_existing; - end if; - - select email into v_email - from auth.users - where id = v_uid; - - v_name := coalesce(split_part(v_email, '@', 1), 'Conta'); - - insert into public.tenants (name, kind, created_at) - values (v_name || ' (Pessoal)', 'saas', now()) - returning id into v_tenant; - - insert into public.tenant_members (tenant_id, user_id, role, status, created_at) - values (v_tenant, v_uid, 'tenant_admin', 'active', now()); - - return v_tenant; -end; -$$; - - -ALTER FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) OWNER TO supabase_admin; - --- --- Name: faq_votar(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.faq_votar(faq_id uuid) RETURNS void -CREATE FUNCTION public.get_my_email() RETURNS text - LANGUAGE sql SECURITY DEFINER - SET search_path TO 'public', 'auth' - AS $$ - select lower(email) - from auth.users - where id = auth.uid(); -$$; - - -ALTER FUNCTION public.get_my_email() OWNER TO supabase_admin; - --- --- Name: guard_account_type_immutable(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_account_type_immutable() RETURNS trigger -CREATE FUNCTION public.guard_account_type_immutable() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - IF OLD.account_type <> 'free' AND NEW.account_type IS DISTINCT FROM OLD.account_type THEN - RAISE EXCEPTION 'account_type é imutável após escolha (atual: "%" para tentativa: "%"). Para mudar de perfil, crie uma nova conta.', OLD.account_type, NEW.account_type - USING ERRCODE = 'P0001'; - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.guard_account_type_immutable() OWNER TO supabase_admin; - --- --- Name: guard_locked_commitment(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_locked_commitment() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - if (old.is_locked = true) then - if (tg_op = 'DELETE') then - raise exception 'Compromisso bloqueado não pode ser excluído.'; - end if; - - if (tg_op = 'UPDATE') then - if (new.active = false) then - raise exception 'Compromisso bloqueado não pode ser desativado.'; - end if; - - -- trava renomear (mantém o "Sessão" sempre igual) - if (new.name is distinct from old.name) then - raise exception 'Compromisso bloqueado não pode ser renomeado.'; - end if; - - -- se quiser travar descrição também, descomente: - -- if (new.description is distinct from old.description) then - -- raise exception 'Compromisso bloqueado não pode alterar descrição.'; - -- end if; - end if; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.guard_locked_commitment() OWNER TO supabase_admin; - --- --- Name: guard_no_change_core_plan_key(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_no_change_core_plan_key() RETURNS trigger -CREATE FUNCTION public.guard_patient_cannot_own_tenant() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_account_type text; -BEGIN - SELECT account_type INTO v_account_type - FROM public.profiles - WHERE id = NEW.user_id; - - IF v_account_type = 'patient' AND NEW.role IN ('tenant_admin', 'therapist') THEN - RAISE EXCEPTION 'Usuário com perfil "patient" não pode ser proprietário ou terapeuta de um tenant. Se tornou profissional? Crie uma nova conta.' - USING ERRCODE = 'P0001'; - END IF; - - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.guard_patient_cannot_own_tenant() OWNER TO supabase_admin; - --- --- Name: guard_tenant_kind_immutable(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_tenant_kind_immutable() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - IF NEW.kind IS DISTINCT FROM OLD.kind THEN - RAISE EXCEPTION 'tenants.kind é imutável após criação. Tentativa de alterar "%" para "%".', OLD.kind, NEW.kind - USING ERRCODE = 'P0001'; - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.guard_tenant_kind_immutable() OWNER TO supabase_admin; - --- --- Name: handle_new_user(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.handle_new_user() RETURNS trigger -CREATE FUNCTION public.guard_tenant_kind_immutable() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - IF NEW.kind IS DISTINCT FROM OLD.kind THEN - RAISE EXCEPTION 'tenants.kind é imutável após criação. Tentativa de alterar "%" para "%".', OLD.kind, NEW.kind - USING ERRCODE = 'P0001'; - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.guard_tenant_kind_immutable() OWNER TO supabase_admin; - --- --- Name: handle_new_user(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.handle_new_user() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -BEGIN - INSERT INTO public.profiles (id, role, account_type) - VALUES (NEW.id, 'portal_user', 'free') - ON CONFLICT (id) DO NOTHING; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.handle_new_user() OWNER TO supabase_admin; - --- --- Name: handle_new_user_create_personal_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.handle_new_user_create_personal_tenant() RETURNS trigger -CREATE FUNCTION public.handle_new_user() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -BEGIN - INSERT INTO public.profiles (id, role, account_type) - VALUES (NEW.id, 'portal_user', 'free') - ON CONFLICT (id) DO NOTHING; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.handle_new_user() OWNER TO supabase_admin; - --- --- Name: handle_new_user_create_personal_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.handle_new_user_create_personal_tenant() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -BEGIN - -- Desabilitado. Tenant criado no onboarding via provision_account_tenant(). - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.handle_new_user_create_personal_tenant() OWNER TO supabase_admin; - --- --- Name: has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) RETURNS boolean -CREATE FUNCTION public.handle_new_user_create_personal_tenant() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -BEGIN - -- Desabilitado. Tenant criado no onboarding via provision_account_tenant(). - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.handle_new_user_create_personal_tenant() OWNER TO supabase_admin; - --- --- Name: has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select exists ( - select 1 - from public.owner_feature_entitlements e - where e.owner_id = p_owner_id - and e.feature_key = p_feature_key - ); -$$; - - -ALTER FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) OWNER TO supabase_admin; - --- --- Name: is_clinic_tenant(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_clinic_tenant(_tenant_id uuid) RETURNS boolean -CREATE FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select exists ( - select 1 - from public.owner_feature_entitlements e - where e.owner_id = p_owner_id - and e.feature_key = p_feature_key - ); -$$; - - -ALTER FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) OWNER TO supabase_admin; - --- --- Name: is_clinic_tenant(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_clinic_tenant(_tenant_id uuid) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - SELECT EXISTS ( - SELECT 1 FROM public.tenants t - WHERE t.id = _tenant_id - AND t.kind IN ('clinic', 'clinic_coworking', 'clinic_reception', 'clinic_full') - ); -$$; - - -ALTER FUNCTION public.is_clinic_tenant(_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: is_saas_admin(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_saas_admin() RETURNS boolean -CREATE FUNCTION public.is_clinic_tenant(_tenant_id uuid) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - SELECT EXISTS ( - SELECT 1 FROM public.tenants t - WHERE t.id = _tenant_id - AND t.kind IN ('clinic', 'clinic_coworking', 'clinic_reception', 'clinic_full') - ); -$$; - - -ALTER FUNCTION public.is_clinic_tenant(_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: is_saas_admin(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_saas_admin() RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select exists ( - select 1 from public.saas_admins sa - where sa.user_id = auth.uid() - ); -$$; - - -ALTER FUNCTION public.is_saas_admin() OWNER TO supabase_admin; - --- --- Name: is_tenant_admin(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_tenant_admin(p_tenant_id uuid) RETURNS boolean -CREATE FUNCTION public.is_saas_admin() RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select exists ( - select 1 from public.saas_admins sa - where sa.user_id = auth.uid() - ); -$$; - - -ALTER FUNCTION public.is_saas_admin() OWNER TO supabase_admin; - --- --- Name: is_tenant_admin(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_tenant_admin(p_tenant_id uuid) RETURNS boolean - LANGUAGE sql STABLE SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ - select exists ( - select 1 - from public.tenant_members tm - where tm.tenant_id = p_tenant_id - and tm.user_id = auth.uid() - and tm.role = 'tenant_admin' - and tm.status = 'active' - ); -$$; - - -ALTER FUNCTION public.is_tenant_admin(p_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: is_tenant_member(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_tenant_member(_tenant_id uuid) RETURNS boolean -CREATE FUNCTION public.is_tenant_admin(p_tenant_id uuid) RETURNS boolean - LANGUAGE sql STABLE SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ - select exists ( - select 1 - from public.tenant_members tm - where tm.tenant_id = p_tenant_id - and tm.user_id = auth.uid() - and tm.role = 'tenant_admin' - and tm.status = 'active' - ); -$$; - - -ALTER FUNCTION public.is_tenant_admin(p_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: is_tenant_member(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_tenant_member(_tenant_id uuid) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select exists ( - select 1 - from public.tenant_members m - where m.tenant_id = _tenant_id - and m.user_id = auth.uid() - and m.status = 'active' - ); -$$; - - -ALTER FUNCTION public.is_tenant_member(_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: is_therapist_tenant(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_therapist_tenant(_tenant_id uuid) RETURNS boolean -CREATE FUNCTION public.is_tenant_member(_tenant_id uuid) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select exists ( - select 1 - from public.tenant_members m - where m.tenant_id = _tenant_id - and m.user_id = auth.uid() - and m.status = 'active' - ); -$$; - - -ALTER FUNCTION public.is_tenant_member(_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: is_therapist_tenant(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.is_therapist_tenant(_tenant_id uuid) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - SELECT EXISTS ( - SELECT 1 FROM public.tenants t - WHERE t.id = _tenant_id AND t.kind = 'therapist' - ); -$$; - - -ALTER FUNCTION public.is_therapist_tenant(_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: jwt_email(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.jwt_email() RETURNS text -CREATE FUNCTION public.is_therapist_tenant(_tenant_id uuid) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - SELECT EXISTS ( - SELECT 1 FROM public.tenants t - WHERE t.id = _tenant_id AND t.kind = 'therapist' - ); -$$; - - -ALTER FUNCTION public.is_therapist_tenant(_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: jwt_email(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.jwt_email() RETURNS text - LANGUAGE sql STABLE - AS $$ - select nullif(lower(current_setting('request.jwt.claim.email', true)), ''); -$$; - - -ALTER FUNCTION public.jwt_email() OWNER TO supabase_admin; - --- --- Name: list_financial_records(uuid, integer, integer, text, text, uuid, integer, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer DEFAULT NULL::integer, p_month integer DEFAULT NULL::integer, p_type text DEFAULT NULL::text, p_status text DEFAULT NULL::text, p_patient_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0) RETURNS SETOF public.financial_records -CREATE FUNCTION public.jwt_email() RETURNS text - LANGUAGE sql STABLE - AS $$ - select nullif(lower(current_setting('request.jwt.claim.email', true)), ''); -$$; - - -ALTER FUNCTION public.jwt_email() OWNER TO supabase_admin; - --- --- Name: list_financial_records(uuid, integer, integer, text, text, uuid, integer, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer DEFAULT NULL::integer, p_month integer DEFAULT NULL::integer, p_type text DEFAULT NULL::text, p_status text DEFAULT NULL::text, p_patient_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0) RETURNS SETOF public.financial_records -CREATE FUNCTION public.my_tenants() RETURNS TABLE(tenant_id uuid, role text, status text, kind text) - LANGUAGE sql STABLE - AS $$ - select - tm.tenant_id, - tm.role, - tm.status, - t.kind - from public.tenant_members tm - join public.tenants t on t.id = tm.tenant_id - where tm.user_id = auth.uid(); -$$; - - -ALTER FUNCTION public.my_tenants() OWNER TO supabase_admin; - --- --- Name: notice_track_click(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.notice_track_click(p_notice_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -begin - update public.global_notices - set clicks_count = clicks_count + 1 - where id = p_notice_id; -end; -$$; - - -ALTER FUNCTION public.notice_track_click(p_notice_id uuid) OWNER TO supabase_admin; - --- --- Name: notice_track_view(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.notice_track_view(p_notice_id uuid) RETURNS void -CREATE FUNCTION public.on_new_user_seed_patient_groups() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ - BEGIN - PERFORM public.seed_default_patient_groups(NEW.id); - RETURN NEW; - END; - $$; - - -ALTER FUNCTION public.on_new_user_seed_patient_groups() OWNER TO supabase_admin; - --- --- Name: patients_validate_member_consistency(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.patients_validate_member_consistency() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_tenant_responsible uuid; - v_tenant_therapist uuid; -BEGIN - -- responsible_member sempre deve existir e ser do tenant - SELECT tenant_id INTO v_tenant_responsible - FROM public.tenant_members - WHERE id = NEW.responsible_member_id; - - IF v_tenant_responsible IS NULL THEN - RAISE EXCEPTION 'Responsible member not found'; - END IF; - - IF NEW.tenant_id IS NULL THEN - RAISE EXCEPTION 'tenant_id is required'; - END IF; - - IF v_tenant_responsible <> NEW.tenant_id THEN - RAISE EXCEPTION 'Responsible member must belong to the same tenant'; - END IF; - - -- therapist scope: therapist_member_id deve existir e ser do mesmo tenant - IF NEW.patient_scope = 'therapist' THEN - IF NEW.therapist_member_id IS NULL THEN - RAISE EXCEPTION 'therapist_member_id is required when patient_scope=therapist'; - END IF; - - SELECT tenant_id INTO v_tenant_therapist - FROM public.tenant_members - WHERE id = NEW.therapist_member_id; - - IF v_tenant_therapist IS NULL THEN - RAISE EXCEPTION 'Therapist member not found'; - END IF; - - IF v_tenant_therapist <> NEW.tenant_id THEN - RAISE EXCEPTION 'Therapist member must belong to the same tenant'; - END IF; - END IF; - - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.patients_validate_member_consistency() OWNER TO supabase_admin; - --- --- Name: patients_validate_responsible_member_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.patients_validate_responsible_member_tenant() RETURNS trigger -CREATE FUNCTION public.prevent_promoting_to_system() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - if new.is_system = true and old.is_system is distinct from true then - raise exception 'Não é permitido transformar um grupo comum em grupo do sistema.'; - end if; - return new; -end; -$$; - - -ALTER FUNCTION public.prevent_promoting_to_system() OWNER TO supabase_admin; - --- --- Name: prevent_saas_membership(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.prevent_saas_membership() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - IF EXISTS ( - SELECT 1 - FROM public.profiles - WHERE id = NEW.user_id - AND role = 'saas_admin' - ) THEN - RAISE EXCEPTION 'SaaS admin cannot belong to tenant'; - END IF; - - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.prevent_saas_membership() OWNER TO supabase_admin; - --- --- Name: prevent_system_group_changes(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.prevent_system_group_changes() RETURNS trigger -CREATE FUNCTION public.prevent_saas_membership() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - IF EXISTS ( - SELECT 1 - FROM public.profiles - WHERE id = NEW.user_id - AND role = 'saas_admin' - ) THEN - RAISE EXCEPTION 'SaaS admin cannot belong to tenant'; - END IF; - - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.prevent_saas_membership() OWNER TO supabase_admin; - --- --- Name: prevent_system_group_changes(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.prevent_system_group_changes() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - -- Se for grupo do sistema, regras rígidas: - if old.is_system = true then - - -- nunca pode deletar - if tg_op = 'DELETE' then - raise exception 'Grupos padrão do sistema não podem ser alterados ou excluídos.'; - end if; - - if tg_op = 'UPDATE' then - -- permite SOMENTE mudar tenant_id e/ou updated_at - -- qualquer mudança de conteúdo permanece proibida - if - new.nome is distinct from old.nome or - new.descricao is distinct from old.descricao or - new.cor is distinct from old.cor or - new.is_active is distinct from old.is_active or - new.is_system is distinct from old.is_system or - new.owner_id is distinct from old.owner_id or - new.therapist_id is distinct from old.therapist_id or - new.created_at is distinct from old.created_at - then - raise exception 'Grupos padrão do sistema não podem ser alterados ou excluídos.'; - end if; - - -- chegou aqui: só tenant_id/updated_at mudaram -> ok - return new; - end if; - - end if; - - -- não-system: deixa passar - if tg_op = 'DELETE' then - return old; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.prevent_system_group_changes() OWNER TO supabase_admin; - --- --- Name: provision_account_tenant(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text DEFAULT NULL::text) RETURNS uuid -CREATE FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text DEFAULT NULL::text) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_tenant_id uuid; - v_account_type text; - v_name text; -BEGIN - IF p_kind NOT IN ('therapist', 'clinic_coworking', 'clinic_reception', 'clinic_full') THEN - RAISE EXCEPTION 'kind inválido: "%". Use: therapist, clinic_coworking, clinic_reception, clinic_full.', p_kind - USING ERRCODE = 'P0001'; - END IF; - - v_account_type := CASE WHEN p_kind = 'therapist' THEN 'therapist' ELSE 'clinic' END; - - IF EXISTS ( - SELECT 1 - FROM public.tenant_members tm - JOIN public.tenants t ON t.id = tm.tenant_id - WHERE tm.user_id = p_user_id - AND tm.role = 'tenant_admin' - AND tm.status = 'active' - AND t.kind = p_kind - ) THEN - RAISE EXCEPTION 'Usuário já possui um tenant do tipo "%".', p_kind - USING ERRCODE = 'P0001'; - END IF; - - v_name := COALESCE( - NULLIF(TRIM(p_name), ''), - ( - SELECT COALESCE(NULLIF(TRIM(pr.full_name), ''), SPLIT_PART(au.email, '@', 1)) - FROM public.profiles pr - JOIN auth.users au ON au.id = pr.id - WHERE pr.id = p_user_id - ), - 'Conta' - ); - - INSERT INTO public.tenants (name, kind, created_at) - VALUES (v_name, p_kind, now()) - RETURNING id INTO v_tenant_id; - - INSERT INTO public.tenant_members (tenant_id, user_id, role, status, created_at) - VALUES (v_tenant_id, p_user_id, 'tenant_admin', 'active', now()); - - UPDATE public.profiles - SET account_type = v_account_type - WHERE id = p_user_id; - - PERFORM public.seed_determined_commitments(v_tenant_id); - - RETURN v_tenant_id; -END; -$$; - - -ALTER FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) OWNER TO supabase_admin; - --- --- Name: FUNCTION provision_account_tenant(p_user_id uuid, p_kind text, p_name text); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) IS 'Cria o tenant do tipo correto e atualiza account_type no profile. Chamar no onboarding após escolha/pagamento de plano therapist ou clinic. p_kind: therapist | clinic_coworking | clinic_reception | clinic_full'; - - --- --- Name: reactivate_subscription(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.reactivate_subscription(p_subscription_id uuid) RETURNS public.subscriptions -CREATE FUNCTION public.tenant_accept_invite(p_token uuid) RETURNS jsonb - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public', 'auth' - AS $$ -declare - v_uid uuid; - v_email text; - v_invite public.tenant_invites%rowtype; -begin - -- 1) precisa estar autenticado - v_uid := auth.uid(); - if v_uid is null then - raise exception 'not_authenticated' using errcode = 'P0001'; - end if; - - -- 2) pega email real do usuário logado sem depender do JWT claim - select u.email - into v_email - from auth.users u - where u.id = v_uid; - - if v_email is null or length(trim(v_email)) = 0 then - raise exception 'missing_user_email' using errcode = 'P0001'; - end if; - - -- 3) carrega o invite e trava linha (evita 2 aceites concorrentes) - select * - into v_invite - from public.tenant_invites i - where i.token = p_token - for update; - - if not found then - raise exception 'invite_not_found' using errcode = 'P0001'; - end if; - - -- 4) validações de estado - if v_invite.revoked_at is not null then - raise exception 'invite_revoked' using errcode = 'P0001'; - end if; - - if v_invite.accepted_at is not null then - raise exception 'invite_already_accepted' using errcode = 'P0001'; - end if; - - if v_invite.expires_at is not null and v_invite.expires_at <= now() then - raise exception 'invite_expired' using errcode = 'P0001'; - end if; - - -- 5) valida email (case-insensitive) - if lower(trim(v_invite.email)) <> lower(trim(v_email)) then - raise exception 'email_mismatch' using errcode = 'P0001'; - end if; - - -- 6) consome o invite - update public.tenant_invites - set accepted_at = now(), - accepted_by = v_uid - where id = v_invite.id; - - -- 7) cria ou reativa o membership - insert into public.tenant_members (tenant_id, user_id, role, status, created_at) - values (v_invite.tenant_id, v_uid, v_invite.role, 'active', now()) - on conflict (tenant_id, user_id) - do update set - role = excluded.role, - status = 'active'; - - -- 8) retorno útil pro front (você já tenta ler tenant_id no AcceptInvitePage) - return jsonb_build_object( - 'ok', true, - 'tenant_id', v_invite.tenant_id, - 'role', v_invite.role - ); -end; -$$; - - -ALTER FUNCTION public.tenant_accept_invite(p_token uuid) OWNER TO supabase_admin; - --- --- Name: tenant_members; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.tenant_members ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - user_id uuid NOT NULL, - role text NOT NULL, - status text DEFAULT 'active'::text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.tenant_members OWNER TO supabase_admin; - --- --- Name: tenant_add_member_by_email(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text DEFAULT 'therapist'::text) RETURNS public.tenant_members - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public', 'auth' - AS $$ -declare - v_target_uid uuid; - v_member public.tenant_members%rowtype; - v_is_admin boolean; - v_email text; -begin - if p_tenant_id is null then - raise exception 'tenant_id é obrigatório'; - end if; - - v_email := lower(trim(coalesce(p_email, ''))); - if v_email = '' then - raise exception 'email é obrigatório'; - end if; - - -- valida role permitida - if p_role not in ('tenant_admin','therapist','secretary','patient') then - raise exception 'role inválida: %', p_role; - end if; - - -- apenas admin do tenant (role real no banco) - select exists ( - select 1 - from public.tenant_members tm - where tm.tenant_id = p_tenant_id - and tm.user_id = auth.uid() - and tm.role = 'tenant_admin' - and coalesce(tm.status,'active') = 'active' - ) into v_is_admin; - - if not v_is_admin then - raise exception 'sem permissão: apenas admin da clínica pode adicionar membros'; - end if; - - -- acha usuário pelo e-mail no Supabase Auth - select u.id - into v_target_uid - from auth.users u - where lower(u.email) = v_email - limit 1; - - if v_target_uid is null then - raise exception 'nenhum usuário encontrado com este e-mail'; - end if; - - -- cria ou reativa membro - insert into public.tenant_members (tenant_id, user_id, role, status) - values (p_tenant_id, v_target_uid, p_role, 'active') - on conflict (tenant_id, user_id) - do update set - role = excluded.role, - status = 'active' - returning * into v_member; - - return v_member; -end; -$$; - - -ALTER FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - --- --- Name: tenant_feature_allowed(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) RETURNS boolean -CREATE FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text DEFAULT 'therapist'::text) RETURNS public.tenant_members - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public', 'auth' - AS $$ -declare - v_target_uid uuid; - v_member public.tenant_members%rowtype; - v_is_admin boolean; - v_email text; -begin - if p_tenant_id is null then - raise exception 'tenant_id é obrigatório'; - end if; - - v_email := lower(trim(coalesce(p_email, ''))); - if v_email = '' then - raise exception 'email é obrigatório'; - end if; - - -- valida role permitida - if p_role not in ('tenant_admin','therapist','secretary','patient') then - raise exception 'role inválida: %', p_role; - end if; - - -- apenas admin do tenant (role real no banco) - select exists ( - select 1 - from public.tenant_members tm - where tm.tenant_id = p_tenant_id - and tm.user_id = auth.uid() - and tm.role = 'tenant_admin' - and coalesce(tm.status,'active') = 'active' - ) into v_is_admin; - - if not v_is_admin then - raise exception 'sem permissão: apenas admin da clínica pode adicionar membros'; - end if; - - -- acha usuário pelo e-mail no Supabase Auth - select u.id - into v_target_uid - from auth.users u - where lower(u.email) = v_email - limit 1; - - if v_target_uid is null then - raise exception 'nenhum usuário encontrado com este e-mail'; - end if; - - -- cria ou reativa membro - insert into public.tenant_members (tenant_id, user_id, role, status) - values (p_tenant_id, v_target_uid, p_role, 'active') - on conflict (tenant_id, user_id) - do update set - role = excluded.role, - status = 'active' - returning * into v_member; - - return v_member; -end; -$$; - - -ALTER FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - --- --- Name: tenant_feature_allowed(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) RETURNS boolean -CREATE FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select exists ( - select 1 - from public.v_tenant_entitlements v - where v.tenant_id = p_tenant_id - and v.feature_key = p_feature_key - and coalesce(v.allowed, false) = true - ); -$$; - - -ALTER FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) OWNER TO supabase_admin; - --- --- Name: tenant_feature_enabled(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select coalesce( - (select tf.enabled - from public.tenant_features tf - where tf.tenant_id = p_tenant_id and tf.feature_key = p_feature_key), - false - ); -$$; - - -ALTER FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) OWNER TO supabase_admin; - --- --- Name: tenant_features_guard_with_plan(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_features_guard_with_plan() RETURNS trigger -CREATE FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select coalesce( - (select tf.enabled - from public.tenant_features tf - where tf.tenant_id = p_tenant_id and tf.feature_key = p_feature_key), - false - ); -$$; - - -ALTER FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) OWNER TO supabase_admin; - --- --- Name: tenant_features_guard_with_plan(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_features_guard_with_plan() RETURNS trigger - LANGUAGE plpgsql - AS $$ -declare - v_allowed boolean; -begin - -- só valida quando está habilitando - if new.enabled is distinct from true then - return new; - end if; - - -- permitido pelo plano do tenant? - select exists ( - select 1 - from public.v_tenant_entitlements_full v - where v.tenant_id = new.tenant_id - and v.feature_key = new.feature_key - and v.allowed = true - ) - into v_allowed; - - if not v_allowed then - raise exception 'Feature % não permitida pelo plano atual do tenant %.', - new.feature_key, new.tenant_id - using errcode = 'P0001'; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.tenant_features_guard_with_plan() OWNER TO supabase_admin; - --- --- Name: tenant_has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select - exists ( - select 1 - from public.v_tenant_entitlements e - where e.tenant_id = _tenant_id - and e.feature_key = _feature - and e.allowed = true - ) - or exists ( - select 1 - from public.tenant_features tf - where tf.tenant_id = _tenant_id - and tf.feature_key = _feature - and tf.enabled = true - ); -$$; - - -ALTER FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) OWNER TO supabase_admin; - --- --- Name: tenant_invite_member_by_email(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) RETURNS uuid -CREATE FUNCTION public.tenant_features_guard_with_plan() RETURNS trigger - LANGUAGE plpgsql - AS $$ -declare - v_allowed boolean; -begin - -- só valida quando está habilitando - if new.enabled is distinct from true then - return new; - end if; - - -- permitido pelo plano do tenant? - select exists ( - select 1 - from public.v_tenant_entitlements_full v - where v.tenant_id = new.tenant_id - and v.feature_key = new.feature_key - and v.allowed = true - ) - into v_allowed; - - if not v_allowed then - raise exception 'Feature % não permitida pelo plano atual do tenant %.', - new.feature_key, new.tenant_id - using errcode = 'P0001'; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.tenant_features_guard_with_plan() OWNER TO supabase_admin; - --- --- Name: tenant_has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select - exists ( - select 1 - from public.v_tenant_entitlements e - where e.tenant_id = _tenant_id - and e.feature_key = _feature - and e.allowed = true - ) - or exists ( - select 1 - from public.tenant_features tf - where tf.tenant_id = _tenant_id - and tf.feature_key = _feature - and tf.enabled = true - ); -$$; - - -ALTER FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) OWNER TO supabase_admin; - --- --- Name: tenant_invite_member_by_email(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) RETURNS uuid -CREATE FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select - exists ( - select 1 - from public.v_tenant_entitlements e - where e.tenant_id = _tenant_id - and e.feature_key = _feature - and e.allowed = true - ) - or exists ( - select 1 - from public.tenant_features tf - where tf.tenant_id = _tenant_id - and tf.feature_key = _feature - and tf.enabled = true - ); -$$; - - -ALTER FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) OWNER TO supabase_admin; - --- --- Name: tenant_invite_member_by_email(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public', 'auth' - AS $$ -declare - v_email text; - v_my_email text; - v_token uuid; - v_updated int; -begin - -- validações básicas - if p_tenant_id is null then - raise exception 'tenant_id inválido' using errcode = 'P0001'; - end if; - - v_email := lower(trim(coalesce(p_email, ''))); - if v_email = '' then - raise exception 'Informe um email' using errcode = 'P0001'; - end if; - - -- role permitido (ajuste se quiser) - if p_role is null or p_role not in ('therapist', 'secretary') then - raise exception 'Role inválido (use therapist/secretary)' using errcode = 'P0001'; - end if; - - -- ✅ bloqueio: auto-convite - v_my_email := public.get_my_email(); - if v_my_email is not null and v_email = v_my_email then - raise exception 'Você não pode convidar o seu próprio email.' using errcode = 'P0001'; - end if; - - -- ✅ bloqueio: já é membro ativo do tenant - if exists ( - select 1 - from tenant_members tm - join auth.users au on au.id = tm.user_id - where tm.tenant_id = p_tenant_id - and tm.status = 'active' - and lower(au.email) = v_email - ) then - raise exception 'Este email já está vinculado a esta clínica.' using errcode = 'P0001'; - end if; - - -- ✅ permissão: só admin do tenant pode convidar - if not exists ( - select 1 - from tenant_members me - where me.tenant_id = p_tenant_id - and me.user_id = auth.uid() - and me.status = 'active' - and me.role in ('tenant_admin','clinic_admin') - ) then - raise exception 'Sem permissão para convidar membros.' using errcode = 'P0001'; - end if; - - -- Gera token (reenvio simples / regeneração) - v_token := gen_random_uuid(); - - -- 1) tenta "regerar" um convite pendente existente (mesmo email) - update tenant_invites - set token = v_token, - role = p_role, - created_at = now(), - expires_at = now() + interval '7 days', - accepted_at = null, - revoked_at = null - where tenant_id = p_tenant_id - and lower(email) = v_email - and accepted_at is null - and revoked_at is null; - - get diagnostics v_updated = row_count; - - -- 2) se não atualizou nada, cria convite novo - if v_updated = 0 then - insert into tenant_invites (tenant_id, email, role, token, created_at, expires_at) - values (p_tenant_id, v_email, p_role, v_token, now(), now() + interval '7 days'); - end if; - - return v_token; -end; -$$; - - -ALTER FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - --- --- Name: tenant_reactivate_member(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void -CREATE FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public', 'auth' - AS $$ -declare - v_email text; - v_my_email text; - v_token uuid; - v_updated int; -begin - -- validações básicas - if p_tenant_id is null then - raise exception 'tenant_id inválido' using errcode = 'P0001'; - end if; - - v_email := lower(trim(coalesce(p_email, ''))); - if v_email = '' then - raise exception 'Informe um email' using errcode = 'P0001'; - end if; - - -- role permitido (ajuste se quiser) - if p_role is null or p_role not in ('therapist', 'secretary') then - raise exception 'Role inválido (use therapist/secretary)' using errcode = 'P0001'; - end if; - - -- ✅ bloqueio: auto-convite - v_my_email := public.get_my_email(); - if v_my_email is not null and v_email = v_my_email then - raise exception 'Você não pode convidar o seu próprio email.' using errcode = 'P0001'; - end if; - - -- ✅ bloqueio: já é membro ativo do tenant - if exists ( - select 1 - from tenant_members tm - join auth.users au on au.id = tm.user_id - where tm.tenant_id = p_tenant_id - and tm.status = 'active' - and lower(au.email) = v_email - ) then - raise exception 'Este email já está vinculado a esta clínica.' using errcode = 'P0001'; - end if; - - -- ✅ permissão: só admin do tenant pode convidar - if not exists ( - select 1 - from tenant_members me - where me.tenant_id = p_tenant_id - and me.user_id = auth.uid() - and me.status = 'active' - and me.role in ('tenant_admin','clinic_admin') - ) then - raise exception 'Sem permissão para convidar membros.' using errcode = 'P0001'; - end if; - - -- Gera token (reenvio simples / regeneração) - v_token := gen_random_uuid(); - - -- 1) tenta "regerar" um convite pendente existente (mesmo email) - update tenant_invites - set token = v_token, - role = p_role, - created_at = now(), - expires_at = now() + interval '7 days', - accepted_at = null, - revoked_at = null - where tenant_id = p_tenant_id - and lower(email) = v_email - and accepted_at is null - and revoked_at is null; - - get diagnostics v_updated = row_count; - - -- 2) se não atualizou nada, cria convite novo - if v_updated = 0 then - insert into tenant_invites (tenant_id, email, role, token, created_at, expires_at) - values (p_tenant_id, v_email, p_role, v_token, now(), now() + interval '7 days'); - end if; - - return v_token; -end; -$$; - - -ALTER FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - --- --- Name: tenant_reactivate_member(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - update public.tenant_members - set status = 'active' - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - --- --- Name: tenant_remove_member(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void -CREATE FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - update public.tenant_members - set status = 'active' - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - --- --- Name: tenant_remove_member(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -declare - v_role text; -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - if p_member_user_id = auth.uid() then - raise exception 'cannot_remove_self'; - end if; - - -- pega role atual do membro (se não existir, erro) - select role into v_role - from public.tenant_members - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if v_role is null then - raise exception 'membership_not_found'; - end if; - - -- trava: se for therapist, não pode remover com eventos futuros - if v_role = 'therapist' then - if exists ( - select 1 - from public.agenda_eventos e - where e.owner_id = p_tenant_id - and e.terapeuta_id = p_member_user_id - and e.inicio_em >= now() - and e.status::text not in ('cancelado','cancelled','canceled') - limit 1 - ) then - raise exception 'cannot_remove_therapist_with_future_events'; - end if; - end if; - - update public.tenant_members - set status = 'inactive' - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - --- --- Name: tenant_remove_member_soft(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) RETURNS void -CREATE FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -declare - v_role text; -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - if p_member_user_id = auth.uid() then - raise exception 'cannot_remove_self'; - end if; - - -- pega role atual do membro (se não existir, erro) - select role into v_role - from public.tenant_members - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if v_role is null then - raise exception 'membership_not_found'; - end if; - - -- trava: se for therapist, não pode remover com eventos futuros - if v_role = 'therapist' then - if exists ( - select 1 - from public.agenda_eventos e - where e.owner_id = p_tenant_id - and e.terapeuta_id = p_member_user_id - and e.inicio_em >= now() - and e.status::text not in ('cancelado','cancelled','canceled') - limit 1 - ) then - raise exception 'cannot_remove_therapist_with_future_events'; - end if; - end if; - - update public.tenant_members - set status = 'inactive' - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - --- --- Name: tenant_remove_member_soft(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - if p_member_user_id = auth.uid() then - raise exception 'cannot_remove_self'; - end if; - - update public.tenant_members - set status = 'inactive' - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - --- --- Name: tenant_revoke_invite(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) RETURNS void -CREATE FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - if p_member_user_id = auth.uid() then - raise exception 'cannot_remove_self'; - end if; - - update public.tenant_members - set status = 'inactive' - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) OWNER TO supabase_admin; - --- --- Name: tenant_revoke_invite(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -declare - v_email text; -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - v_email := lower(trim(p_email)); - - update public.tenant_invites - set revoked_at = now(), - revoked_by = auth.uid() - where tenant_id = p_tenant_id - and lower(email) = v_email - and role = p_role - and accepted_at is null - and revoked_at is null; - - if not found then - raise exception 'invite_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - --- --- Name: tenant_set_member_status(uuid, uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) RETURNS void -CREATE FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -declare - v_email text; -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - v_email := lower(trim(p_email)); - - update public.tenant_invites - set revoked_at = now(), - revoked_by = auth.uid() - where tenant_id = p_tenant_id - and lower(email) = v_email - and role = p_role - and accepted_at is null - and revoked_at is null; - - if not found then - raise exception 'invite_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) OWNER TO supabase_admin; - --- --- Name: tenant_set_member_status(uuid, uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - -- valida status (adapte aos seus valores reais) - if p_new_status not in ('active','inactive','suspended','invited') then - raise exception 'invalid_status: %', p_new_status; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - -- evita desativar a si mesmo (opcional) - if p_member_user_id = auth.uid() and p_new_status <> 'active' then - raise exception 'cannot_disable_self'; - end if; - - update public.tenant_members - set status = p_new_status - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) OWNER TO supabase_admin; - --- --- Name: tenant_update_member_role(uuid, uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) RETURNS void -CREATE FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -begin - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - -- valida status (adapte aos seus valores reais) - if p_new_status not in ('active','inactive','suspended','invited') then - raise exception 'invalid_status: %', p_new_status; - end if; - - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - -- evita desativar a si mesmo (opcional) - if p_member_user_id = auth.uid() and p_new_status <> 'active' then - raise exception 'cannot_disable_self'; - end if; - - update public.tenant_members - set status = p_new_status - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) OWNER TO supabase_admin; - --- --- Name: tenant_update_member_role(uuid, uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -begin - -- exige auth - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - -- valida role - if p_new_role not in ('tenant_admin','therapist','secretary','patient') then - raise exception 'invalid_role: %', p_new_role; - end if; - - -- somente tenant_admin ativo pode alterar role - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - -- evita o admin remover o próprio admin sem querer (opcional mas recomendado) - if p_member_user_id = auth.uid() and p_new_role <> 'tenant_admin' then - raise exception 'cannot_demote_self'; - end if; - - update public.tenant_members - set role = p_new_role - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) OWNER TO supabase_admin; - --- --- Name: toggle_plan(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.toggle_plan(owner uuid) RETURNS void -CREATE FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - SET row_security TO 'off' - AS $$ -begin - -- exige auth - if auth.uid() is null then - raise exception 'not_authenticated'; - end if; - - -- valida role - if p_new_role not in ('tenant_admin','therapist','secretary','patient') then - raise exception 'invalid_role: %', p_new_role; - end if; - - -- somente tenant_admin ativo pode alterar role - if not public.is_tenant_admin(p_tenant_id) then - raise exception 'not_allowed'; - end if; - - -- evita o admin remover o próprio admin sem querer (opcional mas recomendado) - if p_member_user_id = auth.uid() and p_new_role <> 'tenant_admin' then - raise exception 'cannot_demote_self'; - end if; - - update public.tenant_members - set role = p_new_role - where tenant_id = p_tenant_id - and user_id = p_member_user_id; - - if not found then - raise exception 'membership_not_found'; - end if; -end; -$$; - - -ALTER FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) OWNER TO supabase_admin; - --- --- Name: toggle_plan(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.toggle_plan(owner uuid) RETURNS void -CREATE FUNCTION public.user_has_feature(_user_id uuid, _feature text) RETURNS boolean - LANGUAGE sql STABLE - AS $$ - select exists ( - select 1 - from public.v_user_entitlements e - where e.user_id = _user_id - and e.feature_key = _feature - and e.allowed = true - ); -$$; - - -ALTER FUNCTION public.user_has_feature(_user_id uuid, _feature text) OWNER TO supabase_admin; - --- --- Name: validate_support_session(text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.validate_support_session(p_token text) RETURNS json - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_session support_sessions; -BEGIN - IF p_token IS NULL OR length(trim(p_token)) < 32 THEN - RETURN json_build_object('valid', false, 'tenant_id', null); - END IF; - - SELECT * INTO v_session - FROM public.support_sessions - WHERE token = p_token - AND expires_at > now() - LIMIT 1; - - IF NOT FOUND THEN - RETURN json_build_object('valid', false, 'tenant_id', null); - END IF; - - RETURN json_build_object( - 'valid', true, - 'tenant_id', v_session.tenant_id - ); -END; -$$; - - -ALTER FUNCTION public.validate_support_session(p_token text) OWNER TO supabase_admin; - --- --- Name: whoami(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.whoami() RETURNS TABLE(uid uuid, role text) - LANGUAGE sql STABLE - AS $$ - select auth.uid() as uid, auth.role() as role; -$$; - - -ALTER FUNCTION public.whoami() OWNER TO supabase_admin; - --- --- Name: apply_rls(jsonb, integer); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - -CREATE FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer DEFAULT (1024 * 1024)) RETURNS SETOF realtime.wal_rls -CREATE FUNCTION public.current_member_id(p_tenant_id uuid) RETURNS uuid - LANGUAGE sql STABLE - AS $$ - select tm.id - from public.tenant_members tm - where tm.tenant_id = p_tenant_id - and tm.user_id = auth.uid() - limit 1 -$$; - - -ALTER FUNCTION public.current_member_id(p_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: current_member_role(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.current_member_role(p_tenant_id uuid) RETURNS text - LANGUAGE sql STABLE - AS $$ - select tm.role - from public.tenant_members tm - where tm.tenant_id = p_tenant_id - and tm.user_id = auth.uid() - limit 1 -$$; - - -ALTER FUNCTION public.current_member_role(p_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: debit_addon_credit(uuid, text, uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Consumo'::text) RETURNS jsonb -CREATE FUNCTION public.dev_list_auth_users(p_limit integer DEFAULT 50) RETURNS TABLE(id uuid, email text, created_at timestamp with time zone) - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public', 'auth' - AS $$ -begin - -- só saas_admin pode ver - if not exists ( - select 1 - from public.profiles p - where p.id = auth.uid() - and p.role = 'saas_admin' - ) then - return; - end if; - - return query - select - u.id, - u.email, - u.created_at - from auth.users u - order by u.created_at desc - limit greatest(1, least(coalesce(p_limit, 50), 500)); -end; -$$; - - -ALTER FUNCTION public.dev_list_auth_users(p_limit integer) OWNER TO supabase_admin; - --- --- Name: dev_list_custom_users(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.dev_list_custom_users() RETURNS TABLE(user_id uuid, email text, created_at timestamp with time zone, global_role text, tenant_role text, tenant_id uuid, password_dev text, kind text) - LANGUAGE sql SECURITY DEFINER - SET search_path TO 'public' - AS $$ - with base as ( - select - u.id as user_id, - lower(u.email) as email, - u.created_at - from auth.users u - where lower(u.email) not in ( - 'clinic@agenciapsi.com.br', - 'therapist@agenciapsi.com.br', - 'patient@agenciapsi.com.br', - 'saas@agenciapsi.com.br' - ) - ), - prof as ( - select p.id, p.role as global_role - from public.profiles p - ), - last_membership as ( - select distinct on (tm.user_id) - tm.user_id, - tm.tenant_id, - tm.role as tenant_role, - tm.created_at - from public.tenant_members tm - where tm.status = 'active' - order by tm.user_id, tm.created_at desc - ) - select - b.user_id, - b.email, - b.created_at, - pr.global_role, - lm.tenant_role, - lm.tenant_id, - dc.password_dev, - dc.kind - from base b - left join prof pr on pr.id = b.user_id - left join last_membership lm on lm.user_id = b.user_id - left join public.dev_user_credentials dc on lower(dc.email) = b.email - order by b.created_at desc; -$$; - - -ALTER FUNCTION public.dev_list_custom_users() OWNER TO supabase_admin; - --- --- Name: dev_list_intent_leads(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.dev_list_intent_leads() RETURNS TABLE(email text, last_intent_at timestamp with time zone, plan_key text, billing_interval text, status text, tenant_id uuid) - LANGUAGE sql SECURITY DEFINER - SET search_path TO 'public' - AS $$ - select - lower(si.email) as email, - max(si.created_at) as last_intent_at, - (array_agg(si.plan_key order by si.created_at desc))[1] as plan_key, - (array_agg(si.interval order by si.created_at desc))[1] as billing_interval, - (array_agg(si.status order by si.created_at desc))[1] as status, - (array_agg(si.tenant_id order by si.created_at desc))[1] as tenant_id - from public.subscription_intents si - where si.email is not null - and not exists ( - select 1 - from auth.users au - where lower(au.email) = lower(si.email) - ) - group by lower(si.email) - order by max(si.created_at) desc; -$$; - - -ALTER FUNCTION public.dev_list_intent_leads() OWNER TO supabase_admin; - --- --- Name: dev_public_debug_snapshot(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.dev_public_debug_snapshot() RETURNS TABLE(users_total integer, tenants_total integer, intents_new_total integer, latest_intents jsonb) - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $_$ -declare - v_latest jsonb; -begin - select jsonb_agg( - jsonb_build_object( - 'created_at', si.created_at, - 'email_masked', - regexp_replace(lower(si.email), '(^.).*(@.*$)', '\1***\2'), - 'plan_key', si.plan_key, - 'status', si.status - ) - order by si.created_at desc - ) - into v_latest - from ( - select si.* - from public.subscription_intents si - where si.email is not null - order by si.created_at desc - limit 5 - ) si; - - return query - select - (select count(*)::int from auth.users) as users_total, - (select count(*)::int from public.tenants) as tenants_total, - (select count(*)::int from public.subscription_intents where status = 'new') as intents_new_total, - coalesce(v_latest, '[]'::jsonb) as latest_intents; -end; -$_$; - - -ALTER FUNCTION public.dev_public_debug_snapshot() OWNER TO supabase_admin; - --- --- Name: ensure_personal_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.ensure_personal_tenant() RETURNS uuid diff --git a/database-novo/schema/03_functions/infra.sql b/database-novo/schema/03_functions/extensions.sql similarity index 75% rename from database-novo/schema/03_functions/infra.sql rename to database-novo/schema/03_functions/extensions.sql index 8b7b663..935536b 100644 --- a/database-novo/schema/03_functions/infra.sql +++ b/database-novo/schema/03_functions/extensions.sql @@ -1,7 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Functions — infraestrutura --- extensions.grant_pg_*, pgbouncer.get_auth, etc. --- ============================================================================= +-- Functions: extensions +-- Gerado automaticamente em 2026-04-17T12:23:05.222Z +-- Total: 6 CREATE FUNCTION extensions.grant_pg_cron_access() RETURNS event_trigger LANGUAGE plpgsql @@ -35,20 +34,6 @@ BEGIN END; $$; - -ALTER FUNCTION extensions.grant_pg_cron_access() OWNER TO supabase_admin; - --- --- Name: FUNCTION grant_pg_cron_access(); Type: COMMENT; Schema: extensions; Owner: supabase_admin --- - -COMMENT ON FUNCTION extensions.grant_pg_cron_access() IS 'Grants access to pg_cron'; - - --- --- Name: grant_pg_graphql_access(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin --- - CREATE FUNCTION extensions.grant_pg_graphql_access() RETURNS event_trigger LANGUAGE plpgsql AS $_$ @@ -102,20 +87,6 @@ BEGIN END; $_$; - -ALTER FUNCTION extensions.grant_pg_graphql_access() OWNER TO supabase_admin; - --- --- Name: FUNCTION grant_pg_graphql_access(); Type: COMMENT; Schema: extensions; Owner: supabase_admin --- - -COMMENT ON FUNCTION extensions.grant_pg_graphql_access() IS 'Grants access to pg_graphql'; - - --- --- Name: grant_pg_net_access(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin --- - CREATE FUNCTION extensions.grant_pg_net_access() RETURNS event_trigger LANGUAGE plpgsql AS $$ @@ -145,20 +116,6 @@ BEGIN END; $$; - -ALTER FUNCTION extensions.grant_pg_net_access() OWNER TO supabase_admin; - --- --- Name: FUNCTION grant_pg_net_access(); Type: COMMENT; Schema: extensions; Owner: supabase_admin --- - -COMMENT ON FUNCTION extensions.grant_pg_net_access() IS 'Grants access to pg_net'; - - --- --- Name: pgrst_ddl_watch(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin --- - CREATE FUNCTION extensions.pgrst_ddl_watch() RETURNS event_trigger LANGUAGE plpgsql AS $$ @@ -187,13 +144,6 @@ BEGIN END LOOP; END; $$; - -ALTER FUNCTION extensions.pgrst_ddl_watch() OWNER TO supabase_admin; - --- --- Name: pgrst_drop_watch(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin --- - CREATE FUNCTION extensions.pgrst_drop_watch() RETURNS event_trigger LANGUAGE plpgsql AS $$ @@ -220,13 +170,6 @@ BEGIN END LOOP; END; $$; - -ALTER FUNCTION extensions.pgrst_drop_watch() OWNER TO supabase_admin; - --- --- Name: set_graphql_placeholder(); Type: FUNCTION; Schema: extensions; Owner: supabase_admin --- - CREATE FUNCTION extensions.set_graphql_placeholder() RETURNS event_trigger LANGUAGE plpgsql AS $_$ @@ -278,39 +221,3 @@ CREATE FUNCTION extensions.set_graphql_placeholder() RETURNS event_trigger END; $_$; - - -ALTER FUNCTION extensions.set_graphql_placeholder() OWNER TO supabase_admin; - --- --- Name: FUNCTION set_graphql_placeholder(); Type: COMMENT; Schema: extensions; Owner: supabase_admin --- - -COMMENT ON FUNCTION extensions.set_graphql_placeholder() IS 'Reintroduces placeholder function for graphql_public.graphql'; - - --- --- Name: get_auth(text); Type: FUNCTION; Schema: pgbouncer; Owner: supabase_admin --- - -CREATE FUNCTION pgbouncer.get_auth(p_usename text) RETURNS TABLE(username text, password text) - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO '' - AS $_$ -begin - raise debug 'PgBouncer auth request: %', p_usename; - - return query - select - rolname::text, - case when rolvaliduntil < now() - then null - else rolpassword::text - end - from pg_authid - where rolname=$1 and rolcanlogin; -end; -$_$; - - -ALTER FUNCTION pgbouncer.get_auth(p_usename text) OWNER TO supabase_admin; diff --git a/database-novo/schema/03_functions/financial.sql b/database-novo/schema/03_functions/financial.sql deleted file mode 100644 index eabe61e..0000000 --- a/database-novo/schema/03_functions/financial.sql +++ /dev/null @@ -1,818 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Functions — Financeiro --- ============================================================================= --- auto_create_financial_record_from_session, create_financial_record_for_session, --- create_therapist_payout, get_financial_report, get_financial_summary, --- list_financial_records, mark_as_paid, mark_payout_as_paid, --- seed_default_financial_categories, sync_overdue_financial_records, --- trg_fn_financial_records_auto_overdue, set_insurance/services_updated_at --- ============================================================================= - -CREATE FUNCTION public.auto_create_financial_record_from_session() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_price NUMERIC(10,2); - v_services_total NUMERIC(10,2); - v_already_billed BOOLEAN; -BEGIN - -- ── Guards de saída rápida ────────────────────────────────────────────── - - -- Só processa quando o status muda PARA 'realizado' - IF NEW.status::TEXT <> 'realizado' THEN - RETURN NEW; - END IF; - - -- Só processa quando houve mudança real de status - IF OLD.status IS NOT DISTINCT FROM NEW.status THEN - RETURN NEW; - END IF; - - -- Só sessões (não bloqueios, feriados, etc.) - IF NEW.tipo::TEXT <> 'sessao' THEN - RETURN NEW; - END IF; - - -- Paciente obrigatório para vincular a cobrança - IF NEW.patient_id IS NULL THEN - RETURN NEW; - END IF; - - -- Sessões de pacote têm cobrança gerenciada por billing_contract - IF NEW.billing_contract_id IS NOT NULL THEN - RETURN NEW; - END IF; - - -- Idempotência: já existe financial_record para este evento? - SELECT billed INTO v_already_billed - FROM public.agenda_eventos - WHERE id = NEW.id; - - IF v_already_billed = TRUE THEN - -- Confirma no financial_records também (dupla verificação) - IF EXISTS ( - SELECT 1 FROM public.financial_records - WHERE agenda_evento_id = NEW.id AND deleted_at IS NULL - ) THEN - RETURN NEW; - END IF; - END IF; - - -- ── Busca do preço ────────────────────────────────────────────────────── - - v_price := NULL; - - -- Prioridade 1: soma dos serviços da regra de recorrência - IF NEW.recurrence_id IS NOT NULL THEN - SELECT COALESCE(SUM(rrs.final_price), 0) - INTO v_services_total - FROM public.recurrence_rule_services rrs - WHERE rrs.rule_id = NEW.recurrence_id; - - IF v_services_total > 0 THEN - v_price := v_services_total; - END IF; - - -- Prioridade 2: price direto da regra (fallback se sem serviços) - IF v_price IS NULL OR v_price = 0 THEN - SELECT price INTO v_price - FROM public.recurrence_rules - WHERE id = NEW.recurrence_id; - END IF; - END IF; - - -- Prioridade 3: price do próprio evento de agenda - IF v_price IS NULL OR v_price = 0 THEN - v_price := NEW.price; - END IF; - - -- Sem preço → não criar registro (não é erro, apenas skip silencioso) - IF v_price IS NULL OR v_price <= 0 THEN - RETURN NEW; - END IF; - - -- ── Criação do financial_record ───────────────────────────────────────── - - INSERT INTO public.financial_records ( - owner_id, - tenant_id, - patient_id, - agenda_evento_id, - type, - amount, - discount_amount, - final_amount, - clinic_fee_pct, - clinic_fee_amount, - status, - due_date - -- payment_method: NULL até o momento do pagamento (mark_as_paid preenche) - ) VALUES ( - NEW.owner_id, - NEW.tenant_id, - NEW.patient_id, - NEW.id, - 'receita', - v_price, - 0, - v_price, - 0, -- clinic_fee_pct: sem campo de configuração global no schema atual. - 0, -- clinic_fee_amount: calculado manualmente ou via update posterior. - 'pending', - (NEW.inicio_em::DATE + 7) -- vencimento padrão: 7 dias após a sessão - ); - - -- ── Marca sessão como billed ──────────────────────────────────────────── - -- UPDATE em billed (não em status) → não re-dispara este trigger - UPDATE public.agenda_eventos - SET billed = TRUE - WHERE id = NEW.id; - - RETURN NEW; - -EXCEPTION - WHEN OTHERS THEN - -- Log silencioso: nunca bloquear a agenda por falha financeira - RAISE WARNING '[auto_create_financial_record_from_session] evento=% erro=%', - NEW.id, SQLERRM; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.auto_create_financial_record_from_session() OWNER TO supabase_admin; - --- --- Name: FUNCTION auto_create_financial_record_from_session(); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.auto_create_financial_record_from_session() IS 'Trigger que cria automaticamente um financial_record (receita, pending) quando uma sessão de agenda é marcada como realizada. Prioridade de preço: recurrence_rule_services > recurrence_rules.price > agenda_eventos.price. Skip silencioso se sem preço, pacote ou registro já existente.'; - - --- --- Name: can_delete_patient(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.can_delete_patient(p_patient_id uuid) RETURNS boolean -CREATE FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) RETURNS SETOF public.financial_records - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_existing public.financial_records%ROWTYPE; - v_new public.financial_records%ROWTYPE; -BEGIN - -- Idempotência: retorna o registro existente se já foi criado - SELECT * INTO v_existing - FROM public.financial_records - WHERE agenda_evento_id = p_agenda_evento_id - AND deleted_at IS NULL - LIMIT 1; - - IF FOUND THEN - RETURN NEXT v_existing; - RETURN; - END IF; - - -- Cria o novo registro - INSERT INTO public.financial_records ( - tenant_id, - owner_id, - patient_id, - agenda_evento_id, - amount, - discount_amount, - final_amount, - status, - due_date - ) VALUES ( - p_tenant_id, - p_owner_id, - p_patient_id, - p_agenda_evento_id, - p_amount, - 0, - p_amount, - 'pending', - p_due_date - ) - RETURNING * INTO v_new; - - -- Marca o evento da agenda como billed = true - UPDATE public.agenda_eventos - SET billed = TRUE - WHERE id = p_agenda_evento_id; - - RETURN NEXT v_new; -END; -$$; - - -ALTER FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) OWNER TO supabase_admin; - --- --- Name: create_patient_intake_request(text, text, text, text, text, boolean); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text DEFAULT NULL::text, p_phone text DEFAULT NULL::text, p_notes text DEFAULT NULL::text, p_consent boolean DEFAULT false) RETURNS uuid -CREATE FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) RETURNS public.therapist_payouts - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_payout public.therapist_payouts%ROWTYPE; - v_total_sessions INTEGER; - v_gross NUMERIC(10,2); - v_clinic_fee NUMERIC(10,2); - v_net NUMERIC(10,2); -BEGIN - -- ── Verificação de permissão ──────────────────────────────────────────── - -- Apenas o próprio terapeuta ou o tenant_admin pode criar o repasse - IF auth.uid() <> p_therapist_id AND NOT public.is_tenant_admin(p_tenant_id) THEN - RAISE EXCEPTION 'Sem permissão para criar repasse para este terapeuta.'; - END IF; - - -- ── Verifica se já existe repasse para o mesmo período ───────────────── - IF EXISTS ( - SELECT 1 FROM public.therapist_payouts - WHERE owner_id = p_therapist_id - AND tenant_id = p_tenant_id - AND period_start = p_period_start - AND period_end = p_period_end - AND status <> 'cancelled' - ) THEN - RAISE EXCEPTION - 'Já existe um repasse ativo para o período % a % deste terapeuta.', - p_period_start, p_period_end; - END IF; - - -- ── Agrega os financial_records elegíveis ────────────────────────────── - -- Elegíveis: paid, receita, owner=terapeuta, tenant correto, paid_at no período, - -- não soft-deleted, ainda não vinculados a nenhum payout. - SELECT - COUNT(*) AS total_sessions, - COALESCE(SUM(amount), 0) AS gross_amount, - COALESCE(SUM(clinic_fee_amount), 0) AS clinic_fee_total, - COALESCE(SUM(net_amount), 0) AS net_amount - INTO - v_total_sessions, v_gross, v_clinic_fee, v_net - FROM public.financial_records fr - WHERE fr.owner_id = p_therapist_id - AND fr.tenant_id = p_tenant_id - AND fr.type = 'receita' - AND fr.status = 'paid' - AND fr.deleted_at IS NULL - AND fr.paid_at::DATE BETWEEN p_period_start AND p_period_end - AND NOT EXISTS ( - SELECT 1 FROM public.therapist_payout_records tpr - WHERE tpr.financial_record_id = fr.id - ); - - -- Sem registros elegíveis → não criar payout vazio - IF v_total_sessions = 0 THEN - RAISE EXCEPTION - 'Nenhum registro financeiro elegível encontrado para o período % a %.', - p_period_start, p_period_end; - END IF; - - -- ── Cria o repasse ───────────────────────────────────────────────────── - INSERT INTO public.therapist_payouts ( - owner_id, - tenant_id, - period_start, - period_end, - total_sessions, - gross_amount, - clinic_fee_total, - net_amount, - status - ) VALUES ( - p_therapist_id, - p_tenant_id, - p_period_start, - p_period_end, - v_total_sessions, - v_gross, - v_clinic_fee, - v_net, - 'pending' - ) - RETURNING * INTO v_payout; - - -- ── Vincula os financial_records ao repasse ──────────────────────────── - INSERT INTO public.therapist_payout_records (payout_id, financial_record_id) - SELECT v_payout.id, fr.id - FROM public.financial_records fr - WHERE fr.owner_id = p_therapist_id - AND fr.tenant_id = p_tenant_id - AND fr.type = 'receita' - AND fr.status = 'paid' - AND fr.deleted_at IS NULL - AND fr.paid_at::DATE BETWEEN p_period_start AND p_period_end - AND NOT EXISTS ( - SELECT 1 FROM public.therapist_payout_records tpr - WHERE tpr.financial_record_id = fr.id - ); - - RETURN v_payout; -END; -$$; - - -ALTER FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) OWNER TO supabase_admin; - --- --- Name: FUNCTION create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) IS 'Cria um repasse para o terapeuta com todos os financial_records paid+receita do período que ainda não estejam vinculados a outro repasse. Lança exceção se não houver registros elegíveis ou se já houver repasse ativo no período.'; - - --- --- Name: current_member_id(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.current_member_id(p_tenant_id uuid) RETURNS uuid -CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text DEFAULT 'month'::text) RETURNS TABLE(group_key text, group_label text, total_receitas numeric, total_despesas numeric, saldo numeric, total_pendente numeric, total_overdue numeric, count_records bigint) - LANGUAGE sql STABLE SECURITY DEFINER - SET search_path TO 'public' - AS $$ - - -- ── Valida p_group_by antes de executar ────────────────────────────────── - -- (lança erro se valor inválido; plpgsql seria necessário para isso em SQL puro, - -- então usamos um CTE de validação com CASE WHEN para retornar vazio em vez de erro) - - WITH base AS ( - SELECT - fr.type, - fr.amount, - fr.final_amount, - fr.status, - fr.deleted_at, - -- Chave de agrupamento calculada conforme p_group_by - CASE p_group_by - WHEN 'month' THEN TO_CHAR( - COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), - 'YYYY-MM' - ) - WHEN 'week' THEN TO_CHAR( - COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), - 'IYYY-"W"IW' - ) - WHEN 'category' THEN COALESCE(fr.category_id::TEXT, fr.category, 'sem_categoria') - WHEN 'patient' THEN COALESCE(fr.patient_id::TEXT, 'sem_paciente') - ELSE NULL -- group_by inválido → group_key NULL → retorno vazio - END AS gkey, - -- Label legível (enriquecido via JOIN abaixo quando possível) - CASE p_group_by - WHEN 'month' THEN TO_CHAR( - COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), - 'YYYY-MM' - ) - WHEN 'week' THEN TO_CHAR( - COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), - 'IYYY-"W"IW' - ) - WHEN 'category' THEN COALESCE(fc.name, fr.category, 'Sem categoria') - WHEN 'patient' THEN COALESCE(p.nome_completo, fr.patient_id::TEXT, 'Sem paciente') - ELSE NULL - END AS glabel - FROM public.financial_records fr - LEFT JOIN public.financial_categories fc - ON fc.id = fr.category_id - LEFT JOIN public.patients p - ON p.id = fr.patient_id - WHERE fr.owner_id = p_owner_id - AND fr.deleted_at IS NULL - AND COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE) - BETWEEN p_start_date AND p_end_date - ) - - SELECT - gkey AS group_key, - glabel AS group_label, - - COALESCE(SUM(final_amount) FILTER (WHERE type = 'receita' AND status = 'paid'), 0) - AS total_receitas, - - COALESCE(SUM(final_amount) FILTER (WHERE type = 'despesa' AND status = 'paid'), 0) - AS total_despesas, - - COALESCE(SUM(final_amount) FILTER (WHERE type = 'receita' AND status = 'paid'), 0) - - COALESCE(SUM(final_amount) FILTER (WHERE type = 'despesa' AND status = 'paid'), 0) - AS saldo, - - COALESCE(SUM(final_amount) FILTER (WHERE status = 'pending'), 0) AS total_pendente, - - COALESCE(SUM(final_amount) FILTER (WHERE status = 'overdue'), 0) AS total_overdue, - - COUNT(*) AS count_records - - FROM base - WHERE gkey IS NOT NULL -- descarta p_group_by inválido - GROUP BY gkey, glabel - ORDER BY gkey ASC; - -$$; - - -ALTER FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) OWNER TO supabase_admin; - --- --- Name: FUNCTION get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) IS 'Relatório financeiro agrupado por mês, semana ISO, categoria ou paciente. p_group_by aceita: ''month'' | ''week'' | ''category'' | ''patient''. Totais de receita/despesa consideram apenas registros com status=paid. total_pendente e total_overdue incluem todos os tipos (receita + despesa).'; - - --- --- Name: get_financial_summary(uuid, integer, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) RETURNS TABLE(total_receitas numeric, total_despesas numeric, total_pendente numeric, saldo_liquido numeric, total_repasse numeric, count_receitas bigint, count_despesas bigint) - LANGUAGE sql STABLE SECURITY DEFINER - SET search_path TO 'public' - AS $$ - SELECT - -- Receitas pagas no período - COALESCE(SUM(amount) FILTER ( - WHERE type = 'receita' AND status = 'paid' - ), 0) AS total_receitas, - - -- Despesas pagas no período - COALESCE(SUM(amount) FILTER ( - WHERE type = 'despesa' AND status = 'paid' - ), 0) AS total_despesas, - - -- Tudo pendente ou vencido (receitas + despesas) - COALESCE(SUM(amount) FILTER ( - WHERE status IN ('pending', 'overdue') - ), 0) AS total_pendente, - - -- Saldo líquido (receitas pagas − despesas pagas) - COALESCE(SUM(amount) FILTER ( - WHERE type = 'receita' AND status = 'paid' - ), 0) - - COALESCE(SUM(amount) FILTER ( - WHERE type = 'despesa' AND status = 'paid' - ), 0) AS saldo_liquido, - - -- Total repassado à clínica (apenas receitas pagas) - COALESCE(SUM(clinic_fee_amount) FILTER ( - WHERE type = 'receita' AND status = 'paid' - ), 0) AS total_repasse, - - -- Contadores (excluindo soft-deleted) - COUNT(*) FILTER (WHERE type = 'receita' AND deleted_at IS NULL) AS count_receitas, - COUNT(*) FILTER (WHERE type = 'despesa' AND deleted_at IS NULL) AS count_despesas - - FROM public.financial_records - WHERE owner_id = p_owner_id - AND deleted_at IS NULL - AND EXTRACT(YEAR FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_year - AND EXTRACT(MONTH FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_month; -$$; - - -ALTER FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) OWNER TO supabase_admin; - --- --- Name: get_my_email(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.get_my_email() RETURNS text -CREATE FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer DEFAULT NULL::integer, p_month integer DEFAULT NULL::integer, p_type text DEFAULT NULL::text, p_status text DEFAULT NULL::text, p_patient_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0) RETURNS SETOF public.financial_records - LANGUAGE sql STABLE SECURITY DEFINER - SET search_path TO 'public' - AS $$ - SELECT * - FROM public.financial_records - WHERE owner_id = p_owner_id - AND deleted_at IS NULL - AND (p_type IS NULL OR type::TEXT = p_type) - AND (p_status IS NULL OR status = p_status) - AND (p_patient_id IS NULL OR patient_id = p_patient_id) - AND (p_year IS NULL OR EXTRACT(YEAR FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_year) - AND (p_month IS NULL OR EXTRACT(MONTH FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_month) - ORDER BY COALESCE(paid_at, due_date::TIMESTAMPTZ, created_at) DESC - LIMIT p_limit - OFFSET p_offset; -$$; - - -ALTER FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) OWNER TO supabase_admin; - --- --- Name: mark_as_paid(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) RETURNS SETOF public.financial_records - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_record public.financial_records%ROWTYPE; -BEGIN - -- Garante que o registro pertence ao usuário autenticado (RLS não aplica em SECURITY DEFINER) - SELECT * INTO v_record - FROM public.financial_records - WHERE id = p_financial_record_id - AND owner_id = auth.uid() - AND deleted_at IS NULL; - - IF NOT FOUND THEN - RAISE EXCEPTION 'Registro financeiro não encontrado ou sem permissão.'; - END IF; - - IF v_record.status NOT IN ('pending', 'overdue') THEN - RAISE EXCEPTION 'Apenas cobranças pendentes ou vencidas podem ser marcadas como pagas.'; - END IF; - - UPDATE public.financial_records - SET status = 'paid', - paid_at = NOW(), - payment_method = p_payment_method, - updated_at = NOW() - WHERE id = p_financial_record_id - RETURNING * INTO v_record; - - RETURN NEXT v_record; -END; -$$; - - -ALTER FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) OWNER TO supabase_admin; - --- --- Name: mark_payout_as_paid(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.mark_payout_as_paid(p_payout_id uuid) RETURNS public.therapist_payouts -CREATE FUNCTION public.mark_payout_as_paid(p_payout_id uuid) RETURNS public.therapist_payouts - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_payout public.therapist_payouts%ROWTYPE; -BEGIN - -- Busca o payout - SELECT * INTO v_payout - FROM public.therapist_payouts - WHERE id = p_payout_id; - - IF NOT FOUND THEN - RAISE EXCEPTION 'Repasse não encontrado: %', p_payout_id; - END IF; - - -- Verifica permissão: apenas tenant_admin do tenant do repasse - IF NOT public.is_tenant_admin(v_payout.tenant_id) THEN - RAISE EXCEPTION 'Apenas o administrador da clínica pode marcar repasses como pagos.'; - END IF; - - -- Verifica status - IF v_payout.status <> 'pending' THEN - RAISE EXCEPTION - 'Repasse já está com status ''%''. Apenas repasses pendentes podem ser pagos.', - v_payout.status; - END IF; - - -- Atualiza - UPDATE public.therapist_payouts - SET - status = 'paid', - paid_at = NOW(), - updated_at = NOW() - WHERE id = p_payout_id - RETURNING * INTO v_payout; - - RETURN v_payout; -END; -$$; - - -ALTER FUNCTION public.mark_payout_as_paid(p_payout_id uuid) OWNER TO supabase_admin; - --- --- Name: FUNCTION mark_payout_as_paid(p_payout_id uuid); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) IS 'Marca um repasse de terapeuta como pago. Apenas o tenant_admin pode chamar. Apenas repasses com status=pending podem ser finalizados.'; - - --- --- Name: my_tenants(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.my_tenants() RETURNS TABLE(tenant_id uuid, role text, status text, kind text) -CREATE FUNCTION public.seed_default_financial_categories(p_user_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -BEGIN - INSERT INTO public.financial_categories (user_id, name, type, color, icon, sort_order) - VALUES - (p_user_id, 'Sessão', 'receita', '#22c55e', 'pi pi-heart', 1), - (p_user_id, 'Supervisão', 'receita', '#6366f1', 'pi pi-users', 2), - (p_user_id, 'Convênio', 'receita', '#3b82f6', 'pi pi-building', 3), - (p_user_id, 'Grupo terapêutico', 'receita', '#f59e0b', 'pi pi-sitemap', 4), - (p_user_id, 'Outro (receita)', 'receita', '#8b5cf6', 'pi pi-plus-circle', 5), - (p_user_id, 'Aluguel sala', 'despesa', '#ef4444', 'pi pi-home', 1), - (p_user_id, 'Plataforma/SaaS', 'despesa', '#f97316', 'pi pi-desktop', 2), - (p_user_id, 'Repasse clínica', 'despesa', '#64748b', 'pi pi-arrow-right-arrow-left', 3), - (p_user_id, 'Supervisão (custo)', 'despesa', '#6366f1', 'pi pi-users', 4), - (p_user_id, 'Outro (despesa)', 'despesa', '#94a3b8', 'pi pi-minus-circle', 5) - ON CONFLICT DO NOTHING; -END; -$$; - - -ALTER FUNCTION public.seed_default_financial_categories(p_user_id uuid) OWNER TO supabase_admin; - --- --- Name: seed_determined_commitments(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.seed_determined_commitments(p_tenant_id uuid) RETURNS void -CREATE FUNCTION public.set_insurance_plans_updated_at() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN NEW.updated_at = now(); RETURN NEW; END; $$; - - -ALTER FUNCTION public.set_insurance_plans_updated_at() OWNER TO supabase_admin; - --- --- Name: set_owner_id(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.set_owner_id() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - if new.owner_id is null then - new.owner_id := auth.uid(); - end if; - return new; -end; -$$; - - -ALTER FUNCTION public.set_owner_id() OWNER TO supabase_admin; - --- --- Name: set_services_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.set_services_updated_at() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - NEW.updated_at = now(); - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.set_services_updated_at() OWNER TO supabase_admin; - --- --- Name: set_tenant_feature_exception(uuid, text, boolean, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text DEFAULT NULL::text) RETURNS void -CREATE FUNCTION public.set_updated_at() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - NEW.updated_at = now(); - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.set_updated_at() OWNER TO supabase_admin; - --- --- Name: set_updated_at_recurrence(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.set_updated_at_recurrence() RETURNS trigger -CREATE FUNCTION public.sync_overdue_financial_records() RETURNS integer - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_count integer; -BEGIN - UPDATE public.financial_records - SET - status = 'overdue', - updated_at = NOW() - WHERE status = 'pending' - AND due_date IS NOT NULL - AND due_date < CURRENT_DATE - AND deleted_at IS NULL; - - GET DIAGNOSTICS v_count = ROW_COUNT; - RETURN v_count; -END; -$$; - - -ALTER FUNCTION public.sync_overdue_financial_records() OWNER TO supabase_admin; - --- --- Name: FUNCTION sync_overdue_financial_records(); Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON FUNCTION public.sync_overdue_financial_records() IS 'Marca como overdue todos os financial_records pendentes com due_date vencido. Pode ser chamada manualmente, via pg_cron ou via Supabase Edge Function agendada.'; - - --- --- Name: tenant_accept_invite(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.tenant_accept_invite(p_token uuid) RETURNS jsonb -CREATE FUNCTION public.trg_fn_financial_records_auto_overdue() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -BEGIN - IF NEW.status = 'pending' - AND NEW.due_date IS NOT NULL - AND NEW.due_date < CURRENT_DATE - THEN - NEW.status := 'overdue'; - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.trg_fn_financial_records_auto_overdue() OWNER TO supabase_admin; - --- --- Name: unstick_notification_queue(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.unstick_notification_queue() RETURNS integer - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_unstuck integer; -BEGIN - UPDATE public.notification_queue - SET status = 'pendente', - attempts = attempts + 1, - last_error = 'Timeout: preso em processando por >10min', - next_retry_at = now() + interval '2 minutes' - WHERE status = 'processando' - AND updated_at < now() - interval '10 minutes'; - - GET DIAGNOSTICS v_unstuck = ROW_COUNT; - RETURN v_unstuck; -END; -$$; - - -ALTER FUNCTION public.unstick_notification_queue() OWNER TO supabase_admin; - --- --- Name: update_payment_settings_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.update_payment_settings_updated_at() RETURNS trigger -CREATE FUNCTION public.update_payment_settings_updated_at() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - NEW.updated_at = now(); - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.update_payment_settings_updated_at() OWNER TO supabase_admin; - --- --- Name: update_professional_pricing_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.update_professional_pricing_updated_at() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - NEW.updated_at = now(); - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.update_professional_pricing_updated_at() OWNER TO supabase_admin; - --- --- Name: user_has_feature(uuid, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.user_has_feature(_user_id uuid, _feature text) RETURNS boolean diff --git a/database-novo/schema/03_functions/misc.sql b/database-novo/schema/03_functions/misc.sql deleted file mode 100644 index dcf22f4..0000000 --- a/database-novo/schema/03_functions/misc.sql +++ /dev/null @@ -1,776 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Functions — Compromissos, Suporte, SaaS --- ============================================================================= --- seed_determined_commitments, delete_commitment_full, --- delete_determined_commitment, guard_locked_commitment, --- create_support_session, revoke_support_session, validate_support_session, --- saas_votar_doc, faq_votar, notice_track_click/view, --- sanitize_phone_br, create_clinic_tenant --- ============================================================================= - -CREATE FUNCTION public.create_clinic_tenant(p_name text) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_uid uuid; - v_tenant uuid; - v_name text; -begin - v_uid := auth.uid(); - if v_uid is null then - raise exception 'Not authenticated'; - end if; - - v_name := nullif(trim(coalesce(p_name, '')), ''); - if v_name is null then - v_name := 'Clínica'; - end if; - - insert into public.tenants (name, kind, created_at) - values (v_name, 'clinic', now()) - returning id into v_tenant; - - insert into public.tenant_members (tenant_id, user_id, role, status, created_at) - values (v_tenant, v_uid, 'tenant_admin', 'active', now()); - - return v_tenant; -end; -$$; - - -ALTER FUNCTION public.create_clinic_tenant(p_name text) OWNER TO supabase_admin; - --- --- Name: financial_records; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.financial_records ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, - tenant_id uuid, - type public.financial_record_type DEFAULT 'receita'::public.financial_record_type NOT NULL, - amount numeric(10,2) NOT NULL, - description text, - category text, - payment_method text, - paid_at timestamp with time zone, - due_date date, - installments smallint DEFAULT 1, - installment_number smallint DEFAULT 1, - installment_group uuid, - agenda_evento_id uuid, - patient_id uuid, - clinic_fee_pct numeric(5,2) DEFAULT 0, - clinic_fee_amount numeric(10,2) DEFAULT 0, - net_amount numeric(10,2) GENERATED ALWAYS AS ((amount - clinic_fee_amount)) STORED, - insurance_plan_id uuid, - notes text, - tags text[], - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - deleted_at timestamp with time zone, - discount_amount numeric(10,2) DEFAULT 0 NOT NULL, - final_amount numeric(10,2) DEFAULT 0 NOT NULL, - status text DEFAULT 'pending'::text NOT NULL, - category_id uuid, - CONSTRAINT financial_records_amount_check CHECK ((amount >= (0)::numeric)), - CONSTRAINT financial_records_clinic_fee_amount_check CHECK ((clinic_fee_amount >= (0)::numeric)), - CONSTRAINT financial_records_clinic_fee_pct_check CHECK (((clinic_fee_pct >= (0)::numeric) AND (clinic_fee_pct <= (100)::numeric))), - CONSTRAINT financial_records_discount_amount_check CHECK ((discount_amount >= (0)::numeric)), - CONSTRAINT financial_records_final_amount_check CHECK ((final_amount >= (0)::numeric)), - CONSTRAINT financial_records_installments_check CHECK ((installments >= 1)), - CONSTRAINT financial_records_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'paid'::text, 'partial'::text, 'overdue'::text, 'cancelled'::text, 'refunded'::text]))) -); - - -ALTER TABLE public.financial_records OWNER TO supabase_admin; - --- --- Name: create_financial_record_for_session(uuid, uuid, uuid, uuid, numeric, date); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) RETURNS SETOF public.financial_records -CREATE FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer DEFAULT 60) RETURNS json - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_admin_id uuid; - v_role text; - v_token text; - v_expires timestamp with time zone; - v_session support_sessions; -BEGIN - -- Verifica autenticação - v_admin_id := auth.uid(); - IF v_admin_id IS NULL THEN - RAISE EXCEPTION 'Não autenticado.' USING ERRCODE = 'P0001'; - END IF; - - -- Verifica role saas_admin - SELECT role INTO v_role - FROM public.profiles - WHERE id = v_admin_id; - - IF v_role <> 'saas_admin' THEN - RAISE EXCEPTION 'Acesso negado. Somente saas_admin pode criar sessões de suporte.' - USING ERRCODE = 'P0002'; - END IF; - - -- Valida TTL (1 a 120 minutos) - IF p_ttl_minutes < 1 OR p_ttl_minutes > 120 THEN - RAISE EXCEPTION 'TTL inválido. Use entre 1 e 120 minutos.' - USING ERRCODE = 'P0003'; - END IF; - - -- Valida tenant - IF NOT EXISTS (SELECT 1 FROM public.tenants WHERE id = p_tenant_id) THEN - RAISE EXCEPTION 'Tenant não encontrado.' - USING ERRCODE = 'P0004'; - END IF; - - -- Gera token único (64 chars hex, sem pgcrypto) - v_token := replace(gen_random_uuid()::text, '-', '') || replace(gen_random_uuid()::text, '-', ''); - v_expires := now() + (p_ttl_minutes || ' minutes')::interval; - - -- Insere sessão - INSERT INTO public.support_sessions (tenant_id, admin_id, token, expires_at) - VALUES (p_tenant_id, v_admin_id, v_token, v_expires) - RETURNING * INTO v_session; - - RETURN json_build_object( - 'token', v_session.token, - 'expires_at', v_session.expires_at, - 'session_id', v_session.id - ); -END; -$$; - - -ALTER FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) OWNER TO supabase_admin; - --- --- Name: therapist_payouts; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.therapist_payouts ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, - tenant_id uuid NOT NULL, - period_start date NOT NULL, - period_end date NOT NULL, - total_sessions integer DEFAULT 0 NOT NULL, - gross_amount numeric(10,2) DEFAULT 0 NOT NULL, - clinic_fee_total numeric(10,2) DEFAULT 0 NOT NULL, - net_amount numeric(10,2) DEFAULT 0 NOT NULL, - status text DEFAULT 'pending'::text NOT NULL, - paid_at timestamp with time zone, - notes text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - CONSTRAINT therapist_payouts_clinic_fee_total_check CHECK ((clinic_fee_total >= (0)::numeric)), - CONSTRAINT therapist_payouts_gross_amount_check CHECK ((gross_amount >= (0)::numeric)), - CONSTRAINT therapist_payouts_net_amount_check CHECK ((net_amount >= (0)::numeric)), - CONSTRAINT therapist_payouts_period_chk CHECK ((period_end >= period_start)), - CONSTRAINT therapist_payouts_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'paid'::text, 'cancelled'::text]))) -); - - -ALTER TABLE public.therapist_payouts OWNER TO supabase_admin; - --- --- Name: create_therapist_payout(uuid, uuid, date, date); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) RETURNS public.therapist_payouts -CREATE FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -declare - v_is_native boolean; - v_fields int := 0; - v_logs int := 0; - v_parent int := 0; -begin - if auth.uid() is null then - raise exception 'Not authenticated'; - end if; - - if not exists ( - select 1 - from public.tenant_members tm - where tm.tenant_id = p_tenant_id - and tm.user_id = auth.uid() - and tm.status = 'active' - ) then - raise exception 'Not allowed'; - end if; - - select dc.is_native - into v_is_native - from public.determined_commitments dc - where dc.tenant_id = p_tenant_id - and dc.id = p_commitment_id; - - if v_is_native is null then - raise exception 'Commitment not found'; - end if; - - if v_is_native = true then - raise exception 'Cannot delete native commitment'; - end if; - - delete from public.determined_commitment_fields - where tenant_id = p_tenant_id - and commitment_id = p_commitment_id; - get diagnostics v_fields = row_count; - - delete from public.commitment_time_logs - where tenant_id = p_tenant_id - and commitment_id = p_commitment_id; - get diagnostics v_logs = row_count; - - delete from public.determined_commitments - where tenant_id = p_tenant_id - and id = p_commitment_id; - get diagnostics v_parent = row_count; - - if v_parent <> 1 then - raise exception 'Parent not deleted (RLS/owner issue).'; - end if; - - return jsonb_build_object( - 'ok', true, - 'deleted', jsonb_build_object( - 'fields', v_fields, - 'logs', v_logs, - 'commitment', v_parent - ) - ); -end; -$$; - - -ALTER FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) OWNER TO postgres; - --- --- Name: delete_determined_commitment(uuid, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -declare - v_is_native boolean; - v_fields_deleted int := 0; - v_logs_deleted int := 0; - v_commitment_deleted int := 0; -begin - if auth.uid() is null then - raise exception 'Not authenticated'; - end if; - - if not exists ( - select 1 - from public.tenant_members tm - where tm.tenant_id = p_tenant_id - and tm.user_id = auth.uid() - and tm.status = 'active' - ) then - raise exception 'Not allowed'; - end if; - - select dc.is_native - into v_is_native - from public.determined_commitments dc - where dc.tenant_id = p_tenant_id - and dc.id = p_commitment_id; - - if v_is_native is null then - raise exception 'Commitment not found for tenant'; - end if; - - if v_is_native = true then - raise exception 'Cannot delete native commitment'; - end if; - - delete from public.determined_commitment_fields f - where f.tenant_id = p_tenant_id - and f.commitment_id = p_commitment_id; - get diagnostics v_fields_deleted = row_count; - - delete from public.commitment_time_logs l - where l.tenant_id = p_tenant_id - and l.commitment_id = p_commitment_id; - get diagnostics v_logs_deleted = row_count; - - delete from public.determined_commitments dc - where dc.tenant_id = p_tenant_id - and dc.id = p_commitment_id; - get diagnostics v_commitment_deleted = row_count; - - if v_commitment_deleted <> 1 then - raise exception 'Delete did not remove the commitment (tenant mismatch?)'; - end if; - - return jsonb_build_object( - 'ok', true, - 'tenant_id', p_tenant_id, - 'commitment_id', p_commitment_id, - 'deleted', jsonb_build_object( - 'fields', v_fields_deleted, - 'logs', v_logs_deleted, - 'commitment', v_commitment_deleted - ) - ); -end; -$$; - - -ALTER FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) OWNER TO supabase_admin; - --- --- Name: dev_list_auth_users(integer); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.dev_list_auth_users(p_limit integer DEFAULT 50) RETURNS TABLE(id uuid, email text, created_at timestamp with time zone) -CREATE FUNCTION public.faq_votar(faq_id uuid) RETURNS void - LANGUAGE sql SECURITY DEFINER - AS $$ - update public.saas_faq - set votos = votos + 1, - updated_at = now() - where id = faq_id - and ativo = true; -$$; - - -ALTER FUNCTION public.faq_votar(faq_id uuid) OWNER TO supabase_admin; - --- --- Name: fix_all_subscription_mismatches(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.fix_all_subscription_mismatches() RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - r record; -begin - for r in - select distinct s.user_id as owner_id - from public.subscriptions s - where s.status = 'active' - and s.user_id is not null - loop - perform public.rebuild_owner_entitlements(r.owner_id); - end loop; -end; -$$; - - -ALTER FUNCTION public.fix_all_subscription_mismatches() OWNER TO supabase_admin; - --- --- Name: fn_agenda_regras_semanais_no_overlap(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.fn_agenda_regras_semanais_no_overlap() RETURNS trigger -CREATE FUNCTION public.guard_locked_commitment() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - if (old.is_locked = true) then - if (tg_op = 'DELETE') then - raise exception 'Compromisso bloqueado não pode ser excluído.'; - end if; - - if (tg_op = 'UPDATE') then - if (new.active = false) then - raise exception 'Compromisso bloqueado não pode ser desativado.'; - end if; - - -- trava renomear (mantém o "Sessão" sempre igual) - if (new.name is distinct from old.name) then - raise exception 'Compromisso bloqueado não pode ser renomeado.'; - end if; - - -- se quiser travar descrição também, descomente: - -- if (new.description is distinct from old.description) then - -- raise exception 'Compromisso bloqueado não pode alterar descrição.'; - -- end if; - end if; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.guard_locked_commitment() OWNER TO supabase_admin; - --- --- Name: guard_no_change_core_plan_key(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.guard_no_change_core_plan_key() RETURNS trigger -CREATE FUNCTION public.notice_track_click(p_notice_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -begin - update public.global_notices - set clicks_count = clicks_count + 1 - where id = p_notice_id; -end; -$$; - - -ALTER FUNCTION public.notice_track_click(p_notice_id uuid) OWNER TO supabase_admin; - --- --- Name: notice_track_view(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.notice_track_view(p_notice_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -begin - update public.global_notices - set views_count = views_count + 1 - where id = p_notice_id; -end; -$$; - - -ALTER FUNCTION public.notice_track_view(p_notice_id uuid) OWNER TO supabase_admin; - --- --- Name: notify_on_intake(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.notify_on_intake() RETURNS trigger -CREATE FUNCTION public.revoke_support_session(p_token text) RETURNS boolean - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_admin_id uuid; - v_role text; -BEGIN - v_admin_id := auth.uid(); - IF v_admin_id IS NULL THEN - RAISE EXCEPTION 'Não autenticado.' USING ERRCODE = 'P0001'; - END IF; - - SELECT role INTO v_role FROM public.profiles WHERE id = v_admin_id; - IF v_role <> 'saas_admin' THEN - RAISE EXCEPTION 'Acesso negado.' USING ERRCODE = 'P0002'; - END IF; - - DELETE FROM public.support_sessions - WHERE token = p_token - AND admin_id = v_admin_id; - - RETURN FOUND; -END; -$$; - - -ALTER FUNCTION public.revoke_support_session(p_token text) OWNER TO supabase_admin; - --- --- Name: rotate_patient_invite_token(text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.rotate_patient_invite_token(p_new_token text) RETURNS uuid -CREATE FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) RETURNS jsonb - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_uid uuid := auth.uid(); - v_voto_antigo boolean; -begin - if v_uid is null then - raise exception 'Não autenticado'; - end if; - - -- Verifica se já votou - select util into v_voto_antigo - from public.saas_doc_votos - where doc_id = p_doc_id and user_id = v_uid; - - if found then - -- Já votou igual → cancela o voto (toggle) - if v_voto_antigo = p_util then - delete from public.saas_doc_votos - where doc_id = p_doc_id and user_id = v_uid; - - update public.saas_docs set - votos_util = greatest(0, votos_util - (case when p_util then 1 else 0 end)), - votos_nao_util = greatest(0, votos_nao_util - (case when not p_util then 1 else 0 end)), - updated_at = now() - where id = p_doc_id; - - return jsonb_build_object('acao', 'removido', 'util', null); - else - -- Mudou de voto - update public.saas_doc_votos set util = p_util, updated_at = now() - where doc_id = p_doc_id and user_id = v_uid; - - update public.saas_docs set - votos_util = greatest(0, votos_util + (case when p_util then 1 else -1 end)), - votos_nao_util = greatest(0, votos_nao_util + (case when not p_util then 1 else -1 end)), - updated_at = now() - where id = p_doc_id; - - return jsonb_build_object('acao', 'atualizado', 'util', p_util); - end if; - else - -- Primeiro voto - insert into public.saas_doc_votos (doc_id, user_id, util) - values (p_doc_id, v_uid, p_util); - - update public.saas_docs set - votos_util = votos_util + (case when p_util then 1 else 0 end), - votos_nao_util = votos_nao_util + (case when not p_util then 1 else 0 end), - updated_at = now() - where id = p_doc_id; - - return jsonb_build_object('acao', 'registrado', 'util', p_util); - end if; -end; -$$; - - -ALTER FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) OWNER TO supabase_admin; - --- --- Name: safe_delete_patient(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.safe_delete_patient(p_patient_id uuid) RETURNS jsonb -CREATE FUNCTION public.sanitize_phone_br(raw_phone text) RETURNS text - LANGUAGE plpgsql IMMUTABLE - AS $$ DECLARE digits text; - BEGIN - digits := regexp_replace(COALESCE(raw_phone, ''), '[^0-9]', '', 'g'); - IF digits = '' THEN RETURN ''; END IF; - IF length(digits) = 10 OR length(digits) = 11 THEN - digits := '55' || digits; - END IF; - RETURN digits; - END; $$; - - -ALTER FUNCTION public.sanitize_phone_br(raw_phone text) OWNER TO supabase_admin; - --- --- Name: seed_default_financial_categories(uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.seed_default_financial_categories(p_user_id uuid) RETURNS void -CREATE FUNCTION public.seed_determined_commitments(p_tenant_id uuid) RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_id uuid; -begin - -- Sessão (locked + sempre ativa) - if not exists ( - select 1 from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'session' - ) then - insert into public.determined_commitments - (tenant_id, is_native, native_key, is_locked, active, name, description) - values - (p_tenant_id, true, 'session', true, true, 'Sessão', 'Sessão com paciente'); - end if; - - -- Leitura - if not exists ( - select 1 from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'reading' - ) then - insert into public.determined_commitments - (tenant_id, is_native, native_key, is_locked, active, name, description) - values - (p_tenant_id, true, 'reading', false, true, 'Leitura', 'Praticar leitura'); - end if; - - -- Supervisão - if not exists ( - select 1 from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'supervision' - ) then - insert into public.determined_commitments - (tenant_id, is_native, native_key, is_locked, active, name, description) - values - (p_tenant_id, true, 'supervision', false, true, 'Supervisão', 'Supervisão'); - end if; - - -- Aula ✅ (corrigido) - if not exists ( - select 1 from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'class' - ) then - insert into public.determined_commitments - (tenant_id, is_native, native_key, is_locked, active, name, description) - values - (p_tenant_id, true, 'class', false, false, 'Aula', 'Dar aula'); - end if; - - -- Análise pessoal - if not exists ( - select 1 from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'analysis' - ) then - insert into public.determined_commitments - (tenant_id, is_native, native_key, is_locked, active, name, description) - values - (p_tenant_id, true, 'analysis', false, true, 'Análise Pessoal', 'Minha análise pessoal'); - end if; - - -- ------------------------------------------------------- - -- Campos padrão (idempotentes por (commitment_id, key)) - -- ------------------------------------------------------- - - -- Leitura - select id into v_id - from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'reading' - limit 1; - - if v_id is not null then - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'book') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'book', 'Livro', 'text', false, 10); - end if; - - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'author') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'author', 'Autor', 'text', false, 20); - end if; - - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'notes', 'Observação', 'textarea', false, 30); - end if; - end if; - - -- Supervisão - select id into v_id - from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'supervision' - limit 1; - - if v_id is not null then - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'supervisor') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'supervisor', 'Supervisor', 'text', false, 10); - end if; - - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'topic') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'topic', 'Assunto', 'text', false, 20); - end if; - - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'notes', 'Observação', 'textarea', false, 30); - end if; - end if; - - -- Aula - select id into v_id - from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'class' - limit 1; - - if v_id is not null then - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'theme') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'theme', 'Tema', 'text', false, 10); - end if; - - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'group') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'group', 'Turma', 'text', false, 20); - end if; - - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'notes', 'Observação', 'textarea', false, 30); - end if; - end if; - - -- Análise - select id into v_id - from public.determined_commitments - where tenant_id = p_tenant_id and is_native = true and native_key = 'analysis' - limit 1; - - if v_id is not null then - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'analyst') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'analyst', 'Analista', 'text', false, 10); - end if; - - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'focus') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'focus', 'Foco', 'text', false, 20); - end if; - - if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then - insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) - values (p_tenant_id, v_id, 'notes', 'Observação', 'textarea', false, 30); - end if; - end if; -end; -$$; - - -ALTER FUNCTION public.seed_determined_commitments(p_tenant_id uuid) OWNER TO supabase_admin; - --- --- Name: set_insurance_plans_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.set_insurance_plans_updated_at() RETURNS trigger -CREATE FUNCTION public.validate_support_session(p_token text) RETURNS json - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -DECLARE - v_session support_sessions; -BEGIN - IF p_token IS NULL OR length(trim(p_token)) < 32 THEN - RETURN json_build_object('valid', false, 'tenant_id', null); - END IF; - - SELECT * INTO v_session - FROM public.support_sessions - WHERE token = p_token - AND expires_at > now() - LIMIT 1; - - IF NOT FOUND THEN - RETURN json_build_object('valid', false, 'tenant_id', null); - END IF; - - RETURN json_build_object( - 'valid', true, - 'tenant_id', v_session.tenant_id - ); -END; -$$; - - -ALTER FUNCTION public.validate_support_session(p_token text) OWNER TO supabase_admin; - --- --- Name: whoami(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.whoami() RETURNS TABLE(uid uuid, role text) diff --git a/database-novo/schema/03_functions/notifications.sql b/database-novo/schema/03_functions/notifications.sql deleted file mode 100644 index 161377e..0000000 --- a/database-novo/schema/03_functions/notifications.sql +++ /dev/null @@ -1,404 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Functions — Notificações --- ============================================================================= --- cancel_notifications_on_opt_out, cancel_notifications_on_session_cancel, --- cancel_patient_pending_notifications, cleanup_notification_queue, --- notify_on_intake, notify_on_scheduling, notify_on_session_status, --- populate_notification_queue, unstick_notification_queue --- ============================================================================= - -CREATE FUNCTION public.cancel_notifications_on_opt_out() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -BEGIN - -- WhatsApp opt-out - IF OLD.whatsapp_opt_in = true AND NEW.whatsapp_opt_in = false THEN - PERFORM public.cancel_patient_pending_notifications( - NEW.patient_id, 'whatsapp' - ); - END IF; - -- Email opt-out - IF OLD.email_opt_in = true AND NEW.email_opt_in = false THEN - PERFORM public.cancel_patient_pending_notifications( - NEW.patient_id, 'email' - ); - END IF; - -- SMS opt-out - IF OLD.sms_opt_in = true AND NEW.sms_opt_in = false THEN - PERFORM public.cancel_patient_pending_notifications( - NEW.patient_id, 'sms' - ); - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.cancel_notifications_on_opt_out() OWNER TO supabase_admin; - --- --- Name: cancel_notifications_on_session_cancel(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.cancel_notifications_on_session_cancel() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -BEGIN - IF NEW.status IN ('cancelado', 'excluido') - AND OLD.status NOT IN ('cancelado', 'excluido') - THEN - PERFORM public.cancel_patient_pending_notifications( - NEW.patient_id, NULL, NEW.id - ); - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.cancel_notifications_on_session_cancel() OWNER TO supabase_admin; - --- --- Name: cancel_patient_pending_notifications(uuid, text, uuid); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text DEFAULT NULL::text, p_evento_id uuid DEFAULT NULL::uuid) RETURNS integer - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_canceled integer; -BEGIN - UPDATE public.notification_queue - SET status = 'cancelado', - updated_at = now() - WHERE patient_id = p_patient_id - AND status IN ('pendente', 'processando') - AND (p_channel IS NULL OR channel = p_channel) - AND (p_evento_id IS NULL OR agenda_evento_id = p_evento_id); - - GET DIAGNOSTICS v_canceled = ROW_COUNT; - RETURN v_canceled; -END; -$$; - - -ALTER FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) OWNER TO supabase_admin; - --- --- Name: cancel_recurrence_from(uuid, date); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) RETURNS void -CREATE FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text DEFAULT NULL::text, p_evento_id uuid DEFAULT NULL::uuid) RETURNS integer - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_canceled integer; -BEGIN - UPDATE public.notification_queue - SET status = 'cancelado', - updated_at = now() - WHERE patient_id = p_patient_id - AND status IN ('pendente', 'processando') - AND (p_channel IS NULL OR channel = p_channel) - AND (p_evento_id IS NULL OR agenda_evento_id = p_evento_id); - - GET DIAGNOSTICS v_canceled = ROW_COUNT; - RETURN v_canceled; -END; -$$; - - -ALTER FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) OWNER TO supabase_admin; - --- --- Name: cancel_recurrence_from(uuid, date); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) RETURNS void -CREATE FUNCTION public.cleanup_notification_queue() RETURNS integer - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_deleted integer; -BEGIN - DELETE FROM public.notification_queue - WHERE status IN ('enviado', 'cancelado', 'ignorado') - AND created_at < now() - interval '90 days'; - - GET DIAGNOSTICS v_deleted = ROW_COUNT; - RETURN v_deleted; -END; -$$; - - -ALTER FUNCTION public.cleanup_notification_queue() OWNER TO supabase_admin; - --- --- Name: create_clinic_tenant(text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.create_clinic_tenant(p_name text) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -declare - v_uid uuid; - v_tenant uuid; - v_name text; -begin - v_uid := auth.uid(); - if v_uid is null then - raise exception 'Not authenticated'; - end if; - - v_name := nullif(trim(coalesce(p_name, '')), ''); - if v_name is null then - v_name := 'Clínica'; - end if; - - insert into public.tenants (name, kind, created_at) - values (v_name, 'clinic', now()) - returning id into v_tenant; - - insert into public.tenant_members (tenant_id, user_id, role, status, created_at) - values (v_tenant, v_uid, 'tenant_admin', 'active', now()); - - return v_tenant; -end; -$$; - - -ALTER FUNCTION public.create_clinic_tenant(p_name text) OWNER TO supabase_admin; - --- --- Name: financial_records; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.financial_records ( -CREATE FUNCTION public.notify_on_intake() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -BEGIN - IF NEW.status = 'new' THEN - INSERT INTO public.notifications ( - owner_id, - tenant_id, - type, - ref_id, - ref_table, - payload - ) - VALUES ( - NEW.owner_id, - NEW.tenant_id, - 'new_patient', - NEW.id, - 'patient_intake_requests', - jsonb_build_object( - 'title', 'Novo cadastro externo', - 'detail', COALESCE(NEW.nome_completo, 'Paciente'), - 'deeplink', '/therapist/patients/cadastro/recebidos', - 'avatar_initials', upper(left(COALESCE(NEW.nome_completo, '?'), 2)) - ) - ); - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.notify_on_intake() OWNER TO supabase_admin; - --- --- Name: notify_on_scheduling(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.notify_on_scheduling() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - AS $$ BEGIN IF NEW.status = 'pendente' THEN - INSERT INTO public.notifications ( owner_id, tenant_id, type, ref_id, ref_table, payload ) VALUES ( - NEW.owner_id, NEW.tenant_id, - 'new_scheduling', NEW.id, 'agendador_solicitacoes', jsonb_build_object( 'title', 'Nova solicitação de agendamento', 'detail', COALESCE(NEW.paciente_nome, 'Paciente') || ' ' || COALESCE(NEW.paciente_sobrenome, '') || ' — ' || COALESCE(NEW.tipo, ''), 'deeplink', '/therapist/agendamentos-recebidos', 'avatar_initials', upper(left(COALESCE(NEW.paciente_nome, '?'), 1) || left(COALESCE(NEW.paciente_sobrenome, ''), 1)) ) ); END IF; RETURN NEW; END; $$; - - -ALTER FUNCTION public.notify_on_scheduling() OWNER TO supabase_admin; - --- --- Name: notify_on_session_status(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.notify_on_session_status() RETURNS trigger - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_nome text; -BEGIN - IF NEW.status IN ('faltou', 'cancelado') AND OLD.status IS DISTINCT FROM NEW.status THEN - - SELECT nome_completo - INTO v_nome - FROM public.patients - WHERE id = NEW.patient_id - LIMIT 1; - - INSERT INTO public.notifications ( - owner_id, - tenant_id, - type, - ref_id, - ref_table, - payload - ) - VALUES ( - NEW.owner_id, - NEW.tenant_id, - 'session_status', - NEW.id, - 'agenda_eventos', - jsonb_build_object( - 'title', CASE WHEN NEW.status = 'faltou' THEN 'Paciente faltou' ELSE 'Sessão cancelada' END, - 'detail', COALESCE(v_nome, 'Paciente') || ' — ' || to_char(NEW.inicio_em, 'DD/MM HH24:MI'), - 'deeplink', '/therapist/agenda', - 'avatar_initials', upper(left(COALESCE(v_nome, '?'), 2)) - ) - ); - - END IF; - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.notify_on_session_status() OWNER TO supabase_admin; - --- --- Name: on_new_user_seed_patient_groups(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.on_new_user_seed_patient_groups() RETURNS trigger -CREATE FUNCTION public.populate_notification_queue() RETURNS void - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -BEGIN - INSERT INTO public.notification_queue ( - tenant_id, owner_id, agenda_evento_id, patient_id, - channel, template_key, schedule_key, - resolved_vars, recipient_address, - scheduled_at, idempotency_key - ) - SELECT - ae.tenant_id, - ae.owner_id, - ae.id AS agenda_evento_id, - ae.patient_id, - ch.channel, - 'session.' || REPLACE(ns.event_type, '_sessao', '') || '.' || ch.channel, - ns.schedule_key, - jsonb_build_object( - 'nome_paciente', COALESCE(p.nome_completo, 'Paciente'), - 'data_sessao', TO_CHAR(ae.inicio_em AT TIME ZONE 'America/Sao_Paulo', 'DD/MM/YYYY'), - 'hora_sessao', TO_CHAR(ae.inicio_em AT TIME ZONE 'America/Sao_Paulo', 'HH24:MI'), - 'nome_terapeuta', COALESCE(prof.full_name, 'Terapeuta'), - 'modalidade', COALESCE(ae.modalidade, 'Presencial'), - 'titulo', COALESCE(ae.titulo, 'Sessão') - ), - CASE ch.channel - WHEN 'whatsapp' THEN COALESCE(p.telefone, '') - WHEN 'sms' THEN COALESCE(p.telefone, '') - WHEN 'email' THEN COALESCE(p.email_principal, '') - END, - CASE - WHEN (ae.inicio_em - (ns.offset_minutes || ' minutes')::interval)::time - < ns.allowed_time_start - THEN DATE_TRUNC('day', ae.inicio_em - (ns.offset_minutes || ' minutes')::interval) - + ns.allowed_time_start - WHEN (ae.inicio_em - (ns.offset_minutes || ' minutes')::interval)::time - > ns.allowed_time_end - THEN DATE_TRUNC('day', ae.inicio_em - (ns.offset_minutes || ' minutes')::interval) - + ns.allowed_time_start - ELSE ae.inicio_em - (ns.offset_minutes || ' minutes')::interval - END, - ae.id::text || ':' || ns.schedule_key || ':' || ch.channel || ':' - || ae.inicio_em::date::text - FROM public.agenda_eventos ae - JOIN public.patients p ON p.id = ae.patient_id - LEFT JOIN public.profiles prof ON prof.id = ae.owner_id - JOIN public.notification_schedules ns - ON ns.owner_id = ae.owner_id - AND ns.is_active = true - AND ns.deleted_at IS NULL - AND ns.trigger_type = 'before_event' - AND ns.event_type = 'lembrete_sessao' - JOIN public.notification_channels nc - ON nc.owner_id = ae.owner_id - AND nc.is_active = true - AND nc.deleted_at IS NULL - CROSS JOIN LATERAL ( - SELECT 'whatsapp' AS channel WHERE ns.whatsapp_enabled AND nc.channel = 'whatsapp' - UNION ALL - SELECT 'email' AS channel WHERE ns.email_enabled AND nc.channel = 'email' - UNION ALL - SELECT 'sms' AS channel WHERE ns.sms_enabled AND nc.channel = 'sms' - ) ch - LEFT JOIN public.notification_preferences np - ON np.patient_id = ae.patient_id - AND np.owner_id = ae.owner_id - AND np.deleted_at IS NULL - WHERE - ae.inicio_em > now() - AND ae.inicio_em <= now() + interval '48 hours' - AND ae.status NOT IN ('cancelado', 'faltou') - AND CASE ch.channel - WHEN 'whatsapp' THEN COALESCE(p.telefone, '') != '' - WHEN 'sms' THEN COALESCE(p.telefone, '') != '' - WHEN 'email' THEN COALESCE(p.email_principal, '') != '' - END - AND CASE ch.channel - WHEN 'whatsapp' THEN COALESCE(np.whatsapp_opt_in, true) - WHEN 'email' THEN COALESCE(np.email_opt_in, true) - WHEN 'sms' THEN COALESCE(np.sms_opt_in, false) - END - AND EXISTS ( - SELECT 1 FROM public.profiles tp - WHERE tp.id = ae.owner_id - AND COALESCE(tp.notify_reminders, true) = true - ) - ON CONFLICT (idempotency_key) DO NOTHING; -END; -$$; - - -ALTER FUNCTION public.populate_notification_queue() OWNER TO supabase_admin; - --- --- Name: prevent_promoting_to_system(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.prevent_promoting_to_system() RETURNS trigger -CREATE FUNCTION public.unstick_notification_queue() RETURNS integer - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -DECLARE - v_unstuck integer; -BEGIN - UPDATE public.notification_queue - SET status = 'pendente', - attempts = attempts + 1, - last_error = 'Timeout: preso em processando por >10min', - next_retry_at = now() + interval '2 minutes' - WHERE status = 'processando' - AND updated_at < now() - interval '10 minutes'; - - GET DIAGNOSTICS v_unstuck = ROW_COUNT; - RETURN v_unstuck; -END; -$$; - - -ALTER FUNCTION public.unstick_notification_queue() OWNER TO supabase_admin; - --- --- Name: update_payment_settings_updated_at(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.update_payment_settings_updated_at() RETURNS trigger diff --git a/database-novo/schema/03_functions/patients.sql b/database-novo/schema/03_functions/patients.sql deleted file mode 100644 index 8d9d9f0..0000000 --- a/database-novo/schema/03_functions/patients.sql +++ /dev/null @@ -1,433 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Functions — Pacientes --- ============================================================================= --- can_delete_patient, safe_delete_patient, create_patient_intake_request, --- create_patient_intake_request_v2, rotate_patient_invite_token, --- patients_validate_member_consistency, prevent_system_group_changes, --- seed_default_patient_groups --- ============================================================================= - -CREATE FUNCTION public.can_delete_patient(p_patient_id uuid) RETURNS boolean - LANGUAGE sql STABLE SECURITY DEFINER - AS $$ - SELECT NOT EXISTS ( - SELECT 1 FROM public.agenda_eventos WHERE patient_id = p_patient_id - UNION ALL - SELECT 1 FROM public.recurrence_rules WHERE patient_id = p_patient_id - UNION ALL - SELECT 1 FROM public.billing_contracts WHERE patient_id = p_patient_id - ); -$$; - - -ALTER FUNCTION public.can_delete_patient(p_patient_id uuid) OWNER TO supabase_admin; - --- --- Name: cancel_notifications_on_opt_out(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.cancel_notifications_on_opt_out() RETURNS trigger -CREATE FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text DEFAULT NULL::text, p_phone text DEFAULT NULL::text, p_notes text DEFAULT NULL::text, p_consent boolean DEFAULT false) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -declare - v_owner uuid; - v_active boolean; - v_expires timestamptz; - v_max_uses int; - v_uses int; - v_id uuid; -begin - select owner_id, active, expires_at, max_uses, uses - into v_owner, v_active, v_expires, v_max_uses, v_uses - from public.patient_invites - where token = p_token - limit 1; - - if v_owner is null then - raise exception 'Token inválido'; - end if; - - if v_active is not true then - raise exception 'Link desativado'; - end if; - - if v_expires is not null and now() > v_expires then - raise exception 'Link expirado'; - end if; - - if v_max_uses is not null and v_uses >= v_max_uses then - raise exception 'Limite de uso atingido'; - end if; - - if p_name is null or length(trim(p_name)) = 0 then - raise exception 'Nome é obrigatório'; - end if; - - insert into public.patient_intake_requests - (owner_id, token, name, email, phone, notes, consent, status) - values - (v_owner, p_token, trim(p_name), - nullif(lower(trim(p_email)), ''), - nullif(trim(p_phone), ''), - nullif(trim(p_notes), ''), - coalesce(p_consent, false), - 'new') - returning id into v_id; - - update public.patient_invites - set uses = uses + 1 - where token = p_token; - - return v_id; -end; -$$; - - -ALTER FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) OWNER TO supabase_admin; - --- --- Name: create_patient_intake_request_v2(text, jsonb); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $_$ -declare - v_owner_id uuid; - v_intake_id uuid; - v_birth_raw text; - v_birth date; -begin - select owner_id - into v_owner_id - from public.patient_invites - where token = p_token; - - if v_owner_id is null then - raise exception 'Token inválido ou expirado'; - end if; - - v_birth_raw := nullif(trim(coalesce( - p_payload->>'data_nascimento', - '' - )), ''); - - v_birth := case - when v_birth_raw is null then null - when v_birth_raw ~ '^\d{4}-\d{2}-\d{2}$' then v_birth_raw::date - when v_birth_raw ~ '^\d{2}-\d{2}-\d{4}$' then to_date(v_birth_raw, 'DD-MM-YYYY') - else null - end; - - insert into public.patient_intake_requests ( - owner_id, - token, - status, - consent, - - nome_completo, - email_principal, - telefone, - - avatar_url, -- 🔥 AQUI - - data_nascimento, - cpf, - rg, - genero, - estado_civil, - profissao, - escolaridade, - nacionalidade, - naturalidade, - - cep, - pais, - cidade, - estado, - endereco, - numero, - complemento, - bairro, - - observacoes, - notas_internas, - - encaminhado_por, - onde_nos_conheceu - ) - values ( - v_owner_id, - p_token, - 'new', - coalesce((p_payload->>'consent')::boolean, false), - - nullif(trim(p_payload->>'nome_completo'), ''), - nullif(trim(p_payload->>'email_principal'), ''), - nullif(regexp_replace(coalesce(p_payload->>'telefone',''), '\D', '', 'g'), ''), - - nullif(trim(p_payload->>'avatar_url'), ''), -- 🔥 AQUI - - v_birth, - nullif(regexp_replace(coalesce(p_payload->>'cpf',''), '\D', '', 'g'), ''), - nullif(trim(p_payload->>'rg'), ''), - nullif(trim(p_payload->>'genero'), ''), - nullif(trim(p_payload->>'estado_civil'), ''), - nullif(trim(p_payload->>'profissao'), ''), - nullif(trim(p_payload->>'escolaridade'), ''), - nullif(trim(p_payload->>'nacionalidade'), ''), - nullif(trim(p_payload->>'naturalidade'), ''), - - nullif(regexp_replace(coalesce(p_payload->>'cep',''), '\D', '', 'g'), ''), - nullif(trim(p_payload->>'pais'), ''), - nullif(trim(p_payload->>'cidade'), ''), - nullif(trim(p_payload->>'estado'), ''), - nullif(trim(p_payload->>'endereco'), ''), - nullif(trim(p_payload->>'numero'), ''), - nullif(trim(p_payload->>'complemento'), ''), - nullif(trim(p_payload->>'bairro'), ''), - - nullif(trim(p_payload->>'observacoes'), ''), - nullif(trim(p_payload->>'notas_internas'), ''), - - nullif(trim(p_payload->>'encaminhado_por'), ''), - nullif(trim(p_payload->>'onde_nos_conheceu'), '') - ) - returning id into v_intake_id; - - return v_intake_id; -end; -$_$; - - -ALTER FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) OWNER TO supabase_admin; - --- --- Name: create_support_session(uuid, integer); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer DEFAULT 60) RETURNS json -CREATE FUNCTION public.patients_validate_member_consistency() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - v_tenant_responsible uuid; - v_tenant_therapist uuid; -BEGIN - -- responsible_member sempre deve existir e ser do tenant - SELECT tenant_id INTO v_tenant_responsible - FROM public.tenant_members - WHERE id = NEW.responsible_member_id; - - IF v_tenant_responsible IS NULL THEN - RAISE EXCEPTION 'Responsible member not found'; - END IF; - - IF NEW.tenant_id IS NULL THEN - RAISE EXCEPTION 'tenant_id is required'; - END IF; - - IF v_tenant_responsible <> NEW.tenant_id THEN - RAISE EXCEPTION 'Responsible member must belong to the same tenant'; - END IF; - - -- therapist scope: therapist_member_id deve existir e ser do mesmo tenant - IF NEW.patient_scope = 'therapist' THEN - IF NEW.therapist_member_id IS NULL THEN - RAISE EXCEPTION 'therapist_member_id is required when patient_scope=therapist'; - END IF; - - SELECT tenant_id INTO v_tenant_therapist - FROM public.tenant_members - WHERE id = NEW.therapist_member_id; - - IF v_tenant_therapist IS NULL THEN - RAISE EXCEPTION 'Therapist member not found'; - END IF; - - IF v_tenant_therapist <> NEW.tenant_id THEN - RAISE EXCEPTION 'Therapist member must belong to the same tenant'; - END IF; - END IF; - - RETURN NEW; -END; -$$; - - -ALTER FUNCTION public.patients_validate_member_consistency() OWNER TO supabase_admin; - --- --- Name: patients_validate_responsible_member_tenant(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.patients_validate_responsible_member_tenant() RETURNS trigger - LANGUAGE plpgsql - AS $$ -declare - m_tenant uuid; -begin - select tenant_id into m_tenant - from public.tenant_members - where id = new.responsible_member_id; - - if m_tenant is null then - raise exception 'Responsible member not found'; - end if; - - if new.tenant_id is null then - raise exception 'tenant_id is required'; - end if; - - if m_tenant <> new.tenant_id then - raise exception 'Responsible member must belong to the same tenant'; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.patients_validate_responsible_member_tenant() OWNER TO supabase_admin; - --- --- Name: populate_notification_queue(); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.populate_notification_queue() RETURNS void -CREATE FUNCTION public.prevent_system_group_changes() RETURNS trigger - LANGUAGE plpgsql - AS $$ -begin - -- Se for grupo do sistema, regras rígidas: - if old.is_system = true then - - -- nunca pode deletar - if tg_op = 'DELETE' then - raise exception 'Grupos padrão do sistema não podem ser alterados ou excluídos.'; - end if; - - if tg_op = 'UPDATE' then - -- permite SOMENTE mudar tenant_id e/ou updated_at - -- qualquer mudança de conteúdo permanece proibida - if - new.nome is distinct from old.nome or - new.descricao is distinct from old.descricao or - new.cor is distinct from old.cor or - new.is_active is distinct from old.is_active or - new.is_system is distinct from old.is_system or - new.owner_id is distinct from old.owner_id or - new.therapist_id is distinct from old.therapist_id or - new.created_at is distinct from old.created_at - then - raise exception 'Grupos padrão do sistema não podem ser alterados ou excluídos.'; - end if; - - -- chegou aqui: só tenant_id/updated_at mudaram -> ok - return new; - end if; - - end if; - - -- não-system: deixa passar - if tg_op = 'DELETE' then - return old; - end if; - - return new; -end; -$$; - - -ALTER FUNCTION public.prevent_system_group_changes() OWNER TO supabase_admin; - --- --- Name: provision_account_tenant(uuid, text, text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text DEFAULT NULL::text) RETURNS uuid -CREATE FUNCTION public.rotate_patient_invite_token(p_new_token text) RETURNS uuid - LANGUAGE plpgsql SECURITY DEFINER - SET search_path TO 'public' - AS $$ -declare - v_uid uuid; - v_id uuid; -begin - -- pega o usuário logado - v_uid := auth.uid(); - if v_uid is null then - raise exception 'Usuário não autenticado'; - end if; - - -- desativa tokens antigos ativos do usuário - update public.patient_invites - set active = false - where owner_id = v_uid - and active = true; - - -- cria novo token - insert into public.patient_invites (owner_id, token, active) - values (v_uid, p_new_token, true) - returning id into v_id; - - return v_id; -end; -$$; - - -ALTER FUNCTION public.rotate_patient_invite_token(p_new_token text) OWNER TO supabase_admin; - --- --- Name: saas_votar_doc(uuid, boolean); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) RETURNS jsonb -CREATE FUNCTION public.safe_delete_patient(p_patient_id uuid) RETURNS jsonb - LANGUAGE plpgsql SECURITY DEFINER - AS $$ -BEGIN - -- Bloqueia se houver histórico - IF NOT public.can_delete_patient(p_patient_id) THEN - RETURN jsonb_build_object( - 'ok', false, - 'error', 'has_history', - 'message', 'Este paciente possui histórico clínico ou financeiro e não pode ser removido. Você pode desativar ou arquivar o paciente.' - ); - END IF; - - -- Verifica ownership via RLS (owner_id ou responsible_member_id) - IF NOT EXISTS ( - SELECT 1 FROM public.patients - WHERE id = p_patient_id - AND ( - owner_id = auth.uid() - OR responsible_member_id IN ( - SELECT id FROM public.tenant_members WHERE user_id = auth.uid() - ) - ) - ) THEN - RETURN jsonb_build_object( - 'ok', false, - 'error', 'forbidden', - 'message', 'Sem permissão para excluir este paciente.' - ); - END IF; - - DELETE FROM public.patients WHERE id = p_patient_id; - - RETURN jsonb_build_object('ok', true); -END; -$$; - - -ALTER FUNCTION public.safe_delete_patient(p_patient_id uuid) OWNER TO supabase_admin; - --- --- Name: sanitize_phone_br(text); Type: FUNCTION; Schema: public; Owner: supabase_admin --- - -CREATE FUNCTION public.sanitize_phone_br(raw_phone text) RETURNS text diff --git a/database-novo/schema/03_functions/pgbouncer.sql b/database-novo/schema/03_functions/pgbouncer.sql new file mode 100644 index 0000000..2cb77aa --- /dev/null +++ b/database-novo/schema/03_functions/pgbouncer.sql @@ -0,0 +1,22 @@ +-- Functions: pgbouncer +-- Gerado automaticamente em 2026-04-17T12:23:05.222Z +-- Total: 1 + +CREATE FUNCTION pgbouncer.get_auth(p_usename text) RETURNS TABLE(username text, password text) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO '' + AS $_$ +begin + raise debug 'PgBouncer auth request: %', p_usename; + + return query + select + rolname::text, + case when rolvaliduntil < now() + then null + else rolpassword::text + end + from pg_authid + where rolname=$1 and rolcanlogin; +end; +$_$; diff --git a/database-novo/schema/03_functions/public.sql b/database-novo/schema/03_functions/public.sql new file mode 100644 index 0000000..ab9658f --- /dev/null +++ b/database-novo/schema/03_functions/public.sql @@ -0,0 +1,4546 @@ +-- Functions: public +-- Gerado automaticamente em 2026-04-17T12:23:05.222Z +-- Total: 126 + +CREATE FUNCTION public.__rls_ping() RETURNS text + LANGUAGE sql STABLE + AS $$ + select 'ok'::text; +$$; + +CREATE FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_intent record; + v_sub public.subscriptions; + v_days int; + v_user_id uuid; + v_plan_id uuid; + v_target text; +begin + -- l?? pela VIEW unificada + select * into v_intent + from public.subscription_intents + where id = p_intent_id; + + if not found then + raise exception 'Intent n??o encontrado: %', p_intent_id; + end if; + + if v_intent.status <> 'paid' then + raise exception 'Intent precisa estar paid para ativar assinatura'; + end if; + + -- resolve target e plan_id via plans.key + select p.id, p.target + into v_plan_id, v_target + from public.plans p + where p.key = v_intent.plan_key + limit 1; + + if v_plan_id is null then + raise exception 'Plano n??o encontrado em plans.key = %', v_intent.plan_key; + end if; + + v_target := lower(coalesce(v_target, '')); + + -- ??? supervisor adicionado + if v_target not in ('clinic', 'therapist', 'supervisor') then + raise exception 'Target inv??lido em plans.target: %', v_target; + end if; + + -- regra por target + if v_target = 'clinic' then + if v_intent.tenant_id is null then + raise exception 'Intent sem tenant_id'; + end if; + else + -- therapist ou supervisor: vinculado ao user + v_user_id := v_intent.user_id; + if v_user_id is null then + v_user_id := v_intent.created_by_user_id; + end if; + end if; + + if v_target in ('therapist', 'supervisor') and v_user_id is null then + raise exception 'N??o foi poss??vel determinar user_id para assinatura %.', v_target; + end if; + + -- cancela assinatura ativa anterior + if v_target = 'clinic' then + update public.subscriptions + set status = 'cancelled', + cancelled_at = now() + where tenant_id = v_intent.tenant_id + and plan_id = v_plan_id + and status = 'active'; + else + -- therapist ou supervisor + update public.subscriptions + set status = 'cancelled', + cancelled_at = now() + where user_id = v_user_id + and plan_id = v_plan_id + and status = 'active' + and tenant_id is null; + end if; + + -- dura????o do plano (30 dias para mensal) + v_days := case + when lower(coalesce(v_intent.interval, 'month')) = 'year' then 365 + else 30 + end; + + -- cria nova assinatura + insert into public.subscriptions ( + user_id, + plan_id, + status, + started_at, + expires_at, + cancelled_at, + activated_at, + tenant_id, + plan_key, + interval, + source, + created_at, + updated_at + ) + values ( + case when v_target = 'clinic' then null else v_user_id end, + v_plan_id, + 'active', + now(), + now() + make_interval(days => v_days), + null, + now(), + case when v_target = 'clinic' then v_intent.tenant_id else null end, + v_intent.plan_key, + v_intent.interval, + 'manual', + now(), + now() + ) + returning * into v_sub; + + -- grava v??nculo intent ??? subscription + if v_target = 'clinic' then + update public.subscription_intents_tenant + set subscription_id = v_sub.id + where id = p_intent_id; + else + update public.subscription_intents_personal + set subscription_id = v_sub.id + where id = p_intent_id; + end if; + + return v_sub; +end; +$$; + +CREATE FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Cr??dito manual'::text, p_payment_method text DEFAULT 'manual'::text, p_price_cents integer DEFAULT 0) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_credit addon_credits%ROWTYPE; + v_balance_before INTEGER; + v_balance_after INTEGER; + v_tx_id UUID; +BEGIN + -- Upsert addon_credits + INSERT INTO addon_credits (tenant_id, addon_type, balance, total_purchased) + VALUES (p_tenant_id, p_addon_type, 0, 0) + ON CONFLICT (tenant_id, addon_type) DO NOTHING; + + -- Lock e leitura + SELECT * INTO v_credit + FROM addon_credits + WHERE tenant_id = p_tenant_id AND addon_type = p_addon_type + FOR UPDATE; + + v_balance_before := v_credit.balance; + v_balance_after := v_credit.balance + p_amount; + + -- Atualiza saldo + UPDATE addon_credits + SET balance = v_balance_after, + total_purchased = total_purchased + p_amount, + low_balance_notified = CASE WHEN v_balance_after > COALESCE(low_balance_threshold, 10) THEN false ELSE low_balance_notified END, + updated_at = now() + WHERE id = v_credit.id; + + -- Registra transa????o + INSERT INTO addon_transactions ( + tenant_id, addon_type, type, amount, + balance_before, balance_after, + product_id, description, + admin_user_id, payment_method, price_cents + ) VALUES ( + p_tenant_id, p_addon_type, 'purchase', p_amount, + v_balance_before, v_balance_after, + p_product_id, p_description, + auth.uid(), p_payment_method, p_price_cents + ) + RETURNING id INTO v_tx_id; + + RETURN jsonb_build_object( + 'success', true, + 'transaction_id', v_tx_id, + 'balance_before', v_balance_before, + 'balance_after', v_balance_after + ); +END; +$$; + +CREATE FUNCTION public.admin_delete_email_template_global(p_id uuid) RETURNS boolean + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + DELETE FROM public.email_templates_global WHERE id = p_id; + IF NOT FOUND THEN + RAISE EXCEPTION 'Template com id % n??o encontrado', p_id; + END IF; + RETURN true; +END; +$$; + +CREATE FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_plan_id uuid; +begin + -- (opcional) restringe targets v??lidos + if p_new_target not in ('clinic','therapist') then + raise exception 'Target inv??lido: %', p_new_target using errcode='P0001'; + end if; + + -- trava o plano + select id into v_plan_id + from public.plans + where key = p_plan_key + for update; + + if v_plan_id is null then + raise exception 'Plano n??o encontrado: %', p_plan_key using errcode='P0001'; + end if; + + -- seguran??a: n??o mexer se existe subscription + if exists (select 1 from public.subscriptions s where s.plan_id = v_plan_id) then + raise exception 'Plano % possui subscriptions. Migra????o bloqueada.', p_plan_key using errcode='P0001'; + end if; + + -- liga bypass SOMENTE nesta transa????o + perform set_config('app.plan_migration_bypass', '1', true); + + update public.plans + set target = p_new_target + where id = v_plan_id; + +end +$$; + +CREATE FUNCTION public.admin_upsert_email_template_global(p_id uuid DEFAULT NULL::uuid, p_key text DEFAULT NULL::text, p_domain text DEFAULT NULL::text, p_channel text DEFAULT 'email'::text, p_subject text DEFAULT NULL::text, p_body_html text DEFAULT NULL::text, p_body_text text DEFAULT NULL::text, p_is_active boolean DEFAULT true, p_variables jsonb DEFAULT '{}'::jsonb) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_result jsonb; + v_id uuid; +BEGIN + -- UPDATE existente + IF p_id IS NOT NULL THEN + UPDATE public.email_templates_global + SET + subject = COALESCE(p_subject, subject), + body_html = COALESCE(p_body_html, body_html), + body_text = p_body_text, + is_active = p_is_active, + variables = COALESCE(p_variables, variables), + version = version + 1 + WHERE id = p_id + RETURNING to_jsonb(email_templates_global.*) INTO v_result; + + IF v_result IS NULL THEN + RAISE EXCEPTION 'Template com id % n??o encontrado', p_id; + END IF; + + RETURN v_result; + END IF; + + -- INSERT novo + IF p_key IS NULL OR p_domain IS NULL OR p_subject IS NULL OR p_body_html IS NULL THEN + RAISE EXCEPTION 'key, domain, subject e body_html s??o obrigat??rios para novo template'; + END IF; + + INSERT INTO public.email_templates_global (key, domain, channel, subject, body_html, body_text, is_active, variables) + VALUES (p_key, p_domain, p_channel, p_subject, p_body_html, p_body_text, p_is_active, p_variables) + RETURNING to_jsonb(email_templates_global.*) INTO v_result; + + RETURN v_result; +END; +$$; + +CREATE FUNCTION public.agenda_cfg_sync() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if new.agenda_view_mode = 'custom' then + new.usar_horario_admin_custom := true; + new.admin_inicio_visualizacao := new.agenda_custom_start; + new.admin_fim_visualizacao := new.agenda_custom_end; + else + new.usar_horario_admin_custom := false; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) RETURNS TABLE(data date, tem_slots boolean) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_owner_id uuid; + v_antecedencia int; + v_agora timestamptz; + v_data date; + v_data_inicio date; + v_data_fim date; + v_db_dow int; + v_tem_slot boolean; + v_bloqueado boolean; +BEGIN + SELECT c.owner_id, c.antecedencia_minima_horas + INTO v_owner_id, v_antecedencia + FROM public.agendador_configuracoes c + WHERE c.link_slug = p_slug AND c.ativo = true + LIMIT 1; + + IF v_owner_id IS NULL THEN RETURN; END IF; + + v_agora := now(); + v_data_inicio := make_date(p_ano, p_mes, 1); + v_data_fim := (v_data_inicio + interval '1 month' - interval '1 day')::date; + + v_data := v_data_inicio; + WHILE v_data <= v_data_fim LOOP + v_db_dow := extract(dow from v_data::timestamp)::int; + + -- ?????? Dia inteiro bloqueado? (agenda_bloqueios) ??????????????????????????????????????????????????????????????????????????? + SELECT EXISTS ( + SELECT 1 FROM public.agenda_bloqueios b + WHERE b.owner_id = v_owner_id + AND b.data_inicio <= v_data + AND COALESCE(b.data_fim, v_data) >= v_data + AND b.hora_inicio IS NULL -- bloqueio de dia inteiro + AND ( + (NOT b.recorrente) + OR (b.recorrente AND b.dia_semana = v_db_dow) + ) + ) INTO v_bloqueado; + + IF v_bloqueado THEN + v_data := v_data + 1; + CONTINUE; + END IF; + + -- ?????? Tem slots dispon??veis no dia? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????? + SELECT EXISTS ( + SELECT 1 FROM public.agenda_online_slots s + WHERE s.owner_id = v_owner_id + AND s.weekday = v_db_dow + AND s.enabled = true + AND (v_data::text || ' ' || s.time::text)::timestamp + AT TIME ZONE 'America/Sao_Paulo' + >= v_agora + (v_antecedencia || ' hours')::interval + ) INTO v_tem_slot; + + IF v_tem_slot THEN + data := v_data; + tem_slots := true; + RETURN NEXT; + END IF; + + v_data := v_data + 1; + END LOOP; +END; +$$; + +CREATE FUNCTION public.agendador_gerar_slug() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + v_slug text; + v_exists boolean; +BEGIN + -- s?? gera se ativou e n??o tem slug ainda + IF NEW.ativo = true AND (NEW.link_slug IS NULL OR NEW.link_slug = '') THEN + LOOP + v_slug := lower(substring(replace(gen_random_uuid()::text, '-', ''), 1, 8)); + SELECT EXISTS ( + SELECT 1 FROM public.agendador_configuracoes + WHERE link_slug = v_slug AND owner_id <> NEW.owner_id + ) INTO v_exists; + EXIT WHEN NOT v_exists; + END LOOP; + NEW.link_slug := v_slug; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) RETURNS TABLE(hora time without time zone, disponivel boolean) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_owner_id uuid; + v_duracao int; + v_antecedencia int; + v_agora timestamptz; + v_db_dow int; + v_slot time; + v_slot_fim time; + v_slot_ts timestamptz; + v_ocupado boolean; + -- loop de recorr??ncias + v_rule RECORD; + v_rule_start_dow int; + v_first_occ date; + v_day_diff int; + v_ex_type text; +BEGIN + SELECT c.owner_id, c.duracao_sessao_min, c.antecedencia_minima_horas + INTO v_owner_id, v_duracao, v_antecedencia + FROM public.agendador_configuracoes c + WHERE c.link_slug = p_slug AND c.ativo = true + LIMIT 1; + + IF v_owner_id IS NULL THEN RETURN; END IF; + + v_agora := now(); + v_db_dow := extract(dow from p_data::timestamp)::int; + + -- ?????? Dia inteiro bloqueado? (agenda_bloqueios sem hora) ????????????????????????????????????????????????????????? + -- Se sim, n??o h?? nenhum slot dispon??vel ??? retorna vazio. + IF EXISTS ( + SELECT 1 FROM public.agenda_bloqueios b + WHERE b.owner_id = v_owner_id + AND b.data_inicio <= p_data + AND COALESCE(b.data_fim, p_data) >= p_data + AND b.hora_inicio IS NULL -- bloqueio de dia inteiro + AND ( + (NOT b.recorrente) + OR (b.recorrente AND b.dia_semana = v_db_dow) + ) + ) THEN + RETURN; + END IF; + + FOR v_slot IN + SELECT s.time + FROM public.agenda_online_slots s + WHERE s.owner_id = v_owner_id + AND s.weekday = v_db_dow + AND s.enabled = true + ORDER BY s.time + LOOP + v_slot_fim := v_slot + (v_duracao || ' minutes')::interval; + v_ocupado := false; + + -- ?????? Anteced??ncia m??nima ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + v_slot_ts := (p_data::text || ' ' || v_slot::text)::timestamp + AT TIME ZONE 'America/Sao_Paulo'; + IF v_slot_ts < v_agora + (v_antecedencia || ' hours')::interval THEN + v_ocupado := true; + END IF; + + -- ?????? Bloqueio de hor??rio espec??fico (agenda_bloqueios com hora) ????????????????????????????????? + IF NOT v_ocupado THEN + SELECT EXISTS ( + SELECT 1 FROM public.agenda_bloqueios b + WHERE b.owner_id = v_owner_id + AND b.data_inicio <= p_data + AND COALESCE(b.data_fim, p_data) >= p_data + AND b.hora_inicio IS NOT NULL + AND b.hora_inicio < v_slot_fim + AND b.hora_fim > v_slot + AND ( + (NOT b.recorrente) + OR (b.recorrente AND b.dia_semana = v_db_dow) + ) + ) INTO v_ocupado; + END IF; + + -- ?????? Eventos avulsos internos (agenda_eventos) ???????????????????????????????????????????????????????????????????????????????????? + IF NOT v_ocupado THEN + SELECT EXISTS ( + SELECT 1 FROM public.agenda_eventos e + WHERE e.owner_id = v_owner_id + AND e.status::text NOT IN ('cancelado', 'faltou') + AND (e.inicio_em AT TIME ZONE 'America/Sao_Paulo')::date = p_data + AND (e.inicio_em AT TIME ZONE 'America/Sao_Paulo')::time < v_slot_fim + AND (e.fim_em AT TIME ZONE 'America/Sao_Paulo')::time > v_slot + ) INTO v_ocupado; + END IF; + + -- ?????? Recorr??ncias ativas (recurrence_rules) ????????????????????????????????????????????????????????????????????????????????????????????? + IF NOT v_ocupado THEN + FOR v_rule IN + SELECT + r.id, + r.start_date::date AS start_date, + r.end_date::date AS end_date, + r.start_time::time AS start_time, + r.end_time::time AS end_time, + COALESCE(r.interval, 1)::int AS interval + FROM public.recurrence_rules r + WHERE r.owner_id = v_owner_id + AND r.status = 'ativo' + AND p_data >= r.start_date::date + AND (r.end_date IS NULL OR p_data <= r.end_date::date) + AND v_db_dow = ANY(r.weekdays) + AND r.start_time::time < v_slot_fim + AND r.end_time::time > v_slot + LOOP + v_rule_start_dow := extract(dow from v_rule.start_date)::int; + v_first_occ := v_rule.start_date + + (((v_db_dow - v_rule_start_dow + 7) % 7))::int; + v_day_diff := (p_data - v_first_occ)::int; + + IF v_day_diff >= 0 AND v_day_diff % (7 * v_rule.interval) = 0 THEN + v_ex_type := NULL; + SELECT ex.type INTO v_ex_type + FROM public.recurrence_exceptions ex + WHERE ex.recurrence_id = v_rule.id + AND ex.original_date = p_data + LIMIT 1; + + IF v_ex_type IS NULL OR v_ex_type NOT IN ( + 'cancel_session', 'patient_missed', + 'therapist_canceled', 'holiday_block', + 'reschedule_session' + ) THEN + v_ocupado := true; + EXIT; + END IF; + END IF; + END LOOP; + END IF; + + -- ?????? Recorr??ncias remarcadas para este dia ???????????????????????????????????????????????????????????????????????????????????????????????? + IF NOT v_ocupado THEN + SELECT EXISTS ( + SELECT 1 + FROM public.recurrence_exceptions ex + JOIN public.recurrence_rules r ON r.id = ex.recurrence_id + WHERE r.owner_id = v_owner_id + AND r.status = 'ativo' + AND ex.type = 'reschedule_session' + AND ex.new_date = p_data + AND COALESCE(ex.new_start_time, r.start_time)::time < v_slot_fim + AND COALESCE(ex.new_end_time, r.end_time)::time > v_slot + ) INTO v_ocupado; + END IF; + + -- ?????? Solicita????es p??blicas pendentes ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + IF NOT v_ocupado THEN + SELECT EXISTS ( + SELECT 1 FROM public.agendador_solicitacoes sol + WHERE sol.owner_id = v_owner_id + AND sol.status = 'pendente' + AND sol.data_solicitada = p_data + AND sol.hora_solicitada = v_slot + AND (sol.reservado_ate IS NULL OR sol.reservado_ate > v_agora) + ) INTO v_ocupado; + END IF; + + hora := v_slot; + disponivel := NOT v_ocupado; + RETURN NEXT; + END LOOP; +END; +$$; + +CREATE FUNCTION public.auto_create_financial_record_from_session() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_price NUMERIC(10,2); + v_services_total NUMERIC(10,2); + v_already_billed BOOLEAN; +BEGIN + -- ?????? Guards de sa??da r??pida ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + -- S?? processa quando o status muda PARA 'realizado' + IF NEW.status::TEXT <> 'realizado' THEN + RETURN NEW; + END IF; + + -- S?? processa quando houve mudan??a real de status + IF OLD.status IS NOT DISTINCT FROM NEW.status THEN + RETURN NEW; + END IF; + + -- S?? sess??es (n??o bloqueios, feriados, etc.) + IF NEW.tipo::TEXT <> 'sessao' THEN + RETURN NEW; + END IF; + + -- Paciente obrigat??rio para vincular a cobran??a + IF NEW.patient_id IS NULL THEN + RETURN NEW; + END IF; + + -- Sess??es de pacote t??m cobran??a gerenciada por billing_contract + IF NEW.billing_contract_id IS NOT NULL THEN + RETURN NEW; + END IF; + + -- Idempot??ncia: j?? existe financial_record para este evento? + SELECT billed INTO v_already_billed + FROM public.agenda_eventos + WHERE id = NEW.id; + + IF v_already_billed = TRUE THEN + -- Confirma no financial_records tamb??m (dupla verifica????o) + IF EXISTS ( + SELECT 1 FROM public.financial_records + WHERE agenda_evento_id = NEW.id AND deleted_at IS NULL + ) THEN + RETURN NEW; + END IF; + END IF; + + -- ?????? Busca do pre??o ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + v_price := NULL; + + -- Prioridade 1: soma dos servi??os da regra de recorr??ncia + IF NEW.recurrence_id IS NOT NULL THEN + SELECT COALESCE(SUM(rrs.final_price), 0) + INTO v_services_total + FROM public.recurrence_rule_services rrs + WHERE rrs.rule_id = NEW.recurrence_id; + + IF v_services_total > 0 THEN + v_price := v_services_total; + END IF; + + -- Prioridade 2: price direto da regra (fallback se sem servi??os) + IF v_price IS NULL OR v_price = 0 THEN + SELECT price INTO v_price + FROM public.recurrence_rules + WHERE id = NEW.recurrence_id; + END IF; + END IF; + + -- Prioridade 3: price do pr??prio evento de agenda + IF v_price IS NULL OR v_price = 0 THEN + v_price := NEW.price; + END IF; + + -- Sem pre??o ??? n??o criar registro (n??o ?? erro, apenas skip silencioso) + IF v_price IS NULL OR v_price <= 0 THEN + RETURN NEW; + END IF; + + -- ?????? Cria????o do financial_record ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + INSERT INTO public.financial_records ( + owner_id, + tenant_id, + patient_id, + agenda_evento_id, + type, + amount, + discount_amount, + final_amount, + clinic_fee_pct, + clinic_fee_amount, + status, + due_date + -- payment_method: NULL at?? o momento do pagamento (mark_as_paid preenche) + ) VALUES ( + NEW.owner_id, + NEW.tenant_id, + NEW.patient_id, + NEW.id, + 'receita', + v_price, + 0, + v_price, + 0, -- clinic_fee_pct: sem campo de configura????o global no schema atual. + 0, -- clinic_fee_amount: calculado manualmente ou via update posterior. + 'pending', + (NEW.inicio_em::DATE + 7) -- vencimento padr??o: 7 dias ap??s a sess??o + ); + + -- ?????? Marca sess??o como billed ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + -- UPDATE em billed (n??o em status) ??? n??o re-dispara este trigger + UPDATE public.agenda_eventos + SET billed = TRUE + WHERE id = NEW.id; + + RETURN NEW; + +EXCEPTION + WHEN OTHERS THEN + -- Log silencioso: nunca bloquear a agenda por falha financeira + RAISE WARNING '[auto_create_financial_record_from_session] evento=% erro=%', + NEW.id, SQLERRM; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.can_delete_patient(p_patient_id uuid) RETURNS boolean + LANGUAGE sql STABLE SECURITY DEFINER + AS $$ + SELECT NOT EXISTS ( + SELECT 1 FROM public.agenda_eventos WHERE patient_id = p_patient_id + UNION ALL + SELECT 1 FROM public.recurrence_rules WHERE patient_id = p_patient_id + UNION ALL + SELECT 1 FROM public.billing_contracts WHERE patient_id = p_patient_id + ); +$$; + +CREATE FUNCTION public.cancel_notifications_on_opt_out() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + -- WhatsApp opt-out + IF OLD.whatsapp_opt_in = true AND NEW.whatsapp_opt_in = false THEN + PERFORM public.cancel_patient_pending_notifications( + NEW.patient_id, 'whatsapp' + ); + END IF; + -- Email opt-out + IF OLD.email_opt_in = true AND NEW.email_opt_in = false THEN + PERFORM public.cancel_patient_pending_notifications( + NEW.patient_id, 'email' + ); + END IF; + -- SMS opt-out + IF OLD.sms_opt_in = true AND NEW.sms_opt_in = false THEN + PERFORM public.cancel_patient_pending_notifications( + NEW.patient_id, 'sms' + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.cancel_notifications_on_session_cancel() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF NEW.status IN ('cancelado', 'excluido') + AND OLD.status NOT IN ('cancelado', 'excluido') + THEN + PERFORM public.cancel_patient_pending_notifications( + NEW.patient_id, NULL, NEW.id + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text DEFAULT NULL::text, p_evento_id uuid DEFAULT NULL::uuid) RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_canceled integer; +BEGIN + UPDATE public.notification_queue + SET status = 'cancelado', + updated_at = now() + WHERE patient_id = p_patient_id + AND status IN ('pendente', 'processando') + AND (p_channel IS NULL OR channel = p_channel) + AND (p_evento_id IS NULL OR agenda_evento_id = p_evento_id); + + GET DIAGNOSTICS v_canceled = ROW_COUNT; + RETURN v_canceled; +END; +$$; + +CREATE FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + UPDATE public.recurrence_rules + SET + end_date = p_from_date - INTERVAL '1 day', + open_ended = false, + status = CASE + WHEN p_from_date <= start_date THEN 'cancelado' + ELSE status + END, + updated_at = now() + WHERE id = p_recurrence_id; +END; +$$; + +CREATE FUNCTION public.cancel_subscription(p_subscription_id uuid) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_sub public.subscriptions; + v_owner_type text; + v_owner_ref uuid; +begin + + select * + into v_sub + from public.subscriptions + where id = p_subscription_id + for update; + + if not found then + raise exception 'Subscription n??o encontrada'; + end if; + + if v_sub.status = 'canceled' then + return v_sub; + end if; + + if v_sub.tenant_id is not null then + v_owner_type := 'clinic'; + v_owner_ref := v_sub.tenant_id; + elsif v_sub.user_id is not null then + v_owner_type := 'therapist'; + v_owner_ref := v_sub.user_id; + else + v_owner_type := null; + v_owner_ref := null; + end if; + + update public.subscriptions + set status = 'canceled', + cancel_at_period_end = false, + updated_at = now() + where id = p_subscription_id + returning * into v_sub; + + insert into public.subscription_events( + subscription_id, + owner_id, + owner_type, + owner_ref, + event_type, + old_plan_id, + new_plan_id, + created_by, + reason, + source, + metadata + ) + values ( + v_sub.id, + v_owner_ref, + v_owner_type, + v_owner_ref, + 'canceled', + v_sub.plan_id, + v_sub.plan_id, + auth.uid(), + 'Cancelamento manual via admin', + 'admin_panel', + jsonb_build_object('previous_status', 'active') + ); + + if v_owner_ref is not null then + insert into public.entitlements_invalidation(owner_id, changed_at) + values (v_owner_ref, now()) + on conflict (owner_id) + do update set changed_at = excluded.changed_at; + end if; + + return v_sub; + +end; +$$; + +CREATE FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone DEFAULT now()) RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_count integer; +BEGIN + UPDATE public.agenda_eventos + SET status = 'cancelado', + updated_at = now() + WHERE serie_id = p_serie_id + AND inicio_em >= p_a_partir_de + AND status NOT IN ('realizado', 'cancelado'); + + GET DIAGNOSTICS v_count = ROW_COUNT; + RETURN v_count; +END; +$$; + +CREATE FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_sub public.subscriptions; + v_old_plan uuid; + v_new_key text; + + v_owner_type text; + v_owner_ref uuid; + + v_new_target text; + v_sub_target text; +begin + select * + into v_sub + from public.subscriptions + where id = p_subscription_id + for update; + + if not found then + raise exception 'Subscription n??o encontrada'; + end if; + + v_old_plan := v_sub.plan_id; + + if v_old_plan = p_new_plan_id then + return v_sub; + end if; + + select key, target + into v_new_key, v_new_target + from public.plans + where id = p_new_plan_id; + + if v_new_key is null then + raise exception 'Plano n??o encontrado'; + end if; + + v_new_target := lower(coalesce(v_new_target, '')); + + v_sub_target := case + when v_sub.tenant_id is not null then 'clinic' + else 'therapist' + end; + + if v_new_target <> v_sub_target then + raise exception 'Plano inv??lido para este tipo de assinatura. Assinatura ?? % e o plano ?? %.', + v_sub_target, v_new_target + using errcode = 'P0001'; + end if; + + if v_sub.tenant_id is not null then + v_owner_type := 'clinic'; + v_owner_ref := v_sub.tenant_id; + elsif v_sub.user_id is not null then + v_owner_type := 'therapist'; + v_owner_ref := v_sub.user_id; + else + v_owner_type := null; + v_owner_ref := null; + end if; + + update public.subscriptions + set plan_id = p_new_plan_id, + plan_key = v_new_key, + updated_at = now() + where id = p_subscription_id + returning * into v_sub; + + insert into public.subscription_events( + subscription_id, + owner_id, + owner_type, + owner_ref, + event_type, + old_plan_id, + new_plan_id, + created_by, + reason, + source, + metadata + ) + values ( + v_sub.id, + v_owner_ref, + v_owner_type, + v_owner_ref, + 'plan_changed', + v_old_plan, + p_new_plan_id, + auth.uid(), + 'Plan change via DEV menu', + 'dev_menu', + jsonb_build_object( + 'previous_plan', v_old_plan, + 'new_plan', p_new_plan_id, + 'new_plan_key', v_new_key, + 'new_plan_target', v_new_target + ) + ); + + if v_owner_ref is not null then + insert into public.entitlements_invalidation (owner_id, changed_at) + values (v_owner_ref, now()) + on conflict (owner_id) + do update set changed_at = excluded.changed_at; + end if; + + return v_sub; +end; +$$; + +CREATE FUNCTION public.cleanup_notification_queue() RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_deleted integer; +BEGIN + DELETE FROM public.notification_queue + WHERE status IN ('enviado', 'cancelado', 'ignorado') + AND created_at < now() - interval '90 days'; + + GET DIAGNOSTICS v_deleted = ROW_COUNT; + RETURN v_deleted; +END; +$$; + +CREATE FUNCTION public.create_clinic_tenant(p_name text) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_uid uuid; + v_tenant uuid; + v_name text; +begin + v_uid := auth.uid(); + if v_uid is null then + raise exception 'Not authenticated'; + end if; + + v_name := nullif(trim(coalesce(p_name, '')), ''); + if v_name is null then + v_name := 'Cl??nica'; + end if; + + insert into public.tenants (name, kind, created_at) + values (v_name, 'clinic', now()) + returning id into v_tenant; + + insert into public.tenant_members (tenant_id, user_id, role, status, created_at) + values (v_tenant, v_uid, 'tenant_admin', 'active', now()); + + return v_tenant; +end; +$$; + +CREATE FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) RETURNS SETOF public.financial_records + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_existing public.financial_records%ROWTYPE; + v_new public.financial_records%ROWTYPE; +BEGIN + -- Idempot??ncia: retorna o registro existente se j?? foi criado + SELECT * INTO v_existing + FROM public.financial_records + WHERE agenda_evento_id = p_agenda_evento_id + AND deleted_at IS NULL + LIMIT 1; + + IF FOUND THEN + RETURN NEXT v_existing; + RETURN; + END IF; + + -- Cria o novo registro + INSERT INTO public.financial_records ( + tenant_id, + owner_id, + patient_id, + agenda_evento_id, + amount, + discount_amount, + final_amount, + status, + due_date + ) VALUES ( + p_tenant_id, + p_owner_id, + p_patient_id, + p_agenda_evento_id, + p_amount, + 0, + p_amount, + 'pending', + p_due_date + ) + RETURNING * INTO v_new; + + -- Marca o evento da agenda como billed = true + UPDATE public.agenda_eventos + SET billed = TRUE + WHERE id = p_agenda_evento_id; + + RETURN NEXT v_new; +END; +$$; + +CREATE FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text DEFAULT NULL::text, p_phone text DEFAULT NULL::text, p_notes text DEFAULT NULL::text, p_consent boolean DEFAULT false) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + v_owner uuid; + v_active boolean; + v_expires timestamptz; + v_max_uses int; + v_uses int; + v_id uuid; +begin + select owner_id, active, expires_at, max_uses, uses + into v_owner, v_active, v_expires, v_max_uses, v_uses + from public.patient_invites + where token = p_token + limit 1; + + if v_owner is null then + raise exception 'Token inv??lido'; + end if; + + if v_active is not true then + raise exception 'Link desativado'; + end if; + + if v_expires is not null and now() > v_expires then + raise exception 'Link expirado'; + end if; + + if v_max_uses is not null and v_uses >= v_max_uses then + raise exception 'Limite de uso atingido'; + end if; + + if p_name is null or length(trim(p_name)) = 0 then + raise exception 'Nome ?? obrigat??rio'; + end if; + + insert into public.patient_intake_requests + (owner_id, token, name, email, phone, notes, consent, status) + values + (v_owner, p_token, trim(p_name), + nullif(lower(trim(p_email)), ''), + nullif(trim(p_phone), ''), + nullif(trim(p_notes), ''), + coalesce(p_consent, false), + 'new') + returning id into v_id; + + update public.patient_invites + set uses = uses + 1 + where token = p_token; + + return v_id; +end; +$$; + +CREATE FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $_$ +declare + v_owner_id uuid; + v_intake_id uuid; + v_birth_raw text; + v_birth date; +begin + select owner_id + into v_owner_id + from public.patient_invites + where token = p_token; + + if v_owner_id is null then + raise exception 'Token inv??lido ou expirado'; + end if; + + v_birth_raw := nullif(trim(coalesce( + p_payload->>'data_nascimento', + '' + )), ''); + + v_birth := case + when v_birth_raw is null then null + when v_birth_raw ~ '^\d{4}-\d{2}-\d{2}$' then v_birth_raw::date + when v_birth_raw ~ '^\d{2}-\d{2}-\d{4}$' then to_date(v_birth_raw, 'DD-MM-YYYY') + else null + end; + + insert into public.patient_intake_requests ( + owner_id, + token, + status, + consent, + + nome_completo, + email_principal, + telefone, + + avatar_url, -- ???? AQUI + + data_nascimento, + cpf, + rg, + genero, + estado_civil, + profissao, + escolaridade, + nacionalidade, + naturalidade, + + cep, + pais, + cidade, + estado, + endereco, + numero, + complemento, + bairro, + + observacoes, + notas_internas, + + encaminhado_por, + onde_nos_conheceu + ) + values ( + v_owner_id, + p_token, + 'new', + coalesce((p_payload->>'consent')::boolean, false), + + nullif(trim(p_payload->>'nome_completo'), ''), + nullif(trim(p_payload->>'email_principal'), ''), + nullif(regexp_replace(coalesce(p_payload->>'telefone',''), '\D', '', 'g'), ''), + + nullif(trim(p_payload->>'avatar_url'), ''), -- ???? AQUI + + v_birth, + nullif(regexp_replace(coalesce(p_payload->>'cpf',''), '\D', '', 'g'), ''), + nullif(trim(p_payload->>'rg'), ''), + nullif(trim(p_payload->>'genero'), ''), + nullif(trim(p_payload->>'estado_civil'), ''), + nullif(trim(p_payload->>'profissao'), ''), + nullif(trim(p_payload->>'escolaridade'), ''), + nullif(trim(p_payload->>'nacionalidade'), ''), + nullif(trim(p_payload->>'naturalidade'), ''), + + nullif(regexp_replace(coalesce(p_payload->>'cep',''), '\D', '', 'g'), ''), + nullif(trim(p_payload->>'pais'), ''), + nullif(trim(p_payload->>'cidade'), ''), + nullif(trim(p_payload->>'estado'), ''), + nullif(trim(p_payload->>'endereco'), ''), + nullif(trim(p_payload->>'numero'), ''), + nullif(trim(p_payload->>'complemento'), ''), + nullif(trim(p_payload->>'bairro'), ''), + + nullif(trim(p_payload->>'observacoes'), ''), + nullif(trim(p_payload->>'notas_internas'), ''), + + nullif(trim(p_payload->>'encaminhado_por'), ''), + nullif(trim(p_payload->>'onde_nos_conheceu'), '') + ) + returning id into v_intake_id; + + return v_intake_id; +end; +$_$; + +CREATE FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer DEFAULT 60) RETURNS json + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_admin_id uuid; + v_role text; + v_token text; + v_expires timestamp with time zone; + v_session support_sessions; +BEGIN + -- Verifica autentica????o + v_admin_id := auth.uid(); + IF v_admin_id IS NULL THEN + RAISE EXCEPTION 'N??o autenticado.' USING ERRCODE = 'P0001'; + END IF; + + -- Verifica role saas_admin + SELECT role INTO v_role + FROM public.profiles + WHERE id = v_admin_id; + + IF v_role <> 'saas_admin' THEN + RAISE EXCEPTION 'Acesso negado. Somente saas_admin pode criar sess??es de suporte.' + USING ERRCODE = 'P0002'; + END IF; + + -- Valida TTL (1 a 120 minutos) + IF p_ttl_minutes < 1 OR p_ttl_minutes > 120 THEN + RAISE EXCEPTION 'TTL inv??lido. Use entre 1 e 120 minutos.' + USING ERRCODE = 'P0003'; + END IF; + + -- Valida tenant + IF NOT EXISTS (SELECT 1 FROM public.tenants WHERE id = p_tenant_id) THEN + RAISE EXCEPTION 'Tenant n??o encontrado.' + USING ERRCODE = 'P0004'; + END IF; + + -- Gera token ??nico (64 chars hex, sem pgcrypto) + v_token := replace(gen_random_uuid()::text, '-', '') || replace(gen_random_uuid()::text, '-', ''); + v_expires := now() + (p_ttl_minutes || ' minutes')::interval; + + -- Insere sess??o + INSERT INTO public.support_sessions (tenant_id, admin_id, token, expires_at) + VALUES (p_tenant_id, v_admin_id, v_token, v_expires) + RETURNING * INTO v_session; + + RETURN json_build_object( + 'token', v_session.token, + 'expires_at', v_session.expires_at, + 'session_id', v_session.id + ); +END; +$$; + +CREATE FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) RETURNS public.therapist_payouts + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_payout public.therapist_payouts%ROWTYPE; + v_total_sessions INTEGER; + v_gross NUMERIC(10,2); + v_clinic_fee NUMERIC(10,2); + v_net NUMERIC(10,2); +BEGIN + -- ?????? Verifica????o de permiss??o ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + -- Apenas o pr??prio terapeuta ou o tenant_admin pode criar o repasse + IF auth.uid() <> p_therapist_id AND NOT public.is_tenant_admin(p_tenant_id) THEN + RAISE EXCEPTION 'Sem permiss??o para criar repasse para este terapeuta.'; + END IF; + + -- ?????? Verifica se j?? existe repasse para o mesmo per??odo ??????????????????????????????????????????????????? + IF EXISTS ( + SELECT 1 FROM public.therapist_payouts + WHERE owner_id = p_therapist_id + AND tenant_id = p_tenant_id + AND period_start = p_period_start + AND period_end = p_period_end + AND status <> 'cancelled' + ) THEN + RAISE EXCEPTION + 'J?? existe um repasse ativo para o per??odo % a % deste terapeuta.', + p_period_start, p_period_end; + END IF; + + -- ?????? Agrega os financial_records eleg??veis ?????????????????????????????????????????????????????????????????????????????????????????? + -- Eleg??veis: paid, receita, owner=terapeuta, tenant correto, paid_at no per??odo, + -- n??o soft-deleted, ainda n??o vinculados a nenhum payout. + SELECT + COUNT(*) AS total_sessions, + COALESCE(SUM(amount), 0) AS gross_amount, + COALESCE(SUM(clinic_fee_amount), 0) AS clinic_fee_total, + COALESCE(SUM(net_amount), 0) AS net_amount + INTO + v_total_sessions, v_gross, v_clinic_fee, v_net + FROM public.financial_records fr + WHERE fr.owner_id = p_therapist_id + AND fr.tenant_id = p_tenant_id + AND fr.type = 'receita' + AND fr.status = 'paid' + AND fr.deleted_at IS NULL + AND fr.paid_at::DATE BETWEEN p_period_start AND p_period_end + AND NOT EXISTS ( + SELECT 1 FROM public.therapist_payout_records tpr + WHERE tpr.financial_record_id = fr.id + ); + + -- Sem registros eleg??veis ??? n??o criar payout vazio + IF v_total_sessions = 0 THEN + RAISE EXCEPTION + 'Nenhum registro financeiro eleg??vel encontrado para o per??odo % a %.', + p_period_start, p_period_end; + END IF; + + -- ?????? Cria o repasse ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + INSERT INTO public.therapist_payouts ( + owner_id, + tenant_id, + period_start, + period_end, + total_sessions, + gross_amount, + clinic_fee_total, + net_amount, + status + ) VALUES ( + p_therapist_id, + p_tenant_id, + p_period_start, + p_period_end, + v_total_sessions, + v_gross, + v_clinic_fee, + v_net, + 'pending' + ) + RETURNING * INTO v_payout; + + -- ?????? Vincula os financial_records ao repasse ???????????????????????????????????????????????????????????????????????????????????? + INSERT INTO public.therapist_payout_records (payout_id, financial_record_id) + SELECT v_payout.id, fr.id + FROM public.financial_records fr + WHERE fr.owner_id = p_therapist_id + AND fr.tenant_id = p_tenant_id + AND fr.type = 'receita' + AND fr.status = 'paid' + AND fr.deleted_at IS NULL + AND fr.paid_at::DATE BETWEEN p_period_start AND p_period_end + AND NOT EXISTS ( + SELECT 1 FROM public.therapist_payout_records tpr + WHERE tpr.financial_record_id = fr.id + ); + + RETURN v_payout; +END; +$$; + +CREATE FUNCTION public.current_member_id(p_tenant_id uuid) RETURNS uuid + LANGUAGE sql STABLE + AS $$ + select tm.id + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + limit 1 +$$; + +CREATE FUNCTION public.current_member_role(p_tenant_id uuid) RETURNS text + LANGUAGE sql STABLE + AS $$ + select tm.role + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + limit 1 +$$; + +CREATE FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid DEFAULT NULL::uuid, p_description text DEFAULT 'Consumo'::text) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_credit addon_credits%ROWTYPE; + v_balance_before INTEGER; + v_balance_after INTEGER; +BEGIN + -- Lock e leitura + SELECT * INTO v_credit + FROM addon_credits + WHERE tenant_id = p_tenant_id AND addon_type = p_addon_type AND is_active = true + FOR UPDATE; + + IF NOT FOUND THEN + RETURN jsonb_build_object('success', false, 'reason', 'no_credits', 'balance', 0); + END IF; + + -- Verifica saldo + IF v_credit.balance <= 0 THEN + RETURN jsonb_build_object('success', false, 'reason', 'insufficient_balance', 'balance', 0); + END IF; + + -- Verifica rate limit di??rio + IF v_credit.daily_limit IS NOT NULL THEN + -- Reset se passou do dia + IF v_credit.daily_reset_at IS NULL OR v_credit.daily_reset_at < date_trunc('day', now()) THEN + UPDATE addon_credits SET daily_used = 0, daily_reset_at = date_trunc('day', now()) + interval '1 day' WHERE id = v_credit.id; + v_credit.daily_used := 0; + END IF; + + IF v_credit.daily_used >= v_credit.daily_limit THEN + RETURN jsonb_build_object('success', false, 'reason', 'daily_limit_reached', 'balance', v_credit.balance); + END IF; + END IF; + + -- Verifica rate limit hor??rio + IF v_credit.hourly_limit IS NOT NULL THEN + IF v_credit.hourly_reset_at IS NULL OR v_credit.hourly_reset_at < date_trunc('hour', now()) THEN + UPDATE addon_credits SET hourly_used = 0, hourly_reset_at = date_trunc('hour', now()) + interval '1 hour' WHERE id = v_credit.id; + v_credit.hourly_used := 0; + END IF; + + IF v_credit.hourly_used >= v_credit.hourly_limit THEN + RETURN jsonb_build_object('success', false, 'reason', 'hourly_limit_reached', 'balance', v_credit.balance); + END IF; + END IF; + + -- Verifica expira????o + IF v_credit.expires_at IS NOT NULL AND v_credit.expires_at < now() THEN + RETURN jsonb_build_object('success', false, 'reason', 'credits_expired', 'balance', v_credit.balance); + END IF; + + v_balance_before := v_credit.balance; + v_balance_after := v_credit.balance - 1; + + -- Debita + UPDATE addon_credits + SET balance = v_balance_after, + total_consumed = total_consumed + 1, + daily_used = COALESCE(daily_used, 0) + 1, + hourly_used = COALESCE(hourly_used, 0) + 1, + updated_at = now() + WHERE id = v_credit.id; + + -- Registra transa????o + INSERT INTO addon_transactions ( + tenant_id, addon_type, type, amount, + balance_before, balance_after, + queue_id, description + ) VALUES ( + p_tenant_id, p_addon_type, 'consume', -1, + v_balance_before, v_balance_after, + p_queue_id, p_description + ); + + RETURN jsonb_build_object( + 'success', true, + 'balance_before', v_balance_before, + 'balance_after', v_balance_after + ); +END; +$$; + +CREATE FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + v_is_native boolean; + v_fields int := 0; + v_logs int := 0; + v_parent int := 0; +begin + if auth.uid() is null then + raise exception 'Not authenticated'; + end if; + + if not exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + and tm.status = 'active' + ) then + raise exception 'Not allowed'; + end if; + + select dc.is_native + into v_is_native + from public.determined_commitments dc + where dc.tenant_id = p_tenant_id + and dc.id = p_commitment_id; + + if v_is_native is null then + raise exception 'Commitment not found'; + end if; + + if v_is_native = true then + raise exception 'Cannot delete native commitment'; + end if; + + delete from public.determined_commitment_fields + where tenant_id = p_tenant_id + and commitment_id = p_commitment_id; + get diagnostics v_fields = row_count; + + delete from public.commitment_time_logs + where tenant_id = p_tenant_id + and commitment_id = p_commitment_id; + get diagnostics v_logs = row_count; + + delete from public.determined_commitments + where tenant_id = p_tenant_id + and id = p_commitment_id; + get diagnostics v_parent = row_count; + + if v_parent <> 1 then + raise exception 'Parent not deleted (RLS/owner issue).'; + end if; + + return jsonb_build_object( + 'ok', true, + 'deleted', jsonb_build_object( + 'fields', v_fields, + 'logs', v_logs, + 'commitment', v_parent + ) + ); +end; +$$; + +CREATE FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + v_is_native boolean; + v_fields_deleted int := 0; + v_logs_deleted int := 0; + v_commitment_deleted int := 0; +begin + if auth.uid() is null then + raise exception 'Not authenticated'; + end if; + + if not exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + and tm.status = 'active' + ) then + raise exception 'Not allowed'; + end if; + + select dc.is_native + into v_is_native + from public.determined_commitments dc + where dc.tenant_id = p_tenant_id + and dc.id = p_commitment_id; + + if v_is_native is null then + raise exception 'Commitment not found for tenant'; + end if; + + if v_is_native = true then + raise exception 'Cannot delete native commitment'; + end if; + + delete from public.determined_commitment_fields f + where f.tenant_id = p_tenant_id + and f.commitment_id = p_commitment_id; + get diagnostics v_fields_deleted = row_count; + + delete from public.commitment_time_logs l + where l.tenant_id = p_tenant_id + and l.commitment_id = p_commitment_id; + get diagnostics v_logs_deleted = row_count; + + delete from public.determined_commitments dc + where dc.tenant_id = p_tenant_id + and dc.id = p_commitment_id; + get diagnostics v_commitment_deleted = row_count; + + if v_commitment_deleted <> 1 then + raise exception 'Delete did not remove the commitment (tenant mismatch?)'; + end if; + + return jsonb_build_object( + 'ok', true, + 'tenant_id', p_tenant_id, + 'commitment_id', p_commitment_id, + 'deleted', jsonb_build_object( + 'fields', v_fields_deleted, + 'logs', v_logs_deleted, + 'commitment', v_commitment_deleted + ) + ); +end; +$$; + +CREATE FUNCTION public.dev_list_auth_users(p_limit integer DEFAULT 50) RETURNS TABLE(id uuid, email text, created_at timestamp with time zone) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ +begin + -- s?? saas_admin pode ver + if not exists ( + select 1 + from public.profiles p + where p.id = auth.uid() + and p.role = 'saas_admin' + ) then + return; + end if; + + return query + select + u.id, + u.email, + u.created_at + from auth.users u + order by u.created_at desc + limit greatest(1, least(coalesce(p_limit, 50), 500)); +end; +$$; + +CREATE FUNCTION public.dev_list_custom_users() RETURNS TABLE(user_id uuid, email text, created_at timestamp with time zone, global_role text, tenant_role text, tenant_id uuid, password_dev text, kind text) + LANGUAGE sql SECURITY DEFINER + SET search_path TO 'public' + AS $$ + with base as ( + select + u.id as user_id, + lower(u.email) as email, + u.created_at + from auth.users u + where lower(u.email) not in ( + 'clinic@agenciapsi.com.br', + 'therapist@agenciapsi.com.br', + 'patient@agenciapsi.com.br', + 'saas@agenciapsi.com.br' + ) + ), + prof as ( + select p.id, p.role as global_role + from public.profiles p + ), + last_membership as ( + select distinct on (tm.user_id) + tm.user_id, + tm.tenant_id, + tm.role as tenant_role, + tm.created_at + from public.tenant_members tm + where tm.status = 'active' + order by tm.user_id, tm.created_at desc + ) + select + b.user_id, + b.email, + b.created_at, + pr.global_role, + lm.tenant_role, + lm.tenant_id, + dc.password_dev, + dc.kind + from base b + left join prof pr on pr.id = b.user_id + left join last_membership lm on lm.user_id = b.user_id + left join public.dev_user_credentials dc on lower(dc.email) = b.email + order by b.created_at desc; +$$; + +CREATE FUNCTION public.dev_list_intent_leads() RETURNS TABLE(email text, last_intent_at timestamp with time zone, plan_key text, billing_interval text, status text, tenant_id uuid) + LANGUAGE sql SECURITY DEFINER + SET search_path TO 'public' + AS $$ + select + lower(si.email) as email, + max(si.created_at) as last_intent_at, + (array_agg(si.plan_key order by si.created_at desc))[1] as plan_key, + (array_agg(si.interval order by si.created_at desc))[1] as billing_interval, + (array_agg(si.status order by si.created_at desc))[1] as status, + (array_agg(si.tenant_id order by si.created_at desc))[1] as tenant_id + from public.subscription_intents si + where si.email is not null + and not exists ( + select 1 + from auth.users au + where lower(au.email) = lower(si.email) + ) + group by lower(si.email) + order by max(si.created_at) desc; +$$; + +CREATE FUNCTION public.dev_public_debug_snapshot() RETURNS TABLE(users_total integer, tenants_total integer, intents_new_total integer, latest_intents jsonb) + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $_$ +declare + v_latest jsonb; +begin + select jsonb_agg( + jsonb_build_object( + 'created_at', si.created_at, + 'email_masked', + regexp_replace(lower(si.email), '(^.).*(@.*$)', '\1***\2'), + 'plan_key', si.plan_key, + 'status', si.status + ) + order by si.created_at desc + ) + into v_latest + from ( + select si.* + from public.subscription_intents si + where si.email is not null + order by si.created_at desc + limit 5 + ) si; + + return query + select + (select count(*)::int from auth.users) as users_total, + (select count(*)::int from public.tenants) as tenants_total, + (select count(*)::int from public.subscription_intents where status = 'new') as intents_new_total, + coalesce(v_latest, '[]'::jsonb) as latest_intents; +end; +$_$; + +CREATE FUNCTION public.ensure_personal_tenant() RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_uid uuid; + v_existing uuid; +BEGIN + v_uid := auth.uid(); + IF v_uid IS NULL THEN + RAISE EXCEPTION 'Not authenticated'; + END IF; + + SELECT tm.tenant_id INTO v_existing + FROM public.tenant_members tm + JOIN public.tenants t ON t.id = tm.tenant_id + WHERE tm.user_id = v_uid + AND tm.status = 'active' + AND t.kind IN ('therapist', 'saas') + ORDER BY tm.created_at DESC + LIMIT 1; + + IF v_existing IS NOT NULL THEN + RETURN v_existing; + END IF; + + RETURN public.provision_account_tenant(v_uid, 'therapist'); +END; +$$; + +CREATE FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_uid uuid; + v_existing uuid; + v_tenant uuid; + v_email text; + v_name text; +begin + v_uid := p_user_id; + if v_uid is null then + raise exception 'Missing user id'; + end if; + + -- s?? considera tenant pessoal (kind='saas') + select tm.tenant_id + into v_existing + from public.tenant_members tm + join public.tenants t on t.id = tm.tenant_id + where tm.user_id = v_uid + and tm.status = 'active' + and t.kind = 'saas' + order by tm.created_at desc + limit 1; + + if v_existing is not null then + return v_existing; + end if; + + select email into v_email + from auth.users + where id = v_uid; + + v_name := coalesce(split_part(v_email, '@', 1), 'Conta'); + + insert into public.tenants (name, kind, created_at) + values (v_name || ' (Pessoal)', 'saas', now()) + returning id into v_tenant; + + insert into public.tenant_members (tenant_id, user_id, role, status, created_at) + values (v_tenant, v_uid, 'tenant_admin', 'active', now()); + + return v_tenant; +end; +$$; + +CREATE FUNCTION public.faq_votar(faq_id uuid) RETURNS void + LANGUAGE sql SECURITY DEFINER + AS $$ + update public.saas_faq + set votos = votos + 1, + updated_at = now() + where id = faq_id + and ativo = true; +$$; + +CREATE FUNCTION public.fix_all_subscription_mismatches() RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + r record; +begin + for r in + select distinct s.user_id as owner_id + from public.subscriptions s + where s.status = 'active' + and s.user_id is not null + loop + perform public.rebuild_owner_entitlements(r.owner_id); + end loop; +end; +$$; + +CREATE FUNCTION public.fn_agenda_regras_semanais_no_overlap() RETURNS trigger + LANGUAGE plpgsql + AS $$ +declare + v_count int; +begin + if new.ativo is false then + return new; + end if; + + select count(*) into v_count + from public.agenda_regras_semanais r + where r.owner_id = new.owner_id + and r.dia_semana = new.dia_semana + and r.ativo is true + and (tg_op = 'INSERT' or r.id <> new.id) + and (new.hora_inicio < r.hora_fim and new.hora_fim > r.hora_inicio); + + if v_count > 0 then + raise exception 'Janela sobreposta: j?? existe uma regra ativa nesse intervalo.'; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.fn_document_signature_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_patient_id uuid; + v_tenant_id uuid; + v_doc_nome text; +BEGIN + IF NEW.status = 'assinado' AND (OLD.status IS NULL OR OLD.status <> 'assinado') THEN + SELECT d.patient_id, d.tenant_id, d.nome_original + INTO v_patient_id, v_tenant_id, v_doc_nome + FROM public.documents d + WHERE d.id = NEW.documento_id; + + IF v_patient_id IS NOT NULL THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, evento_tipo, + titulo, descricao, icone_cor, + link_ref_tipo, link_ref_id, + gerado_por, ocorrido_em + ) VALUES ( + v_patient_id, + v_tenant_id, + 'documento_assinado', + 'Documento assinado: ' || COALESCE(v_doc_nome, 'documento'), + 'Assinado por ' || COALESCE(NEW.signatario_nome, NEW.signatario_tipo), + 'green', + 'documento', + NEW.documento_id, + NEW.signatario_id, + NEW.assinado_em + ); + END IF; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.fn_documents_timeline_insert() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, evento_tipo, + titulo, descricao, icone_cor, + link_ref_tipo, link_ref_id, + gerado_por, ocorrido_em + ) VALUES ( + NEW.patient_id, + NEW.tenant_id, + 'documento_adicionado', + 'Documento adicionado: ' || COALESCE(NEW.nome_original, 'arquivo'), + 'Tipo: ' || COALESCE(NEW.tipo_documento, 'outro'), + 'blue', + 'documento', + NEW.id, + NEW.uploaded_by, + NEW.uploaded_at + ); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text DEFAULT 'month'::text) RETURNS TABLE(group_key text, group_label text, total_receitas numeric, total_despesas numeric, saldo numeric, total_pendente numeric, total_overdue numeric, count_records bigint) + LANGUAGE sql STABLE SECURITY DEFINER + SET search_path TO 'public' + AS $$ + + -- ?????? Valida p_group_by antes de executar ?????????????????????????????????????????????????????????????????????????????????????????????????????? + -- (lan??a erro se valor inv??lido; plpgsql seria necess??rio para isso em SQL puro, + -- ent??o usamos um CTE de valida????o com CASE WHEN para retornar vazio em vez de erro) + + WITH base AS ( + SELECT + fr.type, + fr.amount, + fr.final_amount, + fr.status, + fr.deleted_at, + -- Chave de agrupamento calculada conforme p_group_by + CASE p_group_by + WHEN 'month' THEN TO_CHAR( + COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), + 'YYYY-MM' + ) + WHEN 'week' THEN TO_CHAR( + COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), + 'IYYY-"W"IW' + ) + WHEN 'category' THEN COALESCE(fr.category_id::TEXT, fr.category, 'sem_categoria') + WHEN 'patient' THEN COALESCE(fr.patient_id::TEXT, 'sem_paciente') + ELSE NULL -- group_by inv??lido ??? group_key NULL ??? retorno vazio + END AS gkey, + -- Label leg??vel (enriquecido via JOIN abaixo quando poss??vel) + CASE p_group_by + WHEN 'month' THEN TO_CHAR( + COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), + 'YYYY-MM' + ) + WHEN 'week' THEN TO_CHAR( + COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE), + 'IYYY-"W"IW' + ) + WHEN 'category' THEN COALESCE(fc.name, fr.category, 'Sem categoria') + WHEN 'patient' THEN COALESCE(p.nome_completo, fr.patient_id::TEXT, 'Sem paciente') + ELSE NULL + END AS glabel + FROM public.financial_records fr + LEFT JOIN public.financial_categories fc + ON fc.id = fr.category_id + LEFT JOIN public.patients p + ON p.id = fr.patient_id + WHERE fr.owner_id = p_owner_id + AND fr.deleted_at IS NULL + AND COALESCE(fr.paid_at::DATE, fr.due_date, fr.created_at::DATE) + BETWEEN p_start_date AND p_end_date + ) + + SELECT + gkey AS group_key, + glabel AS group_label, + + COALESCE(SUM(final_amount) FILTER (WHERE type = 'receita' AND status = 'paid'), 0) + AS total_receitas, + + COALESCE(SUM(final_amount) FILTER (WHERE type = 'despesa' AND status = 'paid'), 0) + AS total_despesas, + + COALESCE(SUM(final_amount) FILTER (WHERE type = 'receita' AND status = 'paid'), 0) + - COALESCE(SUM(final_amount) FILTER (WHERE type = 'despesa' AND status = 'paid'), 0) + AS saldo, + + COALESCE(SUM(final_amount) FILTER (WHERE status = 'pending'), 0) AS total_pendente, + + COALESCE(SUM(final_amount) FILTER (WHERE status = 'overdue'), 0) AS total_overdue, + + COUNT(*) AS count_records + + FROM base + WHERE gkey IS NOT NULL -- descarta p_group_by inv??lido + GROUP BY gkey, glabel + ORDER BY gkey ASC; + +$$; + +CREATE FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) RETURNS TABLE(total_receitas numeric, total_despesas numeric, total_pendente numeric, saldo_liquido numeric, total_repasse numeric, count_receitas bigint, count_despesas bigint) + LANGUAGE sql STABLE SECURITY DEFINER + SET search_path TO 'public' + AS $$ + SELECT + -- Receitas pagas no per??odo + COALESCE(SUM(amount) FILTER ( + WHERE type = 'receita' AND status = 'paid' + ), 0) AS total_receitas, + + -- Despesas pagas no per??odo + COALESCE(SUM(amount) FILTER ( + WHERE type = 'despesa' AND status = 'paid' + ), 0) AS total_despesas, + + -- Tudo pendente ou vencido (receitas + despesas) + COALESCE(SUM(amount) FILTER ( + WHERE status IN ('pending', 'overdue') + ), 0) AS total_pendente, + + -- Saldo l??quido (receitas pagas ??? despesas pagas) + COALESCE(SUM(amount) FILTER ( + WHERE type = 'receita' AND status = 'paid' + ), 0) + - COALESCE(SUM(amount) FILTER ( + WHERE type = 'despesa' AND status = 'paid' + ), 0) AS saldo_liquido, + + -- Total repassado ?? cl??nica (apenas receitas pagas) + COALESCE(SUM(clinic_fee_amount) FILTER ( + WHERE type = 'receita' AND status = 'paid' + ), 0) AS total_repasse, + + -- Contadores (excluindo soft-deleted) + COUNT(*) FILTER (WHERE type = 'receita' AND deleted_at IS NULL) AS count_receitas, + COUNT(*) FILTER (WHERE type = 'despesa' AND deleted_at IS NULL) AS count_despesas + + FROM public.financial_records + WHERE owner_id = p_owner_id + AND deleted_at IS NULL + AND EXTRACT(YEAR FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_year + AND EXTRACT(MONTH FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_month; +$$; + +CREATE FUNCTION public.get_my_email() RETURNS text + LANGUAGE sql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ + select lower(email) + from auth.users + where id = auth.uid(); +$$; + +CREATE FUNCTION public.guard_account_type_immutable() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF OLD.account_type <> 'free' AND NEW.account_type IS DISTINCT FROM OLD.account_type THEN + RAISE EXCEPTION 'account_type ?? imut??vel ap??s escolha (atual: "%" para tentativa: "%"). Para mudar de perfil, crie uma nova conta.', OLD.account_type, NEW.account_type + USING ERRCODE = 'P0001'; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.guard_locked_commitment() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if (old.is_locked = true) then + if (tg_op = 'DELETE') then + raise exception 'Compromisso bloqueado n??o pode ser exclu??do.'; + end if; + + if (tg_op = 'UPDATE') then + if (new.active = false) then + raise exception 'Compromisso bloqueado n??o pode ser desativado.'; + end if; + + -- trava renomear (mant??m o "Sess??o" sempre igual) + if (new.name is distinct from old.name) then + raise exception 'Compromisso bloqueado n??o pode ser renomeado.'; + end if; + + -- se quiser travar descri????o tamb??m, descomente: + -- if (new.description is distinct from old.description) then + -- raise exception 'Compromisso bloqueado n??o pode alterar descri????o.'; + -- end if; + end if; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.guard_no_change_core_plan_key() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') + and new.key is distinct from old.key then + raise exception 'N??o ?? permitido alterar a key do plano padr??o (%).', old.key + using errcode = 'P0001'; + end if; + + return new; +end $$; + +CREATE FUNCTION public.guard_no_change_plan_target() RETURNS trigger + LANGUAGE plpgsql + AS $$ +declare + v_bypass text; +begin + -- bypass controlado por sess??o/transa????o: + -- s?? passa se app.plan_migration_bypass = '1' + v_bypass := current_setting('app.plan_migration_bypass', true); + + if v_bypass = '1' then + return new; + end if; + + -- comportamento original (bloqueia qualquer mudan??a) + if new.target is distinct from old.target then + raise exception 'N??o ?? permitido alterar target do plano (%) de % para %.', + old.key, old.target, new.target + using errcode = 'P0001'; + end if; + + return new; +end +$$; + +CREATE FUNCTION public.guard_no_delete_core_plans() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if old.key in ('clinic_free','clinic_pro','therapist_free','therapist_pro') then + raise exception 'Plano padr??o (%) n??o pode ser removido.', old.key + using errcode = 'P0001'; + end if; + + return old; +end $$; + +CREATE FUNCTION public.guard_patient_cannot_own_tenant() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + v_account_type text; +BEGIN + SELECT account_type INTO v_account_type + FROM public.profiles + WHERE id = NEW.user_id; + + IF v_account_type = 'patient' AND NEW.role IN ('tenant_admin', 'therapist') THEN + RAISE EXCEPTION 'Usu??rio com perfil "patient" n??o pode ser propriet??rio ou terapeuta de um tenant. Se tornou profissional? Crie uma nova conta.' + USING ERRCODE = 'P0001'; + END IF; + + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.guard_tenant_kind_immutable() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF NEW.kind IS DISTINCT FROM OLD.kind THEN + RAISE EXCEPTION 'tenants.kind ?? imut??vel ap??s cria????o. Tentativa de alterar "%" para "%".', OLD.kind, NEW.kind + USING ERRCODE = 'P0001'; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.handle_new_user() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + INSERT INTO public.profiles (id, role, account_type) + VALUES (NEW.id, 'portal_user', 'free') + ON CONFLICT (id) DO NOTHING; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.handle_new_user_create_personal_tenant() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + -- Desabilitado. Tenant criado no onboarding via provision_account_tenant(). + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 + from public.owner_feature_entitlements e + where e.owner_id = p_owner_id + and e.feature_key = p_feature_key + ); +$$; + +CREATE FUNCTION public.is_clinic_tenant(_tenant_id uuid) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + SELECT EXISTS ( + SELECT 1 FROM public.tenants t + WHERE t.id = _tenant_id + AND t.kind IN ('clinic', 'clinic_coworking', 'clinic_reception', 'clinic_full') + ); +$$; + +CREATE FUNCTION public.is_saas_admin() RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 from public.saas_admins sa + where sa.user_id = auth.uid() + ); +$$; + +CREATE FUNCTION public.is_tenant_admin(p_tenant_id uuid) RETURNS boolean + LANGUAGE sql STABLE SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ + select exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + and tm.role = 'tenant_admin' + and tm.status = 'active' + ); +$$; + +CREATE FUNCTION public.is_tenant_member(_tenant_id uuid) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 + from public.tenant_members m + where m.tenant_id = _tenant_id + and m.user_id = auth.uid() + and m.status = 'active' + ); +$$; + +CREATE FUNCTION public.is_therapist_tenant(_tenant_id uuid) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + SELECT EXISTS ( + SELECT 1 FROM public.tenants t + WHERE t.id = _tenant_id AND t.kind = 'therapist' + ); +$$; + +CREATE FUNCTION public.jwt_email() RETURNS text + LANGUAGE sql STABLE + AS $$ + select nullif(lower(current_setting('request.jwt.claim.email', true)), ''); +$$; + +CREATE FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer DEFAULT NULL::integer, p_month integer DEFAULT NULL::integer, p_type text DEFAULT NULL::text, p_status text DEFAULT NULL::text, p_patient_id uuid DEFAULT NULL::uuid, p_limit integer DEFAULT 50, p_offset integer DEFAULT 0) RETURNS SETOF public.financial_records + LANGUAGE sql STABLE SECURITY DEFINER + SET search_path TO 'public' + AS $$ + SELECT * + FROM public.financial_records + WHERE owner_id = p_owner_id + AND deleted_at IS NULL + AND (p_type IS NULL OR type::TEXT = p_type) + AND (p_status IS NULL OR status = p_status) + AND (p_patient_id IS NULL OR patient_id = p_patient_id) + AND (p_year IS NULL OR EXTRACT(YEAR FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_year) + AND (p_month IS NULL OR EXTRACT(MONTH FROM COALESCE(paid_at::DATE, due_date, created_at::DATE)) = p_month) + ORDER BY COALESCE(paid_at, due_date::TIMESTAMPTZ, created_at) DESC + LIMIT p_limit + OFFSET p_offset; +$$; + +CREATE FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) RETURNS SETOF public.financial_records + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_record public.financial_records%ROWTYPE; +BEGIN + -- Garante que o registro pertence ao usu??rio autenticado (RLS n??o aplica em SECURITY DEFINER) + SELECT * INTO v_record + FROM public.financial_records + WHERE id = p_financial_record_id + AND owner_id = auth.uid() + AND deleted_at IS NULL; + + IF NOT FOUND THEN + RAISE EXCEPTION 'Registro financeiro n??o encontrado ou sem permiss??o.'; + END IF; + + IF v_record.status NOT IN ('pending', 'overdue') THEN + RAISE EXCEPTION 'Apenas cobran??as pendentes ou vencidas podem ser marcadas como pagas.'; + END IF; + + UPDATE public.financial_records + SET status = 'paid', + paid_at = NOW(), + payment_method = p_payment_method, + updated_at = NOW() + WHERE id = p_financial_record_id + RETURNING * INTO v_record; + + RETURN NEXT v_record; +END; +$$; + +CREATE FUNCTION public.mark_payout_as_paid(p_payout_id uuid) RETURNS public.therapist_payouts + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_payout public.therapist_payouts%ROWTYPE; +BEGIN + -- Busca o payout + SELECT * INTO v_payout + FROM public.therapist_payouts + WHERE id = p_payout_id; + + IF NOT FOUND THEN + RAISE EXCEPTION 'Repasse n??o encontrado: %', p_payout_id; + END IF; + + -- Verifica permiss??o: apenas tenant_admin do tenant do repasse + IF NOT public.is_tenant_admin(v_payout.tenant_id) THEN + RAISE EXCEPTION 'Apenas o administrador da cl??nica pode marcar repasses como pagos.'; + END IF; + + -- Verifica status + IF v_payout.status <> 'pending' THEN + RAISE EXCEPTION + 'Repasse j?? est?? com status ''%''. Apenas repasses pendentes podem ser pagos.', + v_payout.status; + END IF; + + -- Atualiza + UPDATE public.therapist_payouts + SET + status = 'paid', + paid_at = NOW(), + updated_at = NOW() + WHERE id = p_payout_id + RETURNING * INTO v_payout; + + RETURN v_payout; +END; +$$; + +CREATE FUNCTION public.my_tenants() RETURNS TABLE(tenant_id uuid, role text, status text, kind text) + LANGUAGE sql STABLE + AS $$ + select + tm.tenant_id, + tm.role, + tm.status, + t.kind + from public.tenant_members tm + join public.tenants t on t.id = tm.tenant_id + where tm.user_id = auth.uid(); +$$; + +CREATE FUNCTION public.notice_track_click(p_notice_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +begin + update public.global_notices + set clicks_count = clicks_count + 1 + where id = p_notice_id; +end; +$$; + +CREATE FUNCTION public.notice_track_view(p_notice_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +begin + update public.global_notices + set views_count = views_count + 1 + where id = p_notice_id; +end; +$$; + +CREATE FUNCTION public.notify_on_intake() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF NEW.status = 'new' THEN + INSERT INTO public.notifications ( + owner_id, + tenant_id, + type, + ref_id, + ref_table, + payload + ) + VALUES ( + NEW.owner_id, + NEW.tenant_id, + 'new_patient', + NEW.id, + 'patient_intake_requests', + jsonb_build_object( + 'title', 'Novo cadastro externo', + 'detail', COALESCE(NEW.nome_completo, 'Paciente'), + 'deeplink', '/therapist/patients/cadastro/recebidos', + 'avatar_initials', upper(left(COALESCE(NEW.nome_completo, '?'), 2)) + ) + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.notify_on_scheduling() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ BEGIN IF NEW.status = 'pendente' THEN + INSERT INTO public.notifications ( owner_id, tenant_id, type, ref_id, ref_table, payload ) VALUES ( + NEW.owner_id, NEW.tenant_id, + 'new_scheduling', NEW.id, 'agendador_solicitacoes', jsonb_build_object( 'title', 'Nova solicita????o de agendamento', 'detail', COALESCE(NEW.paciente_nome, 'Paciente') || ' ' || COALESCE(NEW.paciente_sobrenome, '') || ' ??? ' || COALESCE(NEW.tipo, ''), 'deeplink', '/therapist/agendamentos-recebidos', 'avatar_initials', upper(left(COALESCE(NEW.paciente_nome, '?'), 1) || left(COALESCE(NEW.paciente_sobrenome, ''), 1)) ) ); END IF; RETURN NEW; END; $$; + +CREATE FUNCTION public.notify_on_session_status() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_nome text; +BEGIN + IF NEW.status IN ('faltou', 'cancelado') AND OLD.status IS DISTINCT FROM NEW.status THEN + + SELECT nome_completo + INTO v_nome + FROM public.patients + WHERE id = NEW.patient_id + LIMIT 1; + + INSERT INTO public.notifications ( + owner_id, + tenant_id, + type, + ref_id, + ref_table, + payload + ) + VALUES ( + NEW.owner_id, + NEW.tenant_id, + 'session_status', + NEW.id, + 'agenda_eventos', + jsonb_build_object( + 'title', CASE WHEN NEW.status = 'faltou' THEN 'Paciente faltou' ELSE 'Sess??o cancelada' END, + 'detail', COALESCE(v_nome, 'Paciente') || ' ??? ' || to_char(NEW.inicio_em, 'DD/MM HH24:MI'), + 'deeplink', '/therapist/agenda', + 'avatar_initials', upper(left(COALESCE(v_nome, '?'), 2)) + ) + ); + + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.on_new_user_seed_patient_groups() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ + BEGIN + PERFORM public.seed_default_patient_groups(NEW.id); + RETURN NEW; + END; + $$; + +CREATE FUNCTION public.patients_validate_member_consistency() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + v_tenant_responsible uuid; + v_tenant_therapist uuid; +BEGIN + -- responsible_member sempre deve existir e ser do tenant + SELECT tenant_id INTO v_tenant_responsible + FROM public.tenant_members + WHERE id = NEW.responsible_member_id; + + IF v_tenant_responsible IS NULL THEN + RAISE EXCEPTION 'Responsible member not found'; + END IF; + + IF NEW.tenant_id IS NULL THEN + RAISE EXCEPTION 'tenant_id is required'; + END IF; + + IF v_tenant_responsible <> NEW.tenant_id THEN + RAISE EXCEPTION 'Responsible member must belong to the same tenant'; + END IF; + + -- therapist scope: therapist_member_id deve existir e ser do mesmo tenant + IF NEW.patient_scope = 'therapist' THEN + IF NEW.therapist_member_id IS NULL THEN + RAISE EXCEPTION 'therapist_member_id is required when patient_scope=therapist'; + END IF; + + SELECT tenant_id INTO v_tenant_therapist + FROM public.tenant_members + WHERE id = NEW.therapist_member_id; + + IF v_tenant_therapist IS NULL THEN + RAISE EXCEPTION 'Therapist member not found'; + END IF; + + IF v_tenant_therapist <> NEW.tenant_id THEN + RAISE EXCEPTION 'Therapist member must belong to the same tenant'; + END IF; + END IF; + + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.patients_validate_responsible_member_tenant() RETURNS trigger + LANGUAGE plpgsql + AS $$ +declare + m_tenant uuid; +begin + select tenant_id into m_tenant + from public.tenant_members + where id = new.responsible_member_id; + + if m_tenant is null then + raise exception 'Responsible member not found'; + end if; + + if new.tenant_id is null then + raise exception 'tenant_id is required'; + end if; + + if m_tenant <> new.tenant_id then + raise exception 'Responsible member must belong to the same tenant'; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.populate_notification_queue() RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + INSERT INTO public.notification_queue ( + tenant_id, owner_id, agenda_evento_id, patient_id, + channel, template_key, schedule_key, + resolved_vars, recipient_address, + scheduled_at, idempotency_key + ) + SELECT + ae.tenant_id, + ae.owner_id, + ae.id AS agenda_evento_id, + ae.patient_id, + ch.channel, + 'session.' || REPLACE(ns.event_type, '_sessao', '') || '.' || ch.channel, + ns.schedule_key, + jsonb_build_object( + 'nome_paciente', COALESCE(p.nome_completo, 'Paciente'), + 'data_sessao', TO_CHAR(ae.inicio_em AT TIME ZONE 'America/Sao_Paulo', 'DD/MM/YYYY'), + 'hora_sessao', TO_CHAR(ae.inicio_em AT TIME ZONE 'America/Sao_Paulo', 'HH24:MI'), + 'nome_terapeuta', COALESCE(prof.full_name, 'Terapeuta'), + 'modalidade', COALESCE(ae.modalidade, 'Presencial'), + 'titulo', COALESCE(ae.titulo, 'Sess??o') + ), + CASE ch.channel + WHEN 'whatsapp' THEN COALESCE(p.telefone, '') + WHEN 'sms' THEN COALESCE(p.telefone, '') + WHEN 'email' THEN COALESCE(p.email_principal, '') + END, + CASE + WHEN (ae.inicio_em - (ns.offset_minutes || ' minutes')::interval)::time + < ns.allowed_time_start + THEN DATE_TRUNC('day', ae.inicio_em - (ns.offset_minutes || ' minutes')::interval) + + ns.allowed_time_start + WHEN (ae.inicio_em - (ns.offset_minutes || ' minutes')::interval)::time + > ns.allowed_time_end + THEN DATE_TRUNC('day', ae.inicio_em - (ns.offset_minutes || ' minutes')::interval) + + ns.allowed_time_start + ELSE ae.inicio_em - (ns.offset_minutes || ' minutes')::interval + END, + ae.id::text || ':' || ns.schedule_key || ':' || ch.channel || ':' + || ae.inicio_em::date::text + FROM public.agenda_eventos ae + JOIN public.patients p ON p.id = ae.patient_id + LEFT JOIN public.profiles prof ON prof.id = ae.owner_id + JOIN public.notification_schedules ns + ON ns.owner_id = ae.owner_id + AND ns.is_active = true + AND ns.deleted_at IS NULL + AND ns.trigger_type = 'before_event' + AND ns.event_type = 'lembrete_sessao' + JOIN public.notification_channels nc + ON nc.owner_id = ae.owner_id + AND nc.is_active = true + AND nc.deleted_at IS NULL + CROSS JOIN LATERAL ( + SELECT 'whatsapp' AS channel WHERE ns.whatsapp_enabled AND nc.channel = 'whatsapp' + UNION ALL + SELECT 'email' AS channel WHERE ns.email_enabled AND nc.channel = 'email' + UNION ALL + SELECT 'sms' AS channel WHERE ns.sms_enabled AND nc.channel = 'sms' + ) ch + LEFT JOIN public.notification_preferences np + ON np.patient_id = ae.patient_id + AND np.owner_id = ae.owner_id + AND np.deleted_at IS NULL + WHERE + ae.inicio_em > now() + AND ae.inicio_em <= now() + interval '48 hours' + AND ae.status NOT IN ('cancelado', 'faltou') + AND CASE ch.channel + WHEN 'whatsapp' THEN COALESCE(p.telefone, '') != '' + WHEN 'sms' THEN COALESCE(p.telefone, '') != '' + WHEN 'email' THEN COALESCE(p.email_principal, '') != '' + END + AND CASE ch.channel + WHEN 'whatsapp' THEN COALESCE(np.whatsapp_opt_in, true) + WHEN 'email' THEN COALESCE(np.email_opt_in, true) + WHEN 'sms' THEN COALESCE(np.sms_opt_in, false) + END + AND EXISTS ( + SELECT 1 FROM public.profiles tp + WHERE tp.id = ae.owner_id + AND COALESCE(tp.notify_reminders, true) = true + ) + ON CONFLICT (idempotency_key) DO NOTHING; +END; +$$; + +CREATE FUNCTION public.prevent_promoting_to_system() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if new.is_system = true and old.is_system is distinct from true then + raise exception 'N??o ?? permitido transformar um grupo comum em grupo do sistema.'; + end if; + return new; +end; +$$; + +CREATE FUNCTION public.prevent_saas_membership() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF EXISTS ( + SELECT 1 + FROM public.profiles + WHERE id = NEW.user_id + AND role = 'saas_admin' + ) THEN + RAISE EXCEPTION 'SaaS admin cannot belong to tenant'; + END IF; + + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.prevent_system_group_changes() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + -- Se for grupo do sistema, regras r??gidas: + if old.is_system = true then + + -- nunca pode deletar + if tg_op = 'DELETE' then + raise exception 'Grupos padr??o do sistema n??o podem ser alterados ou exclu??dos.'; + end if; + + if tg_op = 'UPDATE' then + -- permite SOMENTE mudar tenant_id e/ou updated_at + -- qualquer mudan??a de conte??do permanece proibida + if + new.nome is distinct from old.nome or + new.descricao is distinct from old.descricao or + new.cor is distinct from old.cor or + new.is_active is distinct from old.is_active or + new.is_system is distinct from old.is_system or + new.owner_id is distinct from old.owner_id or + new.therapist_id is distinct from old.therapist_id or + new.created_at is distinct from old.created_at + then + raise exception 'Grupos padr??o do sistema n??o podem ser alterados ou exclu??dos.'; + end if; + + -- chegou aqui: s?? tenant_id/updated_at mudaram -> ok + return new; + end if; + + end if; + + -- n??o-system: deixa passar + if tg_op = 'DELETE' then + return old; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text DEFAULT NULL::text) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_tenant_id uuid; + v_account_type text; + v_name text; +BEGIN + IF p_kind NOT IN ('therapist', 'clinic_coworking', 'clinic_reception', 'clinic_full') THEN + RAISE EXCEPTION 'kind inv??lido: "%". Use: therapist, clinic_coworking, clinic_reception, clinic_full.', p_kind + USING ERRCODE = 'P0001'; + END IF; + + v_account_type := CASE WHEN p_kind = 'therapist' THEN 'therapist' ELSE 'clinic' END; + + IF EXISTS ( + SELECT 1 + FROM public.tenant_members tm + JOIN public.tenants t ON t.id = tm.tenant_id + WHERE tm.user_id = p_user_id + AND tm.role = 'tenant_admin' + AND tm.status = 'active' + AND t.kind = p_kind + ) THEN + RAISE EXCEPTION 'Usu??rio j?? possui um tenant do tipo "%".', p_kind + USING ERRCODE = 'P0001'; + END IF; + + v_name := COALESCE( + NULLIF(TRIM(p_name), ''), + ( + SELECT COALESCE(NULLIF(TRIM(pr.full_name), ''), SPLIT_PART(au.email, '@', 1)) + FROM public.profiles pr + JOIN auth.users au ON au.id = pr.id + WHERE pr.id = p_user_id + ), + 'Conta' + ); + + INSERT INTO public.tenants (name, kind, created_at) + VALUES (v_name, p_kind, now()) + RETURNING id INTO v_tenant_id; + + INSERT INTO public.tenant_members (tenant_id, user_id, role, status, created_at) + VALUES (v_tenant_id, p_user_id, 'tenant_admin', 'active', now()); + + UPDATE public.profiles + SET account_type = v_account_type + WHERE id = p_user_id; + + PERFORM public.seed_determined_commitments(v_tenant_id); + + RETURN v_tenant_id; +END; +$$; + +CREATE FUNCTION public.reactivate_subscription(p_subscription_id uuid) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_sub public.subscriptions; + v_owner_type text; + v_owner_ref uuid; +begin + + select * + into v_sub + from public.subscriptions + where id = p_subscription_id + for update; + + if not found then + raise exception 'Subscription n??o encontrada'; + end if; + + if v_sub.status = 'active' then + return v_sub; + end if; + + if v_sub.tenant_id is not null then + v_owner_type := 'clinic'; + v_owner_ref := v_sub.tenant_id; + elsif v_sub.user_id is not null then + v_owner_type := 'therapist'; + v_owner_ref := v_sub.user_id; + else + v_owner_type := null; + v_owner_ref := null; + end if; + + update public.subscriptions + set status = 'active', + cancel_at_period_end = false, + updated_at = now() + where id = p_subscription_id + returning * into v_sub; + + insert into public.subscription_events( + subscription_id, + owner_id, + owner_type, + owner_ref, + event_type, + old_plan_id, + new_plan_id, + created_by, + reason, + source, + metadata + ) + values ( + v_sub.id, + v_owner_ref, + v_owner_type, + v_owner_ref, + 'reactivated', + v_sub.plan_id, + v_sub.plan_id, + auth.uid(), + 'Reativa????o manual via admin', + 'admin_panel', + jsonb_build_object('previous_status', 'canceled') + ); + + if v_owner_ref is not null then + insert into public.entitlements_invalidation(owner_id, changed_at) + values (v_owner_ref, now()) + on conflict (owner_id) + do update set changed_at = excluded.changed_at; + end if; + + return v_sub; + +end; +$$; + +CREATE FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_plan_id uuid; +begin + -- Plano ativo do owner (owner = subscriptions.user_id) + select s.plan_id + into v_plan_id + from public.subscriptions s + where s.user_id = p_owner_id + and s.status = 'active' + order by s.created_at desc + limit 1; + + -- Sempre zera entitlements do owner (rebuild) + delete from public.owner_feature_entitlements e + where e.owner_id = p_owner_id; + + -- Se n??o tem assinatura ativa, acabou + if v_plan_id is null then + return; + end if; + + -- Recria entitlements esperados pelo plano + insert into public.owner_feature_entitlements (owner_id, feature_key, sources, limits_list) + select + p_owner_id as owner_id, + f.key as feature_key, + array['plan'::text] as sources, + '{}'::jsonb as limits_list + from public.plan_features pf + join public.features f on f.id = pf.feature_id + where pf.plan_id = v_plan_id; + +end; +$$; + +CREATE FUNCTION public.revoke_support_session(p_token text) RETURNS boolean + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_admin_id uuid; + v_role text; +BEGIN + v_admin_id := auth.uid(); + IF v_admin_id IS NULL THEN + RAISE EXCEPTION 'N??o autenticado.' USING ERRCODE = 'P0001'; + END IF; + + SELECT role INTO v_role FROM public.profiles WHERE id = v_admin_id; + IF v_role <> 'saas_admin' THEN + RAISE EXCEPTION 'Acesso negado.' USING ERRCODE = 'P0002'; + END IF; + + DELETE FROM public.support_sessions + WHERE token = p_token + AND admin_id = v_admin_id; + + RETURN FOUND; +END; +$$; + +CREATE FUNCTION public.rotate_patient_invite_token(p_new_token text) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + v_uid uuid; + v_id uuid; +begin + -- pega o usu??rio logado + v_uid := auth.uid(); + if v_uid is null then + raise exception 'Usu??rio n??o autenticado'; + end if; + + -- desativa tokens antigos ativos do usu??rio + update public.patient_invites + set active = false + where owner_id = v_uid + and active = true; + + -- cria novo token + insert into public.patient_invites (owner_id, token, active) + values (v_uid, p_new_token, true) + returning id into v_id; + + return v_id; +end; +$$; + +CREATE FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_uid uuid := auth.uid(); + v_voto_antigo boolean; +begin + if v_uid is null then + raise exception 'N??o autenticado'; + end if; + + -- Verifica se j?? votou + select util into v_voto_antigo + from public.saas_doc_votos + where doc_id = p_doc_id and user_id = v_uid; + + if found then + -- J?? votou igual ??? cancela o voto (toggle) + if v_voto_antigo = p_util then + delete from public.saas_doc_votos + where doc_id = p_doc_id and user_id = v_uid; + + update public.saas_docs set + votos_util = greatest(0, votos_util - (case when p_util then 1 else 0 end)), + votos_nao_util = greatest(0, votos_nao_util - (case when not p_util then 1 else 0 end)), + updated_at = now() + where id = p_doc_id; + + return jsonb_build_object('acao', 'removido', 'util', null); + else + -- Mudou de voto + update public.saas_doc_votos set util = p_util, updated_at = now() + where doc_id = p_doc_id and user_id = v_uid; + + update public.saas_docs set + votos_util = greatest(0, votos_util + (case when p_util then 1 else -1 end)), + votos_nao_util = greatest(0, votos_nao_util + (case when not p_util then 1 else -1 end)), + updated_at = now() + where id = p_doc_id; + + return jsonb_build_object('acao', 'atualizado', 'util', p_util); + end if; + else + -- Primeiro voto + insert into public.saas_doc_votos (doc_id, user_id, util) + values (p_doc_id, v_uid, p_util); + + update public.saas_docs set + votos_util = votos_util + (case when p_util then 1 else 0 end), + votos_nao_util = votos_nao_util + (case when not p_util then 1 else 0 end), + updated_at = now() + where id = p_doc_id; + + return jsonb_build_object('acao', 'registrado', 'util', p_util); + end if; +end; +$$; + +CREATE FUNCTION public.safe_delete_patient(p_patient_id uuid) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + -- Bloqueia se houver hist??rico + IF NOT public.can_delete_patient(p_patient_id) THEN + RETURN jsonb_build_object( + 'ok', false, + 'error', 'has_history', + 'message', 'Este paciente possui hist??rico cl??nico ou financeiro e n??o pode ser removido. Voc?? pode desativar ou arquivar o paciente.' + ); + END IF; + + -- Verifica ownership via RLS (owner_id ou responsible_member_id) + IF NOT EXISTS ( + SELECT 1 FROM public.patients + WHERE id = p_patient_id + AND ( + owner_id = auth.uid() + OR responsible_member_id IN ( + SELECT id FROM public.tenant_members WHERE user_id = auth.uid() + ) + ) + ) THEN + RETURN jsonb_build_object( + 'ok', false, + 'error', 'forbidden', + 'message', 'Sem permiss??o para excluir este paciente.' + ); + END IF; + + DELETE FROM public.patients WHERE id = p_patient_id; + + RETURN jsonb_build_object('ok', true); +END; +$$; + +CREATE FUNCTION public.sanitize_phone_br(raw_phone text) RETURNS text + LANGUAGE plpgsql IMMUTABLE + AS $$ DECLARE digits text; + BEGIN + digits := regexp_replace(COALESCE(raw_phone, ''), '[^0-9]', '', 'g'); + IF digits = '' THEN RETURN ''; END IF; + IF length(digits) = 10 OR length(digits) = 11 THEN + digits := '55' || digits; + END IF; + RETURN digits; + END; $$; + +CREATE FUNCTION public.seed_default_financial_categories(p_user_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + INSERT INTO public.financial_categories (user_id, name, type, color, icon, sort_order) + VALUES + (p_user_id, 'Sess??o', 'receita', '#22c55e', 'pi pi-heart', 1), + (p_user_id, 'Supervis??o', 'receita', '#6366f1', 'pi pi-users', 2), + (p_user_id, 'Conv??nio', 'receita', '#3b82f6', 'pi pi-building', 3), + (p_user_id, 'Grupo terap??utico', 'receita', '#f59e0b', 'pi pi-sitemap', 4), + (p_user_id, 'Outro (receita)', 'receita', '#8b5cf6', 'pi pi-plus-circle', 5), + (p_user_id, 'Aluguel sala', 'despesa', '#ef4444', 'pi pi-home', 1), + (p_user_id, 'Plataforma/SaaS', 'despesa', '#f97316', 'pi pi-desktop', 2), + (p_user_id, 'Repasse cl??nica', 'despesa', '#64748b', 'pi pi-arrow-right-arrow-left', 3), + (p_user_id, 'Supervis??o (custo)', 'despesa', '#6366f1', 'pi pi-users', 4), + (p_user_id, 'Outro (despesa)', 'despesa', '#94a3b8', 'pi pi-minus-circle', 5) + ON CONFLICT DO NOTHING; +END; +$$; + +CREATE FUNCTION public.seed_default_patient_groups(p_tenant_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_owner_id uuid; +BEGIN + -- busca o owner (tenant_admin) do tenant + SELECT user_id INTO v_owner_id + FROM public.tenant_members + WHERE tenant_id = p_tenant_id + AND role = 'tenant_admin' + AND status = 'active' + LIMIT 1; + + IF v_owner_id IS NULL THEN + RETURN; + END IF; + + INSERT INTO public.patient_groups (owner_id, nome, cor, is_system, tenant_id) + VALUES + (v_owner_id, 'Crian??as', '#60a5fa', true, p_tenant_id), + (v_owner_id, 'Adolescentes', '#a78bfa', true, p_tenant_id), + (v_owner_id, 'Idosos', '#34d399', true, p_tenant_id) + ON CONFLICT (owner_id, nome) DO NOTHING; +END; +$$; + +CREATE FUNCTION public.seed_determined_commitments(p_tenant_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_id uuid; +begin + -- Sess??o (locked + sempre ativa) + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'session' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'session', true, true, 'Sess??o', 'Sess??o com paciente'); + end if; + + -- Leitura + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'reading' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'reading', false, true, 'Leitura', 'Praticar leitura'); + end if; + + -- Supervis??o + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'supervision' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'supervision', false, true, 'Supervis??o', 'Supervis??o'); + end if; + + -- Aula ??? (corrigido) + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'class' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'class', false, false, 'Aula', 'Dar aula'); + end if; + + -- An??lise pessoal + if not exists ( + select 1 from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'analysis' + ) then + insert into public.determined_commitments + (tenant_id, is_native, native_key, is_locked, active, name, description) + values + (p_tenant_id, true, 'analysis', false, true, 'An??lise Pessoal', 'Minha an??lise pessoal'); + end if; + + -- ------------------------------------------------------- + -- Campos padr??o (idempotentes por (commitment_id, key)) + -- ------------------------------------------------------- + + -- Leitura + select id into v_id + from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'reading' + limit 1; + + if v_id is not null then + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'book') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'book', 'Livro', 'text', false, 10); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'author') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'author', 'Autor', 'text', false, 20); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); + end if; + end if; + + -- Supervis??o + select id into v_id + from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'supervision' + limit 1; + + if v_id is not null then + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'supervisor') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'supervisor', 'Supervisor', 'text', false, 10); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'topic') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'topic', 'Assunto', 'text', false, 20); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); + end if; + end if; + + -- Aula + select id into v_id + from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'class' + limit 1; + + if v_id is not null then + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'theme') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'theme', 'Tema', 'text', false, 10); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'group') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'group', 'Turma', 'text', false, 20); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); + end if; + end if; + + -- An??lise + select id into v_id + from public.determined_commitments + where tenant_id = p_tenant_id and is_native = true and native_key = 'analysis' + limit 1; + + if v_id is not null then + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'analyst') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'analyst', 'Analista', 'text', false, 10); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'focus') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'focus', 'Foco', 'text', false, 20); + end if; + + if not exists (select 1 from public.determined_commitment_fields where commitment_id = v_id and key = 'notes') then + insert into public.determined_commitment_fields (tenant_id, commitment_id, key, label, field_type, required, sort_order) + values (p_tenant_id, v_id, 'notes', 'Observa????o', 'textarea', false, 30); + end if; + end if; +end; +$$; + +CREATE FUNCTION public.set_insurance_plans_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN NEW.updated_at = now(); RETURN NEW; END; $$; + +CREATE FUNCTION public.set_medicos_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.set_owner_id() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + if new.owner_id is null then + new.owner_id := auth.uid(); + end if; + return new; +end; +$$; + +CREATE FUNCTION public.set_services_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text DEFAULT NULL::text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +begin + -- ??? S?? owner ou admin do tenant podem alterar features + if not exists ( + select 1 from public.tenant_members + where tenant_id = p_tenant_id + and user_id = auth.uid() + and role in ('owner', 'admin') + and status = 'active' + ) then + raise exception 'Acesso negado: apenas owner/admin pode alterar features do tenant.'; + end if; + + insert into public.tenant_features (tenant_id, feature_key, enabled) + values (p_tenant_id, p_feature_key, p_enabled) + on conflict (tenant_id, feature_key) + do update set enabled = excluded.enabled; + + insert into public.tenant_feature_exceptions_log ( + tenant_id, feature_key, enabled, reason, created_by + ) values ( + p_tenant_id, p_feature_key, p_enabled, p_reason, auth.uid() + ); +end; +$$; + +CREATE FUNCTION public.set_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.set_updated_at_recurrence() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN NEW.updated_at = now(); RETURN NEW; END; +$$; + +CREATE FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_old public.recurrence_rules; + v_new_id uuid; +BEGIN + -- busca a regra original + SELECT * INTO v_old + FROM public.recurrence_rules + WHERE id = p_recurrence_id; + + IF NOT FOUND THEN + RAISE EXCEPTION 'recurrence_rule % n??o encontrada', p_recurrence_id; + END IF; + + -- encerra a regra antiga na data anterior + UPDATE public.recurrence_rules + SET + end_date = p_from_date - INTERVAL '1 day', + open_ended = false, + updated_at = now() + WHERE id = p_recurrence_id; + + -- cria nova regra a partir de p_from_date + INSERT INTO public.recurrence_rules ( + tenant_id, owner_id, therapist_id, patient_id, + determined_commitment_id, type, interval, weekdays, + start_time, end_time, timezone, duration_min, + start_date, end_date, max_occurrences, open_ended, + modalidade, titulo_custom, observacoes, extra_fields, status + ) + SELECT + tenant_id, owner_id, therapist_id, patient_id, + determined_commitment_id, type, interval, weekdays, + start_time, end_time, timezone, duration_min, + p_from_date, v_old.end_date, v_old.max_occurrences, v_old.open_ended, + modalidade, titulo_custom, observacoes, extra_fields, status + FROM public.recurrence_rules + WHERE id = p_recurrence_id + RETURNING id INTO v_new_id; + + RETURN v_new_id; +END; +$$; + +CREATE FUNCTION public.subscription_intents_view_insert() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_target text; + v_plan_id uuid; +begin + select p.id, p.target into v_plan_id, v_target + from public.plans p + where p.key = new.plan_key; + + if v_plan_id is null then + raise exception 'Plano inv??lido: plan_key=%', new.plan_key; + end if; + + if lower(v_target) = 'clinic' then + if new.tenant_id is null then + raise exception 'Inten????o clinic exige tenant_id.'; + end if; + + insert into public.subscription_intents_tenant ( + id, tenant_id, created_by_user_id, email, + plan_id, plan_key, interval, amount_cents, currency, + status, source, notes, created_at, paid_at + ) values ( + coalesce(new.id, gen_random_uuid()), + new.tenant_id, new.created_by_user_id, new.email, + v_plan_id, new.plan_key, coalesce(new.interval,'month'), + new.amount_cents, coalesce(new.currency,'BRL'), + coalesce(new.status,'pending'), coalesce(new.source,'manual'), + new.notes, coalesce(new.created_at, now()), new.paid_at + ); + + new.plan_target := 'clinic'; + return new; + end if; + + -- therapist ou supervisor ??? tabela personal + if lower(v_target) in ('therapist', 'supervisor') then + insert into public.subscription_intents_personal ( + id, user_id, created_by_user_id, email, + plan_id, plan_key, interval, amount_cents, currency, + status, source, notes, created_at, paid_at + ) values ( + coalesce(new.id, gen_random_uuid()), + new.user_id, new.created_by_user_id, new.email, + v_plan_id, new.plan_key, coalesce(new.interval,'month'), + new.amount_cents, coalesce(new.currency,'BRL'), + coalesce(new.status,'pending'), coalesce(new.source,'manual'), + new.notes, coalesce(new.created_at, now()), new.paid_at + ); + + new.plan_target := lower(v_target); -- 'therapist' ou 'supervisor' + return new; + end if; + + raise exception 'Target de plano n??o suportado: %', v_target; +end; +$$; + +CREATE FUNCTION public.subscriptions_validate_scope() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + v_target text; +BEGIN + SELECT lower(p.target) INTO v_target + FROM public.plans p + WHERE p.id = NEW.plan_id; + + IF v_target IS NULL THEN + RAISE EXCEPTION 'Plano inv??lido (target nulo).'; + END IF; + + IF v_target = 'clinic' THEN + IF NEW.tenant_id IS NULL THEN + RAISE EXCEPTION 'Assinatura clinic exige tenant_id.'; + END IF; + IF NEW.user_id IS NOT NULL THEN + RAISE EXCEPTION 'Assinatura clinic n??o pode ter user_id (XOR).'; + END IF; + + ELSIF v_target IN ('therapist', 'supervisor') THEN + -- supervisor ?? pessoal como therapist + IF NEW.tenant_id IS NOT NULL THEN + RAISE EXCEPTION 'Assinatura % n??o deve ter tenant_id.', v_target; + END IF; + IF NEW.user_id IS NULL THEN + RAISE EXCEPTION 'Assinatura % exige user_id.', v_target; + END IF; + + ELSIF v_target = 'patient' THEN + IF NEW.tenant_id IS NOT NULL THEN + RAISE EXCEPTION 'Assinatura patient n??o deve ter tenant_id.'; + END IF; + IF NEW.user_id IS NULL THEN + RAISE EXCEPTION 'Assinatura patient exige user_id.'; + END IF; + + ELSE + RAISE EXCEPTION 'Target de plano inv??lido: %', v_target; + END IF; + + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.sync_busy_mirror_agenda_eventos() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +declare + clinic_tenant uuid; + is_personal boolean; + should_mirror boolean; +begin + -- Anti-recurs??o: espelho n??o espelha + if (tg_op <> 'DELETE') then + if new.mirror_of_event_id is not null then + return new; + end if; + else + if old.mirror_of_event_id is not null then + return old; + end if; + end if; + + -- Define se ?? pessoal e se deve espelhar + if (tg_op = 'DELETE') then + is_personal := (old.tenant_id = old.owner_id); + should_mirror := (old.visibility_scope in ('busy_only','private')); + else + is_personal := (new.tenant_id = new.owner_id); + should_mirror := (new.visibility_scope in ('busy_only','private')); + end if; + + -- Se n??o ?? pessoal, n??o faz nada + if not is_personal then + if (tg_op = 'DELETE') then + return old; + end if; + return new; + end if; + + -- DELETE: remove espelhos existentes + if (tg_op = 'DELETE') then + delete from public.agenda_eventos e + where e.mirror_of_event_id = old.id + and e.mirror_source = 'personal_busy_mirror'; + + return old; + end if; + + -- INSERT/UPDATE: + -- Se n??o deve espelhar, remove espelhos e sai + if not should_mirror then + delete from public.agenda_eventos e + where e.mirror_of_event_id = new.id + and e.mirror_source = 'personal_busy_mirror'; + + return new; + end if; + + -- Para cada cl??nica onde o usu??rio ?? therapist active, cria/atualiza o "Ocupado" + for clinic_tenant in + select tm.tenant_id + from public.tenant_members tm + where tm.user_id = new.owner_id + and tm.role = 'therapist' + and tm.status = 'active' + and tm.tenant_id <> new.owner_id + loop + insert into public.agenda_eventos ( + tenant_id, + owner_id, + terapeuta_id, + paciente_id, + tipo, + status, + titulo, + observacoes, + inicio_em, + fim_em, + mirror_of_event_id, + mirror_source, + visibility_scope, + created_at, + updated_at + ) values ( + clinic_tenant, + new.owner_id, + new.owner_id, + null, + 'bloqueio'::public.tipo_evento_agenda, + 'agendado'::public.status_evento_agenda, + 'Ocupado', + null, + new.inicio_em, + new.fim_em, + new.id, + 'personal_busy_mirror', + 'public', + now(), + now() + ) + on conflict (tenant_id, mirror_of_event_id) where mirror_of_event_id is not null + do update set + owner_id = excluded.owner_id, + terapeuta_id = excluded.terapeuta_id, + tipo = excluded.tipo, + status = excluded.status, + titulo = excluded.titulo, + observacoes = excluded.observacoes, + inicio_em = excluded.inicio_em, + fim_em = excluded.fim_em, + updated_at = now(); + end loop; + + -- Limpa espelhos de cl??nicas onde o v??nculo therapist active n??o existe mais + delete from public.agenda_eventos e + where e.mirror_of_event_id = new.id + and e.mirror_source = 'personal_busy_mirror' + and not exists ( + select 1 + from public.tenant_members tm + where tm.user_id = new.owner_id + and tm.role = 'therapist' + and tm.status = 'active' + and tm.tenant_id = e.tenant_id + ); + + return new; +end; +$$; + +CREATE FUNCTION public.sync_overdue_financial_records() RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_count integer; +BEGIN + UPDATE public.financial_records + SET + status = 'overdue', + updated_at = NOW() + WHERE status = 'pending' + AND due_date IS NOT NULL + AND due_date < CURRENT_DATE + AND deleted_at IS NULL; + + GET DIAGNOSTICS v_count = ROW_COUNT; + RETURN v_count; +END; +$$; + +CREATE FUNCTION public.tenant_accept_invite(p_token uuid) RETURNS jsonb + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ +declare + v_uid uuid; + v_email text; + v_invite public.tenant_invites%rowtype; +begin + -- 1) precisa estar autenticado + v_uid := auth.uid(); + if v_uid is null then + raise exception 'not_authenticated' using errcode = 'P0001'; + end if; + + -- 2) pega email real do usu??rio logado sem depender do JWT claim + select u.email + into v_email + from auth.users u + where u.id = v_uid; + + if v_email is null or length(trim(v_email)) = 0 then + raise exception 'missing_user_email' using errcode = 'P0001'; + end if; + + -- 3) carrega o invite e trava linha (evita 2 aceites concorrentes) + select * + into v_invite + from public.tenant_invites i + where i.token = p_token + for update; + + if not found then + raise exception 'invite_not_found' using errcode = 'P0001'; + end if; + + -- 4) valida????es de estado + if v_invite.revoked_at is not null then + raise exception 'invite_revoked' using errcode = 'P0001'; + end if; + + if v_invite.accepted_at is not null then + raise exception 'invite_already_accepted' using errcode = 'P0001'; + end if; + + if v_invite.expires_at is not null and v_invite.expires_at <= now() then + raise exception 'invite_expired' using errcode = 'P0001'; + end if; + + -- 5) valida email (case-insensitive) + if lower(trim(v_invite.email)) <> lower(trim(v_email)) then + raise exception 'email_mismatch' using errcode = 'P0001'; + end if; + + -- 6) consome o invite + update public.tenant_invites + set accepted_at = now(), + accepted_by = v_uid + where id = v_invite.id; + + -- 7) cria ou reativa o membership + insert into public.tenant_members (tenant_id, user_id, role, status, created_at) + values (v_invite.tenant_id, v_uid, v_invite.role, 'active', now()) + on conflict (tenant_id, user_id) + do update set + role = excluded.role, + status = 'active'; + + -- 8) retorno ??til pro front (voc?? j?? tenta ler tenant_id no AcceptInvitePage) + return jsonb_build_object( + 'ok', true, + 'tenant_id', v_invite.tenant_id, + 'role', v_invite.role + ); +end; +$$; + +CREATE FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text DEFAULT 'therapist'::text) RETURNS public.tenant_members + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ +declare + v_target_uid uuid; + v_member public.tenant_members%rowtype; + v_is_admin boolean; + v_email text; +begin + if p_tenant_id is null then + raise exception 'tenant_id ?? obrigat??rio'; + end if; + + v_email := lower(trim(coalesce(p_email, ''))); + if v_email = '' then + raise exception 'email ?? obrigat??rio'; + end if; + + -- valida role permitida + if p_role not in ('tenant_admin','therapist','secretary','patient') then + raise exception 'role inv??lida: %', p_role; + end if; + + -- apenas admin do tenant (role real no banco) + select exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = p_tenant_id + and tm.user_id = auth.uid() + and tm.role = 'tenant_admin' + and coalesce(tm.status,'active') = 'active' + ) into v_is_admin; + + if not v_is_admin then + raise exception 'sem permiss??o: apenas admin da cl??nica pode adicionar membros'; + end if; + + -- acha usu??rio pelo e-mail no Supabase Auth + select u.id + into v_target_uid + from auth.users u + where lower(u.email) = v_email + limit 1; + + if v_target_uid is null then + raise exception 'nenhum usu??rio encontrado com este e-mail'; + end if; + + -- cria ou reativa membro + insert into public.tenant_members (tenant_id, user_id, role, status) + values (p_tenant_id, v_target_uid, p_role, 'active') + on conflict (tenant_id, user_id) + do update set + role = excluded.role, + status = 'active' + returning * into v_member; + + return v_member; +end; +$$; + +CREATE FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 + from public.v_tenant_entitlements v + where v.tenant_id = p_tenant_id + and v.feature_key = p_feature_key + and coalesce(v.allowed, false) = true + ); +$$; + +CREATE FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select coalesce( + (select tf.enabled + from public.tenant_features tf + where tf.tenant_id = p_tenant_id and tf.feature_key = p_feature_key), + false + ); +$$; + +CREATE FUNCTION public.tenant_features_guard_with_plan() RETURNS trigger + LANGUAGE plpgsql + AS $$ +declare + v_allowed boolean; +begin + -- s?? valida quando est?? habilitando + if new.enabled is distinct from true then + return new; + end if; + + -- permitido pelo plano do tenant? + select exists ( + select 1 + from public.v_tenant_entitlements_full v + where v.tenant_id = new.tenant_id + and v.feature_key = new.feature_key + and v.allowed = true + ) + into v_allowed; + + if not v_allowed then + raise exception 'Feature % n??o permitida pelo plano atual do tenant %.', + new.feature_key, new.tenant_id + using errcode = 'P0001'; + end if; + + return new; +end; +$$; + +CREATE FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select + exists ( + select 1 + from public.v_tenant_entitlements e + where e.tenant_id = _tenant_id + and e.feature_key = _feature + and e.allowed = true + ) + or exists ( + select 1 + from public.tenant_features tf + where tf.tenant_id = _tenant_id + and tf.feature_key = _feature + and tf.enabled = true + ); +$$; + +CREATE FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) RETURNS uuid + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public', 'auth' + AS $$ +declare + v_email text; + v_my_email text; + v_token uuid; + v_updated int; +begin + -- valida????es b??sicas + if p_tenant_id is null then + raise exception 'tenant_id inv??lido' using errcode = 'P0001'; + end if; + + v_email := lower(trim(coalesce(p_email, ''))); + if v_email = '' then + raise exception 'Informe um email' using errcode = 'P0001'; + end if; + + -- role permitido (ajuste se quiser) + if p_role is null or p_role not in ('therapist', 'secretary') then + raise exception 'Role inv??lido (use therapist/secretary)' using errcode = 'P0001'; + end if; + + -- ??? bloqueio: auto-convite + v_my_email := public.get_my_email(); + if v_my_email is not null and v_email = v_my_email then + raise exception 'Voc?? n??o pode convidar o seu pr??prio email.' using errcode = 'P0001'; + end if; + + -- ??? bloqueio: j?? ?? membro ativo do tenant + if exists ( + select 1 + from tenant_members tm + join auth.users au on au.id = tm.user_id + where tm.tenant_id = p_tenant_id + and tm.status = 'active' + and lower(au.email) = v_email + ) then + raise exception 'Este email j?? est?? vinculado a esta cl??nica.' using errcode = 'P0001'; + end if; + + -- ??? permiss??o: s?? admin do tenant pode convidar + if not exists ( + select 1 + from tenant_members me + where me.tenant_id = p_tenant_id + and me.user_id = auth.uid() + and me.status = 'active' + and me.role in ('tenant_admin','clinic_admin') + ) then + raise exception 'Sem permiss??o para convidar membros.' using errcode = 'P0001'; + end if; + + -- Gera token (reenvio simples / regenera????o) + v_token := gen_random_uuid(); + + -- 1) tenta "regerar" um convite pendente existente (mesmo email) + update tenant_invites + set token = v_token, + role = p_role, + created_at = now(), + expires_at = now() + interval '7 days', + accepted_at = null, + revoked_at = null + where tenant_id = p_tenant_id + and lower(email) = v_email + and accepted_at is null + and revoked_at is null; + + get diagnostics v_updated = row_count; + + -- 2) se n??o atualizou nada, cria convite novo + if v_updated = 0 then + insert into tenant_invites (tenant_id, email, role, token, created_at, expires_at) + values (p_tenant_id, v_email, p_role, v_token, now(), now() + interval '7 days'); + end if; + + return v_token; +end; +$$; + +CREATE FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + update public.tenant_members + set status = 'active' + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +declare + v_role text; +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + if p_member_user_id = auth.uid() then + raise exception 'cannot_remove_self'; + end if; + + -- pega role atual do membro (se n??o existir, erro) + select role into v_role + from public.tenant_members + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if v_role is null then + raise exception 'membership_not_found'; + end if; + + -- trava: se for therapist, n??o pode remover com eventos futuros + if v_role = 'therapist' then + if exists ( + select 1 + from public.agenda_eventos e + where e.owner_id = p_tenant_id + and e.terapeuta_id = p_member_user_id + and e.inicio_em >= now() + and e.status::text not in ('cancelado','cancelled','canceled') + limit 1 + ) then + raise exception 'cannot_remove_therapist_with_future_events'; + end if; + end if; + + update public.tenant_members + set status = 'inactive' + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + if p_member_user_id = auth.uid() then + raise exception 'cannot_remove_self'; + end if; + + update public.tenant_members + set status = 'inactive' + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +declare + v_email text; +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + v_email := lower(trim(p_email)); + + update public.tenant_invites + set revoked_at = now(), + revoked_by = auth.uid() + where tenant_id = p_tenant_id + and lower(email) = v_email + and role = p_role + and accepted_at is null + and revoked_at is null; + + if not found then + raise exception 'invite_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +begin + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + -- valida status (adapte aos seus valores reais) + if p_new_status not in ('active','inactive','suspended','invited') then + raise exception 'invalid_status: %', p_new_status; + end if; + + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + -- evita desativar a si mesmo (opcional) + if p_member_user_id = auth.uid() and p_new_status <> 'active' then + raise exception 'cannot_disable_self'; + end if; + + update public.tenant_members + set status = p_new_status + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + SET row_security TO 'off' + AS $$ +begin + -- exige auth + if auth.uid() is null then + raise exception 'not_authenticated'; + end if; + + -- valida role + if p_new_role not in ('tenant_admin','therapist','secretary','patient') then + raise exception 'invalid_role: %', p_new_role; + end if; + + -- somente tenant_admin ativo pode alterar role + if not public.is_tenant_admin(p_tenant_id) then + raise exception 'not_allowed'; + end if; + + -- evita o admin remover o pr??prio admin sem querer (opcional mas recomendado) + if p_member_user_id = auth.uid() and p_new_role <> 'tenant_admin' then + raise exception 'cannot_demote_self'; + end if; + + update public.tenant_members + set role = p_new_role + where tenant_id = p_tenant_id + and user_id = p_member_user_id; + + if not found then + raise exception 'membership_not_found'; + end if; +end; +$$; + +CREATE FUNCTION public.toggle_plan(owner uuid) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + current_key text; + new_key text; +begin + select p.key into current_key + from subscriptions s + join plans p on p.id = s.plan_id + where s.owner_id = owner + and s.status = 'active'; + + new_key := case + when current_key = 'pro' then 'free' + else 'pro' + end; + + update subscriptions s + set plan_id = p.id + from plans p + where p.key = new_key + and s.owner_id = owner + and s.status = 'active'; +end; +$$; + +CREATE FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text DEFAULT NULL::text, p_metadata jsonb DEFAULT NULL::jsonb) RETURNS public.subscriptions + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +declare + v_sub public.subscriptions; + v_uid uuid; + v_is_allowed boolean := false; +begin + v_uid := auth.uid(); + + select * + into v_sub + from public.subscriptions + where id = p_subscription_id; + + if not found then + raise exception 'Assinatura n??o encontrada'; + end if; + + -- ===================================================== + -- ???? BLOCO DE AUTORIZA????O + -- ===================================================== + + -- 1) SaaS admin pode tudo + if is_saas_admin() then + v_is_allowed := true; + end if; + + -- 2) Assinatura pessoal (therapist) + if not v_is_allowed + and v_sub.tenant_id is null + and v_sub.user_id = v_uid then + v_is_allowed := true; + end if; + + -- 3) Assinatura de clinic (tenant) + if not v_is_allowed + and v_sub.tenant_id is not null then + + if exists ( + select 1 + from public.tenant_members tm + where tm.tenant_id = v_sub.tenant_id + and tm.user_id = v_uid + and tm.status = 'active' + and tm.role = 'tenant_admin' + ) then + v_is_allowed := true; + end if; + + end if; + + if not v_is_allowed then + raise exception 'Sem permiss??o para transicionar esta assinatura'; + end if; + + -- ===================================================== + -- ???? TRANSI????O + -- ===================================================== + + update public.subscriptions + set status = p_to_status, + updated_at = now(), + cancelled_at = case when p_to_status = 'cancelled' then now() else cancelled_at end, + suspended_at = case when p_to_status = 'suspended' then now() else suspended_at end, + past_due_since = case when p_to_status = 'past_due' then now() else past_due_since end, + expired_at = case when p_to_status = 'expired' then now() else expired_at end, + activated_at = case when p_to_status = 'active' then now() else activated_at end + where id = p_subscription_id + returning * into v_sub; + + -- ===================================================== + -- ???? EVENT LOG + -- ===================================================== + + insert into public.subscription_events ( + subscription_id, + owner_id, + event_type, + created_at, + created_by, + source, + reason, + metadata, + owner_type, + owner_ref + ) + values ( + v_sub.id, + coalesce(v_sub.tenant_id, v_sub.user_id), + 'status_changed', + now(), + v_uid, + 'manual_transition', + p_reason, + p_metadata, + case when v_sub.tenant_id is not null then 'tenant' else 'personal' end, + coalesce(v_sub.tenant_id, v_sub.user_id) + ); + + return v_sub; +end; +$$; + +CREATE FUNCTION public.trg_fn_financial_records_auto_overdue() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +BEGIN + IF NEW.status = 'pending' + AND NEW.due_date IS NOT NULL + AND NEW.due_date < CURRENT_DATE + THEN + NEW.status := 'overdue'; + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.trg_fn_patient_risco_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF OLD.risco_elevado IS DISTINCT FROM NEW.risco_elevado THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, + evento_tipo, titulo, descricao, icone_cor, + gerado_por, ocorrido_em + ) VALUES ( + NEW.id, NEW.tenant_id, + CASE WHEN NEW.risco_elevado THEN 'risco_sinalizado' ELSE 'risco_removido' END, + CASE WHEN NEW.risco_elevado THEN 'Risco elevado sinalizado' ELSE 'Sinalização de risco removida' END, + NEW.risco_nota, + CASE WHEN NEW.risco_elevado THEN 'red' ELSE 'green' END, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.trg_fn_patient_status_history() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF (TG_OP = 'INSERT') OR (OLD.status IS DISTINCT FROM NEW.status) THEN + INSERT INTO public.patient_status_history ( + patient_id, tenant_id, + status_anterior, status_novo, + motivo, encaminhado_para, data_saida, + alterado_por, alterado_em + ) VALUES ( + NEW.id, NEW.tenant_id, + CASE WHEN TG_OP = 'INSERT' THEN NULL ELSE OLD.status END, + NEW.status, + NEW.motivo_saida, + NEW.encaminhado_para, + NEW.data_saida, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.trg_fn_patient_status_timeline() RETURNS trigger + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +BEGIN + IF (TG_OP = 'INSERT') OR (OLD.status IS DISTINCT FROM NEW.status) THEN + INSERT INTO public.patient_timeline ( + patient_id, tenant_id, + evento_tipo, titulo, descricao, icone_cor, + gerado_por, ocorrido_em + ) VALUES ( + NEW.id, NEW.tenant_id, + 'status_alterado', + 'Status alterado para ' || NEW.status, + CASE + WHEN TG_OP = 'INSERT' THEN 'Paciente cadastrado' + ELSE 'De ' || OLD.status || ' → ' || NEW.status || + CASE WHEN NEW.motivo_saida IS NOT NULL THEN ' · ' || NEW.motivo_saida ELSE '' END + END, + CASE NEW.status + WHEN 'Ativo' THEN 'green' + WHEN 'Alta' THEN 'blue' + WHEN 'Inativo' THEN 'gray' + WHEN 'Encaminhado' THEN 'amber' + WHEN 'Arquivado' THEN 'gray' + ELSE 'gray' + END, + auth.uid(), + now() + ); + END IF; + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.trg_set_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN + NEW.updated_at = now(); + RETURN NEW; + END; + $$; + +CREATE FUNCTION public.unstick_notification_queue() RETURNS integer + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + v_unstuck integer; +BEGIN + UPDATE public.notification_queue + SET status = 'pendente', + attempts = attempts + 1, + last_error = 'Timeout: preso em processando por >10min', + next_retry_at = now() + interval '2 minutes' + WHERE status = 'processando' + AND updated_at < now() - interval '10 minutes'; + + GET DIAGNOSTICS v_unstuck = ROW_COUNT; + RETURN v_unstuck; +END; +$$; + +CREATE FUNCTION public.update_payment_settings_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.update_professional_pricing_updated_at() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + NEW.updated_at = now(); + RETURN NEW; +END; +$$; + +CREATE FUNCTION public.user_has_feature(_user_id uuid, _feature text) RETURNS boolean + LANGUAGE sql STABLE + AS $$ + select exists ( + select 1 + from public.v_user_entitlements e + where e.user_id = _user_id + and e.feature_key = _feature + and e.allowed = true + ); +$$; + +CREATE FUNCTION public.validate_support_session(p_token text) RETURNS json + LANGUAGE plpgsql SECURITY DEFINER + SET search_path TO 'public' + AS $$ +DECLARE + v_session support_sessions; +BEGIN + IF p_token IS NULL OR length(trim(p_token)) < 32 THEN + RETURN json_build_object('valid', false, 'tenant_id', null); + END IF; + + SELECT * INTO v_session + FROM public.support_sessions + WHERE token = p_token + AND expires_at > now() + LIMIT 1; + + IF NOT FOUND THEN + RETURN json_build_object('valid', false, 'tenant_id', null); + END IF; + + RETURN json_build_object( + 'valid', true, + 'tenant_id', v_session.tenant_id + ); +END; +$$; + +CREATE FUNCTION public.whoami() RETURNS TABLE(uid uuid, role text) + LANGUAGE sql STABLE + AS $$ + select auth.uid() as uid, auth.role() as role; +$$; diff --git a/database-novo/schema/03_functions/realtime.sql b/database-novo/schema/03_functions/realtime.sql index 372d9f3..59ed93d 100644 --- a/database-novo/schema/03_functions/realtime.sql +++ b/database-novo/schema/03_functions/realtime.sql @@ -1,6 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Functions — realtime schema --- ============================================================================= +-- Functions: realtime +-- Gerado automaticamente em 2026-04-17T12:23:05.223Z +-- Total: 12 CREATE FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer DEFAULT (1024 * 1024)) RETURNS SETOF realtime.wal_rls LANGUAGE plpgsql @@ -302,13 +302,6 @@ perform set_config('role', null, true); end; $$; - -ALTER FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) OWNER TO supabase_admin; - --- --- Name: broadcast_changes(text, text, text, text, text, record, record, text); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text DEFAULT 'ROW'::text) RETURNS void LANGUAGE plpgsql AS $$ @@ -333,13 +326,6 @@ END; $$; - -ALTER FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text) OWNER TO supabase_admin; - --- --- Name: build_prepared_statement_sql(text, regclass, realtime.wal_column[]); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) RETURNS text LANGUAGE sql AS $$ @@ -368,13 +354,6 @@ CREATE FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name te entity $$; - -ALTER FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) OWNER TO supabase_admin; - --- --- Name: cast(text, regtype); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime."cast"(val text, type_ regtype) RETURNS jsonb LANGUAGE plpgsql IMMUTABLE AS $$ @@ -386,13 +365,6 @@ CREATE FUNCTION realtime."cast"(val text, type_ regtype) RETURNS jsonb end $$; - -ALTER FUNCTION realtime."cast"(val text, type_ regtype) OWNER TO supabase_admin; - --- --- Name: check_equality_op(realtime.equality_op, regtype, text, text); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) RETURNS boolean LANGUAGE plpgsql IMMUTABLE AS $$ @@ -427,13 +399,6 @@ CREATE FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtyp end; $$; - -ALTER FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) OWNER TO supabase_admin; - --- --- Name: is_visible_through_filters(realtime.wal_column[], realtime.user_defined_filter[]); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) RETURNS boolean LANGUAGE sql IMMUTABLE AS $_$ @@ -465,13 +430,6 @@ CREATE FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[ on f.column_name = col.name; $_$; - -ALTER FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) OWNER TO supabase_admin; - --- --- Name: list_changes(name, name, integer, integer); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) RETURNS SETOF realtime.wal_rls LANGUAGE sql SET log_min_messages TO 'fatal' @@ -533,13 +491,6 @@ CREATE FUNCTION realtime.list_changes(publication name, slot_name name, max_chan and xyz.subscription_ids[1] is not null $$; - -ALTER FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) OWNER TO supabase_admin; - --- --- Name: quote_wal2json(regclass); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.quote_wal2json(entity regclass) RETURNS text LANGUAGE sql IMMUTABLE STRICT AS $$ @@ -573,13 +524,6 @@ CREATE FUNCTION realtime.quote_wal2json(entity regclass) RETURNS text pc.oid = entity $$; - -ALTER FUNCTION realtime.quote_wal2json(entity regclass) OWNER TO supabase_admin; - --- --- Name: send(jsonb, text, text, boolean); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean DEFAULT true) RETURNS void LANGUAGE plpgsql AS $$ @@ -612,13 +556,6 @@ BEGIN END; $$; - -ALTER FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean) OWNER TO supabase_admin; - --- --- Name: subscription_check_filters(); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.subscription_check_filters() RETURNS trigger LANGUAGE plpgsql AS $$ @@ -688,34 +625,12 @@ CREATE FUNCTION realtime.subscription_check_filters() RETURNS trigger end; $$; - -ALTER FUNCTION realtime.subscription_check_filters() OWNER TO supabase_admin; - --- --- Name: to_regrole(text); Type: FUNCTION; Schema: realtime; Owner: supabase_admin --- - CREATE FUNCTION realtime.to_regrole(role_name text) RETURNS regrole LANGUAGE sql IMMUTABLE AS $$ select role_name::regrole $$; - -ALTER FUNCTION realtime.to_regrole(role_name text) OWNER TO supabase_admin; - --- --- Name: topic(); Type: FUNCTION; Schema: realtime; Owner: supabase_realtime_admin --- - CREATE FUNCTION realtime.topic() RETURNS text LANGUAGE sql STABLE AS $$ select nullif(current_setting('realtime.topic', true), '')::text; $$; - - -ALTER FUNCTION realtime.topic() OWNER TO supabase_realtime_admin; - --- --- Name: can_insert_object(text, text, uuid, jsonb); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - diff --git a/database-novo/schema/03_functions/storage.sql b/database-novo/schema/03_functions/storage.sql index a7962c9..3ea94f0 100644 --- a/database-novo/schema/03_functions/storage.sql +++ b/database-novo/schema/03_functions/storage.sql @@ -1,6 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Functions — storage schema --- ============================================================================= +-- Functions: storage +-- Gerado automaticamente em 2026-04-17T12:23:05.224Z +-- Total: 15 CREATE FUNCTION storage.can_insert_object(bucketid text, name text, owner uuid, metadata jsonb) RETURNS void LANGUAGE plpgsql @@ -14,13 +14,6 @@ BEGIN END $$; - -ALTER FUNCTION storage.can_insert_object(bucketid text, name text, owner uuid, metadata jsonb) OWNER TO supabase_storage_admin; - --- --- Name: enforce_bucket_name_length(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.enforce_bucket_name_length() RETURNS trigger LANGUAGE plpgsql AS $$ @@ -32,13 +25,6 @@ begin end; $$; - -ALTER FUNCTION storage.enforce_bucket_name_length() OWNER TO supabase_storage_admin; - --- --- Name: extension(text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.extension(name text) RETURNS text LANGUAGE plpgsql AS $$ @@ -53,13 +39,6 @@ BEGIN END $$; - -ALTER FUNCTION storage.extension(name text) OWNER TO supabase_storage_admin; - --- --- Name: filename(text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.filename(name text) RETURNS text LANGUAGE plpgsql AS $$ @@ -71,13 +50,6 @@ BEGIN END $$; - -ALTER FUNCTION storage.filename(name text) OWNER TO supabase_storage_admin; - --- --- Name: foldername(text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.foldername(name text) RETURNS text[] LANGUAGE plpgsql AS $$ @@ -89,13 +61,6 @@ BEGIN END $$; - -ALTER FUNCTION storage.foldername(name text) OWNER TO supabase_storage_admin; - --- --- Name: get_common_prefix(text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.get_common_prefix(p_key text, p_prefix text, p_delimiter text) RETURNS text LANGUAGE sql IMMUTABLE AS $$ @@ -106,13 +71,6 @@ SELECT CASE END; $$; - -ALTER FUNCTION storage.get_common_prefix(p_key text, p_prefix text, p_delimiter text) OWNER TO supabase_storage_admin; - --- --- Name: get_size_by_bucket(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.get_size_by_bucket() RETURNS TABLE(size bigint, bucket_id text) LANGUAGE plpgsql AS $$ @@ -124,13 +82,6 @@ BEGIN END $$; - -ALTER FUNCTION storage.get_size_by_bucket() OWNER TO supabase_storage_admin; - --- --- Name: list_multipart_uploads_with_delimiter(text, text, text, integer, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.list_multipart_uploads_with_delimiter(bucket_id text, prefix_param text, delimiter_param text, max_keys integer DEFAULT 100, next_key_token text DEFAULT ''::text, next_upload_token text DEFAULT ''::text) RETURNS TABLE(key text, id text, created_at timestamp with time zone) LANGUAGE plpgsql AS $_$ @@ -172,13 +123,6 @@ BEGIN END; $_$; - -ALTER FUNCTION storage.list_multipart_uploads_with_delimiter(bucket_id text, prefix_param text, delimiter_param text, max_keys integer, next_key_token text, next_upload_token text) OWNER TO supabase_storage_admin; - --- --- Name: list_objects_with_delimiter(text, text, text, integer, text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.list_objects_with_delimiter(_bucket_id text, prefix_param text, delimiter_param text, max_keys integer DEFAULT 100, start_after text DEFAULT ''::text, next_token text DEFAULT ''::text, sort_order text DEFAULT 'asc'::text) RETURNS TABLE(name text, id uuid, metadata jsonb, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone) LANGUAGE plpgsql STABLE AS $_$ @@ -389,13 +333,6 @@ BEGIN END; $_$; - -ALTER FUNCTION storage.list_objects_with_delimiter(_bucket_id text, prefix_param text, delimiter_param text, max_keys integer, start_after text, next_token text, sort_order text) OWNER TO supabase_storage_admin; - --- --- Name: operation(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.operation() RETURNS text LANGUAGE plpgsql STABLE AS $$ @@ -404,13 +341,6 @@ BEGIN END; $$; - -ALTER FUNCTION storage.operation() OWNER TO supabase_storage_admin; - --- --- Name: protect_delete(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.protect_delete() RETURNS trigger LANGUAGE plpgsql AS $$ @@ -425,13 +355,6 @@ BEGIN END; $$; - -ALTER FUNCTION storage.protect_delete() OWNER TO supabase_storage_admin; - --- --- Name: search(text, text, integer, integer, integer, text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.search(prefix text, bucketname text, limits integer DEFAULT 100, levels integer DEFAULT 1, offsets integer DEFAULT 0, search text DEFAULT ''::text, sortcolumn text DEFAULT 'name'::text, sortorder text DEFAULT 'asc'::text) RETURNS TABLE(name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) LANGUAGE plpgsql STABLE AS $_$ @@ -681,13 +604,6 @@ BEGIN END; $_$; - -ALTER FUNCTION storage.search(prefix text, bucketname text, limits integer, levels integer, offsets integer, search text, sortcolumn text, sortorder text) OWNER TO supabase_storage_admin; - --- --- Name: search_by_timestamp(text, text, integer, integer, text, text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.search_by_timestamp(p_prefix text, p_bucket_id text, p_limit integer, p_level integer, p_start_after text, p_sort_order text, p_sort_column text, p_sort_column_after text) RETURNS TABLE(key text, name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) LANGUAGE plpgsql STABLE AS $_$ @@ -790,13 +706,6 @@ BEGIN END; $_$; - -ALTER FUNCTION storage.search_by_timestamp(p_prefix text, p_bucket_id text, p_limit integer, p_level integer, p_start_after text, p_sort_order text, p_sort_column text, p_sort_column_after text) OWNER TO supabase_storage_admin; - --- --- Name: search_v2(text, text, integer, integer, text, text, text, text); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.search_v2(prefix text, bucket_name text, limits integer DEFAULT 100, levels integer DEFAULT 1, start_after text DEFAULT ''::text, sort_order text DEFAULT 'asc'::text, sort_column text DEFAULT 'name'::text, sort_column_after text DEFAULT ''::text) RETURNS TABLE(key text, name text, id uuid, updated_at timestamp with time zone, created_at timestamp with time zone, last_accessed_at timestamp with time zone, metadata jsonb) LANGUAGE plpgsql STABLE AS $$ @@ -852,13 +761,6 @@ BEGIN END; $$; - -ALTER FUNCTION storage.search_v2(prefix text, bucket_name text, limits integer, levels integer, start_after text, sort_order text, sort_column text, sort_column_after text) OWNER TO supabase_storage_admin; - --- --- Name: update_updated_at_column(); Type: FUNCTION; Schema: storage; Owner: supabase_storage_admin --- - CREATE FUNCTION storage.update_updated_at_column() RETURNS trigger LANGUAGE plpgsql AS $$ @@ -867,11 +769,3 @@ BEGIN RETURN NEW; END; $$; - - -ALTER FUNCTION storage.update_updated_at_column() OWNER TO supabase_storage_admin; - --- --- Name: http_request(); Type: FUNCTION; Schema: supabase_functions; Owner: supabase_functions_admin --- - diff --git a/database-novo/schema/03_functions/supabase_functions.sql b/database-novo/schema/03_functions/supabase_functions.sql index dffb698..3423455 100644 --- a/database-novo/schema/03_functions/supabase_functions.sql +++ b/database-novo/schema/03_functions/supabase_functions.sql @@ -1,6 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Functions — supabase_functions schema --- ============================================================================= +-- Functions: supabase_functions +-- Gerado automaticamente em 2026-04-17T12:23:05.224Z +-- Total: 1 CREATE FUNCTION supabase_functions.http_request() RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER @@ -77,11 +77,3 @@ CREATE FUNCTION supabase_functions.http_request() RETURNS trigger RETURN NEW; END $$; - - -ALTER FUNCTION supabase_functions.http_request() OWNER TO supabase_functions_admin; - --- --- Name: extensions; Type: TABLE; Schema: _realtime; Owner: supabase_admin --- - diff --git a/database-novo/schema/04_tables/addons_cr_ditos.sql b/database-novo/schema/04_tables/addons_cr_ditos.sql new file mode 100644 index 0000000..e5218e9 --- /dev/null +++ b/database-novo/schema/04_tables/addons_cr_ditos.sql @@ -0,0 +1,66 @@ +-- Tables: Addons / Créditos +-- Gerado automaticamente em 2026-04-17T12:23:05.228Z +-- Total: 3 + +CREATE TABLE public.addon_credits ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + owner_id uuid, + addon_type text NOT NULL, + balance integer DEFAULT 0 NOT NULL, + total_purchased integer DEFAULT 0 NOT NULL, + total_consumed integer DEFAULT 0 NOT NULL, + low_balance_threshold integer DEFAULT 10, + low_balance_notified boolean DEFAULT false, + daily_limit integer, + hourly_limit integer, + daily_used integer DEFAULT 0, + hourly_used integer DEFAULT 0, + daily_reset_at timestamp with time zone, + hourly_reset_at timestamp with time zone, + from_number_override text, + expires_at timestamp with time zone, + is_active boolean DEFAULT true, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + +CREATE TABLE public.addon_products ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + slug text NOT NULL, + name text NOT NULL, + description text, + addon_type text NOT NULL, + icon text DEFAULT 'pi pi-box'::text, + credits_amount integer DEFAULT 0, + price_cents integer DEFAULT 0 NOT NULL, + currency text DEFAULT 'BRL'::text, + is_active boolean DEFAULT true, + is_visible boolean DEFAULT true, + sort_order integer DEFAULT 0, + metadata jsonb DEFAULT '{}'::jsonb, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + deleted_at timestamp with time zone +); + +CREATE TABLE public.addon_transactions ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + owner_id uuid, + addon_type text NOT NULL, + type text NOT NULL, + amount integer NOT NULL, + balance_before integer DEFAULT 0 NOT NULL, + balance_after integer DEFAULT 0 NOT NULL, + product_id uuid, + queue_id uuid, + description text, + admin_user_id uuid, + payment_method text, + payment_reference text, + price_cents integer, + currency text DEFAULT 'BRL'::text, + created_at timestamp with time zone DEFAULT now(), + metadata jsonb DEFAULT '{}'::jsonb +); diff --git a/database-novo/schema/04_tables/agenda.sql b/database-novo/schema/04_tables/agenda_agendamento.sql similarity index 68% rename from database-novo/schema/04_tables/agenda.sql rename to database-novo/schema/04_tables/agenda_agendamento.sql index 5caae2d..a1a1662 100644 --- a/database-novo/schema/04_tables/agenda.sql +++ b/database-novo/schema/04_tables/agenda_agendamento.sql @@ -1,11 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Tables — Agenda + Recorrências + Agendador Online --- ============================================================================= --- agenda_bloqueios, agenda_configuracoes, agenda_eventos, agenda_excecoes, --- agenda_online_slots, agenda_regras_semanais, agenda_slots_bloqueados_semanais, --- agenda_slots_regras, recurrence_rules, recurrence_exceptions, --- recurrence_rule_services, agendador_configuracoes, agendador_solicitacoes --- ============================================================================= +-- Tables: Agenda / Agendamento +-- Gerado automaticamente em 2026-04-17T12:23:05.229Z +-- Total: 10 CREATE TABLE public.agenda_bloqueios ( id uuid DEFAULT gen_random_uuid() NOT NULL, @@ -25,13 +20,6 @@ CREATE TABLE public.agenda_bloqueios ( CONSTRAINT agenda_bloqueios_tipo_check CHECK ((tipo = ANY (ARRAY['feriado_nacional'::text, 'feriado_municipal'::text, 'bloqueio'::text]))) ); - -ALTER TABLE public.agenda_bloqueios OWNER TO supabase_admin; - --- --- Name: agenda_configuracoes; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.agenda_configuracoes ( owner_id uuid NOT NULL, duracao_padrao_minutos integer DEFAULT 50 NOT NULL, @@ -68,7 +56,9 @@ CREATE TABLE public.agenda_configuracoes ( tenant_id uuid, jornada_igual_todos boolean DEFAULT true, slot_mode text DEFAULT 'fixed'::text NOT NULL, + atendimento_mode text DEFAULT 'particular'::text, CONSTRAINT agenda_configuracoes_admin_slot_visual_minutos_check CHECK ((admin_slot_visual_minutos = ANY (ARRAY[5, 10, 15, 20, 30, 60]))), + CONSTRAINT agenda_configuracoes_atendimento_mode_check CHECK (((atendimento_mode IS NULL) OR (atendimento_mode = ANY (ARRAY['particular'::text, 'convenio'::text, 'ambos'::text])))), CONSTRAINT agenda_configuracoes_check CHECK (((usar_horario_admin_custom = false) OR ((admin_inicio_visualizacao IS NOT NULL) AND (admin_fim_visualizacao IS NOT NULL) AND (admin_fim_visualizacao > admin_inicio_visualizacao)))), CONSTRAINT agenda_configuracoes_duracao_padrao_minutos_check CHECK (((duracao_padrao_minutos >= 10) AND (duracao_padrao_minutos <= 240))), CONSTRAINT agenda_configuracoes_granularidade_min_check CHECK (((granularidade_min IS NULL) OR (granularidade_min = ANY (ARRAY[5, 10, 15, 20, 30, 45, 50, 60])))), @@ -87,13 +77,6 @@ CREATE TABLE public.agenda_configuracoes ( CONSTRAINT session_duration_min_chk CHECK (((session_duration_min >= 10) AND (session_duration_min <= 240))) ); - -ALTER TABLE public.agenda_configuracoes OWNER TO supabase_admin; - --- --- Name: agenda_eventos; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.agenda_eventos ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -129,20 +112,6 @@ CREATE TABLE public.agenda_eventos ( CONSTRAINT agenda_eventos_check CHECK ((fim_em > inicio_em)) ); - -ALTER TABLE public.agenda_eventos OWNER TO supabase_admin; - --- --- Name: COLUMN agenda_eventos.price; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON COLUMN public.agenda_eventos.price IS 'Valor da sessão em BRL. Preenchido automaticamente pela tabela professional_pricing do profissional.'; - - --- --- Name: agenda_excecoes; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.agenda_excecoes ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -161,13 +130,6 @@ CREATE TABLE public.agenda_excecoes ( CONSTRAINT agenda_excecoes_fonte_check CHECK ((fonte = ANY (ARRAY['manual'::text, 'feriado_google'::text, 'sistema'::text]))) ); - -ALTER TABLE public.agenda_excecoes OWNER TO supabase_admin; - --- --- Name: agenda_online_slots; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.agenda_online_slots ( id bigint NOT NULL, owner_id uuid NOT NULL, @@ -180,34 +142,6 @@ CREATE TABLE public.agenda_online_slots ( CONSTRAINT agenda_online_slots_weekday_check CHECK ((weekday = ANY (ARRAY[0, 1, 2, 3, 4, 5, 6]))) ); - -ALTER TABLE public.agenda_online_slots OWNER TO supabase_admin; - --- --- Name: agenda_online_slots_id_seq; Type: SEQUENCE; Schema: public; Owner: supabase_admin --- - -CREATE SEQUENCE public.agenda_online_slots_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - -ALTER SEQUENCE public.agenda_online_slots_id_seq OWNER TO supabase_admin; - --- --- Name: agenda_online_slots_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: supabase_admin --- - -ALTER SEQUENCE public.agenda_online_slots_id_seq OWNED BY public.agenda_online_slots.id; - - --- --- Name: agenda_regras_semanais; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.agenda_regras_semanais ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -224,13 +158,6 @@ CREATE TABLE public.agenda_regras_semanais ( CONSTRAINT agenda_regras_semanais_modalidade_check CHECK (((modalidade = ANY (ARRAY['online'::text, 'presencial'::text, 'ambos'::text])) OR (modalidade IS NULL))) ); - -ALTER TABLE public.agenda_regras_semanais OWNER TO supabase_admin; - --- --- Name: agenda_slots_bloqueados_semanais; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.agenda_slots_bloqueados_semanais ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -244,13 +171,6 @@ CREATE TABLE public.agenda_slots_bloqueados_semanais ( CONSTRAINT agenda_slots_bloqueados_semanais_dia_semana_check CHECK (((dia_semana >= 0) AND (dia_semana <= 6))) ); - -ALTER TABLE public.agenda_slots_bloqueados_semanais OWNER TO supabase_admin; - --- --- Name: agenda_slots_regras; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.agenda_slots_regras ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -272,14 +192,6 @@ CREATE TABLE public.agenda_slots_regras ( CONSTRAINT agenda_slots_regras_passo_minutos_check CHECK (((passo_minutos >= 5) AND (passo_minutos <= 240))) ); - -ALTER TABLE public.agenda_slots_regras OWNER TO supabase_admin; - --- --- Name: agendador_configuracoes; Type: TABLE; Schema: public; Owner: supabase_admin --- - - CREATE TABLE public.agendador_configuracoes ( owner_id uuid NOT NULL, tenant_id uuid, @@ -323,27 +235,6 @@ CREATE TABLE public.agendador_configuracoes ( CONSTRAINT agendador_configuracoes_reserva_check CHECK (((reserva_horas >= 1) AND (reserva_horas <= 48))) ); - -ALTER TABLE public.agendador_configuracoes OWNER TO supabase_admin; - --- --- Name: COLUMN agendador_configuracoes.pagamento_modo; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON COLUMN public.agendador_configuracoes.pagamento_modo IS 'sem_pagamento | pagar_na_hora | pix_antecipado'; - - --- --- Name: COLUMN agendador_configuracoes.pagamento_metodos_visiveis; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON COLUMN public.agendador_configuracoes.pagamento_metodos_visiveis IS 'Métodos exibidos ao paciente quando pagamento_modo = pagar_na_hora. Ex: {pix, deposito, dinheiro, cartao, convenio}'; - - --- --- Name: agendador_solicitacoes; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.agendador_solicitacoes ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -376,97 +267,3 @@ CREATE TABLE public.agendador_solicitacoes ( CONSTRAINT agendador_sol_status_check CHECK ((status = ANY (ARRAY['pendente'::text, 'autorizado'::text, 'recusado'::text, 'expirado'::text, 'convertido'::text]))), CONSTRAINT agendador_sol_tipo_check CHECK ((tipo = ANY (ARRAY['primeira'::text, 'retorno'::text, 'reagendar'::text]))) ); - - -ALTER TABLE public.agendador_solicitacoes OWNER TO supabase_admin; - --- --- Name: billing_contracts; Type: TABLE; Schema: public; Owner: supabase_admin --- - - -CREATE TABLE public.recurrence_exceptions ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - recurrence_id uuid NOT NULL, - tenant_id uuid NOT NULL, - original_date date NOT NULL, - type public.recurrence_exception_type NOT NULL, - new_date date, - new_start_time time without time zone, - new_end_time time without time zone, - modalidade text, - observacoes text, - titulo_custom text, - extra_fields jsonb, - reason text, - agenda_evento_id uuid, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.recurrence_exceptions OWNER TO supabase_admin; - --- --- Name: recurrence_rule_services; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.recurrence_rule_services ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - rule_id uuid NOT NULL, - service_id uuid NOT NULL, - quantity integer DEFAULT 1 NOT NULL, - unit_price numeric(10,2) NOT NULL, - discount_pct numeric(5,2) DEFAULT 0, - discount_flat numeric(10,2) DEFAULT 0, - final_price numeric(10,2) NOT NULL, - created_at timestamp with time zone DEFAULT now(), - CONSTRAINT recurrence_rule_services_disc_flat_chk CHECK ((discount_flat >= (0)::numeric)), - CONSTRAINT recurrence_rule_services_disc_pct_chk CHECK (((discount_pct >= (0)::numeric) AND (discount_pct <= (100)::numeric))), - CONSTRAINT recurrence_rule_services_final_price_chk CHECK ((final_price >= (0)::numeric)), - CONSTRAINT recurrence_rule_services_quantity_chk CHECK ((quantity > 0)) -); - - -ALTER TABLE public.recurrence_rule_services OWNER TO supabase_admin; - --- --- Name: recurrence_rules; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.recurrence_rules ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - owner_id uuid NOT NULL, - therapist_id uuid, - patient_id uuid, - determined_commitment_id uuid, - type public.recurrence_type DEFAULT 'weekly'::public.recurrence_type NOT NULL, - "interval" smallint DEFAULT 1 NOT NULL, - weekdays smallint[] DEFAULT '{}'::smallint[] NOT NULL, - start_time time without time zone NOT NULL, - end_time time without time zone NOT NULL, - timezone text DEFAULT 'America/Sao_Paulo'::text NOT NULL, - duration_min smallint DEFAULT 50 NOT NULL, - start_date date NOT NULL, - end_date date, - max_occurrences integer, - open_ended boolean DEFAULT true NOT NULL, - modalidade text DEFAULT 'presencial'::text, - titulo_custom text, - observacoes text, - extra_fields jsonb, - status text DEFAULT 'ativo'::text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - price numeric(10,2), - insurance_plan_id uuid, - insurance_guide_number text, - insurance_value numeric(10,2), - insurance_plan_service_id uuid, - CONSTRAINT recurrence_rules_dates_chk CHECK (((end_date IS NULL) OR (end_date >= start_date))), - CONSTRAINT recurrence_rules_interval_chk CHECK (("interval" >= 1)), - CONSTRAINT recurrence_rules_status_check CHECK ((status = ANY (ARRAY['ativo'::text, 'pausado'::text, 'cancelado'::text]))), - CONSTRAINT recurrence_rules_times_chk CHECK ((end_time > start_time)) -); - - diff --git a/database-novo/schema/04_tables/auth.sql b/database-novo/schema/04_tables/auth.sql deleted file mode 100644 index a68b2ef..0000000 --- a/database-novo/schema/04_tables/auth.sql +++ /dev/null @@ -1,608 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Tables — auth schema (Supabase GoTrue) --- ============================================================================= --- auth.users, auth.identities, auth.sessions, auth.refresh_tokens, --- auth.mfa_*, auth.saml_*, auth.sso_*, auth.flow_state, etc. --- ============================================================================= - -CREATE TABLE auth.audit_log_entries ( - instance_id uuid, - id uuid NOT NULL, - payload json, - created_at timestamp with time zone, - ip_address character varying(64) DEFAULT ''::character varying NOT NULL -); - - -ALTER TABLE auth.audit_log_entries OWNER TO supabase_auth_admin; - --- --- Name: TABLE audit_log_entries; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.audit_log_entries IS 'Auth: Audit trail for user actions.'; - - --- --- Name: flow_state; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.flow_state ( - id uuid NOT NULL, - user_id uuid, - auth_code text, - code_challenge_method auth.code_challenge_method, - code_challenge text, - provider_type text NOT NULL, - provider_access_token text, - provider_refresh_token text, - created_at timestamp with time zone, - updated_at timestamp with time zone, - authentication_method text NOT NULL, - auth_code_issued_at timestamp with time zone, - invite_token text, - referrer text, - oauth_client_state_id uuid, - linking_target_id uuid, - email_optional boolean DEFAULT false NOT NULL -); - - -ALTER TABLE auth.flow_state OWNER TO supabase_auth_admin; - --- --- Name: TABLE flow_state; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.flow_state IS 'Stores metadata for all OAuth/SSO login flows'; - - --- --- Name: identities; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.identities ( - provider_id text NOT NULL, - user_id uuid NOT NULL, - identity_data jsonb NOT NULL, - provider text NOT NULL, - last_sign_in_at timestamp with time zone, - created_at timestamp with time zone, - updated_at timestamp with time zone, - email text GENERATED ALWAYS AS (lower((identity_data ->> 'email'::text))) STORED, - id uuid DEFAULT gen_random_uuid() NOT NULL -); - - -ALTER TABLE auth.identities OWNER TO supabase_auth_admin; - --- --- Name: TABLE identities; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.identities IS 'Auth: Stores identities associated to a user.'; - - --- --- Name: COLUMN identities.email; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON COLUMN auth.identities.email IS 'Auth: Email is a generated column that references the optional email property in the identity_data'; - - --- --- Name: instances; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.instances ( - id uuid NOT NULL, - uuid uuid, - raw_base_config text, - created_at timestamp with time zone, - updated_at timestamp with time zone -); - - -ALTER TABLE auth.instances OWNER TO supabase_auth_admin; - --- --- Name: TABLE instances; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.instances IS 'Auth: Manages users across multiple sites.'; - - --- --- Name: mfa_amr_claims; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.mfa_amr_claims ( - session_id uuid NOT NULL, - created_at timestamp with time zone NOT NULL, - updated_at timestamp with time zone NOT NULL, - authentication_method text NOT NULL, - id uuid NOT NULL -); - - -ALTER TABLE auth.mfa_amr_claims OWNER TO supabase_auth_admin; - --- --- Name: TABLE mfa_amr_claims; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.mfa_amr_claims IS 'auth: stores authenticator method reference claims for multi factor authentication'; - - --- --- Name: mfa_challenges; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.mfa_challenges ( - id uuid NOT NULL, - factor_id uuid NOT NULL, - created_at timestamp with time zone NOT NULL, - verified_at timestamp with time zone, - ip_address inet NOT NULL, - otp_code text, - web_authn_session_data jsonb -); - - -ALTER TABLE auth.mfa_challenges OWNER TO supabase_auth_admin; - --- --- Name: TABLE mfa_challenges; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.mfa_challenges IS 'auth: stores metadata about challenge requests made'; - - --- --- Name: mfa_factors; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.mfa_factors ( - id uuid NOT NULL, - user_id uuid NOT NULL, - friendly_name text, - factor_type auth.factor_type NOT NULL, - status auth.factor_status NOT NULL, - created_at timestamp with time zone NOT NULL, - updated_at timestamp with time zone NOT NULL, - secret text, - phone text, - last_challenged_at timestamp with time zone, - web_authn_credential jsonb, - web_authn_aaguid uuid, - last_webauthn_challenge_data jsonb -); - - -ALTER TABLE auth.mfa_factors OWNER TO supabase_auth_admin; - --- --- Name: TABLE mfa_factors; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.mfa_factors IS 'auth: stores metadata about factors'; - - --- --- Name: COLUMN mfa_factors.last_webauthn_challenge_data; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON COLUMN auth.mfa_factors.last_webauthn_challenge_data IS 'Stores the latest WebAuthn challenge data including attestation/assertion for customer verification'; - - --- --- Name: oauth_authorizations; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.oauth_authorizations ( - id uuid NOT NULL, - authorization_id text NOT NULL, - client_id uuid NOT NULL, - user_id uuid, - redirect_uri text NOT NULL, - scope text NOT NULL, - state text, - resource text, - code_challenge text, - code_challenge_method auth.code_challenge_method, - response_type auth.oauth_response_type DEFAULT 'code'::auth.oauth_response_type NOT NULL, - status auth.oauth_authorization_status DEFAULT 'pending'::auth.oauth_authorization_status NOT NULL, - authorization_code text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - expires_at timestamp with time zone DEFAULT (now() + '00:03:00'::interval) NOT NULL, - approved_at timestamp with time zone, - nonce text, - CONSTRAINT oauth_authorizations_authorization_code_length CHECK ((char_length(authorization_code) <= 255)), - CONSTRAINT oauth_authorizations_code_challenge_length CHECK ((char_length(code_challenge) <= 128)), - CONSTRAINT oauth_authorizations_expires_at_future CHECK ((expires_at > created_at)), - CONSTRAINT oauth_authorizations_nonce_length CHECK ((char_length(nonce) <= 255)), - CONSTRAINT oauth_authorizations_redirect_uri_length CHECK ((char_length(redirect_uri) <= 2048)), - CONSTRAINT oauth_authorizations_resource_length CHECK ((char_length(resource) <= 2048)), - CONSTRAINT oauth_authorizations_scope_length CHECK ((char_length(scope) <= 4096)), - CONSTRAINT oauth_authorizations_state_length CHECK ((char_length(state) <= 4096)) -); - - -ALTER TABLE auth.oauth_authorizations OWNER TO supabase_auth_admin; - --- --- Name: oauth_client_states; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.oauth_client_states ( - id uuid NOT NULL, - provider_type text NOT NULL, - code_verifier text, - created_at timestamp with time zone NOT NULL -); - - -ALTER TABLE auth.oauth_client_states OWNER TO supabase_auth_admin; - --- --- Name: TABLE oauth_client_states; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.oauth_client_states IS 'Stores OAuth states for third-party provider authentication flows where Supabase acts as the OAuth client.'; - - --- --- Name: oauth_clients; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.oauth_clients ( - id uuid NOT NULL, - client_secret_hash text, - registration_type auth.oauth_registration_type NOT NULL, - redirect_uris text NOT NULL, - grant_types text NOT NULL, - client_name text, - client_uri text, - logo_uri text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - deleted_at timestamp with time zone, - client_type auth.oauth_client_type DEFAULT 'confidential'::auth.oauth_client_type NOT NULL, - token_endpoint_auth_method text NOT NULL, - CONSTRAINT oauth_clients_client_name_length CHECK ((char_length(client_name) <= 1024)), - CONSTRAINT oauth_clients_client_uri_length CHECK ((char_length(client_uri) <= 2048)), - CONSTRAINT oauth_clients_logo_uri_length CHECK ((char_length(logo_uri) <= 2048)), - CONSTRAINT oauth_clients_token_endpoint_auth_method_check CHECK ((token_endpoint_auth_method = ANY (ARRAY['client_secret_basic'::text, 'client_secret_post'::text, 'none'::text]))) -); - - -ALTER TABLE auth.oauth_clients OWNER TO supabase_auth_admin; - --- --- Name: oauth_consents; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.oauth_consents ( - id uuid NOT NULL, - user_id uuid NOT NULL, - client_id uuid NOT NULL, - scopes text NOT NULL, - granted_at timestamp with time zone DEFAULT now() NOT NULL, - revoked_at timestamp with time zone, - CONSTRAINT oauth_consents_revoked_after_granted CHECK (((revoked_at IS NULL) OR (revoked_at >= granted_at))), - CONSTRAINT oauth_consents_scopes_length CHECK ((char_length(scopes) <= 2048)), - CONSTRAINT oauth_consents_scopes_not_empty CHECK ((char_length(TRIM(BOTH FROM scopes)) > 0)) -); - - -ALTER TABLE auth.oauth_consents OWNER TO supabase_auth_admin; - --- --- Name: one_time_tokens; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.one_time_tokens ( - id uuid NOT NULL, - user_id uuid NOT NULL, - token_type auth.one_time_token_type NOT NULL, - token_hash text NOT NULL, - relates_to text NOT NULL, - created_at timestamp without time zone DEFAULT now() NOT NULL, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - CONSTRAINT one_time_tokens_token_hash_check CHECK ((char_length(token_hash) > 0)) -); - - -ALTER TABLE auth.one_time_tokens OWNER TO supabase_auth_admin; - --- --- Name: refresh_tokens; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.refresh_tokens ( - instance_id uuid, - id bigint NOT NULL, - token character varying(255), - user_id character varying(255), - revoked boolean, - created_at timestamp with time zone, - updated_at timestamp with time zone, - parent character varying(255), - session_id uuid -); - - -ALTER TABLE auth.refresh_tokens OWNER TO supabase_auth_admin; - --- --- Name: TABLE refresh_tokens; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.refresh_tokens IS 'Auth: Store of tokens used to refresh JWT tokens once they expire.'; - - --- --- Name: refresh_tokens_id_seq; Type: SEQUENCE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE SEQUENCE auth.refresh_tokens_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - -ALTER SEQUENCE auth.refresh_tokens_id_seq OWNER TO supabase_auth_admin; - --- --- Name: refresh_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER SEQUENCE auth.refresh_tokens_id_seq OWNED BY auth.refresh_tokens.id; - - --- --- Name: saml_providers; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.saml_providers ( - id uuid NOT NULL, - sso_provider_id uuid NOT NULL, - entity_id text NOT NULL, - metadata_xml text NOT NULL, - metadata_url text, - attribute_mapping jsonb, - created_at timestamp with time zone, - updated_at timestamp with time zone, - name_id_format text, - CONSTRAINT "entity_id not empty" CHECK ((char_length(entity_id) > 0)), - CONSTRAINT "metadata_url not empty" CHECK (((metadata_url = NULL::text) OR (char_length(metadata_url) > 0))), - CONSTRAINT "metadata_xml not empty" CHECK ((char_length(metadata_xml) > 0)) -); - - -ALTER TABLE auth.saml_providers OWNER TO supabase_auth_admin; - --- --- Name: TABLE saml_providers; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.saml_providers IS 'Auth: Manages SAML Identity Provider connections.'; - - --- --- Name: saml_relay_states; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.saml_relay_states ( - id uuid NOT NULL, - sso_provider_id uuid NOT NULL, - request_id text NOT NULL, - for_email text, - redirect_to text, - created_at timestamp with time zone, - updated_at timestamp with time zone, - flow_state_id uuid, - CONSTRAINT "request_id not empty" CHECK ((char_length(request_id) > 0)) -); - - -ALTER TABLE auth.saml_relay_states OWNER TO supabase_auth_admin; - --- --- Name: TABLE saml_relay_states; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.saml_relay_states IS 'Auth: Contains SAML Relay State information for each Service Provider initiated login.'; - - --- --- Name: schema_migrations; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.schema_migrations ( - version character varying(255) NOT NULL -); - - -ALTER TABLE auth.schema_migrations OWNER TO supabase_auth_admin; - --- --- Name: TABLE schema_migrations; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.schema_migrations IS 'Auth: Manages updates to the auth system.'; - - --- --- Name: sessions; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.sessions ( - id uuid NOT NULL, - user_id uuid NOT NULL, - created_at timestamp with time zone, - updated_at timestamp with time zone, - factor_id uuid, - aal auth.aal_level, - not_after timestamp with time zone, - refreshed_at timestamp without time zone, - user_agent text, - ip inet, - tag text, - oauth_client_id uuid, - refresh_token_hmac_key text, - refresh_token_counter bigint, - scopes text, - CONSTRAINT sessions_scopes_length CHECK ((char_length(scopes) <= 4096)) -); - - -ALTER TABLE auth.sessions OWNER TO supabase_auth_admin; - --- --- Name: TABLE sessions; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.sessions IS 'Auth: Stores session data associated to a user.'; - - --- --- Name: COLUMN sessions.not_after; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON COLUMN auth.sessions.not_after IS 'Auth: Not after is a nullable column that contains a timestamp after which the session should be regarded as expired.'; - - --- --- Name: COLUMN sessions.refresh_token_hmac_key; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON COLUMN auth.sessions.refresh_token_hmac_key IS 'Holds a HMAC-SHA256 key used to sign refresh tokens for this session.'; - - --- --- Name: COLUMN sessions.refresh_token_counter; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON COLUMN auth.sessions.refresh_token_counter IS 'Holds the ID (counter) of the last issued refresh token.'; - - --- --- Name: sso_domains; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.sso_domains ( - id uuid NOT NULL, - sso_provider_id uuid NOT NULL, - domain text NOT NULL, - created_at timestamp with time zone, - updated_at timestamp with time zone, - CONSTRAINT "domain not empty" CHECK ((char_length(domain) > 0)) -); - - -ALTER TABLE auth.sso_domains OWNER TO supabase_auth_admin; - --- --- Name: TABLE sso_domains; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.sso_domains IS 'Auth: Manages SSO email address domain mapping to an SSO Identity Provider.'; - - --- --- Name: sso_providers; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.sso_providers ( - id uuid NOT NULL, - resource_id text, - created_at timestamp with time zone, - updated_at timestamp with time zone, - disabled boolean, - CONSTRAINT "resource_id not empty" CHECK (((resource_id = NULL::text) OR (char_length(resource_id) > 0))) -); - - -ALTER TABLE auth.sso_providers OWNER TO supabase_auth_admin; - --- --- Name: TABLE sso_providers; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.sso_providers IS 'Auth: Manages SSO identity provider information; see saml_providers for SAML.'; - - --- --- Name: COLUMN sso_providers.resource_id; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON COLUMN auth.sso_providers.resource_id IS 'Auth: Uniquely identifies a SSO provider according to a user-chosen resource ID (case insensitive), useful in infrastructure as code.'; - - --- --- Name: users; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - -CREATE TABLE auth.users ( - instance_id uuid, - id uuid NOT NULL, - aud character varying(255), - role character varying(255), - email character varying(255), - encrypted_password character varying(255), - email_confirmed_at timestamp with time zone, - invited_at timestamp with time zone, - confirmation_token character varying(255), - confirmation_sent_at timestamp with time zone, - recovery_token character varying(255), - recovery_sent_at timestamp with time zone, - email_change_token_new character varying(255), - email_change character varying(255), - email_change_sent_at timestamp with time zone, - last_sign_in_at timestamp with time zone, - raw_app_meta_data jsonb, - raw_user_meta_data jsonb, - is_super_admin boolean, - created_at timestamp with time zone, - updated_at timestamp with time zone, - phone text DEFAULT NULL::character varying, - phone_confirmed_at timestamp with time zone, - phone_change text DEFAULT ''::character varying, - phone_change_token character varying(255) DEFAULT ''::character varying, - phone_change_sent_at timestamp with time zone, - confirmed_at timestamp with time zone GENERATED ALWAYS AS (LEAST(email_confirmed_at, phone_confirmed_at)) STORED, - email_change_token_current character varying(255) DEFAULT ''::character varying, - email_change_confirm_status smallint DEFAULT 0, - banned_until timestamp with time zone, - reauthentication_token character varying(255) DEFAULT ''::character varying, - reauthentication_sent_at timestamp with time zone, - is_sso_user boolean DEFAULT false NOT NULL, - deleted_at timestamp with time zone, - is_anonymous boolean DEFAULT false NOT NULL, - CONSTRAINT users_email_change_confirm_status_check CHECK (((email_change_confirm_status >= 0) AND (email_change_confirm_status <= 2))) -); - - -ALTER TABLE auth.users OWNER TO supabase_auth_admin; - --- --- Name: TABLE users; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON TABLE auth.users IS 'Auth: Stores user login data within a secure schema.'; - - --- --- Name: COLUMN users.is_sso_user; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON COLUMN auth.users.is_sso_user IS 'Auth: Set this column to true when the account comes from SSO. These accounts can have duplicate emails.'; - - --- --- Name: addon_credits; Type: TABLE; Schema: public; Owner: supabase_admin --- - diff --git a/database-novo/schema/04_tables/central_saas_docs_faq.sql b/database-novo/schema/04_tables/central_saas_docs_faq.sql new file mode 100644 index 0000000..ba00291 --- /dev/null +++ b/database-novo/schema/04_tables/central_saas_docs_faq.sql @@ -0,0 +1,61 @@ +-- Tables: Central SaaS (docs/FAQ) +-- Gerado automaticamente em 2026-04-17T12:23:05.230Z +-- Total: 4 + +CREATE TABLE public.saas_doc_votos ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + doc_id uuid NOT NULL, + user_id uuid NOT NULL, + util boolean NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.saas_docs ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + titulo text NOT NULL, + conteudo text DEFAULT ''::text NOT NULL, + medias jsonb DEFAULT '[]'::jsonb NOT NULL, + tipo_acesso text DEFAULT 'usuario'::text NOT NULL, + pagina_path text NOT NULL, + docs_relacionados uuid[] DEFAULT '{}'::uuid[] NOT NULL, + ativo boolean DEFAULT true NOT NULL, + ordem integer DEFAULT 0 NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + categoria text, + exibir_no_faq boolean DEFAULT false NOT NULL, + votos_util integer DEFAULT 0 NOT NULL, + votos_nao_util integer DEFAULT 0 NOT NULL, + CONSTRAINT saas_docs_tipo_acesso_check CHECK ((tipo_acesso = ANY (ARRAY['admin'::text, 'usuario'::text]))) +); + +CREATE TABLE public.saas_faq ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + pergunta text NOT NULL, + categoria text, + publico boolean DEFAULT false NOT NULL, + votos integer DEFAULT 0 NOT NULL, + titulo text, + conteudo text, + tipo_acesso text DEFAULT 'usuario'::text NOT NULL, + pagina_path text NOT NULL, + pagina_label text, + medias jsonb DEFAULT '[]'::jsonb NOT NULL, + faqs_relacionados uuid[] DEFAULT '{}'::uuid[] NOT NULL, + ativo boolean DEFAULT true NOT NULL, + ordem integer DEFAULT 0 NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.saas_faq_itens ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + doc_id uuid NOT NULL, + pergunta text NOT NULL, + resposta text, + ordem integer DEFAULT 0 NOT NULL, + ativo boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); diff --git a/database-novo/schema/04_tables/notifications.sql b/database-novo/schema/04_tables/comunica_o_notifica_es.sql similarity index 70% rename from database-novo/schema/04_tables/notifications.sql rename to database-novo/schema/04_tables/comunica_o_notifica_es.sql index ee593a3..e589fb4 100644 --- a/database-novo/schema/04_tables/notifications.sql +++ b/database-novo/schema/04_tables/comunica_o_notifica_es.sql @@ -1,11 +1,99 @@ --- ============================================================================= --- AgenciaPsi — Tables — Notificações + Email Templates --- ============================================================================= --- notification_channels, notification_logs, notification_preferences, --- notification_queue, notification_schedules, notification_templates, --- notifications, email_templates_global, email_templates_tenant, --- email_layout_config --- ============================================================================= +-- Tables: Comunicação / Notificações +-- Gerado automaticamente em 2026-04-17T12:23:05.230Z +-- Total: 14 + +CREATE TABLE public.email_layout_config ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + header_config jsonb DEFAULT '{"layout": null, "content": "", "enabled": false}'::jsonb NOT NULL, + footer_config jsonb DEFAULT '{"layout": null, "content": "", "enabled": false}'::jsonb NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.email_templates_global ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + key text NOT NULL, + domain text NOT NULL, + channel text DEFAULT 'email'::text NOT NULL, + subject text NOT NULL, + body_html text NOT NULL, + body_text text, + version integer DEFAULT 1 NOT NULL, + is_active boolean DEFAULT true NOT NULL, + variables jsonb, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.email_templates_tenant ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + owner_id uuid, + template_key text NOT NULL, + subject text, + body_html text, + body_text text, + enabled boolean DEFAULT true NOT NULL, + synced_version integer, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.global_notices ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + title text, + message text DEFAULT ''::text NOT NULL, + variant text DEFAULT 'info'::text NOT NULL, + roles text[] DEFAULT '{}'::text[] NOT NULL, + contexts text[] DEFAULT '{}'::text[] NOT NULL, + starts_at timestamp with time zone, + ends_at timestamp with time zone, + is_active boolean DEFAULT true NOT NULL, + priority integer DEFAULT 0 NOT NULL, + dismissible boolean DEFAULT true NOT NULL, + persist_dismiss boolean DEFAULT true NOT NULL, + dismiss_scope text DEFAULT 'device'::text NOT NULL, + show_once boolean DEFAULT false NOT NULL, + max_views integer, + cooldown_minutes integer, + version integer DEFAULT 1 NOT NULL, + action_type text DEFAULT 'none'::text NOT NULL, + action_label text, + action_url text, + action_route text, + views_count integer DEFAULT 0 NOT NULL, + clicks_count integer DEFAULT 0 NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + created_by uuid, + content_align text DEFAULT 'left'::text NOT NULL, + link_target text DEFAULT '_blank'::text NOT NULL, + CONSTRAINT global_notices_action_type_check CHECK ((action_type = ANY (ARRAY['none'::text, 'internal'::text, 'external'::text]))), + CONSTRAINT global_notices_content_align_check CHECK ((content_align = ANY (ARRAY['left'::text, 'center'::text, 'right'::text, 'justify'::text]))), + CONSTRAINT global_notices_dismiss_scope_check CHECK ((dismiss_scope = ANY (ARRAY['session'::text, 'device'::text, 'user'::text]))), + CONSTRAINT global_notices_link_target_check CHECK ((link_target = ANY (ARRAY['_blank'::text, '_self'::text, '_parent'::text, '_top'::text]))), + CONSTRAINT global_notices_variant_check CHECK ((variant = ANY (ARRAY['info'::text, 'success'::text, 'warning'::text, 'error'::text]))) +); + +CREATE TABLE public.login_carousel_slides ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + title text NOT NULL, + body text NOT NULL, + icon text DEFAULT 'pi-star'::text NOT NULL, + ordem integer DEFAULT 0 NOT NULL, + ativo boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + +CREATE TABLE public.notice_dismissals ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + notice_id uuid NOT NULL, + user_id uuid NOT NULL, + version integer DEFAULT 1 NOT NULL, + dismissed_at timestamp with time zone DEFAULT now() NOT NULL +); CREATE TABLE public.notification_channels ( id uuid DEFAULT gen_random_uuid() NOT NULL, @@ -23,18 +111,18 @@ CREATE TABLE public.notification_channels ( created_at timestamp with time zone DEFAULT now() NOT NULL, updated_at timestamp with time zone DEFAULT now() NOT NULL, deleted_at timestamp with time zone, + twilio_subaccount_sid text, + twilio_phone_number text, + twilio_phone_sid text, + webhook_url text, + cost_per_message_usd numeric(8,6) DEFAULT 0, + price_per_message_brl numeric(8,4) DEFAULT 0, + provisioned_at timestamp with time zone, CONSTRAINT notification_channels_channel_check CHECK ((channel = ANY (ARRAY['whatsapp'::text, 'email'::text, 'sms'::text]))), CONSTRAINT notification_channels_connection_status_check CHECK ((connection_status = ANY (ARRAY['connected'::text, 'disconnected'::text, 'connecting'::text, 'qr_pending'::text, 'error'::text]))), CONSTRAINT notification_channels_provider_check CHECK ((provider = ANY (ARRAY['evolution_api'::text, 'meta_official'::text, 'twilio'::text, 'zenvia'::text, 'sendgrid'::text, 'resend'::text, 'smtp'::text, 'zapi'::text]))) ); - -ALTER TABLE public.notification_channels OWNER TO supabase_admin; - --- --- Name: notification_logs; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.notification_logs ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, @@ -64,13 +152,6 @@ CREATE TABLE public.notification_logs ( CONSTRAINT notification_logs_status_check CHECK ((status = ANY (ARRAY['sent'::text, 'delivered'::text, 'read'::text, 'failed'::text, 'bounced'::text, 'opted_out'::text]))) ); - -ALTER TABLE public.notification_logs OWNER TO supabase_admin; - --- --- Name: notification_preferences; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.notification_preferences ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, @@ -92,13 +173,6 @@ CREATE TABLE public.notification_preferences ( deleted_at timestamp with time zone ); - -ALTER TABLE public.notification_preferences OWNER TO supabase_admin; - --- --- Name: notification_queue; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.notification_queue ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, @@ -125,13 +199,6 @@ CREATE TABLE public.notification_queue ( CONSTRAINT notification_queue_status_check CHECK ((status = ANY (ARRAY['pendente'::text, 'processando'::text, 'enviado'::text, 'falhou'::text, 'cancelado'::text, 'ignorado'::text]))) ); - -ALTER TABLE public.notification_queue OWNER TO supabase_admin; - --- --- Name: notification_schedules; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.notification_schedules ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, @@ -156,13 +223,6 @@ CREATE TABLE public.notification_schedules ( CONSTRAINT notification_schedules_trigger_type_check CHECK ((trigger_type = ANY (ARRAY['before_event'::text, 'after_event'::text, 'immediate'::text]))) ); - -ALTER TABLE public.notification_schedules OWNER TO supabase_admin; - --- --- Name: notification_templates; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.notification_templates ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid, @@ -189,13 +249,6 @@ CREATE TABLE public.notification_templates ( CONSTRAINT notification_templates_meta_status_check CHECK ((meta_status = ANY (ARRAY['draft'::text, 'pending_approval'::text, 'approved'::text, 'rejected'::text]))) ); - -ALTER TABLE public.notification_templates OWNER TO supabase_admin; - --- --- Name: notifications; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.notifications ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -210,58 +263,22 @@ CREATE TABLE public.notifications ( CONSTRAINT notifications_type_check CHECK ((type = ANY (ARRAY['new_scheduling'::text, 'new_patient'::text, 'recurrence_alert'::text, 'session_status'::text]))) ); - - -CREATE TABLE public.email_layout_config ( +CREATE TABLE public.twilio_subaccount_usage ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, - header_config jsonb DEFAULT '{"layout": null, "content": "", "enabled": false}'::jsonb NOT NULL, - footer_config jsonb DEFAULT '{"layout": null, "content": "", "enabled": false}'::jsonb NOT NULL, + channel_id uuid NOT NULL, + twilio_subaccount_sid text NOT NULL, + period_start date NOT NULL, + period_end date NOT NULL, + messages_sent integer DEFAULT 0 NOT NULL, + messages_delivered integer DEFAULT 0 NOT NULL, + messages_failed integer DEFAULT 0 NOT NULL, + cost_usd numeric(12,6) DEFAULT 0 NOT NULL, + cost_brl numeric(12,4) DEFAULT 0 NOT NULL, + revenue_brl numeric(12,4) DEFAULT 0 NOT NULL, + margin_brl numeric(12,4) GENERATED ALWAYS AS ((revenue_brl - cost_brl)) STORED, + usd_brl_rate numeric(8,4) DEFAULT 0, + synced_at timestamp with time zone DEFAULT now(), created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL + CONSTRAINT twilio_subaccount_usage_period_check CHECK ((period_end >= period_start)) ); - - -ALTER TABLE public.email_layout_config OWNER TO supabase_admin; - --- --- Name: email_templates_global; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.email_templates_global ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - key text NOT NULL, - domain text NOT NULL, - channel text DEFAULT 'email'::text NOT NULL, - subject text NOT NULL, - body_html text NOT NULL, - body_text text, - version integer DEFAULT 1 NOT NULL, - is_active boolean DEFAULT true NOT NULL, - variables jsonb, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.email_templates_global OWNER TO supabase_admin; - --- --- Name: email_templates_tenant; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.email_templates_tenant ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - owner_id uuid, - template_key text NOT NULL, - subject text, - body_html text, - body_text text, - enabled boolean DEFAULT true NOT NULL, - synced_version integer, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - diff --git a/database-novo/schema/04_tables/documentos.sql b/database-novo/schema/04_tables/documentos.sql new file mode 100644 index 0000000..c1f61a1 --- /dev/null +++ b/database-novo/schema/04_tables/documentos.sql @@ -0,0 +1,117 @@ +-- Tables: Documentos +-- Gerado automaticamente em 2026-04-17T12:23:05.229Z +-- Total: 6 + +CREATE TABLE public.document_access_logs ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + documento_id uuid NOT NULL, + tenant_id uuid NOT NULL, + acao text NOT NULL, + user_id uuid, + ip inet, + user_agent text, + acessado_em timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT dal_acao_check CHECK ((acao = ANY (ARRAY['visualizou'::text, 'baixou'::text, 'imprimiu'::text, 'compartilhou'::text, 'assinou'::text]))) +); + +CREATE TABLE public.document_generated ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + template_id uuid NOT NULL, + patient_id uuid NOT NULL, + tenant_id uuid NOT NULL, + dados_preenchidos jsonb DEFAULT '{}'::jsonb NOT NULL, + pdf_path text NOT NULL, + storage_bucket text DEFAULT 'generated-docs'::text NOT NULL, + documento_id uuid, + gerado_por uuid NOT NULL, + gerado_em timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.document_share_links ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + documento_id uuid NOT NULL, + tenant_id uuid NOT NULL, + token text DEFAULT encode(extensions.gen_random_bytes(32), 'hex'::text) NOT NULL, + expira_em timestamp with time zone NOT NULL, + usos_max smallint DEFAULT 5 NOT NULL, + usos smallint DEFAULT 0 NOT NULL, + criado_por uuid NOT NULL, + criado_em timestamp with time zone DEFAULT now(), + ativo boolean DEFAULT true NOT NULL +); + +CREATE TABLE public.document_signatures ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + documento_id uuid NOT NULL, + tenant_id uuid NOT NULL, + signatario_tipo text NOT NULL, + signatario_id uuid, + signatario_nome text, + signatario_email text, + ordem smallint DEFAULT 1 NOT NULL, + status text DEFAULT 'pendente'::text NOT NULL, + ip inet, + user_agent text, + assinado_em timestamp with time zone, + hash_documento text, + criado_em timestamp with time zone DEFAULT now(), + atualizado_em timestamp with time zone DEFAULT now(), + CONSTRAINT ds_signatario_tipo_check CHECK ((signatario_tipo = ANY (ARRAY['paciente'::text, 'responsavel_legal'::text, 'terapeuta'::text]))), + CONSTRAINT ds_status_check CHECK ((status = ANY (ARRAY['pendente'::text, 'enviado'::text, 'assinado'::text, 'recusado'::text, 'expirado'::text]))) +); + +CREATE TABLE public.document_templates ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid, + owner_id uuid, + nome_template text NOT NULL, + tipo text DEFAULT 'outro'::text NOT NULL, + descricao text, + corpo_html text DEFAULT ''::text NOT NULL, + cabecalho_html text, + rodape_html text, + variaveis text[] DEFAULT '{}'::text[], + logo_url text, + is_global boolean DEFAULT false NOT NULL, + ativo boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT dt_tipo_check CHECK ((tipo = ANY (ARRAY['declaracao_comparecimento'::text, 'atestado_psicologico'::text, 'relatorio_acompanhamento'::text, 'recibo_pagamento'::text, 'termo_consentimento'::text, 'encaminhamento'::text, 'contrato_servicos'::text, 'tcle'::text, 'autorizacao_menor'::text, 'laudo_psicologico'::text, 'parecer_psicologico'::text, 'termo_sigilo'::text, 'declaracao_inicio_tratamento'::text, 'termo_alta'::text, 'tcle_online'::text, 'outro'::text]))) +); + +CREATE TABLE public.documents ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + patient_id uuid NOT NULL, + bucket_path text NOT NULL, + storage_bucket text DEFAULT 'documents'::text NOT NULL, + nome_original text NOT NULL, + mime_type text, + tamanho_bytes bigint, + tipo_documento text DEFAULT 'outro'::text NOT NULL, + categoria text, + descricao text, + tags text[] DEFAULT '{}'::text[], + agenda_evento_id uuid, + session_note_id uuid, + visibilidade text DEFAULT 'privado'::text NOT NULL, + compartilhado_portal boolean DEFAULT false NOT NULL, + compartilhado_supervisor boolean DEFAULT false NOT NULL, + compartilhado_em timestamp with time zone, + expira_compartilhamento timestamp with time zone, + enviado_pelo_paciente boolean DEFAULT false NOT NULL, + status_revisao text DEFAULT 'aprovado'::text, + revisado_por uuid, + revisado_em timestamp with time zone, + uploaded_by uuid NOT NULL, + uploaded_at timestamp with time zone DEFAULT now() NOT NULL, + deleted_at timestamp with time zone, + deleted_by uuid, + retencao_ate timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now(), + CONSTRAINT documents_status_revisao_check CHECK ((status_revisao = ANY (ARRAY['pendente'::text, 'aprovado'::text, 'rejeitado'::text]))), + CONSTRAINT documents_tipo_check CHECK ((tipo_documento = ANY (ARRAY['laudo'::text, 'receita'::text, 'exame'::text, 'termo_assinado'::text, 'relatorio_externo'::text, 'identidade'::text, 'convenio'::text, 'declaracao'::text, 'atestado'::text, 'recibo'::text, 'outro'::text]))), + CONSTRAINT documents_visibilidade_check CHECK ((visibilidade = ANY (ARRAY['privado'::text, 'compartilhado_supervisor'::text, 'compartilhado_portal'::text]))) +); diff --git a/database-novo/schema/04_tables/estrutura_calend_rio.sql b/database-novo/schema/04_tables/estrutura_calend_rio.sql new file mode 100644 index 0000000..810a92a --- /dev/null +++ b/database-novo/schema/04_tables/estrutura_calend_rio.sql @@ -0,0 +1,18 @@ +-- Tables: Estrutura / Calendário +-- Gerado automaticamente em 2026-04-17T12:23:05.230Z +-- Total: 1 + +CREATE TABLE public.feriados ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid, + owner_id uuid, + tipo text DEFAULT 'municipal'::text NOT NULL, + nome text NOT NULL, + data date NOT NULL, + cidade text, + estado text, + observacao text, + bloqueia_sessoes boolean DEFAULT false NOT NULL, + criado_em timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT feriados_tipo_check CHECK ((tipo = ANY (ARRAY['municipal'::text, 'personalizado'::text]))) +); diff --git a/database-novo/schema/04_tables/financial.sql b/database-novo/schema/04_tables/financeiro.sql similarity index 69% rename from database-novo/schema/04_tables/financial.sql rename to database-novo/schema/04_tables/financeiro.sql index 1174934..26de5c2 100644 --- a/database-novo/schema/04_tables/financial.sql +++ b/database-novo/schema/04_tables/financeiro.sql @@ -1,10 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Tables — Financeiro --- ============================================================================= --- financial_records, financial_categories, financial_exceptions, --- payment_settings, professional_pricing, therapist_payouts, --- therapist_payout_records, services, insurance_plans, insurance_plan_services --- ============================================================================= +-- Tables: Financeiro +-- Gerado automaticamente em 2026-04-17T12:23:05.228Z +-- Total: 10 CREATE TABLE public.financial_records ( id uuid DEFAULT gen_random_uuid() NOT NULL, @@ -44,7 +40,27 @@ CREATE TABLE public.financial_records ( CONSTRAINT financial_records_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'paid'::text, 'partial'::text, 'overdue'::text, 'cancelled'::text, 'refunded'::text]))) ); - +CREATE TABLE public.therapist_payouts ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + period_start date NOT NULL, + period_end date NOT NULL, + total_sessions integer DEFAULT 0 NOT NULL, + gross_amount numeric(10,2) DEFAULT 0 NOT NULL, + clinic_fee_total numeric(10,2) DEFAULT 0 NOT NULL, + net_amount numeric(10,2) DEFAULT 0 NOT NULL, + status text DEFAULT 'pending'::text NOT NULL, + paid_at timestamp with time zone, + notes text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT therapist_payouts_clinic_fee_total_check CHECK ((clinic_fee_total >= (0)::numeric)), + CONSTRAINT therapist_payouts_gross_amount_check CHECK ((gross_amount >= (0)::numeric)), + CONSTRAINT therapist_payouts_net_amount_check CHECK ((net_amount >= (0)::numeric)), + CONSTRAINT therapist_payouts_period_chk CHECK ((period_end >= period_start)), + CONSTRAINT therapist_payouts_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'paid'::text, 'cancelled'::text]))) +); CREATE TABLE public.financial_categories ( id uuid DEFAULT gen_random_uuid() NOT NULL, @@ -57,13 +73,6 @@ CREATE TABLE public.financial_categories ( created_at timestamp with time zone DEFAULT now() NOT NULL ); - -ALTER TABLE public.financial_categories OWNER TO supabase_admin; - --- --- Name: financial_exceptions; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.financial_exceptions ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid, @@ -79,8 +88,6 @@ CREATE TABLE public.financial_exceptions ( CONSTRAINT financial_exceptions_type_chk CHECK ((exception_type = ANY (ARRAY['patient_no_show'::text, 'patient_cancellation'::text, 'professional_cancellation'::text]))) ); - - CREATE TABLE public.payment_settings ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -106,8 +113,6 @@ CREATE TABLE public.payment_settings ( updated_at timestamp with time zone DEFAULT now() ); - - CREATE TABLE public.professional_pricing ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -119,81 +124,77 @@ CREATE TABLE public.professional_pricing ( updated_at timestamp with time zone DEFAULT now() ); - - -CREATE TABLE public.therapist_payouts ( +CREATE TABLE public.recurrence_exceptions ( id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, + recurrence_id uuid NOT NULL, tenant_id uuid NOT NULL, - period_start date NOT NULL, - period_end date NOT NULL, - total_sessions integer DEFAULT 0 NOT NULL, - gross_amount numeric(10,2) DEFAULT 0 NOT NULL, - clinic_fee_total numeric(10,2) DEFAULT 0 NOT NULL, - net_amount numeric(10,2) DEFAULT 0 NOT NULL, - status text DEFAULT 'pending'::text NOT NULL, - paid_at timestamp with time zone, - notes text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - CONSTRAINT therapist_payouts_clinic_fee_total_check CHECK ((clinic_fee_total >= (0)::numeric)), - CONSTRAINT therapist_payouts_gross_amount_check CHECK ((gross_amount >= (0)::numeric)), - CONSTRAINT therapist_payouts_net_amount_check CHECK ((net_amount >= (0)::numeric)), - CONSTRAINT therapist_payouts_period_chk CHECK ((period_end >= period_start)), - CONSTRAINT therapist_payouts_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'paid'::text, 'cancelled'::text]))) + original_date date NOT NULL, + type public.recurrence_exception_type NOT NULL, + new_date date, + new_start_time time without time zone, + new_end_time time without time zone, + modalidade text, + observacoes text, + titulo_custom text, + extra_fields jsonb, + reason text, + agenda_evento_id uuid, + created_at timestamp with time zone DEFAULT now() NOT NULL ); +CREATE TABLE public.recurrence_rule_services ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + rule_id uuid NOT NULL, + service_id uuid NOT NULL, + quantity integer DEFAULT 1 NOT NULL, + unit_price numeric(10,2) NOT NULL, + discount_pct numeric(5,2) DEFAULT 0, + discount_flat numeric(10,2) DEFAULT 0, + final_price numeric(10,2) NOT NULL, + created_at timestamp with time zone DEFAULT now(), + CONSTRAINT recurrence_rule_services_disc_flat_chk CHECK ((discount_flat >= (0)::numeric)), + CONSTRAINT recurrence_rule_services_disc_pct_chk CHECK (((discount_pct >= (0)::numeric) AND (discount_pct <= (100)::numeric))), + CONSTRAINT recurrence_rule_services_final_price_chk CHECK ((final_price >= (0)::numeric)), + CONSTRAINT recurrence_rule_services_quantity_chk CHECK ((quantity > 0)) +); +CREATE TABLE public.recurrence_rules ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + owner_id uuid NOT NULL, + therapist_id uuid, + patient_id uuid, + determined_commitment_id uuid, + type public.recurrence_type DEFAULT 'weekly'::public.recurrence_type NOT NULL, + "interval" smallint DEFAULT 1 NOT NULL, + weekdays smallint[] DEFAULT '{}'::smallint[] NOT NULL, + start_time time without time zone NOT NULL, + end_time time without time zone NOT NULL, + timezone text DEFAULT 'America/Sao_Paulo'::text NOT NULL, + duration_min smallint DEFAULT 50 NOT NULL, + start_date date NOT NULL, + end_date date, + max_occurrences integer, + open_ended boolean DEFAULT true NOT NULL, + modalidade text DEFAULT 'presencial'::text, + titulo_custom text, + observacoes text, + extra_fields jsonb, + status text DEFAULT 'ativo'::text NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + price numeric(10,2), + insurance_plan_id uuid, + insurance_guide_number text, + insurance_value numeric(10,2), + insurance_plan_service_id uuid, + CONSTRAINT recurrence_rules_dates_chk CHECK (((end_date IS NULL) OR (end_date >= start_date))), + CONSTRAINT recurrence_rules_interval_chk CHECK (("interval" >= 1)), + CONSTRAINT recurrence_rules_status_check CHECK ((status = ANY (ARRAY['ativo'::text, 'pausado'::text, 'cancelado'::text]))), + CONSTRAINT recurrence_rules_times_chk CHECK ((end_time > start_time)) +); CREATE TABLE public.therapist_payout_records ( payout_id uuid NOT NULL, financial_record_id uuid NOT NULL ); - - - -CREATE TABLE public.services ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, - tenant_id uuid NOT NULL, - name text NOT NULL, - description text, - price numeric(10,2) NOT NULL, - duration_min integer, - active boolean DEFAULT true NOT NULL, - created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now() -); - - - -CREATE TABLE public.insurance_plan_services ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - insurance_plan_id uuid NOT NULL, - name text NOT NULL, - value numeric(10,2) NOT NULL, - active boolean DEFAULT true NOT NULL, - created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now() -); - - -ALTER TABLE public.insurance_plan_services OWNER TO supabase_admin; - --- --- Name: insurance_plans; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.insurance_plans ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, - tenant_id uuid NOT NULL, - name text NOT NULL, - notes text, - default_value numeric(10,2), - active boolean DEFAULT true NOT NULL, - created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now() -); - - diff --git a/database-novo/schema/04_tables/infra.sql b/database-novo/schema/04_tables/infra.sql deleted file mode 100644 index 93e9498..0000000 --- a/database-novo/schema/04_tables/infra.sql +++ /dev/null @@ -1,500 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Tables — Infraestrutura (realtime, storage, supabase_functions) --- ============================================================================= - -CREATE TABLE _realtime.extensions ( - id uuid NOT NULL, - type text, - settings jsonb, - tenant_external_id text, - inserted_at timestamp(0) without time zone NOT NULL, - updated_at timestamp(0) without time zone NOT NULL -); - - -ALTER TABLE _realtime.extensions OWNER TO supabase_admin; - --- --- Name: schema_migrations; Type: TABLE; Schema: _realtime; Owner: supabase_admin --- - -CREATE TABLE _realtime.schema_migrations ( - version bigint NOT NULL, - inserted_at timestamp(0) without time zone -); - - -ALTER TABLE _realtime.schema_migrations OWNER TO supabase_admin; - --- --- Name: tenants; Type: TABLE; Schema: _realtime; Owner: supabase_admin --- - -CREATE TABLE _realtime.tenants ( - id uuid NOT NULL, - name text, - external_id text, - jwt_secret text, - max_concurrent_users integer DEFAULT 200 NOT NULL, - inserted_at timestamp(0) without time zone NOT NULL, - updated_at timestamp(0) without time zone NOT NULL, - max_events_per_second integer DEFAULT 100 NOT NULL, - postgres_cdc_default text DEFAULT 'postgres_cdc_rls'::text, - max_bytes_per_second integer DEFAULT 100000 NOT NULL, - max_channels_per_client integer DEFAULT 100 NOT NULL, - max_joins_per_second integer DEFAULT 500 NOT NULL, - suspend boolean DEFAULT false, - jwt_jwks jsonb, - notify_private_alpha boolean DEFAULT false, - private_only boolean DEFAULT false NOT NULL, - migrations_ran integer DEFAULT 0, - broadcast_adapter character varying(255) DEFAULT 'gen_rpc'::character varying, - max_presence_events_per_second integer DEFAULT 1000, - max_payload_size_in_kb integer DEFAULT 3000, - CONSTRAINT jwt_secret_or_jwt_jwks_required CHECK (((jwt_secret IS NOT NULL) OR (jwt_jwks IS NOT NULL))) -); - - -ALTER TABLE _realtime.tenants OWNER TO supabase_admin; - --- --- Name: audit_log_entries; Type: TABLE; Schema: auth; Owner: supabase_auth_admin --- - - -CREATE TABLE realtime.messages ( - topic text NOT NULL, - extension text NOT NULL, - payload jsonb, - event text, - private boolean DEFAULT false, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - inserted_at timestamp without time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL -) -PARTITION BY RANGE (inserted_at); - - -ALTER TABLE realtime.messages OWNER TO supabase_realtime_admin; - --- --- Name: messages_2026_03_20; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.messages_2026_03_20 ( - topic text NOT NULL, - extension text NOT NULL, - payload jsonb, - event text, - private boolean DEFAULT false, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - inserted_at timestamp without time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL -); - - -ALTER TABLE realtime.messages_2026_03_20 OWNER TO supabase_admin; - --- --- Name: messages_2026_03_21; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.messages_2026_03_21 ( - topic text NOT NULL, - extension text NOT NULL, - payload jsonb, - event text, - private boolean DEFAULT false, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - inserted_at timestamp without time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL -); - - -ALTER TABLE realtime.messages_2026_03_21 OWNER TO supabase_admin; - --- --- Name: messages_2026_03_22; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.messages_2026_03_22 ( - topic text NOT NULL, - extension text NOT NULL, - payload jsonb, - event text, - private boolean DEFAULT false, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - inserted_at timestamp without time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL -); - - -ALTER TABLE realtime.messages_2026_03_22 OWNER TO supabase_admin; - --- --- Name: messages_2026_03_23; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.messages_2026_03_23 ( - topic text NOT NULL, - extension text NOT NULL, - payload jsonb, - event text, - private boolean DEFAULT false, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - inserted_at timestamp without time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL -); - - -ALTER TABLE realtime.messages_2026_03_23 OWNER TO supabase_admin; - --- --- Name: messages_2026_03_24; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.messages_2026_03_24 ( - topic text NOT NULL, - extension text NOT NULL, - payload jsonb, - event text, - private boolean DEFAULT false, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - inserted_at timestamp without time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL -); - - -ALTER TABLE realtime.messages_2026_03_24 OWNER TO supabase_admin; - --- --- Name: messages_2026_03_25; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.messages_2026_03_25 ( - topic text NOT NULL, - extension text NOT NULL, - payload jsonb, - event text, - private boolean DEFAULT false, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - inserted_at timestamp without time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL -); - - -ALTER TABLE realtime.messages_2026_03_25 OWNER TO supabase_admin; - --- --- Name: messages_2026_03_26; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.messages_2026_03_26 ( - topic text NOT NULL, - extension text NOT NULL, - payload jsonb, - event text, - private boolean DEFAULT false, - updated_at timestamp without time zone DEFAULT now() NOT NULL, - inserted_at timestamp without time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL -); - - -ALTER TABLE realtime.messages_2026_03_26 OWNER TO supabase_admin; - --- --- Name: schema_migrations; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.schema_migrations ( - version bigint NOT NULL, - inserted_at timestamp(0) without time zone -); - - -ALTER TABLE realtime.schema_migrations OWNER TO supabase_admin; - --- --- Name: subscription; Type: TABLE; Schema: realtime; Owner: supabase_admin --- - -CREATE TABLE realtime.subscription ( - id bigint NOT NULL, - subscription_id uuid NOT NULL, - entity regclass NOT NULL, - filters realtime.user_defined_filter[] DEFAULT '{}'::realtime.user_defined_filter[] NOT NULL, - claims jsonb NOT NULL, - claims_role regrole GENERATED ALWAYS AS (realtime.to_regrole((claims ->> 'role'::text))) STORED NOT NULL, - created_at timestamp without time zone DEFAULT timezone('utc'::text, now()) NOT NULL -); - - -ALTER TABLE realtime.subscription OWNER TO supabase_admin; - --- --- Name: subscription_id_seq; Type: SEQUENCE; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE realtime.subscription ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY ( - SEQUENCE NAME realtime.subscription_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1 -); - - --- --- Name: buckets; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - - -CREATE TABLE storage.buckets ( - id text NOT NULL, - name text NOT NULL, - owner uuid, - created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now(), - public boolean DEFAULT false, - avif_autodetection boolean DEFAULT false, - file_size_limit bigint, - allowed_mime_types text[], - owner_id text, - type storage.buckettype DEFAULT 'STANDARD'::storage.buckettype NOT NULL -); - - -ALTER TABLE storage.buckets OWNER TO supabase_storage_admin; - --- --- Name: COLUMN buckets.owner; Type: COMMENT; Schema: storage; Owner: supabase_storage_admin --- - -COMMENT ON COLUMN storage.buckets.owner IS 'Field is deprecated, use owner_id instead'; - - --- --- Name: buckets_analytics; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.buckets_analytics ( - name text NOT NULL, - type storage.buckettype DEFAULT 'ANALYTICS'::storage.buckettype NOT NULL, - format text DEFAULT 'ICEBERG'::text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - id uuid DEFAULT gen_random_uuid() NOT NULL, - deleted_at timestamp with time zone -); - - -ALTER TABLE storage.buckets_analytics OWNER TO supabase_storage_admin; - --- --- Name: buckets_vectors; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.buckets_vectors ( - id text NOT NULL, - type storage.buckettype DEFAULT 'VECTOR'::storage.buckettype NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE storage.buckets_vectors OWNER TO supabase_storage_admin; - --- --- Name: iceberg_namespaces; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.iceberg_namespaces ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - bucket_name text NOT NULL, - name text NOT NULL COLLATE pg_catalog."C", - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - metadata jsonb DEFAULT '{}'::jsonb NOT NULL, - catalog_id uuid NOT NULL -); - - -ALTER TABLE storage.iceberg_namespaces OWNER TO supabase_storage_admin; - --- --- Name: iceberg_tables; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.iceberg_tables ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - namespace_id uuid NOT NULL, - bucket_name text NOT NULL, - name text NOT NULL COLLATE pg_catalog."C", - location text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - remote_table_id text, - shard_key text, - shard_id text, - catalog_id uuid NOT NULL -); - - -ALTER TABLE storage.iceberg_tables OWNER TO supabase_storage_admin; - --- --- Name: migrations; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.migrations ( - id integer NOT NULL, - name character varying(100) NOT NULL, - hash character varying(40) NOT NULL, - executed_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP -); - - -ALTER TABLE storage.migrations OWNER TO supabase_storage_admin; - --- --- Name: objects; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.objects ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - bucket_id text, - name text, - owner uuid, - created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now(), - last_accessed_at timestamp with time zone DEFAULT now(), - metadata jsonb, - path_tokens text[] GENERATED ALWAYS AS (string_to_array(name, '/'::text)) STORED, - version text, - owner_id text, - user_metadata jsonb -); - - -ALTER TABLE storage.objects OWNER TO supabase_storage_admin; - --- --- Name: COLUMN objects.owner; Type: COMMENT; Schema: storage; Owner: supabase_storage_admin --- - -COMMENT ON COLUMN storage.objects.owner IS 'Field is deprecated, use owner_id instead'; - - --- --- Name: s3_multipart_uploads; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.s3_multipart_uploads ( - id text NOT NULL, - in_progress_size bigint DEFAULT 0 NOT NULL, - upload_signature text NOT NULL, - bucket_id text NOT NULL, - key text NOT NULL COLLATE pg_catalog."C", - version text NOT NULL, - owner_id text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - user_metadata jsonb -); - - -ALTER TABLE storage.s3_multipart_uploads OWNER TO supabase_storage_admin; - --- --- Name: s3_multipart_uploads_parts; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.s3_multipart_uploads_parts ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - upload_id text NOT NULL, - size bigint DEFAULT 0 NOT NULL, - part_number integer NOT NULL, - bucket_id text NOT NULL, - key text NOT NULL COLLATE pg_catalog."C", - etag text NOT NULL, - owner_id text, - version text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE storage.s3_multipart_uploads_parts OWNER TO supabase_storage_admin; - --- --- Name: vector_indexes; Type: TABLE; Schema: storage; Owner: supabase_storage_admin --- - -CREATE TABLE storage.vector_indexes ( - id text DEFAULT gen_random_uuid() NOT NULL, - name text NOT NULL COLLATE pg_catalog."C", - bucket_id text NOT NULL, - data_type text NOT NULL, - dimension integer NOT NULL, - distance_metric text NOT NULL, - metadata_configuration jsonb, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE supabase_functions.hooks ( - id bigint NOT NULL, - hook_table_id integer NOT NULL, - hook_name text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - request_id bigint -); - - -ALTER TABLE supabase_functions.hooks OWNER TO supabase_functions_admin; - --- --- Name: TABLE hooks; Type: COMMENT; Schema: supabase_functions; Owner: supabase_functions_admin --- - -COMMENT ON TABLE supabase_functions.hooks IS 'Supabase Functions Hooks: Audit trail for triggered hooks.'; - - --- --- Name: hooks_id_seq; Type: SEQUENCE; Schema: supabase_functions; Owner: supabase_functions_admin --- - -CREATE SEQUENCE supabase_functions.hooks_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - -ALTER SEQUENCE supabase_functions.hooks_id_seq OWNER TO supabase_functions_admin; - --- --- Name: hooks_id_seq; Type: SEQUENCE OWNED BY; Schema: supabase_functions; Owner: supabase_functions_admin --- - -ALTER SEQUENCE supabase_functions.hooks_id_seq OWNED BY supabase_functions.hooks.id; - - --- --- Name: migrations; Type: TABLE; Schema: supabase_functions; Owner: supabase_functions_admin --- - -CREATE TABLE supabase_functions.migrations ( - version text NOT NULL, - inserted_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE supabase_functions.migrations OWNER TO supabase_functions_admin; - --- --- Name: messages_2026_03_20; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin --- diff --git a/database-novo/schema/04_tables/outros.sql b/database-novo/schema/04_tables/outros.sql new file mode 100644 index 0000000..3803ba4 --- /dev/null +++ b/database-novo/schema/04_tables/outros.sql @@ -0,0 +1,11 @@ +-- Tables: outros +-- Gerado automaticamente em 2026-04-17T12:23:05.228Z +-- Total: 1 + +CREATE TABLE public._db_migrations ( + id integer NOT NULL, + filename text NOT NULL, + hash text NOT NULL, + category text DEFAULT 'migration'::text NOT NULL, + applied_at timestamp with time zone DEFAULT now() NOT NULL +); diff --git a/database-novo/schema/04_tables/patients.sql b/database-novo/schema/04_tables/pacientes.sql similarity index 53% rename from database-novo/schema/04_tables/patients.sql rename to database-novo/schema/04_tables/pacientes.sql index fc665b4..acf7131 100644 --- a/database-novo/schema/04_tables/patients.sql +++ b/database-novo/schema/04_tables/pacientes.sql @@ -1,10 +1,177 @@ --- ============================================================================= --- AgenciaPsi — Tables — Pacientes --- ============================================================================= --- patients, patient_groups, patient_group_patient, patient_tags, --- patient_patient_tag, patient_intake_requests, patient_invites, --- patient_discounts --- ============================================================================= +-- Tables: Pacientes +-- Gerado automaticamente em 2026-04-17T12:23:05.230Z +-- Total: 12 + +CREATE TABLE public.patient_contacts ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + patient_id uuid NOT NULL, + tenant_id uuid NOT NULL, + nome text NOT NULL, + tipo text NOT NULL, + relacao text, + telefone text, + email text, + cpf text, + especialidade text, + registro_profissional text, + is_primario boolean DEFAULT false NOT NULL, + ativo boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT patient_contacts_tipo_check CHECK ((tipo = ANY (ARRAY['emergencia'::text, 'responsavel_legal'::text, 'profissional_saude'::text, 'outro'::text]))) +); + +CREATE TABLE public.patient_discounts ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + patient_id uuid NOT NULL, + discount_pct numeric(5,2) DEFAULT 0, + discount_flat numeric(10,2) DEFAULT 0, + reason text, + active boolean DEFAULT true NOT NULL, + active_from timestamp with time zone DEFAULT now(), + active_to timestamp with time zone, + created_at timestamp with time zone DEFAULT now() +); + +CREATE TABLE public.patient_group_patient ( + patient_group_id uuid NOT NULL, + patient_id uuid NOT NULL, + created_at timestamp with time zone DEFAULT now(), + tenant_id uuid NOT NULL +); + +CREATE TABLE public.patient_groups ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + nome text NOT NULL, + descricao text, + cor text, + is_active boolean DEFAULT true NOT NULL, + is_system boolean DEFAULT false NOT NULL, + owner_id uuid DEFAULT auth.uid() NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + therapist_id uuid, + tenant_id uuid NOT NULL +); + +CREATE TABLE public.patient_intake_requests ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + token text NOT NULL, + consent boolean DEFAULT false NOT NULL, + status text DEFAULT 'new'::text NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + converted_patient_id uuid, + rejected_reason text, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + cpf text, + rg text, + cep text, + nome_completo text, + email_principal text, + telefone text, + pais text, + cidade text, + estado text, + endereco text, + numero text, + bairro text, + complemento text, + data_nascimento date, + naturalidade text, + genero text, + estado_civil text, + onde_nos_conheceu text, + encaminhado_por text, + observacoes text, + notas_internas text, + email_alternativo text, + telefone_alternativo text, + profissao text, + escolaridade text, + nacionalidade text, + avatar_url text, + tenant_id uuid, + CONSTRAINT chk_intakes_status CHECK ((status = ANY (ARRAY['new'::text, 'converted'::text, 'rejected'::text]))) +); + +CREATE TABLE public.patient_invites ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + token text NOT NULL, + active boolean DEFAULT true NOT NULL, + expires_at timestamp with time zone, + max_uses integer, + uses integer DEFAULT 0 NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + tenant_id uuid +); + +CREATE TABLE public.patient_patient_tag ( + owner_id uuid NOT NULL, + patient_id uuid NOT NULL, + tag_id uuid NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + tenant_id uuid NOT NULL +); + +CREATE TABLE public.patient_status_history ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + patient_id uuid NOT NULL, + tenant_id uuid NOT NULL, + status_anterior text, + status_novo text NOT NULL, + motivo text, + encaminhado_para text, + data_saida date, + alterado_por uuid, + alterado_em timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT psh_status_novo_check CHECK ((status_novo = ANY (ARRAY['Ativo'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text]))) +); + +CREATE TABLE public.patient_support_contacts ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + patient_id uuid NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + nome text, + relacao text, + tipo text, + telefone text, + email text, + is_primario boolean DEFAULT false NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + +CREATE TABLE public.patient_tags ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + nome text NOT NULL, + cor text, + is_padrao boolean DEFAULT false NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone, + tenant_id uuid NOT NULL +); + +CREATE TABLE public.patient_timeline ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + patient_id uuid NOT NULL, + tenant_id uuid NOT NULL, + evento_tipo text NOT NULL, + titulo text NOT NULL, + descricao text, + icone_cor text DEFAULT 'gray'::text, + link_ref_tipo text, + link_ref_id uuid, + gerado_por uuid, + ocorrido_em timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT pt_evento_tipo_check CHECK ((evento_tipo = ANY (ARRAY['primeira_sessao'::text, 'sessao_realizada'::text, 'sessao_cancelada'::text, 'falta'::text, 'status_alterado'::text, 'risco_sinalizado'::text, 'risco_removido'::text, 'documento_assinado'::text, 'documento_adicionado'::text, 'escala_respondida'::text, 'escala_enviada'::text, 'pagamento_vencido'::text, 'pagamento_recebido'::text, 'tarefa_combinada'::text, 'contato_adicionado'::text, 'prontuario_editado'::text, 'nota_adicionada'::text, 'manual'::text]))), + CONSTRAINT pt_icone_cor_check CHECK ((icone_cor = ANY (ARRAY['green'::text, 'blue'::text, 'amber'::text, 'red'::text, 'gray'::text, 'purple'::text]))) +); CREATE TABLE public.patients ( id uuid DEFAULT gen_random_uuid() NOT NULL, @@ -54,132 +221,31 @@ CREATE TABLE public.patients ( user_id uuid, patient_scope text DEFAULT 'clinic'::text NOT NULL, therapist_member_id uuid, + nome_social text, + pronomes text, + etnia text, + religiao text, + faixa_renda text, + canal_preferido text DEFAULT 'whatsapp'::text, + horario_contato_inicio time without time zone DEFAULT '08:00:00'::time without time zone, + horario_contato_fim time without time zone DEFAULT '20:00:00'::time without time zone, + idioma text DEFAULT 'pt-BR'::text, + origem text, + metodo_pagamento_preferido text, + motivo_saida text, + data_saida date, + encaminhado_para text, + risco_elevado boolean DEFAULT false NOT NULL, + risco_nota text, + risco_sinalizado_em timestamp with time zone, + risco_sinalizado_por uuid, + horario_contato text, + convenio text, + convenio_id uuid, CONSTRAINT cpf_responsavel_format_check CHECK (((cpf_responsavel IS NULL) OR (cpf_responsavel ~ '^\d{11}$'::text))), CONSTRAINT patients_cpf_format_check CHECK (((cpf IS NULL) OR (cpf ~ '^\d{11}$'::text))), - CONSTRAINT patients_patient_scope_check CHECK ((patient_scope = ANY (ARRAY['clinic'::text, 'therapist'::text]))), - CONSTRAINT patients_status_check CHECK ((status = ANY (ARRAY['Ativo'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text]))), - CONSTRAINT patients_therapist_scope_consistency CHECK ((((patient_scope = 'clinic'::text) AND (therapist_member_id IS NULL)) OR ((patient_scope = 'therapist'::text) AND (therapist_member_id IS NOT NULL)))) + CONSTRAINT patients_faixa_renda_check CHECK (((faixa_renda IS NULL) OR (faixa_renda = ANY (ARRAY['ate_1sm'::text, '1_3sm'::text, '3_6sm'::text, '6_10sm'::text, 'acima_10sm'::text, 'nao_informado'::text])))), + CONSTRAINT patients_metodo_pagamento_check CHECK (((metodo_pagamento_preferido IS NULL) OR (metodo_pagamento_preferido = ANY (ARRAY['pix'::text, 'cartao'::text, 'dinheiro'::text, 'deposito'::text, 'convenio'::text])))), + CONSTRAINT patients_risco_consistency_check CHECK (((risco_elevado = false) OR ((risco_elevado = true) AND (risco_nota IS NOT NULL) AND (risco_sinalizado_por IS NOT NULL)))), + CONSTRAINT patients_status_check CHECK ((status = ANY (ARRAY['Ativo'::text, 'Em espera'::text, 'Inativo'::text, 'Alta'::text, 'Encaminhado'::text, 'Arquivado'::text]))) ); - - - -CREATE TABLE public.patient_groups ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - nome text NOT NULL, - descricao text, - cor text, - is_active boolean DEFAULT true NOT NULL, - is_system boolean DEFAULT false NOT NULL, - owner_id uuid DEFAULT auth.uid() NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - therapist_id uuid, - tenant_id uuid NOT NULL -); - - - -CREATE TABLE public.patient_group_patient ( - patient_group_id uuid NOT NULL, - patient_id uuid NOT NULL, - created_at timestamp with time zone DEFAULT now(), - tenant_id uuid NOT NULL -); - - - -CREATE TABLE public.patient_tags ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, - nome text NOT NULL, - cor text, - is_padrao boolean DEFAULT false NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone, - tenant_id uuid NOT NULL -); - - - -CREATE TABLE public.patient_patient_tag ( - owner_id uuid NOT NULL, - patient_id uuid NOT NULL, - tag_id uuid NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - tenant_id uuid NOT NULL -); - - - -CREATE TABLE public.patient_intake_requests ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, - token text NOT NULL, - consent boolean DEFAULT false NOT NULL, - status text DEFAULT 'new'::text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - converted_patient_id uuid, - rejected_reason text, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - cpf text, - rg text, - cep text, - nome_completo text, - email_principal text, - telefone text, - pais text, - cidade text, - estado text, - endereco text, - numero text, - bairro text, - complemento text, - data_nascimento date, - naturalidade text, - genero text, - estado_civil text, - onde_nos_conheceu text, - encaminhado_por text, - observacoes text, - notas_internas text, - email_alternativo text, - telefone_alternativo text, - profissao text, - escolaridade text, - nacionalidade text, - avatar_url text, - tenant_id uuid, - CONSTRAINT chk_intakes_status CHECK ((status = ANY (ARRAY['new'::text, 'converted'::text, 'rejected'::text]))) -); - - - -CREATE TABLE public.patient_invites ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, - token text NOT NULL, - active boolean DEFAULT true NOT NULL, - expires_at timestamp with time zone, - max_uses integer, - uses integer DEFAULT 0 NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - tenant_id uuid -); - - - -CREATE TABLE public.patient_discounts ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - owner_id uuid NOT NULL, - tenant_id uuid NOT NULL, - patient_id uuid NOT NULL, - discount_pct numeric(5,2) DEFAULT 0, - discount_flat numeric(10,2) DEFAULT 0, - reason text, - active boolean DEFAULT true NOT NULL, - active_from timestamp with time zone DEFAULT now(), - active_to timestamp with time zone, - created_at timestamp with time zone DEFAULT now() -); - - diff --git a/database-novo/schema/04_tables/saas_admin.sql b/database-novo/schema/04_tables/saas_admin.sql deleted file mode 100644 index d610e30..0000000 --- a/database-novo/schema/04_tables/saas_admin.sql +++ /dev/null @@ -1,204 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Tables — SaaS Admin, FAQ, Docs, UI --- ============================================================================= --- saas_docs, saas_doc_votos, saas_faq, saas_faq_itens, --- feriados, global_notices, login_carousel_slides, notice_dismissals, --- support_sessions --- ============================================================================= - -CREATE TABLE public.saas_doc_votos ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - doc_id uuid NOT NULL, - user_id uuid NOT NULL, - util boolean NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.saas_doc_votos OWNER TO supabase_admin; - --- --- Name: saas_docs; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.saas_docs ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - titulo text NOT NULL, - conteudo text DEFAULT ''::text NOT NULL, - medias jsonb DEFAULT '[]'::jsonb NOT NULL, - tipo_acesso text DEFAULT 'usuario'::text NOT NULL, - pagina_path text NOT NULL, - docs_relacionados uuid[] DEFAULT '{}'::uuid[] NOT NULL, - ativo boolean DEFAULT true NOT NULL, - ordem integer DEFAULT 0 NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - categoria text, - exibir_no_faq boolean DEFAULT false NOT NULL, - votos_util integer DEFAULT 0 NOT NULL, - votos_nao_util integer DEFAULT 0 NOT NULL, - CONSTRAINT saas_docs_tipo_acesso_check CHECK ((tipo_acesso = ANY (ARRAY['admin'::text, 'usuario'::text]))) -); - - -ALTER TABLE public.saas_docs OWNER TO supabase_admin; - --- --- Name: COLUMN saas_docs.categoria; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON COLUMN public.saas_docs.categoria IS 'Agrupa docs no portal FAQ (ex: Conta, Agenda, Pagamentos)'; - - --- --- Name: COLUMN saas_docs.exibir_no_faq; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON COLUMN public.saas_docs.exibir_no_faq IS 'Se true, a doc e seus itens FAQ aparecem no portal de FAQ'; - - --- --- Name: saas_faq; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.saas_faq ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - pergunta text NOT NULL, - categoria text, - publico boolean DEFAULT false NOT NULL, - votos integer DEFAULT 0 NOT NULL, - titulo text, - conteudo text, - tipo_acesso text DEFAULT 'usuario'::text NOT NULL, - pagina_path text NOT NULL, - pagina_label text, - medias jsonb DEFAULT '[]'::jsonb NOT NULL, - faqs_relacionados uuid[] DEFAULT '{}'::uuid[] NOT NULL, - ativo boolean DEFAULT true NOT NULL, - ordem integer DEFAULT 0 NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.saas_faq OWNER TO supabase_admin; - --- --- Name: saas_faq_itens; Type: TABLE; Schema: public; Owner: supabase_admin --- - -CREATE TABLE public.saas_faq_itens ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - doc_id uuid NOT NULL, - pergunta text NOT NULL, - resposta text, - ordem integer DEFAULT 0 NOT NULL, - ativo boolean DEFAULT true NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.saas_faq_itens OWNER TO supabase_admin; - --- --- Name: TABLE saas_faq_itens; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON TABLE public.saas_faq_itens IS 'Pares pergunta/resposta vinculados a um documento de ajuda'; - - --- --- Name: services; Type: TABLE; Schema: public; Owner: supabase_admin --- - - -CREATE TABLE public.feriados ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid, - owner_id uuid, - tipo text DEFAULT 'municipal'::text NOT NULL, - nome text NOT NULL, - data date NOT NULL, - cidade text, - estado text, - observacao text, - bloqueia_sessoes boolean DEFAULT false NOT NULL, - criado_em timestamp with time zone DEFAULT now() NOT NULL, - CONSTRAINT feriados_tipo_check CHECK ((tipo = ANY (ARRAY['municipal'::text, 'personalizado'::text]))) -); - - - -CREATE TABLE public.global_notices ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - title text, - message text DEFAULT ''::text NOT NULL, - variant text DEFAULT 'info'::text NOT NULL, - roles text[] DEFAULT '{}'::text[] NOT NULL, - contexts text[] DEFAULT '{}'::text[] NOT NULL, - starts_at timestamp with time zone, - ends_at timestamp with time zone, - is_active boolean DEFAULT true NOT NULL, - priority integer DEFAULT 0 NOT NULL, - dismissible boolean DEFAULT true NOT NULL, - persist_dismiss boolean DEFAULT true NOT NULL, - dismiss_scope text DEFAULT 'device'::text NOT NULL, - show_once boolean DEFAULT false NOT NULL, - max_views integer, - cooldown_minutes integer, - version integer DEFAULT 1 NOT NULL, - action_type text DEFAULT 'none'::text NOT NULL, - action_label text, - action_url text, - action_route text, - views_count integer DEFAULT 0 NOT NULL, - clicks_count integer DEFAULT 0 NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - created_by uuid, - content_align text DEFAULT 'left'::text NOT NULL, - link_target text DEFAULT '_blank'::text NOT NULL, - CONSTRAINT global_notices_action_type_check CHECK ((action_type = ANY (ARRAY['none'::text, 'internal'::text, 'external'::text]))), - CONSTRAINT global_notices_content_align_check CHECK ((content_align = ANY (ARRAY['left'::text, 'center'::text, 'right'::text, 'justify'::text]))), - CONSTRAINT global_notices_dismiss_scope_check CHECK ((dismiss_scope = ANY (ARRAY['session'::text, 'device'::text, 'user'::text]))), - CONSTRAINT global_notices_link_target_check CHECK ((link_target = ANY (ARRAY['_blank'::text, '_self'::text, '_parent'::text, '_top'::text]))), - CONSTRAINT global_notices_variant_check CHECK ((variant = ANY (ARRAY['info'::text, 'success'::text, 'warning'::text, 'error'::text]))) -); - - - -CREATE TABLE public.login_carousel_slides ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - title text NOT NULL, - body text NOT NULL, - icon text DEFAULT 'pi-star'::text NOT NULL, - ordem integer DEFAULT 0 NOT NULL, - ativo boolean DEFAULT true NOT NULL, - created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now() -); - - - -CREATE TABLE public.notice_dismissals ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - notice_id uuid NOT NULL, - user_id uuid NOT NULL, - version integer DEFAULT 1 NOT NULL, - dismissed_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE public.support_sessions ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - admin_id uuid NOT NULL, - token text DEFAULT encode(extensions.gen_random_bytes(32), 'hex'::text) NOT NULL, - expires_at timestamp with time zone DEFAULT (now() + '01:00:00'::interval) NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - diff --git a/database-novo/schema/04_tables/plans_billing.sql b/database-novo/schema/04_tables/saas_planos.sql similarity index 73% rename from database-novo/schema/04_tables/plans_billing.sql rename to database-novo/schema/04_tables/saas_planos.sql index 8ca5b01..913e2fe 100644 --- a/database-novo/schema/04_tables/plans_billing.sql +++ b/database-novo/schema/04_tables/saas_planos.sql @@ -1,115 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Tables — Plans, Billing, Subscriptions --- ============================================================================= --- plans, plan_prices, plan_features, plan_public, plan_public_bullets, --- features, entitlements_invalidation, subscriptions, subscription_events, --- subscription_intents_personal, subscription_intents_tenant, --- subscription_intents_legacy, billing_contracts, --- addon_credits, addon_products, addon_transactions, --- modules, module_features, tenant_modules --- ============================================================================= - -CREATE TABLE public.plans ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - key text NOT NULL, - name text NOT NULL, - description text, - is_active boolean DEFAULT true NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - price_cents integer DEFAULT 0 NOT NULL, - currency text DEFAULT 'BRL'::text NOT NULL, - billing_interval text DEFAULT 'month'::text NOT NULL, - target text, - max_supervisees integer, - CONSTRAINT plans_target_check CHECK ((target = ANY (ARRAY['patient'::text, 'therapist'::text, 'clinic'::text, 'supervisor'::text]))) -); - - - -CREATE TABLE public.plan_prices ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - plan_id uuid NOT NULL, - currency text DEFAULT 'BRL'::text NOT NULL, - "interval" text NOT NULL, - amount_cents integer NOT NULL, - is_active boolean DEFAULT true NOT NULL, - active_from timestamp with time zone DEFAULT now() NOT NULL, - active_to timestamp with time zone, - source text DEFAULT 'manual'::text NOT NULL, - provider text, - provider_price_id text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - CONSTRAINT plan_prices_amount_cents_check CHECK ((amount_cents >= 0)), - CONSTRAINT plan_prices_interval_check CHECK (("interval" = ANY (ARRAY['month'::text, 'year'::text]))) -); - - - -CREATE TABLE public.plan_features ( - plan_id uuid NOT NULL, - feature_id uuid NOT NULL, - enabled boolean DEFAULT true NOT NULL, - limits jsonb, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE public.plan_public ( - plan_id uuid NOT NULL, - public_name text DEFAULT ''::text NOT NULL, - public_description text DEFAULT ''::text NOT NULL, - badge text, - is_featured boolean DEFAULT false NOT NULL, - is_visible boolean DEFAULT true NOT NULL, - sort_order integer DEFAULT 0 NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE public.plan_public_bullets ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - plan_id uuid NOT NULL, - text text NOT NULL, - sort_order integer DEFAULT 0 NOT NULL, - highlight boolean DEFAULT false NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE public.features ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - key text NOT NULL, - description text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - descricao text DEFAULT ''::text NOT NULL, - name text DEFAULT ''::text NOT NULL -); - - -ALTER TABLE public.features OWNER TO supabase_admin; - --- --- Name: COLUMN features.descricao; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON COLUMN public.features.descricao IS 'Descrição humana da feature (exibição no admin e documentação).'; - - --- --- Name: feriados; Type: TABLE; Schema: public; Owner: supabase_admin --- - - -CREATE TABLE public.entitlements_invalidation ( - owner_id uuid NOT NULL, - changed_at timestamp with time zone DEFAULT now() NOT NULL -); - - +-- Tables: SaaS / Planos +-- Gerado automaticamente em 2026-04-17T12:23:05.227Z +-- Total: 18 CREATE TABLE public.subscriptions ( id uuid DEFAULT gen_random_uuid() NOT NULL, @@ -142,92 +33,6 @@ CREATE TABLE public.subscriptions ( CONSTRAINT subscriptions_status_check CHECK ((status = ANY (ARRAY['pending'::text, 'active'::text, 'past_due'::text, 'suspended'::text, 'cancelled'::text, 'expired'::text]))) ); -CREATE TABLE public.subscription_events ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - subscription_id uuid NOT NULL, - owner_id uuid NOT NULL, - event_type text NOT NULL, - old_plan_id uuid, - new_plan_id uuid, - created_at timestamp with time zone DEFAULT now() NOT NULL, - created_by uuid, - source text DEFAULT 'admin_ui'::text, - reason text, - metadata jsonb, - owner_type text NOT NULL, - owner_ref uuid NOT NULL, - CONSTRAINT subscription_events_owner_ref_consistency_chk CHECK ((owner_id = owner_ref)), - CONSTRAINT subscription_events_owner_type_chk CHECK (((owner_type IS NULL) OR (owner_type = ANY (ARRAY['clinic'::text, 'therapist'::text])))) -); - - - -CREATE TABLE public.subscription_intents_personal ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - user_id uuid NOT NULL, - created_by_user_id uuid, - email text NOT NULL, - plan_id uuid NOT NULL, - plan_key text, - "interval" text, - amount_cents integer, - currency text, - status text DEFAULT 'new'::text NOT NULL, - source text DEFAULT 'manual'::text NOT NULL, - notes text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - paid_at timestamp with time zone, - subscription_id uuid, - CONSTRAINT sint_personal_interval_check CHECK ((("interval" IS NULL) OR ("interval" = ANY (ARRAY['month'::text, 'year'::text])))), - CONSTRAINT sint_personal_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text]))) -); - - - -CREATE TABLE public.subscription_intents_tenant ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - user_id uuid NOT NULL, - created_by_user_id uuid, - email text NOT NULL, - plan_id uuid NOT NULL, - plan_key text, - "interval" text, - amount_cents integer, - currency text, - status text DEFAULT 'new'::text NOT NULL, - source text DEFAULT 'manual'::text NOT NULL, - notes text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - paid_at timestamp with time zone, - tenant_id uuid NOT NULL, - subscription_id uuid, - CONSTRAINT sint_tenant_interval_check CHECK ((("interval" IS NULL) OR ("interval" = ANY (ARRAY['month'::text, 'year'::text])))), - CONSTRAINT sint_tenant_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text]))) -); - - - -CREATE TABLE public.subscription_intents_legacy ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - user_id uuid, - email text, - plan_key text NOT NULL, - "interval" text NOT NULL, - amount_cents integer NOT NULL, - currency text DEFAULT 'BRL'::text NOT NULL, - status text DEFAULT 'new'::text NOT NULL, - source text DEFAULT 'landing'::text NOT NULL, - notes text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - paid_at timestamp with time zone, - tenant_id uuid NOT NULL, - created_by_user_id uuid, - CONSTRAINT subscription_intents_interval_check CHECK (("interval" = ANY (ARRAY['month'::text, 'year'::text]))), - CONSTRAINT subscription_intents_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text]))) -); - - - CREATE TABLE public.billing_contracts ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -250,90 +55,28 @@ CREATE TABLE public.billing_contracts ( CONSTRAINT billing_contracts_type_chk CHECK ((type = ANY (ARRAY['per_session'::text, 'package'::text, 'subscription'::text]))) ); - - -CREATE TABLE public.addon_credits ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - owner_id uuid, - addon_type text NOT NULL, - balance integer DEFAULT 0 NOT NULL, - total_purchased integer DEFAULT 0 NOT NULL, - total_consumed integer DEFAULT 0 NOT NULL, - low_balance_threshold integer DEFAULT 10, - low_balance_notified boolean DEFAULT false, - daily_limit integer, - hourly_limit integer, - daily_used integer DEFAULT 0, - hourly_used integer DEFAULT 0, - daily_reset_at timestamp with time zone, - hourly_reset_at timestamp with time zone, - from_number_override text, - expires_at timestamp with time zone, - is_active boolean DEFAULT true, - created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now() +CREATE TABLE public.entitlements_invalidation ( + owner_id uuid NOT NULL, + changed_at timestamp with time zone DEFAULT now() NOT NULL ); - - -CREATE TABLE public.addon_products ( +CREATE TABLE public.features ( id uuid DEFAULT gen_random_uuid() NOT NULL, - slug text NOT NULL, - name text NOT NULL, + key text NOT NULL, description text, - addon_type text NOT NULL, - icon text DEFAULT 'pi pi-box'::text, - credits_amount integer DEFAULT 0, - price_cents integer DEFAULT 0 NOT NULL, - currency text DEFAULT 'BRL'::text, - is_active boolean DEFAULT true, - is_visible boolean DEFAULT true, - sort_order integer DEFAULT 0, - metadata jsonb DEFAULT '{}'::jsonb, - created_at timestamp with time zone DEFAULT now(), - updated_at timestamp with time zone DEFAULT now(), - deleted_at timestamp with time zone + created_at timestamp with time zone DEFAULT now() NOT NULL, + descricao text DEFAULT ''::text NOT NULL, + name text DEFAULT ''::text NOT NULL ); - - -CREATE TABLE public.addon_transactions ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - owner_id uuid, - addon_type text NOT NULL, - type text NOT NULL, - amount integer NOT NULL, - balance_before integer DEFAULT 0 NOT NULL, - balance_after integer DEFAULT 0 NOT NULL, - product_id uuid, - queue_id uuid, - description text, - admin_user_id uuid, - payment_method text, - payment_reference text, - price_cents integer, - currency text DEFAULT 'BRL'::text, - created_at timestamp with time zone DEFAULT now(), - metadata jsonb DEFAULT '{}'::jsonb +CREATE TABLE public.module_features ( + module_id uuid NOT NULL, + feature_id uuid NOT NULL, + enabled boolean DEFAULT true NOT NULL, + limits jsonb, + created_at timestamp with time zone DEFAULT now() NOT NULL ); - -ALTER TABLE public.addon_transactions OWNER TO supabase_admin; - --- --- Name: TABLE addon_transactions; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON TABLE public.addon_transactions IS 'Histórico de todas as transações de créditos: compras, consumo, ajustes, reembolsos.'; - - --- --- Name: agenda_bloqueios; Type: TABLE; Schema: public; Owner: supabase_admin --- - - CREATE TABLE public.modules ( id uuid DEFAULT gen_random_uuid() NOT NULL, key text NOT NULL, @@ -343,18 +86,14 @@ CREATE TABLE public.modules ( created_at timestamp with time zone DEFAULT now() NOT NULL ); - - -CREATE TABLE public.module_features ( - module_id uuid NOT NULL, +CREATE TABLE public.plan_features ( + plan_id uuid NOT NULL, feature_id uuid NOT NULL, enabled boolean DEFAULT true NOT NULL, limits jsonb, created_at timestamp with time zone DEFAULT now() NOT NULL ); - - CREATE TABLE public.tenant_modules ( id uuid DEFAULT gen_random_uuid() NOT NULL, owner_id uuid NOT NULL, @@ -367,5 +106,151 @@ CREATE TABLE public.tenant_modules ( updated_at timestamp with time zone DEFAULT now() NOT NULL ); +CREATE TABLE public.plan_prices ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + plan_id uuid NOT NULL, + currency text DEFAULT 'BRL'::text NOT NULL, + "interval" text NOT NULL, + amount_cents integer NOT NULL, + is_active boolean DEFAULT true NOT NULL, + active_from timestamp with time zone DEFAULT now() NOT NULL, + active_to timestamp with time zone, + source text DEFAULT 'manual'::text NOT NULL, + provider text, + provider_price_id text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT plan_prices_amount_cents_check CHECK ((amount_cents >= 0)), + CONSTRAINT plan_prices_interval_check CHECK (("interval" = ANY (ARRAY['month'::text, 'year'::text]))) +); -ALTER TABLE public.tenant_modules OWNER TO supabase_admin; +CREATE TABLE public.plan_public ( + plan_id uuid NOT NULL, + public_name text DEFAULT ''::text NOT NULL, + public_description text DEFAULT ''::text NOT NULL, + badge text, + is_featured boolean DEFAULT false NOT NULL, + is_visible boolean DEFAULT true NOT NULL, + sort_order integer DEFAULT 0 NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.plan_public_bullets ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + plan_id uuid NOT NULL, + text text NOT NULL, + sort_order integer DEFAULT 0 NOT NULL, + highlight boolean DEFAULT false NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.plans ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + key text NOT NULL, + name text NOT NULL, + description text, + is_active boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + price_cents integer DEFAULT 0 NOT NULL, + currency text DEFAULT 'BRL'::text NOT NULL, + billing_interval text DEFAULT 'month'::text NOT NULL, + target text, + max_supervisees integer, + CONSTRAINT plans_target_check CHECK ((target = ANY (ARRAY['patient'::text, 'therapist'::text, 'clinic'::text, 'supervisor'::text]))) +); + +CREATE TABLE public.subscription_events ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + subscription_id uuid NOT NULL, + owner_id uuid NOT NULL, + event_type text NOT NULL, + old_plan_id uuid, + new_plan_id uuid, + created_at timestamp with time zone DEFAULT now() NOT NULL, + created_by uuid, + source text DEFAULT 'admin_ui'::text, + reason text, + metadata jsonb, + owner_type text NOT NULL, + owner_ref uuid NOT NULL, + CONSTRAINT subscription_events_owner_ref_consistency_chk CHECK ((owner_id = owner_ref)), + CONSTRAINT subscription_events_owner_type_chk CHECK (((owner_type IS NULL) OR (owner_type = ANY (ARRAY['clinic'::text, 'therapist'::text])))) +); + +CREATE TABLE public.subscription_intents_personal ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + user_id uuid NOT NULL, + created_by_user_id uuid, + email text NOT NULL, + plan_id uuid NOT NULL, + plan_key text, + "interval" text, + amount_cents integer, + currency text, + status text DEFAULT 'new'::text NOT NULL, + source text DEFAULT 'manual'::text NOT NULL, + notes text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + paid_at timestamp with time zone, + subscription_id uuid, + CONSTRAINT sint_personal_interval_check CHECK ((("interval" IS NULL) OR ("interval" = ANY (ARRAY['month'::text, 'year'::text])))), + CONSTRAINT sint_personal_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text]))) +); + +CREATE TABLE public.subscription_intents_tenant ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + user_id uuid NOT NULL, + created_by_user_id uuid, + email text NOT NULL, + plan_id uuid NOT NULL, + plan_key text, + "interval" text, + amount_cents integer, + currency text, + status text DEFAULT 'new'::text NOT NULL, + source text DEFAULT 'manual'::text NOT NULL, + notes text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + paid_at timestamp with time zone, + tenant_id uuid NOT NULL, + subscription_id uuid, + CONSTRAINT sint_tenant_interval_check CHECK ((("interval" IS NULL) OR ("interval" = ANY (ARRAY['month'::text, 'year'::text])))), + CONSTRAINT sint_tenant_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text]))) +); + +CREATE TABLE public.subscription_intents_legacy ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + user_id uuid, + email text, + plan_key text NOT NULL, + "interval" text NOT NULL, + amount_cents integer NOT NULL, + currency text DEFAULT 'BRL'::text NOT NULL, + status text DEFAULT 'new'::text NOT NULL, + source text DEFAULT 'landing'::text NOT NULL, + notes text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + paid_at timestamp with time zone, + tenant_id uuid NOT NULL, + created_by_user_id uuid, + CONSTRAINT subscription_intents_interval_check CHECK (("interval" = ANY (ARRAY['month'::text, 'year'::text]))), + CONSTRAINT subscription_intents_status_check CHECK ((status = ANY (ARRAY['new'::text, 'waiting_payment'::text, 'paid'::text, 'canceled'::text]))) +); + +CREATE TABLE public.tenant_feature_exceptions_log ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + feature_key text NOT NULL, + enabled boolean NOT NULL, + reason text, + created_by uuid, + created_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.tenant_features ( + tenant_id uuid NOT NULL, + feature_key text NOT NULL, + enabled boolean DEFAULT false NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); diff --git a/database-novo/schema/04_tables/commitments.sql b/database-novo/schema/04_tables/servi_os_prontu_rios.sql similarity index 57% rename from database-novo/schema/04_tables/commitments.sql rename to database-novo/schema/04_tables/servi_os_prontu_rios.sql index 6ad4e51..d0aa74d 100644 --- a/database-novo/schema/04_tables/commitments.sql +++ b/database-novo/schema/04_tables/servi_os_prontu_rios.sql @@ -1,42 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Tables — Compromissos Determinados --- ============================================================================= --- determined_commitments, determined_commitment_fields, --- commitment_services, commitment_time_logs --- ============================================================================= - -CREATE TABLE public.determined_commitments ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - created_by uuid, - is_native boolean DEFAULT false NOT NULL, - native_key text, - is_locked boolean DEFAULT false NOT NULL, - active boolean DEFAULT true NOT NULL, - name text NOT NULL, - description text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - bg_color text, - text_color text -); - - - -CREATE TABLE public.determined_commitment_fields ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - commitment_id uuid NOT NULL, - key text NOT NULL, - label text NOT NULL, - field_type public.determined_field_type DEFAULT 'text'::public.determined_field_type NOT NULL, - required boolean DEFAULT false NOT NULL, - sort_order integer DEFAULT 0 NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - +-- Tables: Serviços / Prontuários +-- Gerado automaticamente em 2026-04-17T12:23:05.229Z +-- Total: 8 CREATE TABLE public.commitment_services ( id uuid DEFAULT gen_random_uuid() NOT NULL, @@ -54,13 +18,6 @@ CREATE TABLE public.commitment_services ( CONSTRAINT commitment_services_quantity_chk CHECK ((quantity > 0)) ); - -ALTER TABLE public.commitment_services OWNER TO supabase_admin; - --- --- Name: commitment_time_logs; Type: TABLE; Schema: public; Owner: supabase_admin --- - CREATE TABLE public.commitment_time_logs ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, @@ -74,4 +31,85 @@ CREATE TABLE public.commitment_time_logs ( created_at timestamp with time zone DEFAULT now() NOT NULL ); +CREATE TABLE public.determined_commitment_fields ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + commitment_id uuid NOT NULL, + key text NOT NULL, + label text NOT NULL, + field_type public.determined_field_type DEFAULT 'text'::public.determined_field_type NOT NULL, + required boolean DEFAULT false NOT NULL, + sort_order integer DEFAULT 0 NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL +); +CREATE TABLE public.determined_commitments ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + created_by uuid, + is_native boolean DEFAULT false NOT NULL, + native_key text, + is_locked boolean DEFAULT false NOT NULL, + active boolean DEFAULT true NOT NULL, + name text NOT NULL, + description text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + bg_color text, + text_color text +); + +CREATE TABLE public.insurance_plan_services ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + insurance_plan_id uuid NOT NULL, + name text NOT NULL, + value numeric(10,2) NOT NULL, + active boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + +CREATE TABLE public.insurance_plans ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + name text NOT NULL, + notes text, + default_value numeric(10,2), + active boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + +CREATE TABLE public.medicos ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + nome text NOT NULL, + crm text, + especialidade text, + telefone_profissional text, + telefone_pessoal text, + email text, + clinica text, + cidade text, + estado text DEFAULT 'SP'::text, + observacoes text, + ativo boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + +CREATE TABLE public.services ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + owner_id uuid NOT NULL, + tenant_id uuid NOT NULL, + name text NOT NULL, + description text, + price numeric(10,2) NOT NULL, + duration_min integer, + active boolean DEFAULT true NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); diff --git a/database-novo/schema/04_tables/core.sql b/database-novo/schema/04_tables/tenants_multi_tenant.sql similarity index 82% rename from database-novo/schema/04_tables/core.sql rename to database-novo/schema/04_tables/tenants_multi_tenant.sql index fd545c3..a6ec9c5 100644 --- a/database-novo/schema/04_tables/core.sql +++ b/database-novo/schema/04_tables/tenants_multi_tenant.sql @@ -1,51 +1,6 @@ --- ============================================================================= --- AgenciaPsi — Tables — Core --- ============================================================================= --- profiles, tenants, tenant_members, tenant_invites, tenant_features, --- tenant_feature_exceptions_log, saas_admins, owner_users, user_settings, --- company_profiles, dev_user_credentials --- ============================================================================= - -CREATE TABLE public.profiles ( - id uuid NOT NULL, - role text DEFAULT 'tenant_member'::text NOT NULL, - full_name text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - avatar_url text, - phone text, - bio text, - language text DEFAULT 'pt-BR'::text NOT NULL, - timezone text DEFAULT 'America/Sao_Paulo'::text NOT NULL, - notify_system_email boolean DEFAULT true NOT NULL, - notify_reminders boolean DEFAULT true NOT NULL, - notify_news boolean DEFAULT false NOT NULL, - account_type text DEFAULT 'free'::text NOT NULL, - platform_roles text[] DEFAULT '{}'::text[] NOT NULL, - nickname text, - work_description text, - work_description_other text, - site_url text, - social_instagram text, - social_youtube text, - social_facebook text, - social_x text, - social_custom jsonb DEFAULT '[]'::jsonb NOT NULL, - CONSTRAINT profiles_account_type_check CHECK ((account_type = ANY (ARRAY['free'::text, 'patient'::text, 'therapist'::text, 'clinic'::text]))), - CONSTRAINT profiles_role_check CHECK ((role = ANY (ARRAY['saas_admin'::text, 'tenant_member'::text, 'portal_user'::text, 'patient'::text]))) -); - - - -CREATE TABLE public.tenants ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - name text, - created_at timestamp with time zone DEFAULT now() NOT NULL, - kind text DEFAULT 'saas'::text NOT NULL, - CONSTRAINT tenants_kind_check CHECK ((kind = ANY (ARRAY['therapist'::text, 'clinic_coworking'::text, 'clinic_reception'::text, 'clinic_full'::text, 'clinic'::text, 'saas'::text, 'supervisor'::text]))) -); - - +-- Tables: Tenants / Multi-tenant +-- Gerado automaticamente em 2026-04-17T12:23:05.228Z +-- Total: 10 CREATE TABLE public.tenant_members ( id uuid DEFAULT gen_random_uuid() NOT NULL, @@ -56,81 +11,6 @@ CREATE TABLE public.tenant_members ( created_at timestamp with time zone DEFAULT now() NOT NULL ); - - -CREATE TABLE public.tenant_invites ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - email text NOT NULL, - role text NOT NULL, - token uuid DEFAULT gen_random_uuid() NOT NULL, - invited_by uuid, - created_at timestamp with time zone DEFAULT now() NOT NULL, - expires_at timestamp with time zone DEFAULT (now() + '7 days'::interval) NOT NULL, - accepted_at timestamp with time zone, - accepted_by uuid, - revoked_at timestamp with time zone, - revoked_by uuid, - CONSTRAINT tenant_invites_role_check CHECK ((role = ANY (ARRAY['therapist'::text, 'secretary'::text]))) -); - - - -CREATE TABLE public.tenant_features ( - tenant_id uuid NOT NULL, - feature_key text NOT NULL, - enabled boolean DEFAULT false NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE public.tenant_feature_exceptions_log ( - id uuid DEFAULT gen_random_uuid() NOT NULL, - tenant_id uuid NOT NULL, - feature_key text NOT NULL, - enabled boolean NOT NULL, - reason text, - created_by uuid, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE public.saas_admins ( - user_id uuid NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE public.owner_users ( - owner_id uuid NOT NULL, - user_id uuid NOT NULL, - role text DEFAULT 'admin'::text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL -); - - - -CREATE TABLE public.user_settings ( - user_id uuid NOT NULL, - theme_mode text DEFAULT 'dark'::text NOT NULL, - preset text DEFAULT 'Aura'::text NOT NULL, - primary_color text DEFAULT 'noir'::text NOT NULL, - surface_color text DEFAULT 'slate'::text NOT NULL, - menu_mode text DEFAULT 'static'::text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - updated_at timestamp with time zone DEFAULT now() NOT NULL, - layout_variant text DEFAULT 'classic'::text NOT NULL, - CONSTRAINT user_settings_layout_variant_check CHECK ((layout_variant = ANY (ARRAY['classic'::text, 'rail'::text]))), - CONSTRAINT user_settings_menu_mode_check CHECK ((menu_mode = ANY (ARRAY['static'::text, 'overlay'::text]))), - CONSTRAINT user_settings_theme_mode_check CHECK ((theme_mode = ANY (ARRAY['light'::text, 'dark'::text]))) -); - - - CREATE TABLE public.company_profiles ( id uuid DEFAULT gen_random_uuid() NOT NULL, tenant_id uuid NOT NULL, @@ -156,8 +36,6 @@ CREATE TABLE public.company_profiles ( updated_at timestamp with time zone DEFAULT now() NOT NULL ); - - CREATE TABLE public.dev_user_credentials ( id uuid DEFAULT gen_random_uuid() NOT NULL, user_id uuid, @@ -168,4 +46,93 @@ CREATE TABLE public.dev_user_credentials ( created_at timestamp with time zone DEFAULT now() NOT NULL ); +CREATE TABLE public.owner_users ( + owner_id uuid NOT NULL, + user_id uuid NOT NULL, + role text DEFAULT 'admin'::text NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL +); +CREATE TABLE public.profiles ( + id uuid NOT NULL, + role text DEFAULT 'tenant_member'::text NOT NULL, + full_name text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + avatar_url text, + phone text, + bio text, + language text DEFAULT 'pt-BR'::text NOT NULL, + timezone text DEFAULT 'America/Sao_Paulo'::text NOT NULL, + notify_system_email boolean DEFAULT true NOT NULL, + notify_reminders boolean DEFAULT true NOT NULL, + notify_news boolean DEFAULT false NOT NULL, + account_type text DEFAULT 'free'::text NOT NULL, + platform_roles text[] DEFAULT '{}'::text[] NOT NULL, + nickname text, + work_description text, + work_description_other text, + site_url text, + social_instagram text, + social_youtube text, + social_facebook text, + social_x text, + social_custom jsonb DEFAULT '[]'::jsonb NOT NULL, + tenant_id uuid, + CONSTRAINT profiles_account_type_check CHECK ((account_type = ANY (ARRAY['free'::text, 'patient'::text, 'therapist'::text, 'clinic'::text]))), + CONSTRAINT profiles_role_check CHECK ((role = ANY (ARRAY['saas_admin'::text, 'tenant_member'::text, 'portal_user'::text, 'patient'::text]))) +); + +CREATE TABLE public.saas_admins ( + user_id uuid NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.support_sessions ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + admin_id uuid NOT NULL, + token text DEFAULT encode(extensions.gen_random_bytes(32), 'hex'::text) NOT NULL, + expires_at timestamp with time zone DEFAULT (now() + '01:00:00'::interval) NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL +); + +CREATE TABLE public.tenant_invites ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + tenant_id uuid NOT NULL, + email text NOT NULL, + role text NOT NULL, + token uuid DEFAULT gen_random_uuid() NOT NULL, + invited_by uuid, + created_at timestamp with time zone DEFAULT now() NOT NULL, + expires_at timestamp with time zone DEFAULT (now() + '7 days'::interval) NOT NULL, + accepted_at timestamp with time zone, + accepted_by uuid, + revoked_at timestamp with time zone, + revoked_by uuid, + CONSTRAINT tenant_invites_role_check CHECK ((role = ANY (ARRAY['therapist'::text, 'secretary'::text]))) +); + +CREATE TABLE public.tenants ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + name text, + created_at timestamp with time zone DEFAULT now() NOT NULL, + kind text DEFAULT 'saas'::text NOT NULL, + papel_timbrado jsonb DEFAULT '{"footer": {"slots": {"left": null, "right": null, "center": {"type": "custom-text", "content": ""}}, "height": 40, "preset": "text-center", "divider": {"show": true, "color": "#cccccc", "style": "solid"}, "enabled": true, "showPageNumber": false}, "header": {"slots": {"left": {"size": "medium", "type": "logo"}, "right": {"type": "institution-data", "fields": ["nome", "cnpj", "endereco_linha"]}, "center": null}, "height": 80, "preset": "logo-left-text-right", "divider": {"show": true, "color": "#cccccc", "style": "solid"}, "enabled": true}, "margins": {"top": 20, "left": 25, "right": 25, "bottom": 20}}'::jsonb, + CONSTRAINT tenants_kind_check CHECK ((kind = ANY (ARRAY['therapist'::text, 'clinic_coworking'::text, 'clinic_reception'::text, 'clinic_full'::text, 'clinic'::text, 'saas'::text, 'supervisor'::text]))) +); + +CREATE TABLE public.user_settings ( + user_id uuid NOT NULL, + theme_mode text DEFAULT 'dark'::text NOT NULL, + preset text DEFAULT 'Aura'::text NOT NULL, + primary_color text DEFAULT 'noir'::text NOT NULL, + surface_color text DEFAULT 'slate'::text NOT NULL, + menu_mode text DEFAULT 'static'::text NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone DEFAULT now() NOT NULL, + layout_variant text DEFAULT 'classic'::text NOT NULL, + CONSTRAINT user_settings_layout_variant_check CHECK ((layout_variant = ANY (ARRAY['classic'::text, 'rail'::text]))), + CONSTRAINT user_settings_menu_mode_check CHECK ((menu_mode = ANY (ARRAY['static'::text, 'overlay'::text]))), + CONSTRAINT user_settings_theme_mode_check CHECK ((theme_mode = ANY (ARRAY['light'::text, 'dark'::text]))) +); diff --git a/database-novo/schema/05_views/views.sql b/database-novo/schema/05_views/views.sql index 2e28065..b78149a 100644 --- a/database-novo/schema/05_views/views.sql +++ b/database-novo/schema/05_views/views.sql @@ -1,28 +1,10 @@ --- ============================================================================= --- AgenciaPsi — Views --- ============================================================================= --- current_tenant_id, owner_feature_entitlements, subscription_intents, --- v_auth_users_public, v_cashflow_projection, 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_user_active_subscription, v_user_entitlements --- ============================================================================= +-- Views +-- Gerado automaticamente em 2026-04-17T12:23:05.233Z +-- Total: 27 CREATE VIEW public.current_tenant_id AS SELECT current_setting('request.jwt.claim.tenant_id'::text, true) AS current_setting; - -ALTER VIEW public.current_tenant_id OWNER TO supabase_admin; - --- --- Name: determined_commitment_fields; Type: TABLE; Schema: public; Owner: supabase_admin --- - - CREATE VIEW public.owner_feature_entitlements AS WITH base AS ( SELECT s.user_id AS owner_id, @@ -51,14 +33,6 @@ CREATE VIEW public.owner_feature_entitlements AS FROM base GROUP BY owner_id, feature_key; - -ALTER VIEW public.owner_feature_entitlements OWNER TO supabase_admin; - --- --- Name: owner_users; Type: TABLE; Schema: public; Owner: supabase_admin --- - - CREATE VIEW public.subscription_intents AS SELECT t.id, t.user_id, @@ -98,14 +72,6 @@ UNION ALL 'therapist'::text AS plan_target FROM public.subscription_intents_personal p; - -ALTER VIEW public.subscription_intents OWNER TO supabase_admin; - --- --- Name: subscription_intents_legacy; Type: TABLE; Schema: public; Owner: supabase_admin --- - - CREATE VIEW public.v_auth_users_public AS SELECT id AS user_id, email, @@ -113,13 +79,6 @@ CREATE VIEW public.v_auth_users_public AS last_sign_in_at FROM auth.users u; - -ALTER VIEW public.v_auth_users_public OWNER TO supabase_admin; - --- --- Name: v_cashflow_projection; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_cashflow_projection WITH (security_invoker='on') AS SELECT gs.mes, to_char(gs.mes, 'YYYY-MM'::text) AS mes_label, @@ -136,20 +95,6 @@ CREATE VIEW public.v_cashflow_projection WITH (security_invoker='on') AS GROUP BY gs.mes ORDER BY gs.mes; - -ALTER VIEW public.v_cashflow_projection OWNER TO supabase_admin; - --- --- Name: VIEW v_cashflow_projection; Type: COMMENT; Schema: public; Owner: supabase_admin --- - -COMMENT ON VIEW public.v_cashflow_projection IS 'Fluxo de caixa projetado: próximos 6 meses com totais de pending+overdue por due_date. Usa security_invoker=on — filtra automaticamente pelo auth.uid() via RLS de financial_records.'; - - --- --- Name: v_commitment_totals; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_commitment_totals AS SELECT c.tenant_id, c.id AS commitment_id, @@ -158,12 +103,76 @@ CREATE VIEW public.v_commitment_totals AS LEFT JOIN public.commitment_time_logs l ON ((l.commitment_id = c.id))) GROUP BY c.tenant_id, c.id; - -ALTER VIEW public.v_commitment_totals OWNER TO supabase_admin; - --- --- Name: v_patient_groups_with_counts; Type: VIEW; Schema: public; Owner: supabase_admin --- +CREATE VIEW public.v_patient_engajamento WITH (security_invoker='on') AS + WITH sessoes AS ( + SELECT ae.patient_id, + ae.tenant_id, + count(*) FILTER (WHERE (ae.status = 'realizado'::public.status_evento_agenda)) AS total_realizadas, + count(*) FILTER (WHERE (ae.status = ANY (ARRAY['realizado'::public.status_evento_agenda, 'cancelado'::public.status_evento_agenda, 'faltou'::public.status_evento_agenda]))) AS total_marcadas, + count(*) FILTER (WHERE (ae.status = 'faltou'::public.status_evento_agenda)) AS total_faltas, + max(ae.inicio_em) FILTER (WHERE (ae.status = 'realizado'::public.status_evento_agenda)) AS ultima_sessao_em, + min(ae.inicio_em) FILTER (WHERE (ae.status = 'realizado'::public.status_evento_agenda)) AS primeira_sessao_em, + count(*) FILTER (WHERE ((ae.status = 'realizado'::public.status_evento_agenda) AND (ae.inicio_em >= (now() - '30 days'::interval)))) AS sessoes_ultimo_mes + FROM public.agenda_eventos ae + WHERE (ae.patient_id IS NOT NULL) + GROUP BY ae.patient_id, ae.tenant_id + ), financeiro AS ( + SELECT fr.patient_id, + fr.tenant_id, + COALESCE(sum(fr.final_amount) FILTER (WHERE (fr.status = 'paid'::text)), (0)::numeric) AS total_pago, + COALESCE(avg(fr.final_amount) FILTER (WHERE (fr.status = 'paid'::text)), (0)::numeric) AS ticket_medio, + count(*) FILTER (WHERE ((fr.status = ANY (ARRAY['pending'::text, 'overdue'::text])) AND (fr.due_date < now()))) AS cobr_vencidas, + count(*) FILTER (WHERE (fr.status = ANY (ARRAY['pending'::text, 'overdue'::text]))) AS cobr_pendentes, + count(*) FILTER (WHERE ((fr.type = 'receita'::public.financial_record_type) AND (fr.status = 'paid'::text))) AS cobr_pagas + FROM public.financial_records fr + WHERE ((fr.patient_id IS NOT NULL) AND (fr.deleted_at IS NULL)) + GROUP BY fr.patient_id, fr.tenant_id + ) + SELECT p.id AS patient_id, + p.tenant_id, + p.nome_completo, + p.status, + p.risco_elevado, + COALESCE(s.total_realizadas, (0)::bigint) AS total_sessoes, + COALESCE(s.sessoes_ultimo_mes, (0)::bigint) AS sessoes_ultimo_mes, + s.primeira_sessao_em, + s.ultima_sessao_em, + (EXTRACT(day FROM (now() - s.ultima_sessao_em)))::integer AS dias_sem_sessao, + CASE + WHEN (COALESCE(s.total_marcadas, (0)::bigint) = 0) THEN NULL::numeric + ELSE round((((s.total_realizadas)::numeric / (s.total_marcadas)::numeric) * (100)::numeric), 1) + END AS taxa_comparecimento, + COALESCE(f.total_pago, (0)::numeric) AS ltv_total, + round(COALESCE(f.ticket_medio, (0)::numeric), 2) AS ticket_medio, + COALESCE(f.cobr_vencidas, (0)::bigint) AS cobr_vencidas, + COALESCE(f.cobr_pagas, (0)::bigint) AS cobr_pagas, + CASE + WHEN (COALESCE((f.cobr_pagas + f.cobr_vencidas), (0)::bigint) = 0) THEN NULL::numeric + ELSE round((((f.cobr_pagas)::numeric / ((f.cobr_pagas + f.cobr_vencidas))::numeric) * (100)::numeric), 1) + END AS taxa_pagamentos_dia, + round(LEAST((100)::numeric, COALESCE((( + CASE + WHEN (COALESCE(s.total_marcadas, (0)::bigint) = 0) THEN (50)::numeric + ELSE LEAST((50)::numeric, (((s.total_realizadas)::numeric / (s.total_marcadas)::numeric) * (50)::numeric)) + END + + CASE + WHEN (COALESCE((f.cobr_pagas + f.cobr_vencidas), (0)::bigint) = 0) THEN (30)::numeric + ELSE LEAST((30)::numeric, (((f.cobr_pagas)::numeric / ((f.cobr_pagas + f.cobr_vencidas))::numeric) * (30)::numeric)) + END) + ( + CASE + WHEN (s.ultima_sessao_em IS NULL) THEN 0 + WHEN (EXTRACT(day FROM (now() - s.ultima_sessao_em)) <= (14)::numeric) THEN 20 + WHEN (EXTRACT(day FROM (now() - s.ultima_sessao_em)) <= (30)::numeric) THEN 15 + WHEN (EXTRACT(day FROM (now() - s.ultima_sessao_em)) <= (60)::numeric) THEN 8 + ELSE 0 + END)::numeric), (0)::numeric)), 0) AS engajamento_score, + CASE + WHEN (s.primeira_sessao_em IS NULL) THEN NULL::integer + ELSE (EXTRACT(day FROM (now() - s.primeira_sessao_em)))::integer + END AS duracao_tratamento_dias + FROM ((public.patients p + LEFT JOIN sessoes s ON (((s.patient_id = p.id) AND (s.tenant_id = p.tenant_id)))) + LEFT JOIN financeiro f ON (((f.patient_id = p.id) AND (f.tenant_id = p.tenant_id)))); CREATE VIEW public.v_patient_groups_with_counts AS SELECT pg.id, @@ -179,12 +188,27 @@ CREATE VIEW public.v_patient_groups_with_counts AS LEFT JOIN public.patient_group_patient pgp ON ((pgp.patient_group_id = pg.id))) GROUP BY pg.id, pg.nome, pg.cor, pg.owner_id, pg.is_system, pg.is_active, pg.created_at, pg.updated_at; - -ALTER VIEW public.v_patient_groups_with_counts OWNER TO supabase_admin; - --- --- Name: v_plan_active_prices; Type: VIEW; Schema: public; Owner: supabase_admin --- +CREATE VIEW public.v_patients_risco WITH (security_invoker='on') AS + SELECT p.id, + p.tenant_id, + p.nome_completo, + p.status, + p.risco_elevado, + p.risco_nota, + p.risco_sinalizado_em, + e.dias_sem_sessao, + e.engajamento_score, + e.taxa_comparecimento, + CASE + WHEN p.risco_elevado THEN 'risco_sinalizado'::text + WHEN ((COALESCE(e.dias_sem_sessao, 999) > 30) AND (p.status = 'Ativo'::text)) THEN 'sem_sessao_30d'::text + WHEN (COALESCE(e.taxa_comparecimento, (100)::numeric) < (60)::numeric) THEN 'baixo_comparecimento'::text + WHEN (COALESCE(e.cobr_vencidas, (0)::bigint) > 0) THEN 'cobranca_vencida'::text + ELSE 'ok'::text + END AS alerta_tipo + FROM (public.patients p + JOIN public.v_patient_engajamento e ON ((e.patient_id = p.id))) + WHERE ((p.status = 'Ativo'::text) AND ((p.risco_elevado = true) OR (COALESCE(e.dias_sem_sessao, 999) > 30) OR (COALESCE(e.taxa_comparecimento, (100)::numeric) < (60)::numeric) OR (COALESCE(e.cobr_vencidas, (0)::bigint) > 0))); CREATE VIEW public.v_plan_active_prices AS SELECT plan_id, @@ -211,13 +235,6 @@ CREATE VIEW public.v_plan_active_prices AS FROM public.plan_prices GROUP BY plan_id; - -ALTER VIEW public.v_plan_active_prices OWNER TO supabase_admin; - --- --- Name: v_public_pricing; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_public_pricing AS SELECT p.id AS plan_id, p.key AS plan_key, @@ -241,13 +258,6 @@ CREATE VIEW public.v_public_pricing AS LEFT JOIN public.v_plan_active_prices ap ON ((ap.plan_id = p.id))) ORDER BY COALESCE(pp.sort_order, 0), p.key; - -ALTER VIEW public.v_public_pricing OWNER TO supabase_admin; - --- --- Name: v_subscription_feature_mismatch; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_subscription_feature_mismatch AS WITH expected AS ( SELECT s.user_id AS owner_id, @@ -272,13 +282,6 @@ CREATE VIEW public.v_subscription_feature_mismatch AS FULL JOIN actual ON (((expected.owner_id = actual.owner_id) AND (expected.feature_key = actual.feature_key)))) WHERE ((expected.feature_key IS NULL) OR (actual.feature_key IS NULL)); - -ALTER VIEW public.v_subscription_feature_mismatch OWNER TO supabase_admin; - --- --- Name: v_subscription_health; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_subscription_health AS SELECT s.id AS subscription_id, s.user_id AS owner_id, @@ -303,13 +306,6 @@ CREATE VIEW public.v_subscription_health AS FROM (public.subscriptions s LEFT JOIN public.plans p ON ((p.id = s.plan_id))); - -ALTER VIEW public.v_subscription_health OWNER TO supabase_admin; - --- --- Name: v_subscription_health_v2; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_subscription_health_v2 AS SELECT s.id AS subscription_id, s.user_id AS owner_id, @@ -334,13 +330,6 @@ CREATE VIEW public.v_subscription_health_v2 AS FROM (public.subscriptions s LEFT JOIN public.plans p ON ((p.id = s.plan_id))); - -ALTER VIEW public.v_subscription_health_v2 OWNER TO supabase_admin; - --- --- Name: v_tag_patient_counts; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tag_patient_counts AS SELECT t.id, t.owner_id, @@ -355,13 +344,6 @@ CREATE VIEW public.v_tag_patient_counts AS LEFT JOIN public.patient_patient_tag ppt ON (((ppt.tag_id = t.id) AND (ppt.owner_id = t.owner_id)))) GROUP BY t.id, t.owner_id, t.nome, t.cor, t.is_padrao, t.created_at, t.updated_at; - -ALTER VIEW public.v_tag_patient_counts OWNER TO supabase_admin; - --- --- Name: v_tenant_active_subscription; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_active_subscription AS SELECT DISTINCT ON (tenant_id) tenant_id, plan_id, @@ -375,13 +357,6 @@ CREATE VIEW public.v_tenant_active_subscription AS WHERE ((tenant_id IS NOT NULL) AND (status = 'active'::text) AND ((current_period_end IS NULL) OR (current_period_end > now()))) ORDER BY tenant_id, created_at DESC; - -ALTER VIEW public.v_tenant_active_subscription OWNER TO supabase_admin; - --- --- Name: v_tenant_entitlements; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_entitlements AS SELECT a.tenant_id, f.key AS feature_key, @@ -390,13 +365,6 @@ CREATE VIEW public.v_tenant_entitlements AS JOIN public.plan_features pf ON (((pf.plan_id = a.plan_id) AND (pf.enabled = true)))) JOIN public.features f ON ((f.id = pf.feature_id))); - -ALTER VIEW public.v_tenant_entitlements OWNER TO supabase_admin; - --- --- Name: v_tenant_entitlements_full; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_entitlements_full AS SELECT a.tenant_id, f.key AS feature_key, @@ -409,13 +377,6 @@ CREATE VIEW public.v_tenant_entitlements_full AS JOIN public.features f ON ((f.id = pf.feature_id))) JOIN public.plans p ON ((p.id = a.plan_id))); - -ALTER VIEW public.v_tenant_entitlements_full OWNER TO supabase_admin; - --- --- Name: v_tenant_entitlements_json; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_entitlements_json AS SELECT tenant_id, max(plan_key) AS plan_key, @@ -423,13 +384,6 @@ CREATE VIEW public.v_tenant_entitlements_json AS FROM public.v_tenant_entitlements_full GROUP BY tenant_id; - -ALTER VIEW public.v_tenant_entitlements_json OWNER TO supabase_admin; - --- --- Name: v_tenant_feature_exceptions; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_feature_exceptions AS SELECT tf.tenant_id, a.plan_key, @@ -440,13 +394,6 @@ CREATE VIEW public.v_tenant_feature_exceptions AS LEFT JOIN public.v_tenant_entitlements_full v ON (((v.tenant_id = tf.tenant_id) AND (v.feature_key = tf.feature_key)))) WHERE ((tf.enabled = true) AND (COALESCE(v.allowed, false) = false)); - -ALTER VIEW public.v_tenant_feature_exceptions OWNER TO supabase_admin; - --- --- Name: v_tenant_feature_mismatch; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_feature_mismatch AS WITH plan_allowed AS ( SELECT v.tenant_id, @@ -469,13 +416,6 @@ CREATE VIEW public.v_tenant_feature_mismatch AS LEFT JOIN plan_allowed p ON (((p.tenant_id = o.tenant_id) AND (p.feature_key = o.feature_key)))) WHERE ((o.enabled = true) AND (COALESCE(p.allowed, false) = false)); - -ALTER VIEW public.v_tenant_feature_mismatch OWNER TO supabase_admin; - --- --- Name: v_tenant_members_with_profiles; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_members_with_profiles AS SELECT tm.id AS tenant_member_id, tm.tenant_id, @@ -489,13 +429,6 @@ CREATE VIEW public.v_tenant_members_with_profiles AS LEFT JOIN public.profiles p ON ((p.id = tm.user_id))) LEFT JOIN auth.users au ON ((au.id = tm.user_id))); - -ALTER VIEW public.v_tenant_members_with_profiles OWNER TO supabase_admin; - --- --- Name: v_tenant_people; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_people AS SELECT 'member'::text AS type, m.tenant_id, @@ -519,13 +452,6 @@ UNION ALL FROM public.tenant_invites i WHERE ((i.accepted_at IS NULL) AND (i.revoked_at IS NULL)); - -ALTER VIEW public.v_tenant_people OWNER TO supabase_admin; - --- --- Name: v_tenant_staff; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_tenant_staff AS SELECT ('m_'::text || (tm.id)::text) AS row_id, tm.tenant_id, @@ -552,12 +478,31 @@ UNION ALL FROM public.tenant_invites ti WHERE ((ti.accepted_at IS NULL) AND (ti.revoked_at IS NULL) AND (ti.expires_at > now())); - -ALTER VIEW public.v_tenant_staff OWNER TO supabase_admin; - --- --- Name: v_user_active_subscription; Type: VIEW; Schema: public; Owner: supabase_admin --- +CREATE VIEW public.v_twilio_whatsapp_overview AS + SELECT nc.id AS channel_id, + nc.tenant_id, + nc.owner_id, + nc.is_active, + nc.connection_status, + nc.display_name, + nc.twilio_subaccount_sid, + nc.twilio_phone_number, + nc.twilio_phone_sid, + nc.cost_per_message_usd, + nc.price_per_message_brl, + nc.provisioned_at, + nc.created_at, + nc.updated_at, + COALESCE(u.messages_sent, 0) AS current_month_sent, + COALESCE(u.messages_delivered, 0) AS current_month_delivered, + COALESCE(u.messages_failed, 0) AS current_month_failed, + COALESCE(u.cost_usd, (0)::numeric) AS current_month_cost_usd, + COALESCE(u.cost_brl, (0)::numeric) AS current_month_cost_brl, + COALESCE(u.revenue_brl, (0)::numeric) AS current_month_revenue_brl, + COALESCE(u.margin_brl, (0)::numeric) AS current_month_margin_brl + FROM (public.notification_channels nc + LEFT JOIN public.twilio_subaccount_usage u ON (((u.channel_id = nc.id) AND (u.period_start = (date_trunc('month'::text, (CURRENT_DATE)::timestamp with time zone))::date)))) + WHERE ((nc.channel = 'whatsapp'::text) AND (nc.provider = 'twilio'::text) AND (nc.deleted_at IS NULL)); CREATE VIEW public.v_user_active_subscription AS SELECT DISTINCT ON (user_id) user_id, @@ -572,13 +517,6 @@ CREATE VIEW public.v_user_active_subscription AS WHERE ((tenant_id IS NULL) AND (user_id IS NOT NULL) AND (status = 'active'::text) AND ((current_period_end IS NULL) OR (current_period_end > now()))) ORDER BY user_id, created_at DESC; - -ALTER VIEW public.v_user_active_subscription OWNER TO supabase_admin; - --- --- Name: v_user_entitlements; Type: VIEW; Schema: public; Owner: supabase_admin --- - CREATE VIEW public.v_user_entitlements AS SELECT a.user_id, f.key AS feature_key, @@ -586,11 +524,3 @@ CREATE VIEW public.v_user_entitlements AS FROM ((public.v_user_active_subscription a JOIN public.plan_features pf ON (((pf.plan_id = a.plan_id) AND (pf.enabled = true)))) JOIN public.features f ON ((f.id = pf.feature_id))); - - -ALTER VIEW public.v_user_entitlements OWNER TO supabase_admin; - --- --- Name: messages; Type: TABLE; Schema: realtime; Owner: supabase_realtime_admin --- - diff --git a/database-novo/schema/06_indexes/indexes.sql b/database-novo/schema/06_indexes/indexes.sql index dcb3910..a0b5c59 100644 --- a/database-novo/schema/06_indexes/indexes.sql +++ b/database-novo/schema/06_indexes/indexes.sql @@ -1,2049 +1,543 @@ --- ============================================================================= --- AgenciaPsi — Indexes --- ============================================================================= - -CREATE INDEX extensions_tenant_external_id_index ON _realtime.extensions USING btree (tenant_external_id); - - --- --- Name: extensions_tenant_external_id_type_index; Type: INDEX; Schema: _realtime; Owner: supabase_admin --- - -CREATE UNIQUE INDEX extensions_tenant_external_id_type_index ON _realtime.extensions USING btree (tenant_external_id, type); - - --- --- Name: tenants_external_id_index; Type: INDEX; Schema: _realtime; Owner: supabase_admin --- - -CREATE UNIQUE INDEX tenants_external_id_index ON _realtime.tenants USING btree (external_id); - - --- --- Name: audit_logs_instance_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX audit_logs_instance_id_idx ON auth.audit_log_entries USING btree (instance_id); - - --- --- Name: confirmation_token_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX confirmation_token_idx ON auth.users USING btree (confirmation_token) WHERE ((confirmation_token)::text !~ '^[0-9 ]*$'::text); - - --- --- Name: email_change_token_current_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX email_change_token_current_idx ON auth.users USING btree (email_change_token_current) WHERE ((email_change_token_current)::text !~ '^[0-9 ]*$'::text); - - --- --- Name: email_change_token_new_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX email_change_token_new_idx ON auth.users USING btree (email_change_token_new) WHERE ((email_change_token_new)::text !~ '^[0-9 ]*$'::text); - - --- --- Name: factor_id_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX factor_id_created_at_idx ON auth.mfa_factors USING btree (user_id, created_at); - - --- --- Name: flow_state_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX flow_state_created_at_idx ON auth.flow_state USING btree (created_at DESC); - - --- --- Name: identities_email_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX identities_email_idx ON auth.identities USING btree (email text_pattern_ops); - - --- --- Name: INDEX identities_email_idx; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON INDEX auth.identities_email_idx IS 'Auth: Ensures indexed queries on the email column'; - - --- --- Name: identities_user_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX identities_user_id_idx ON auth.identities USING btree (user_id); - - --- --- Name: idx_auth_code; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX idx_auth_code ON auth.flow_state USING btree (auth_code); - - --- --- Name: idx_oauth_client_states_created_at; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX idx_oauth_client_states_created_at ON auth.oauth_client_states USING btree (created_at); - - --- --- Name: idx_user_id_auth_method; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX idx_user_id_auth_method ON auth.flow_state USING btree (user_id, authentication_method); - - --- --- Name: mfa_challenge_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX mfa_challenge_created_at_idx ON auth.mfa_challenges USING btree (created_at DESC); - - --- --- Name: mfa_factors_user_friendly_name_unique; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX mfa_factors_user_friendly_name_unique ON auth.mfa_factors USING btree (friendly_name, user_id) WHERE (TRIM(BOTH FROM friendly_name) <> ''::text); - - --- --- Name: mfa_factors_user_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX mfa_factors_user_id_idx ON auth.mfa_factors USING btree (user_id); - - --- --- Name: oauth_auth_pending_exp_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX oauth_auth_pending_exp_idx ON auth.oauth_authorizations USING btree (expires_at) WHERE (status = 'pending'::auth.oauth_authorization_status); - - --- --- Name: oauth_clients_deleted_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX oauth_clients_deleted_at_idx ON auth.oauth_clients USING btree (deleted_at); - - --- --- Name: oauth_consents_active_client_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX oauth_consents_active_client_idx ON auth.oauth_consents USING btree (client_id) WHERE (revoked_at IS NULL); - - --- --- Name: oauth_consents_active_user_client_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX oauth_consents_active_user_client_idx ON auth.oauth_consents USING btree (user_id, client_id) WHERE (revoked_at IS NULL); - - --- --- Name: oauth_consents_user_order_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX oauth_consents_user_order_idx ON auth.oauth_consents USING btree (user_id, granted_at DESC); - - --- --- Name: one_time_tokens_relates_to_hash_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX one_time_tokens_relates_to_hash_idx ON auth.one_time_tokens USING hash (relates_to); - - --- --- Name: one_time_tokens_token_hash_hash_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX one_time_tokens_token_hash_hash_idx ON auth.one_time_tokens USING hash (token_hash); - - --- --- Name: one_time_tokens_user_id_token_type_key; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX one_time_tokens_user_id_token_type_key ON auth.one_time_tokens USING btree (user_id, token_type); - - --- --- Name: reauthentication_token_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX reauthentication_token_idx ON auth.users USING btree (reauthentication_token) WHERE ((reauthentication_token)::text !~ '^[0-9 ]*$'::text); - - --- --- Name: recovery_token_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX recovery_token_idx ON auth.users USING btree (recovery_token) WHERE ((recovery_token)::text !~ '^[0-9 ]*$'::text); - - --- --- Name: refresh_tokens_instance_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX refresh_tokens_instance_id_idx ON auth.refresh_tokens USING btree (instance_id); - - --- --- Name: refresh_tokens_instance_id_user_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX refresh_tokens_instance_id_user_id_idx ON auth.refresh_tokens USING btree (instance_id, user_id); - - --- --- Name: refresh_tokens_parent_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX refresh_tokens_parent_idx ON auth.refresh_tokens USING btree (parent); - - --- --- Name: refresh_tokens_session_id_revoked_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX refresh_tokens_session_id_revoked_idx ON auth.refresh_tokens USING btree (session_id, revoked); - - --- --- Name: refresh_tokens_updated_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX refresh_tokens_updated_at_idx ON auth.refresh_tokens USING btree (updated_at DESC); - - --- --- Name: saml_providers_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX saml_providers_sso_provider_id_idx ON auth.saml_providers USING btree (sso_provider_id); - - --- --- Name: saml_relay_states_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX saml_relay_states_created_at_idx ON auth.saml_relay_states USING btree (created_at DESC); - - --- --- Name: saml_relay_states_for_email_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX saml_relay_states_for_email_idx ON auth.saml_relay_states USING btree (for_email); - - --- --- Name: saml_relay_states_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX saml_relay_states_sso_provider_id_idx ON auth.saml_relay_states USING btree (sso_provider_id); - - --- --- Name: sessions_not_after_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX sessions_not_after_idx ON auth.sessions USING btree (not_after DESC); - - --- --- Name: sessions_oauth_client_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX sessions_oauth_client_id_idx ON auth.sessions USING btree (oauth_client_id); - - --- --- Name: sessions_user_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX sessions_user_id_idx ON auth.sessions USING btree (user_id); - - --- --- Name: sso_domains_domain_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX sso_domains_domain_idx ON auth.sso_domains USING btree (lower(domain)); - - --- --- Name: sso_domains_sso_provider_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX sso_domains_sso_provider_id_idx ON auth.sso_domains USING btree (sso_provider_id); - - --- --- Name: sso_providers_resource_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX sso_providers_resource_id_idx ON auth.sso_providers USING btree (lower(resource_id)); - - --- --- Name: sso_providers_resource_id_pattern_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX sso_providers_resource_id_pattern_idx ON auth.sso_providers USING btree (resource_id text_pattern_ops); - - --- --- Name: unique_phone_factor_per_user; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX unique_phone_factor_per_user ON auth.mfa_factors USING btree (user_id, phone); - - --- --- Name: user_id_created_at_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX user_id_created_at_idx ON auth.sessions USING btree (user_id, created_at); - - --- --- Name: users_email_partial_key; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE UNIQUE INDEX users_email_partial_key ON auth.users USING btree (email) WHERE (is_sso_user = false); - - --- --- Name: INDEX users_email_partial_key; Type: COMMENT; Schema: auth; Owner: supabase_auth_admin --- - -COMMENT ON INDEX auth.users_email_partial_key IS 'Auth: A partial unique index that applies only when is_sso_user is false'; - - --- --- Name: users_instance_id_email_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX users_instance_id_email_idx ON auth.users USING btree (instance_id, lower((email)::text)); - - --- --- Name: users_instance_id_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX users_instance_id_idx ON auth.users USING btree (instance_id); - - --- --- Name: users_is_anonymous_idx; Type: INDEX; Schema: auth; Owner: supabase_auth_admin --- - -CREATE INDEX users_is_anonymous_idx ON auth.users USING btree (is_anonymous); - - --- --- Name: agenda_bloqueios_owner_data_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- +-- Indexes +-- Gerado automaticamente em 2026-04-17T12:23:05.235Z +-- Total: 270 CREATE INDEX agenda_bloqueios_owner_data_idx ON public.agenda_bloqueios USING btree (owner_id, data_inicio, data_fim); - --- --- Name: agenda_bloqueios_owner_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_bloqueios_owner_id_idx ON public.agenda_bloqueios USING btree (owner_id); - --- --- Name: agenda_bloqueios_recorrente_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_bloqueios_recorrente_idx ON public.agenda_bloqueios USING btree (owner_id, dia_semana) WHERE (recorrente = true); - --- --- Name: agenda_bloqueios_tenant_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_bloqueios_tenant_id_idx ON public.agenda_bloqueios USING btree (tenant_id); - --- --- Name: agenda_configuracoes_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_configuracoes_tenant_idx ON public.agenda_configuracoes USING btree (tenant_id); - --- --- Name: agenda_configuracoes_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_configuracoes_tenant_owner_idx ON public.agenda_configuracoes USING btree (tenant_id, owner_id); - --- --- Name: agenda_eventos_billing_contract_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_eventos_billing_contract_idx ON public.agenda_eventos USING btree (billing_contract_id) WHERE (billing_contract_id IS NOT NULL); - --- --- Name: agenda_eventos_insurance_plan_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_eventos_insurance_plan_idx ON public.agenda_eventos USING btree (insurance_plan_id); - --- --- Name: agenda_eventos_owner_inicio_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_eventos_owner_inicio_idx ON public.agenda_eventos USING btree (owner_id, inicio_em); - --- --- Name: agenda_eventos_owner_terapeuta_inicio_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_eventos_owner_terapeuta_inicio_idx ON public.agenda_eventos USING btree (owner_id, terapeuta_id, inicio_em); - --- --- Name: agenda_eventos_recurrence_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_eventos_recurrence_idx ON public.agenda_eventos USING btree (recurrence_id) WHERE (recurrence_id IS NOT NULL); - --- --- Name: agenda_eventos_tenant_inicio_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_eventos_tenant_inicio_idx ON public.agenda_eventos USING btree (tenant_id, inicio_em); - --- --- Name: agenda_eventos_tenant_owner_inicio_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_eventos_tenant_owner_inicio_idx ON public.agenda_eventos USING btree (tenant_id, owner_id, inicio_em); - --- --- Name: agenda_excecoes_owner_data_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_excecoes_owner_data_idx ON public.agenda_excecoes USING btree (owner_id, data); - --- --- Name: agenda_excecoes_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_excecoes_tenant_idx ON public.agenda_excecoes USING btree (tenant_id); - --- --- Name: agenda_excecoes_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_excecoes_tenant_owner_idx ON public.agenda_excecoes USING btree (tenant_id, owner_id); - --- --- Name: agenda_online_slots_owner_weekday_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_online_slots_owner_weekday_idx ON public.agenda_online_slots USING btree (owner_id, weekday); - --- --- Name: agenda_online_slots_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_online_slots_tenant_idx ON public.agenda_online_slots USING btree (tenant_id); - --- --- Name: agenda_online_slots_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_online_slots_tenant_owner_idx ON public.agenda_online_slots USING btree (tenant_id, owner_id); - --- --- Name: agenda_regras_semanais_owner_dia_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_regras_semanais_owner_dia_idx ON public.agenda_regras_semanais USING btree (owner_id, dia_semana); - --- --- Name: agenda_regras_semanais_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_regras_semanais_tenant_idx ON public.agenda_regras_semanais USING btree (tenant_id); - --- --- Name: agenda_regras_semanais_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_regras_semanais_tenant_owner_idx ON public.agenda_regras_semanais USING btree (tenant_id, owner_id); - --- --- Name: agenda_slots_bloqueados_semanais_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_slots_bloqueados_semanais_tenant_idx ON public.agenda_slots_bloqueados_semanais USING btree (tenant_id); - --- --- Name: agenda_slots_bloqueados_semanais_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_slots_bloqueados_semanais_tenant_owner_idx ON public.agenda_slots_bloqueados_semanais USING btree (tenant_id, owner_id); - --- --- Name: agenda_slots_regras_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_slots_regras_tenant_idx ON public.agenda_slots_regras USING btree (tenant_id); - --- --- Name: agenda_slots_regras_tenant_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agenda_slots_regras_tenant_owner_idx ON public.agenda_slots_regras USING btree (tenant_id, owner_id); - --- --- Name: agendador_cfg_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agendador_cfg_tenant_idx ON public.agendador_configuracoes USING btree (tenant_id); - --- --- Name: agendador_sol_data_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agendador_sol_data_idx ON public.agendador_solicitacoes USING btree (data_solicitada, hora_solicitada); - --- --- Name: agendador_sol_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agendador_sol_owner_idx ON public.agendador_solicitacoes USING btree (owner_id, status); - --- --- Name: agendador_sol_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX agendador_sol_tenant_idx ON public.agendador_solicitacoes USING btree (tenant_id); - --- --- Name: billing_contracts_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX billing_contracts_owner_idx ON public.billing_contracts USING btree (owner_id); - --- --- Name: billing_contracts_patient_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX billing_contracts_patient_idx ON public.billing_contracts USING btree (patient_id); - --- --- Name: billing_contracts_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX billing_contracts_tenant_idx ON public.billing_contracts USING btree (tenant_id); - --- --- Name: commitment_services_commitment_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX commitment_services_commitment_idx ON public.commitment_services USING btree (commitment_id); - --- --- Name: commitment_services_service_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX commitment_services_service_idx ON public.commitment_services USING btree (service_id); - --- --- Name: commitment_time_logs_calendar_event_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX commitment_time_logs_calendar_event_idx ON public.commitment_time_logs USING btree (calendar_event_id); - --- --- Name: commitment_time_logs_commitment_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX commitment_time_logs_commitment_idx ON public.commitment_time_logs USING btree (commitment_id, created_at DESC); - --- --- Name: commitment_time_logs_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX commitment_time_logs_tenant_idx ON public.commitment_time_logs USING btree (tenant_id, created_at DESC); +CREATE INDEX dal_documento_idx ON public.document_access_logs USING btree (documento_id, acessado_em DESC); --- --- Name: determined_commitment_fields_commitment_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX dal_tenant_idx ON public.document_access_logs USING btree (tenant_id, acessado_em DESC); + +CREATE INDEX dal_user_idx ON public.document_access_logs USING btree (user_id, acessado_em DESC); CREATE INDEX determined_commitment_fields_commitment_idx ON public.determined_commitment_fields USING btree (commitment_id, sort_order); - --- --- Name: determined_commitment_fields_key_uniq; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX determined_commitment_fields_key_uniq ON public.determined_commitment_fields USING btree (commitment_id, key); - --- --- Name: determined_commitment_fields_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX determined_commitment_fields_tenant_idx ON public.determined_commitment_fields USING btree (tenant_id); - --- --- Name: determined_commitments_active_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX determined_commitments_active_idx ON public.determined_commitments USING btree (tenant_id, active); - --- --- Name: determined_commitments_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX determined_commitments_tenant_idx ON public.determined_commitments USING btree (tenant_id); - --- --- Name: determined_commitments_tenant_name_uniq; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX determined_commitments_tenant_name_uniq ON public.determined_commitments USING btree (tenant_id, lower(name)); +CREATE INDEX dg_gerado_por_idx ON public.document_generated USING btree (gerado_por, gerado_em DESC); --- --- Name: feriados_global_unique; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX dg_patient_idx ON public.document_generated USING btree (patient_id, gerado_em DESC); + +CREATE INDEX dg_template_idx ON public.document_generated USING btree (template_id); + +CREATE INDEX dg_tenant_idx ON public.document_generated USING btree (tenant_id, gerado_em DESC); + +CREATE INDEX docs_active_idx ON public.documents USING btree (patient_id, uploaded_at DESC) WHERE (deleted_at IS NULL); + +CREATE INDEX docs_nome_trgm_idx ON public.documents USING gin (nome_original public.gin_trgm_ops); + +CREATE INDEX docs_owner_idx ON public.documents USING btree (owner_id); + +CREATE INDEX docs_patient_idx ON public.documents USING btree (patient_id); + +CREATE INDEX docs_tags_idx ON public.documents USING gin (tags); + +CREATE INDEX docs_tenant_idx ON public.documents USING btree (tenant_id); + +CREATE INDEX docs_tipo_idx ON public.documents USING btree (patient_id, tipo_documento); + +CREATE INDEX docs_uploaded_at_idx ON public.documents USING btree (patient_id, uploaded_at DESC); + +CREATE INDEX ds_documento_idx ON public.document_signatures USING btree (documento_id, ordem); + +CREATE INDEX ds_status_idx ON public.document_signatures USING btree (documento_id, status); + +CREATE INDEX ds_tenant_idx ON public.document_signatures USING btree (tenant_id); + +CREATE INDEX dsl_documento_idx ON public.document_share_links USING btree (documento_id); + +CREATE INDEX dsl_expira_idx ON public.document_share_links USING btree (expira_em) WHERE (ativo = true); + +CREATE INDEX dsl_token_idx ON public.document_share_links USING btree (token) WHERE (ativo = true); + +CREATE INDEX dt_global_idx ON public.document_templates USING btree (is_global) WHERE (is_global = true); + +CREATE INDEX dt_nome_trgm_idx ON public.document_templates USING gin (nome_template public.gin_trgm_ops); + +CREATE INDEX dt_owner_idx ON public.document_templates USING btree (owner_id); + +CREATE INDEX dt_tenant_idx ON public.document_templates USING btree (tenant_id); + +CREATE INDEX dt_tipo_idx ON public.document_templates USING btree (tipo); CREATE UNIQUE INDEX feriados_global_unique ON public.feriados USING btree (data, nome) WHERE (tenant_id IS NULL); - --- --- Name: financial_exceptions_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX financial_exceptions_owner_idx ON public.financial_exceptions USING btree (owner_id); - --- --- Name: financial_exceptions_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX financial_exceptions_tenant_idx ON public.financial_exceptions USING btree (tenant_id); - --- --- Name: idx_addon_credits_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_addon_credits_tenant ON public.addon_credits USING btree (tenant_id) WHERE (is_active = true); - --- --- Name: idx_addon_credits_type; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_addon_credits_type ON public.addon_credits USING btree (addon_type) WHERE (is_active = true); - --- --- Name: idx_addon_products_active; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_addon_products_active ON public.addon_products USING btree (is_active, is_visible) WHERE (deleted_at IS NULL); - --- --- Name: idx_addon_products_type; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_addon_products_type ON public.addon_products USING btree (addon_type) WHERE (deleted_at IS NULL); - --- --- Name: idx_addon_tx_created; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_addon_tx_created ON public.addon_transactions USING btree (created_at DESC); - --- --- Name: idx_addon_tx_queue; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_addon_tx_queue ON public.addon_transactions USING btree (queue_id) WHERE (queue_id IS NOT NULL); - --- --- Name: idx_addon_tx_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_addon_tx_tenant ON public.addon_transactions USING btree (tenant_id, addon_type); - --- --- Name: idx_addon_tx_type; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_addon_tx_type ON public.addon_transactions USING btree (type); - --- --- Name: idx_agenda_eventos_determined_commitment_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_agenda_eventos_determined_commitment_id ON public.agenda_eventos USING btree (determined_commitment_id); - --- --- Name: idx_agenda_excecoes_owner_data; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_agenda_excecoes_owner_data ON public.agenda_excecoes USING btree (owner_id, data); - --- --- Name: idx_agenda_slots_regras_owner_dia; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_agenda_slots_regras_owner_dia ON public.agenda_slots_regras USING btree (owner_id, dia_semana); - --- --- Name: idx_email_templates_global_domain; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_email_templates_global_domain ON public.email_templates_global USING btree (domain) WHERE (is_active = true); - --- --- Name: idx_email_templates_global_key; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_email_templates_global_key ON public.email_templates_global USING btree (key) WHERE (is_active = true); - --- --- Name: idx_email_templates_tenant_lookup; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_email_templates_tenant_lookup ON public.email_templates_tenant USING btree (tenant_id, template_key) WHERE (enabled = true); - --- --- Name: idx_email_templates_tenant_owner; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_email_templates_tenant_owner ON public.email_templates_tenant USING btree (owner_id, template_key) WHERE ((enabled = true) AND (owner_id IS NOT NULL)); - --- --- Name: idx_financial_categories_user_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_categories_user_id ON public.financial_categories USING btree (user_id); - --- --- Name: idx_financial_records_active; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_active ON public.financial_records USING btree (owner_id, paid_at DESC) WHERE (deleted_at IS NULL); - --- --- Name: idx_financial_records_agenda_evento_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_agenda_evento_id ON public.financial_records USING btree (agenda_evento_id) WHERE (agenda_evento_id IS NOT NULL); - --- --- Name: idx_financial_records_category_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_category_id ON public.financial_records USING btree (category_id) WHERE (category_id IS NOT NULL); - --- --- Name: idx_financial_records_due_date; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_due_date ON public.financial_records USING btree (due_date); - --- --- Name: idx_financial_records_installment_group; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_installment_group ON public.financial_records USING btree (installment_group) WHERE (installment_group IS NOT NULL); - --- --- Name: idx_financial_records_owner_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_owner_id ON public.financial_records USING btree (owner_id); - --- --- Name: idx_financial_records_paid_at; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_paid_at ON public.financial_records USING btree (paid_at DESC); - --- --- Name: idx_financial_records_patient_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_patient_id ON public.financial_records USING btree (patient_id); - --- --- Name: idx_financial_records_status; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_status ON public.financial_records USING btree (status) WHERE (deleted_at IS NULL); - --- --- Name: idx_financial_records_tenant_active; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_tenant_active ON public.financial_records USING btree (tenant_id, paid_at DESC) WHERE ((deleted_at IS NULL) AND (tenant_id IS NOT NULL)); - --- --- Name: idx_financial_records_tenant_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_tenant_id ON public.financial_records USING btree (tenant_id); - --- --- Name: idx_financial_records_type_status; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_financial_records_type_status ON public.financial_records USING btree (type, status); - --- --- Name: idx_global_notices_active_priority; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_global_notices_active_priority ON public.global_notices USING btree (is_active, priority DESC, starts_at, ends_at); - --- --- Name: idx_intakes_converted_patient_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_intakes_converted_patient_id ON public.patient_intake_requests USING btree (converted_patient_id); - --- --- Name: idx_intakes_owner_cpf; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_intakes_owner_cpf ON public.patient_intake_requests USING btree (owner_id, cpf); - --- --- Name: idx_intakes_owner_created; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_intakes_owner_created ON public.patient_intake_requests USING btree (owner_id, created_at DESC); - --- --- Name: idx_intakes_owner_status_created; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_intakes_owner_status_created ON public.patient_intake_requests USING btree (owner_id, status, created_at DESC); - --- --- Name: idx_intakes_status_created; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_intakes_status_created ON public.patient_intake_requests USING btree (status, created_at DESC); - --- --- Name: idx_notice_dismissals_user; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notice_dismissals_user ON public.notice_dismissals USING btree (user_id, notice_id); - --- --- Name: idx_notif_channels_owner_active; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_channels_owner_active ON public.notification_channels USING btree (owner_id, channel) WHERE ((is_active = true) AND (deleted_at IS NULL)); - --- --- Name: idx_notif_channels_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_channels_tenant ON public.notification_channels USING btree (tenant_id) WHERE (deleted_at IS NULL); - --- --- Name: idx_notif_logs_owner_date; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_logs_owner_date ON public.notification_logs USING btree (owner_id, created_at DESC); - --- --- Name: idx_notif_logs_patient; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_logs_patient ON public.notification_logs USING btree (patient_id, created_at DESC); - --- --- Name: idx_notif_logs_provider_msg; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_logs_provider_msg ON public.notification_logs USING btree (provider_message_id) WHERE (provider_message_id IS NOT NULL); - --- --- Name: idx_notif_logs_status; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_logs_status ON public.notification_logs USING btree (status, created_at DESC); - --- --- Name: idx_notif_logs_tenant_date; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_logs_tenant_date ON public.notification_logs USING btree (tenant_id, created_at DESC); - --- --- Name: idx_notif_prefs_owner; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_prefs_owner ON public.notification_preferences USING btree (owner_id) WHERE (deleted_at IS NULL); - --- --- Name: idx_notif_prefs_patient; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_prefs_patient ON public.notification_preferences USING btree (patient_id) WHERE (deleted_at IS NULL); - --- --- Name: idx_notif_prefs_whatsapp_active; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_prefs_whatsapp_active ON public.notification_preferences USING btree (owner_id, patient_id) WHERE ((whatsapp_opt_in = true) AND (deleted_at IS NULL)); - --- --- Name: idx_notif_queue_evento; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_queue_evento ON public.notification_queue USING btree (agenda_evento_id) WHERE (status = ANY (ARRAY['pendente'::text, 'processando'::text])); - --- --- Name: idx_notif_queue_patient; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_queue_patient ON public.notification_queue USING btree (patient_id, channel) WHERE (status = 'pendente'::text); - --- --- Name: idx_notif_queue_pending; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_queue_pending ON public.notification_queue USING btree (scheduled_at) WHERE (status = 'pendente'::text); - --- --- Name: idx_notif_queue_processing; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_queue_processing ON public.notification_queue USING btree (status, updated_at) WHERE (status = 'processando'::text); - --- --- Name: idx_notif_queue_retry; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_queue_retry ON public.notification_queue USING btree (next_retry_at) WHERE ((status = 'pendente'::text) AND (attempts > 0)); - --- --- Name: idx_notif_queue_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_queue_tenant ON public.notification_queue USING btree (tenant_id, created_at DESC); - --- --- Name: idx_notif_schedules_owner_active; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_schedules_owner_active ON public.notification_schedules USING btree (owner_id, event_type) WHERE ((is_active = true) AND (deleted_at IS NULL)); - --- --- Name: idx_notif_templates_default; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_templates_default ON public.notification_templates USING btree (channel, event_type) WHERE ((is_default = true) AND (deleted_at IS NULL) AND (tenant_id IS NULL)); - --- --- Name: idx_notif_templates_lookup; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_templates_lookup ON public.notification_templates USING btree (channel, event_type, is_active) WHERE (deleted_at IS NULL); - --- --- Name: idx_notif_templates_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_notif_templates_tenant ON public.notification_templates USING btree (tenant_id, channel, event_type) WHERE ((deleted_at IS NULL) AND (is_active = true)); +CREATE INDEX idx_notification_channels_twilio_subaccount_sid ON public.notification_channels USING btree (twilio_subaccount_sid) WHERE (twilio_subaccount_sid IS NOT NULL); --- --- Name: idx_patient_group_patient_group_id; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX idx_patient_contacts_patient ON public.patient_contacts USING btree (patient_id); + +CREATE INDEX idx_patient_contacts_tenant ON public.patient_contacts USING btree (tenant_id); CREATE INDEX idx_patient_group_patient_group_id ON public.patient_group_patient USING btree (patient_group_id); - --- --- Name: idx_patient_groups_owner; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patient_groups_owner ON public.patient_groups USING btree (owner_id); - --- --- Name: idx_patient_groups_owner_system_nome; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patient_groups_owner_system_nome ON public.patient_groups USING btree (owner_id, is_system, nome); - --- --- Name: idx_patient_tags_owner; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patient_tags_owner ON public.patient_tags USING btree (owner_id); - --- --- Name: idx_patients_created_at; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patients_created_at ON public.patients USING btree (created_at DESC); - --- --- Name: idx_patients_last_attended; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patients_last_attended ON public.patients USING btree (last_attended_at DESC); - --- --- Name: idx_patients_owner_email_principal; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX idx_patients_origem ON public.patients USING btree (tenant_id, origem) WHERE (origem IS NOT NULL); CREATE INDEX idx_patients_owner_email_principal ON public.patients USING btree (owner_id, email_principal); - --- --- Name: idx_patients_owner_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patients_owner_id ON public.patients USING btree (owner_id); - --- --- Name: idx_patients_owner_nome; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patients_owner_nome ON public.patients USING btree (owner_id, nome_completo); - --- --- Name: idx_patients_responsible_member; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patients_responsible_member ON public.patients USING btree (responsible_member_id); - --- --- Name: idx_patients_status; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX idx_patients_risco_elevado ON public.patients USING btree (tenant_id, risco_elevado) WHERE (risco_elevado = true); CREATE INDEX idx_patients_status ON public.patients USING btree (status); - --- --- Name: idx_patients_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX idx_patients_status_tenant ON public.patients USING btree (tenant_id, status); CREATE INDEX idx_patients_tenant ON public.patients USING btree (tenant_id); - --- --- Name: idx_patients_tenant_email_norm; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_patients_tenant_email_norm ON public.patients USING btree (tenant_id, lower(TRIM(BOTH FROM email_principal))); - --- --- Name: idx_pgp_group; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_pgp_group ON public.patient_group_patient USING btree (patient_group_id); - --- --- Name: idx_pgp_patient; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_pgp_patient ON public.patient_group_patient USING btree (patient_id); - --- --- Name: idx_ppt_patient; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_ppt_patient ON public.patient_patient_tag USING btree (patient_id); - --- --- Name: idx_ppt_tag; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_ppt_tag ON public.patient_patient_tag USING btree (tag_id); +CREATE INDEX idx_psh_patient ON public.patient_status_history USING btree (patient_id, alterado_em DESC); --- --- Name: idx_slots_bloq_owner_dia; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX idx_psh_tenant ON public.patient_status_history USING btree (tenant_id, alterado_em DESC); + +CREATE INDEX idx_pt_evento_tipo ON public.patient_timeline USING btree (patient_id, evento_tipo); + +CREATE INDEX idx_pt_patient_ocorrido ON public.patient_timeline USING btree (patient_id, ocorrido_em DESC); + +CREATE INDEX idx_pt_tenant ON public.patient_timeline USING btree (tenant_id, ocorrido_em DESC); CREATE INDEX idx_slots_bloq_owner_dia ON public.agenda_slots_bloqueados_semanais USING btree (owner_id, dia_semana); - --- --- Name: idx_subscription_intents_plan_interval; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_subscription_intents_plan_interval ON public.subscription_intents_legacy USING btree (plan_key, "interval"); - --- --- Name: idx_subscription_intents_status; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_subscription_intents_status ON public.subscription_intents_legacy USING btree (status); - --- --- Name: idx_subscription_intents_user_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_subscription_intents_user_id ON public.subscription_intents_legacy USING btree (user_id); - --- --- Name: idx_tenant_features_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_tenant_features_tenant ON public.tenant_features USING btree (tenant_id); - --- --- Name: idx_tenant_invites_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_tenant_invites_tenant ON public.tenant_invites USING btree (tenant_id); - --- --- Name: idx_tenant_invites_token; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_tenant_invites_token ON public.tenant_invites USING btree (token); - --- --- Name: idx_therapist_payout_records_financial_record_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_therapist_payout_records_financial_record_id ON public.therapist_payout_records USING btree (financial_record_id); - --- --- Name: idx_therapist_payouts_owner_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_therapist_payouts_owner_id ON public.therapist_payouts USING btree (owner_id); - --- --- Name: idx_therapist_payouts_period; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_therapist_payouts_period ON public.therapist_payouts USING btree (period_start, period_end); - --- --- Name: idx_therapist_payouts_status; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_therapist_payouts_status ON public.therapist_payouts USING btree (status) WHERE (status = 'pending'::text); - --- --- Name: idx_therapist_payouts_tenant_id; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX idx_therapist_payouts_tenant_id ON public.therapist_payouts USING btree (tenant_id); +CREATE INDEX idx_twilio_usage_channel ON public.twilio_subaccount_usage USING btree (channel_id, period_start DESC); --- --- Name: insurance_plans_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX idx_twilio_usage_tenant_period ON public.twilio_subaccount_usage USING btree (tenant_id, period_start DESC); + +CREATE UNIQUE INDEX idx_twilio_usage_unique_period ON public.twilio_subaccount_usage USING btree (channel_id, period_start, period_end); CREATE INDEX insurance_plans_owner_idx ON public.insurance_plans USING btree (owner_id); - --- --- Name: insurance_plans_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX insurance_plans_tenant_idx ON public.insurance_plans USING btree (tenant_id); - --- --- Name: ix_plan_prices_plan; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX ix_plan_prices_plan ON public.plan_prices USING btree (plan_id); - --- --- Name: ix_plan_public_bullets_plan; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX ix_plan_public_bullets_plan ON public.plan_public_bullets USING btree (plan_id); - --- --- Name: ix_plan_public_sort; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX ix_plan_public_sort ON public.plan_public USING btree (sort_order); +CREATE INDEX medicos_especialidade_idx ON public.medicos USING btree (especialidade); --- --- Name: notifications_owner_created; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX medicos_nome_idx ON public.medicos USING btree (nome); + +CREATE INDEX medicos_nome_trgm_idx ON public.medicos USING gin (nome public.gin_trgm_ops); + +CREATE INDEX medicos_owner_idx ON public.medicos USING btree (owner_id); + +CREATE INDEX medicos_tenant_idx ON public.medicos USING btree (tenant_id); CREATE INDEX notifications_owner_created ON public.notifications USING btree (owner_id, created_at DESC); - --- --- Name: notifications_owner_unread; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX notifications_owner_unread ON public.notifications USING btree (owner_id, read_at) WHERE (read_at IS NULL); - --- --- Name: patient_discounts_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_discounts_owner_idx ON public.patient_discounts USING btree (owner_id); - --- --- Name: patient_discounts_patient_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_discounts_patient_idx ON public.patient_discounts USING btree (patient_id); - --- --- Name: patient_discounts_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_discounts_tenant_idx ON public.patient_discounts USING btree (tenant_id); - --- --- Name: patient_group_patient_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_group_patient_tenant_idx ON public.patient_group_patient USING btree (tenant_id); - --- --- Name: patient_groups_owner_nome_uniq; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX patient_groups_owner_nome_uniq ON public.patient_groups USING btree (owner_id, nome); - --- --- Name: patient_groups_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_groups_tenant_idx ON public.patient_groups USING btree (tenant_id); - --- --- Name: patient_intake_owner_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_intake_owner_id_idx ON public.patient_intake_requests USING btree (owner_id); - --- --- Name: patient_intake_requests_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_intake_requests_tenant_idx ON public.patient_intake_requests USING btree (tenant_id); - --- --- Name: patient_intake_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_intake_status_idx ON public.patient_intake_requests USING btree (status); - --- --- Name: patient_intake_token_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_intake_token_idx ON public.patient_intake_requests USING btree (token); - --- --- Name: patient_invites_one_active_per_owner; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX patient_invites_one_active_per_owner ON public.patient_invites USING btree (owner_id) WHERE (active = true); - --- --- Name: patient_invites_owner_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_invites_owner_id_idx ON public.patient_invites USING btree (owner_id); - --- --- Name: patient_invites_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_invites_tenant_idx ON public.patient_invites USING btree (tenant_id); - --- --- Name: patient_invites_token_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_invites_token_idx ON public.patient_invites USING btree (token); - --- --- Name: patient_patient_tag_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_patient_tag_tenant_idx ON public.patient_patient_tag USING btree (tenant_id); - --- --- Name: patient_tags_owner_name_uq; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX patient_tags_owner_name_uq ON public.patient_tags USING btree (owner_id, lower(nome)); - --- --- Name: patient_tags_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX patient_tags_tenant_idx ON public.patient_tags USING btree (tenant_id); +CREATE INDEX patients_convenio_id_idx ON public.patients USING btree (convenio_id); --- --- Name: payment_settings_tenant_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX patients_etnia_idx ON public.patients USING btree (etnia); + +CREATE INDEX patients_pronomes_idx ON public.patients USING btree (pronomes); CREATE INDEX payment_settings_tenant_id_idx ON public.payment_settings USING btree (tenant_id); - --- --- Name: ppt_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX ppt_owner_idx ON public.patient_patient_tag USING btree (owner_id); - --- --- Name: ppt_patient_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX ppt_patient_idx ON public.patient_patient_tag USING btree (patient_id); - --- --- Name: ppt_tag_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX ppt_tag_idx ON public.patient_patient_tag USING btree (tag_id); - --- --- Name: professional_pricing_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX professional_pricing_tenant_idx ON public.professional_pricing USING btree (tenant_id); - --- --- Name: profiles_work_description_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX profiles_work_description_idx ON public.profiles USING btree (work_description) WHERE (work_description IS NOT NULL); +CREATE INDEX psc_owner_idx ON public.patient_support_contacts USING btree (owner_id); --- --- Name: recurrence_exceptions_rule_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE INDEX psc_patient_idx ON public.patient_support_contacts USING btree (patient_id); CREATE INDEX recurrence_exceptions_rule_idx ON public.recurrence_exceptions USING btree (recurrence_id); - --- --- Name: recurrence_exceptions_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX recurrence_exceptions_tenant_idx ON public.recurrence_exceptions USING btree (tenant_id); - --- --- Name: recurrence_rule_services_rule_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX recurrence_rule_services_rule_idx ON public.recurrence_rule_services USING btree (rule_id); - --- --- Name: recurrence_rule_services_service_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX recurrence_rule_services_service_idx ON public.recurrence_rule_services USING btree (service_id); - --- --- Name: recurrence_rules_active_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX recurrence_rules_active_idx ON public.recurrence_rules USING btree (owner_id, status) WHERE (status = 'ativo'::text); - --- --- Name: recurrence_rules_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX recurrence_rules_owner_idx ON public.recurrence_rules USING btree (owner_id); - --- --- Name: recurrence_rules_patient_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX recurrence_rules_patient_idx ON public.recurrence_rules USING btree (patient_id); - --- --- Name: recurrence_rules_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX recurrence_rules_tenant_idx ON public.recurrence_rules USING btree (tenant_id); - --- --- Name: saas_doc_votos_doc_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_doc_votos_doc_id_idx ON public.saas_doc_votos USING btree (doc_id); - --- --- Name: saas_doc_votos_user_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_doc_votos_user_id_idx ON public.saas_doc_votos USING btree (user_id); - --- --- Name: saas_docs_categoria_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_docs_categoria_idx ON public.saas_docs USING btree (categoria); - --- --- Name: saas_docs_exibir_no_faq_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_docs_exibir_no_faq_idx ON public.saas_docs USING btree (exibir_no_faq) WHERE (exibir_no_faq = true); - --- --- Name: saas_docs_path_ativo_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_docs_path_ativo_idx ON public.saas_docs USING btree (pagina_path, ativo); - --- --- Name: saas_faq_ativo_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_faq_ativo_idx ON public.saas_faq USING btree (ativo); - --- --- Name: saas_faq_categoria_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_faq_categoria_idx ON public.saas_faq USING btree (categoria); - --- --- Name: saas_faq_fts_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_faq_fts_idx ON public.saas_faq USING gin (to_tsvector('portuguese'::regconfig, ((COALESCE(pergunta, ''::text) || ' '::text) || COALESCE(conteudo, ''::text)))); - --- --- Name: saas_faq_itens_ativo_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_faq_itens_ativo_idx ON public.saas_faq_itens USING btree (ativo); - --- --- Name: saas_faq_itens_doc_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_faq_itens_doc_id_idx ON public.saas_faq_itens USING btree (doc_id); - --- --- Name: saas_faq_pagina_path_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_faq_pagina_path_idx ON public.saas_faq USING btree (pagina_path); - --- --- Name: saas_faq_publico_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_faq_publico_idx ON public.saas_faq USING btree (publico); - --- --- Name: saas_faq_votos_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX saas_faq_votos_idx ON public.saas_faq USING btree (votos DESC); - --- --- Name: services_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX services_owner_idx ON public.services USING btree (owner_id); - --- --- Name: services_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX services_tenant_idx ON public.services USING btree (tenant_id); - --- --- Name: sint_personal_created_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX sint_personal_created_idx ON public.subscription_intents_personal USING btree (created_at DESC); - --- --- Name: sint_personal_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX sint_personal_status_idx ON public.subscription_intents_personal USING btree (status); - --- --- Name: sint_tenant_created_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX sint_tenant_created_idx ON public.subscription_intents_tenant USING btree (created_at DESC); - --- --- Name: sint_tenant_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX sint_tenant_status_idx ON public.subscription_intents_tenant USING btree (status); - --- --- Name: sint_tenant_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX sint_tenant_tenant_idx ON public.subscription_intents_tenant USING btree (tenant_id); - --- --- Name: subscription_events_created_at_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscription_events_created_at_idx ON public.subscription_events USING btree (created_at DESC); - --- --- Name: subscription_events_owner_ref_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscription_events_owner_ref_idx ON public.subscription_events USING btree (owner_type, owner_ref); - --- --- Name: subscription_events_sub_created_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscription_events_sub_created_idx ON public.subscription_events USING btree (subscription_id, created_at DESC); - --- --- Name: subscription_events_subscription_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscription_events_subscription_id_idx ON public.subscription_events USING btree (subscription_id); - --- --- Name: subscriptions_one_active_per_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX subscriptions_one_active_per_tenant ON public.subscriptions USING btree (tenant_id) WHERE (status = 'active'::text); - --- --- Name: subscriptions_one_active_per_user; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX subscriptions_one_active_per_user ON public.subscriptions USING btree (user_id) WHERE (status = 'active'::text); - --- --- Name: subscriptions_one_active_per_user_personal; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX subscriptions_one_active_per_user_personal ON public.subscriptions USING btree (user_id) WHERE ((tenant_id IS NULL) AND (status = 'active'::text)); - --- --- Name: subscriptions_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscriptions_owner_idx ON public.subscriptions USING btree (user_id); - --- --- Name: subscriptions_plan_key_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscriptions_plan_key_idx ON public.subscriptions USING btree (plan_key); - --- --- Name: subscriptions_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscriptions_status_idx ON public.subscriptions USING btree (status); - --- --- Name: subscriptions_tenant_id_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscriptions_tenant_id_idx ON public.subscriptions USING btree (tenant_id); - --- --- Name: subscriptions_tenant_period_end_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscriptions_tenant_period_end_idx ON public.subscriptions USING btree (tenant_id, current_period_end); - --- --- Name: subscriptions_tenant_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscriptions_tenant_status_idx ON public.subscriptions USING btree (tenant_id, status); - --- --- Name: subscriptions_user_status_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX subscriptions_user_status_idx ON public.subscriptions USING btree (user_id, status, created_at DESC); - --- --- Name: support_sessions_expires_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX support_sessions_expires_idx ON public.support_sessions USING btree (expires_at); - --- --- Name: support_sessions_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX support_sessions_tenant_idx ON public.support_sessions USING btree (tenant_id); - --- --- Name: support_sessions_token_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX support_sessions_token_idx ON public.support_sessions USING btree (token); - --- --- Name: tenant_members_tenant_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX tenant_members_tenant_idx ON public.tenant_members USING btree (tenant_id); - --- --- Name: tenant_members_user_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX tenant_members_user_idx ON public.tenant_members USING btree (user_id); - --- --- Name: tenant_modules_owner_idx; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE INDEX tenant_modules_owner_idx ON public.tenant_modules USING btree (owner_id); - --- --- Name: unique_member_per_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX unique_member_per_tenant ON public.tenant_members USING btree (tenant_id, user_id); - --- --- Name: uq_patients_tenant_user; Type: INDEX; Schema: public; Owner: supabase_admin --- +CREATE UNIQUE INDEX uq_patient_contacts_primario ON public.patient_contacts USING btree (patient_id) WHERE ((is_primario = true) AND (ativo = true)); CREATE UNIQUE INDEX uq_patients_tenant_user ON public.patients USING btree (tenant_id, user_id) WHERE (user_id IS NOT NULL); - --- --- Name: uq_plan_price_active; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX uq_plan_price_active ON public.plan_prices USING btree (plan_id, "interval", currency) WHERE ((is_active = true) AND (active_to IS NULL)); - --- --- Name: uq_plan_prices_active; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX uq_plan_prices_active ON public.plan_prices USING btree (plan_id, "interval") WHERE (is_active = true); - --- --- Name: uq_subscriptions_active_by_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX uq_subscriptions_active_by_tenant ON public.subscriptions USING btree (tenant_id) WHERE ((tenant_id IS NOT NULL) AND (status = 'active'::text)); - --- --- Name: uq_subscriptions_active_personal_by_user; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX uq_subscriptions_active_personal_by_user ON public.subscriptions USING btree (user_id) WHERE ((tenant_id IS NULL) AND (status = 'active'::text)); - --- --- Name: uq_tenant_invites_pending; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX uq_tenant_invites_pending ON public.tenant_invites USING btree (tenant_id, lower(email), role) WHERE ((accepted_at IS NULL) AND (revoked_at IS NULL)); - --- --- Name: uq_tenant_members_tenant_user; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX uq_tenant_members_tenant_user ON public.tenant_members USING btree (tenant_id, user_id); - --- --- Name: ux_subscriptions_active_per_personal_user; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX ux_subscriptions_active_per_personal_user ON public.subscriptions USING btree (user_id) WHERE ((status = 'active'::text) AND (tenant_id IS NULL)); - --- --- Name: ux_subscriptions_active_per_tenant; Type: INDEX; Schema: public; Owner: supabase_admin --- - CREATE UNIQUE INDEX ux_subscriptions_active_per_tenant ON public.subscriptions USING btree (tenant_id) WHERE ((status = 'active'::text) AND (tenant_id IS NOT NULL)); - - --- --- Name: ix_realtime_subscription_entity; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE INDEX ix_realtime_subscription_entity ON realtime.subscription USING btree (entity); - - --- --- Name: messages_inserted_at_topic_index; Type: INDEX; Schema: realtime; Owner: supabase_realtime_admin --- - -CREATE INDEX messages_inserted_at_topic_index ON ONLY realtime.messages USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); - - --- --- Name: messages_2026_03_20_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE INDEX messages_2026_03_20_inserted_at_topic_idx ON realtime.messages_2026_03_20 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); - - --- --- Name: messages_2026_03_21_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE INDEX messages_2026_03_21_inserted_at_topic_idx ON realtime.messages_2026_03_21 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); - - --- --- Name: messages_2026_03_22_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE INDEX messages_2026_03_22_inserted_at_topic_idx ON realtime.messages_2026_03_22 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); - - --- --- Name: messages_2026_03_23_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE INDEX messages_2026_03_23_inserted_at_topic_idx ON realtime.messages_2026_03_23 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); - - --- --- Name: messages_2026_03_24_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE INDEX messages_2026_03_24_inserted_at_topic_idx ON realtime.messages_2026_03_24 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); - - --- --- Name: messages_2026_03_25_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE INDEX messages_2026_03_25_inserted_at_topic_idx ON realtime.messages_2026_03_25 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); - - --- --- Name: messages_2026_03_26_inserted_at_topic_idx; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE INDEX messages_2026_03_26_inserted_at_topic_idx ON realtime.messages_2026_03_26 USING btree (inserted_at DESC, topic) WHERE ((extension = 'broadcast'::text) AND (private IS TRUE)); - - --- --- Name: subscription_subscription_id_entity_filters_key; Type: INDEX; Schema: realtime; Owner: supabase_admin --- - -CREATE UNIQUE INDEX subscription_subscription_id_entity_filters_key ON realtime.subscription USING btree (subscription_id, entity, filters); - - --- --- Name: bname; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE UNIQUE INDEX bname ON storage.buckets USING btree (name); - - --- --- Name: bucketid_objname; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE UNIQUE INDEX bucketid_objname ON storage.objects USING btree (bucket_id, name); - - --- --- Name: buckets_analytics_unique_name_idx; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE UNIQUE INDEX buckets_analytics_unique_name_idx ON storage.buckets_analytics USING btree (name) WHERE (deleted_at IS NULL); - - --- --- Name: idx_iceberg_namespaces_bucket_id; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE UNIQUE INDEX idx_iceberg_namespaces_bucket_id ON storage.iceberg_namespaces USING btree (catalog_id, name); - - --- --- Name: idx_iceberg_tables_location; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE UNIQUE INDEX idx_iceberg_tables_location ON storage.iceberg_tables USING btree (location); - - --- --- Name: idx_iceberg_tables_namespace_id; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE UNIQUE INDEX idx_iceberg_tables_namespace_id ON storage.iceberg_tables USING btree (catalog_id, namespace_id, name); - - --- --- Name: idx_multipart_uploads_list; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE INDEX idx_multipart_uploads_list ON storage.s3_multipart_uploads USING btree (bucket_id, key, created_at); - - --- --- Name: idx_objects_bucket_id_name; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE INDEX idx_objects_bucket_id_name ON storage.objects USING btree (bucket_id, name COLLATE "C"); - - --- --- Name: idx_objects_bucket_id_name_lower; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE INDEX idx_objects_bucket_id_name_lower ON storage.objects USING btree (bucket_id, lower(name) COLLATE "C"); - - --- --- Name: name_prefix_search; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE INDEX name_prefix_search ON storage.objects USING btree (name text_pattern_ops); - - --- --- Name: vector_indexes_name_bucket_id_idx; Type: INDEX; Schema: storage; Owner: supabase_storage_admin --- - -CREATE UNIQUE INDEX vector_indexes_name_bucket_id_idx ON storage.vector_indexes USING btree (name, bucket_id); - - --- --- Name: supabase_functions_hooks_h_table_id_h_name_idx; Type: INDEX; Schema: supabase_functions; Owner: supabase_functions_admin --- - -CREATE INDEX supabase_functions_hooks_h_table_id_h_name_idx ON supabase_functions.hooks USING btree (hook_table_id, hook_name); - - --- --- Name: supabase_functions_hooks_request_id_idx; Type: INDEX; Schema: supabase_functions; Owner: supabase_functions_admin --- - -CREATE INDEX supabase_functions_hooks_request_id_idx ON supabase_functions.hooks USING btree (request_id); diff --git a/database-novo/schema/07_foreign_keys/constraints.sql b/database-novo/schema/07_foreign_keys/constraints.sql index defab1e..5fe585c 100644 --- a/database-novo/schema/07_foreign_keys/constraints.sql +++ b/database-novo/schema/07_foreign_keys/constraints.sql @@ -1,2629 +1,828 @@ --- ============================================================================= --- AgenciaPsi — Primary Keys, Unique Constraints, Foreign Keys --- ============================================================================= +-- Constraints (PK, FK, UNIQUE, CHECK) +-- Gerado automaticamente em 2026-04-17T12:23:05.237Z +-- Total: 275 --- ═══ PKs + UNIQUE + CHECK constraints ═══ +ALTER TABLE ONLY public._db_migrations + ADD CONSTRAINT _db_migrations_filename_key UNIQUE (filename); -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_20 FOR VALUES FROM ('2026-03-20 00:00:00') TO ('2026-03-21 00:00:00'); - - --- --- Name: messages_2026_03_21; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_21 FOR VALUES FROM ('2026-03-21 00:00:00') TO ('2026-03-22 00:00:00'); - - --- --- Name: messages_2026_03_22; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_22 FOR VALUES FROM ('2026-03-22 00:00:00') TO ('2026-03-23 00:00:00'); - - --- --- Name: messages_2026_03_23; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_23 FOR VALUES FROM ('2026-03-23 00:00:00') TO ('2026-03-24 00:00:00'); - - --- --- Name: messages_2026_03_24; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_24 FOR VALUES FROM ('2026-03-24 00:00:00') TO ('2026-03-25 00:00:00'); - - --- --- Name: messages_2026_03_25; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_25 FOR VALUES FROM ('2026-03-25 00:00:00') TO ('2026-03-26 00:00:00'); - - --- --- Name: messages_2026_03_26; Type: TABLE ATTACH; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages ATTACH PARTITION realtime.messages_2026_03_26 FOR VALUES FROM ('2026-03-26 00:00:00') TO ('2026-03-27 00:00:00'); - - --- --- Name: refresh_tokens id; Type: DEFAULT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.refresh_tokens ALTER COLUMN id SET DEFAULT nextval('auth.refresh_tokens_id_seq'::regclass); - - --- --- Name: agenda_online_slots id; Type: DEFAULT; Schema: public; Owner: supabase_admin --- - -ALTER TABLE ONLY public.agenda_online_slots ALTER COLUMN id SET DEFAULT nextval('public.agenda_online_slots_id_seq'::regclass); - - --- --- Name: hooks id; Type: DEFAULT; Schema: supabase_functions; Owner: supabase_functions_admin --- - -ALTER TABLE ONLY supabase_functions.hooks ALTER COLUMN id SET DEFAULT nextval('supabase_functions.hooks_id_seq'::regclass); - - --- --- Name: extensions extensions_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY _realtime.extensions - ADD CONSTRAINT extensions_pkey PRIMARY KEY (id); - - --- --- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY _realtime.schema_migrations - ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version); - - --- --- Name: tenants tenants_pkey; Type: CONSTRAINT; Schema: _realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY _realtime.tenants - ADD CONSTRAINT tenants_pkey PRIMARY KEY (id); - - --- --- Name: mfa_amr_claims amr_id_pk; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.mfa_amr_claims - ADD CONSTRAINT amr_id_pk PRIMARY KEY (id); - - --- --- Name: audit_log_entries audit_log_entries_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.audit_log_entries - ADD CONSTRAINT audit_log_entries_pkey PRIMARY KEY (id); - - --- --- Name: flow_state flow_state_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.flow_state - ADD CONSTRAINT flow_state_pkey PRIMARY KEY (id); - - --- --- Name: identities identities_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.identities - ADD CONSTRAINT identities_pkey PRIMARY KEY (id); - - --- --- Name: identities identities_provider_id_provider_unique; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.identities - ADD CONSTRAINT identities_provider_id_provider_unique UNIQUE (provider_id, provider); - - --- --- Name: instances instances_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.instances - ADD CONSTRAINT instances_pkey PRIMARY KEY (id); - - --- --- Name: mfa_amr_claims mfa_amr_claims_session_id_authentication_method_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.mfa_amr_claims - ADD CONSTRAINT mfa_amr_claims_session_id_authentication_method_pkey UNIQUE (session_id, authentication_method); - - --- --- Name: mfa_challenges mfa_challenges_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.mfa_challenges - ADD CONSTRAINT mfa_challenges_pkey PRIMARY KEY (id); - - --- --- Name: mfa_factors mfa_factors_last_challenged_at_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.mfa_factors - ADD CONSTRAINT mfa_factors_last_challenged_at_key UNIQUE (last_challenged_at); - - --- --- Name: mfa_factors mfa_factors_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.mfa_factors - ADD CONSTRAINT mfa_factors_pkey PRIMARY KEY (id); - - --- --- Name: oauth_authorizations oauth_authorizations_authorization_code_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_authorizations - ADD CONSTRAINT oauth_authorizations_authorization_code_key UNIQUE (authorization_code); - - --- --- Name: oauth_authorizations oauth_authorizations_authorization_id_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_authorizations - ADD CONSTRAINT oauth_authorizations_authorization_id_key UNIQUE (authorization_id); - - --- --- Name: oauth_authorizations oauth_authorizations_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_authorizations - ADD CONSTRAINT oauth_authorizations_pkey PRIMARY KEY (id); - - --- --- Name: oauth_client_states oauth_client_states_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_client_states - ADD CONSTRAINT oauth_client_states_pkey PRIMARY KEY (id); - - --- --- Name: oauth_clients oauth_clients_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_clients - ADD CONSTRAINT oauth_clients_pkey PRIMARY KEY (id); - - --- --- Name: oauth_consents oauth_consents_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_consents - ADD CONSTRAINT oauth_consents_pkey PRIMARY KEY (id); - - --- --- Name: oauth_consents oauth_consents_user_client_unique; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_consents - ADD CONSTRAINT oauth_consents_user_client_unique UNIQUE (user_id, client_id); - - --- --- Name: one_time_tokens one_time_tokens_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.one_time_tokens - ADD CONSTRAINT one_time_tokens_pkey PRIMARY KEY (id); - - --- --- Name: refresh_tokens refresh_tokens_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.refresh_tokens - ADD CONSTRAINT refresh_tokens_pkey PRIMARY KEY (id); - - --- --- Name: refresh_tokens refresh_tokens_token_unique; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.refresh_tokens - ADD CONSTRAINT refresh_tokens_token_unique UNIQUE (token); - - --- --- Name: saml_providers saml_providers_entity_id_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.saml_providers - ADD CONSTRAINT saml_providers_entity_id_key UNIQUE (entity_id); - - --- --- Name: saml_providers saml_providers_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.saml_providers - ADD CONSTRAINT saml_providers_pkey PRIMARY KEY (id); - - --- --- Name: saml_relay_states saml_relay_states_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.saml_relay_states - ADD CONSTRAINT saml_relay_states_pkey PRIMARY KEY (id); - - --- --- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.schema_migrations - ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version); - - --- --- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.sessions - ADD CONSTRAINT sessions_pkey PRIMARY KEY (id); - - --- --- Name: sso_domains sso_domains_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.sso_domains - ADD CONSTRAINT sso_domains_pkey PRIMARY KEY (id); - - --- --- Name: sso_providers sso_providers_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.sso_providers - ADD CONSTRAINT sso_providers_pkey PRIMARY KEY (id); - - --- --- Name: users users_phone_key; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.users - ADD CONSTRAINT users_phone_key UNIQUE (phone); - - --- --- Name: users users_pkey; Type: CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.users - ADD CONSTRAINT users_pkey PRIMARY KEY (id); - - --- --- Name: addon_credits addon_credits_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public._db_migrations + ADD CONSTRAINT _db_migrations_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.addon_credits ADD CONSTRAINT addon_credits_pkey PRIMARY KEY (id); - --- --- Name: addon_products addon_products_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_products ADD CONSTRAINT addon_products_pkey PRIMARY KEY (id); - --- --- Name: addon_products addon_products_slug_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_products ADD CONSTRAINT addon_products_slug_key UNIQUE (slug); - --- --- Name: addon_transactions addon_transactions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_transactions ADD CONSTRAINT addon_transactions_pkey PRIMARY KEY (id); - --- --- Name: agenda_bloqueios agenda_bloqueios_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_bloqueios ADD CONSTRAINT agenda_bloqueios_pkey PRIMARY KEY (id); - --- --- Name: agenda_configuracoes agenda_configuracoes_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_configuracoes ADD CONSTRAINT agenda_configuracoes_pkey PRIMARY KEY (owner_id); - --- --- Name: agenda_eventos agenda_eventos_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_pkey PRIMARY KEY (id); - --- --- Name: agenda_eventos agenda_eventos_sem_sobreposicao; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_sem_sobreposicao EXCLUDE USING gist (owner_id WITH =, tstzrange(inicio_em, fim_em, '[)'::text) WITH &&); - --- --- Name: agenda_excecoes agenda_excecoes_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_excecoes ADD CONSTRAINT agenda_excecoes_pkey PRIMARY KEY (id); - --- --- Name: agenda_online_slots agenda_online_slots_owner_id_weekday_time_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_online_slots ADD CONSTRAINT agenda_online_slots_owner_id_weekday_time_key UNIQUE (owner_id, weekday, "time"); - --- --- Name: agenda_online_slots agenda_online_slots_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_online_slots ADD CONSTRAINT agenda_online_slots_pkey PRIMARY KEY (id); - --- --- Name: agenda_regras_semanais agenda_regras_semanais_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_regras_semanais ADD CONSTRAINT agenda_regras_semanais_pkey PRIMARY KEY (id); - --- --- Name: agenda_regras_semanais agenda_regras_semanais_unique; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_regras_semanais ADD CONSTRAINT agenda_regras_semanais_unique UNIQUE (owner_id, dia_semana, hora_inicio, hora_fim, modalidade); - --- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_seman_owner_id_dia_semana_hora_inic_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais ADD CONSTRAINT agenda_slots_bloqueados_seman_owner_id_dia_semana_hora_inic_key UNIQUE (owner_id, dia_semana, hora_inicio); - --- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais ADD CONSTRAINT agenda_slots_bloqueados_semanais_pkey PRIMARY KEY (id); - --- --- Name: agenda_slots_regras agenda_slots_regras_owner_id_dia_semana_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_slots_regras ADD CONSTRAINT agenda_slots_regras_owner_id_dia_semana_key UNIQUE (owner_id, dia_semana); - --- --- Name: agenda_slots_regras agenda_slots_regras_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_slots_regras ADD CONSTRAINT agenda_slots_regras_pkey PRIMARY KEY (id); - --- --- Name: agendador_configuracoes agendador_configuracoes_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agendador_configuracoes ADD CONSTRAINT agendador_configuracoes_pkey PRIMARY KEY (owner_id); - --- --- Name: agendador_solicitacoes agendador_solicitacoes_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agendador_solicitacoes ADD CONSTRAINT agendador_solicitacoes_pkey PRIMARY KEY (id); - --- --- Name: billing_contracts billing_contracts_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.billing_contracts ADD CONSTRAINT billing_contracts_pkey PRIMARY KEY (id); - --- --- Name: commitment_services commitment_services_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.commitment_services ADD CONSTRAINT commitment_services_pkey PRIMARY KEY (id); - --- --- Name: commitment_time_logs commitment_time_logs_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.commitment_time_logs ADD CONSTRAINT commitment_time_logs_pkey PRIMARY KEY (id); - --- --- Name: company_profiles company_profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.company_profiles ADD CONSTRAINT company_profiles_pkey PRIMARY KEY (id); - --- --- Name: company_profiles company_profiles_tenant_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.company_profiles ADD CONSTRAINT company_profiles_tenant_id_key UNIQUE (tenant_id); - --- --- Name: determined_commitment_fields determined_commitment_fields_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.determined_commitment_fields ADD CONSTRAINT determined_commitment_fields_pkey PRIMARY KEY (id); - --- --- Name: determined_commitments determined_commitments_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.determined_commitments ADD CONSTRAINT determined_commitments_pkey PRIMARY KEY (id); - --- --- Name: determined_commitments determined_commitments_tenant_native_key_uq; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.determined_commitments ADD CONSTRAINT determined_commitments_tenant_native_key_uq UNIQUE (tenant_id, native_key); - --- --- Name: dev_user_credentials dev_user_credentials_email_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.dev_user_credentials ADD CONSTRAINT dev_user_credentials_email_key UNIQUE (email); - --- --- Name: dev_user_credentials dev_user_credentials_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.dev_user_credentials ADD CONSTRAINT dev_user_credentials_pkey PRIMARY KEY (id); +ALTER TABLE ONLY public.document_access_logs + ADD CONSTRAINT document_access_logs_pkey PRIMARY KEY (id); --- --- Name: email_layout_config email_layout_config_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.document_generated + ADD CONSTRAINT document_generated_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY public.document_share_links + ADD CONSTRAINT document_share_links_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY public.document_signatures + ADD CONSTRAINT document_signatures_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY public.document_templates + ADD CONSTRAINT document_templates_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY public.documents + ADD CONSTRAINT documents_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY public.document_share_links + ADD CONSTRAINT dsl_token_unique UNIQUE (token); ALTER TABLE ONLY public.email_layout_config ADD CONSTRAINT email_layout_config_pkey PRIMARY KEY (id); - --- --- Name: email_layout_config email_layout_config_tenant_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.email_layout_config ADD CONSTRAINT email_layout_config_tenant_id_key UNIQUE (tenant_id); - --- --- Name: email_templates_global email_templates_global_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.email_templates_global ADD CONSTRAINT email_templates_global_key_key UNIQUE (key); - --- --- Name: email_templates_global email_templates_global_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.email_templates_global ADD CONSTRAINT email_templates_global_pkey PRIMARY KEY (id); - --- --- Name: email_templates_tenant email_templates_tenant_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.email_templates_tenant ADD CONSTRAINT email_templates_tenant_pkey PRIMARY KEY (id); - --- --- Name: email_templates_tenant email_templates_tenant_tenant_id_owner_id_template_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.email_templates_tenant ADD CONSTRAINT email_templates_tenant_tenant_id_owner_id_template_key_key UNIQUE (tenant_id, owner_id, template_key); - --- --- Name: entitlements_invalidation entitlements_invalidation_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.entitlements_invalidation ADD CONSTRAINT entitlements_invalidation_pkey PRIMARY KEY (owner_id); - --- --- Name: features features_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.features ADD CONSTRAINT features_key_key UNIQUE (key); - --- --- Name: features features_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.features ADD CONSTRAINT features_pkey PRIMARY KEY (id); - --- --- Name: feriados feriados_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.feriados ADD CONSTRAINT feriados_pkey PRIMARY KEY (id); - --- --- Name: feriados feriados_tenant_id_data_nome_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.feriados ADD CONSTRAINT feriados_tenant_id_data_nome_key UNIQUE (tenant_id, data, nome); - --- --- Name: financial_categories financial_categories_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_categories ADD CONSTRAINT financial_categories_pkey PRIMARY KEY (id); - --- --- Name: financial_exceptions financial_exceptions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_exceptions ADD CONSTRAINT financial_exceptions_pkey PRIMARY KEY (id); - --- --- Name: financial_records financial_records_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_records ADD CONSTRAINT financial_records_pkey PRIMARY KEY (id); - --- --- Name: global_notices global_notices_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.global_notices ADD CONSTRAINT global_notices_pkey PRIMARY KEY (id); - --- --- Name: insurance_plan_services insurance_plan_services_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.insurance_plan_services ADD CONSTRAINT insurance_plan_services_pkey PRIMARY KEY (id); - --- --- Name: insurance_plans insurance_plans_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.insurance_plans ADD CONSTRAINT insurance_plans_pkey PRIMARY KEY (id); - --- --- Name: login_carousel_slides login_carousel_slides_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.login_carousel_slides ADD CONSTRAINT login_carousel_slides_pkey PRIMARY KEY (id); +ALTER TABLE ONLY public.medicos + ADD CONSTRAINT medicos_crm_owner_unique UNIQUE NULLS NOT DISTINCT (owner_id, crm); --- --- Name: module_features module_features_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.medicos + ADD CONSTRAINT medicos_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.module_features ADD CONSTRAINT module_features_pkey PRIMARY KEY (module_id, feature_id); - --- --- Name: modules modules_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.modules ADD CONSTRAINT modules_key_key UNIQUE (key); - --- --- Name: modules modules_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.modules ADD CONSTRAINT modules_pkey PRIMARY KEY (id); - --- --- Name: notice_dismissals notice_dismissals_notice_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notice_dismissals ADD CONSTRAINT notice_dismissals_notice_id_user_id_key UNIQUE (notice_id, user_id); - --- --- Name: notice_dismissals notice_dismissals_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notice_dismissals ADD CONSTRAINT notice_dismissals_pkey PRIMARY KEY (id); - --- --- Name: notification_channels notification_channels_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_channels ADD CONSTRAINT notification_channels_pkey PRIMARY KEY (id); - --- --- Name: notification_logs notification_logs_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_logs ADD CONSTRAINT notification_logs_pkey PRIMARY KEY (id); - --- --- Name: notification_preferences notification_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_preferences ADD CONSTRAINT notification_preferences_pkey PRIMARY KEY (id); - --- --- Name: notification_queue notification_queue_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_queue ADD CONSTRAINT notification_queue_pkey PRIMARY KEY (id); - --- --- Name: notification_schedules notification_schedules_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_schedules ADD CONSTRAINT notification_schedules_pkey PRIMARY KEY (id); - --- --- Name: notification_templates notification_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_templates ADD CONSTRAINT notification_templates_pkey PRIMARY KEY (id); - --- --- Name: notifications notifications_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notifications ADD CONSTRAINT notifications_pkey PRIMARY KEY (id); - --- --- Name: owner_users owner_users_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.owner_users ADD CONSTRAINT owner_users_pkey PRIMARY KEY (owner_id, user_id); - --- --- Name: patient_discounts patient_discounts_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.patient_contacts + ADD CONSTRAINT patient_contacts_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.patient_discounts ADD CONSTRAINT patient_discounts_pkey PRIMARY KEY (id); - --- --- Name: patient_group_patient patient_group_patient_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_group_patient ADD CONSTRAINT patient_group_patient_pkey PRIMARY KEY (patient_group_id, patient_id); - --- --- Name: patient_groups patient_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_groups ADD CONSTRAINT patient_groups_pkey PRIMARY KEY (id); - --- --- Name: patient_intake_requests patient_intake_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_intake_requests ADD CONSTRAINT patient_intake_requests_pkey PRIMARY KEY (id); - --- --- Name: patient_invites patient_invites_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_invites ADD CONSTRAINT patient_invites_pkey PRIMARY KEY (id); - --- --- Name: patient_invites patient_invites_token_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_invites ADD CONSTRAINT patient_invites_token_key UNIQUE (token); - --- --- Name: patient_patient_tag patient_patient_tag_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_patient_tag ADD CONSTRAINT patient_patient_tag_pkey PRIMARY KEY (patient_id, tag_id); +ALTER TABLE ONLY public.patient_status_history + ADD CONSTRAINT patient_status_history_pkey PRIMARY KEY (id); --- --- Name: patient_tags patient_tags_owner_name_uniq; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.patient_support_contacts + ADD CONSTRAINT patient_support_contacts_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.patient_tags ADD CONSTRAINT patient_tags_owner_name_uniq UNIQUE (owner_id, nome); - --- --- Name: patient_tags patient_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_tags ADD CONSTRAINT patient_tags_pkey PRIMARY KEY (id); - --- --- Name: patients patients_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.patient_timeline + ADD CONSTRAINT patient_timeline_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.patients ADD CONSTRAINT patients_pkey PRIMARY KEY (id); - --- --- Name: payment_settings payment_settings_owner_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.payment_settings ADD CONSTRAINT payment_settings_owner_id_key UNIQUE (owner_id); - --- --- Name: payment_settings payment_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.payment_settings ADD CONSTRAINT payment_settings_pkey PRIMARY KEY (id); - --- --- Name: plan_features plan_features_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_features ADD CONSTRAINT plan_features_pkey PRIMARY KEY (plan_id, feature_id); - --- --- Name: plan_prices plan_prices_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_prices ADD CONSTRAINT plan_prices_pkey PRIMARY KEY (id); - --- --- Name: plan_public_bullets plan_public_bullets_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_public_bullets ADD CONSTRAINT plan_public_bullets_pkey PRIMARY KEY (id); - --- --- Name: plan_public plan_public_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_public ADD CONSTRAINT plan_public_pkey PRIMARY KEY (plan_id); - --- --- Name: plans plans_key_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plans ADD CONSTRAINT plans_key_key UNIQUE (key); - --- --- Name: plans plans_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plans ADD CONSTRAINT plans_pkey PRIMARY KEY (id); - --- --- Name: professional_pricing professional_pricing_owner_commitment_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.professional_pricing ADD CONSTRAINT professional_pricing_owner_commitment_key UNIQUE (owner_id, determined_commitment_id); - --- --- Name: professional_pricing professional_pricing_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.professional_pricing ADD CONSTRAINT professional_pricing_pkey PRIMARY KEY (id); - --- --- Name: profiles profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.profiles ADD CONSTRAINT profiles_pkey PRIMARY KEY (id); - --- --- Name: recurrence_exceptions recurrence_exceptions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_exceptions ADD CONSTRAINT recurrence_exceptions_pkey PRIMARY KEY (id); - --- --- Name: recurrence_exceptions recurrence_exceptions_unique; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_exceptions ADD CONSTRAINT recurrence_exceptions_unique UNIQUE (recurrence_id, original_date); - --- --- Name: recurrence_rule_services recurrence_rule_services_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_rule_services ADD CONSTRAINT recurrence_rule_services_pkey PRIMARY KEY (id); - --- --- Name: recurrence_rules recurrence_rules_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_rules ADD CONSTRAINT recurrence_rules_pkey PRIMARY KEY (id); - --- --- Name: saas_admins saas_admins_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_admins ADD CONSTRAINT saas_admins_pkey PRIMARY KEY (user_id); - --- --- Name: saas_doc_votos saas_doc_votos_doc_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_doc_votos ADD CONSTRAINT saas_doc_votos_doc_id_user_id_key UNIQUE (doc_id, user_id); - --- --- Name: saas_doc_votos saas_doc_votos_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_doc_votos ADD CONSTRAINT saas_doc_votos_pkey PRIMARY KEY (id); - --- --- Name: saas_docs saas_docs_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_docs ADD CONSTRAINT saas_docs_pkey PRIMARY KEY (id); - --- --- Name: saas_faq_itens saas_faq_itens_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_faq_itens ADD CONSTRAINT saas_faq_itens_pkey PRIMARY KEY (id); - --- --- Name: saas_faq saas_faq_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_faq ADD CONSTRAINT saas_faq_pkey PRIMARY KEY (id); - --- --- Name: services services_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.services ADD CONSTRAINT services_pkey PRIMARY KEY (id); - --- --- Name: subscription_events subscription_events_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_events ADD CONSTRAINT subscription_events_pkey PRIMARY KEY (id); - --- --- Name: subscription_intents_personal subscription_intents_personal_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_intents_personal ADD CONSTRAINT subscription_intents_personal_pkey PRIMARY KEY (id); - --- --- Name: subscription_intents_legacy subscription_intents_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_intents_legacy ADD CONSTRAINT subscription_intents_pkey PRIMARY KEY (id); - --- --- Name: subscription_intents_tenant subscription_intents_tenant_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_intents_tenant ADD CONSTRAINT subscription_intents_tenant_pkey PRIMARY KEY (id); - --- --- Name: subscriptions subscriptions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscriptions ADD CONSTRAINT subscriptions_pkey PRIMARY KEY (id); - --- --- Name: support_sessions support_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.support_sessions ADD CONSTRAINT support_sessions_pkey PRIMARY KEY (id); - --- --- Name: support_sessions support_sessions_token_unique; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.support_sessions ADD CONSTRAINT support_sessions_token_unique UNIQUE (token); - --- --- Name: tenant_feature_exceptions_log tenant_feature_exceptions_log_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_feature_exceptions_log ADD CONSTRAINT tenant_feature_exceptions_log_pkey PRIMARY KEY (id); - --- --- Name: tenant_features tenant_features_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_features ADD CONSTRAINT tenant_features_pkey PRIMARY KEY (tenant_id, feature_key); - --- --- Name: tenant_invites tenant_invites_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_invites ADD CONSTRAINT tenant_invites_pkey PRIMARY KEY (id); - --- --- Name: tenant_members tenant_members_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_members ADD CONSTRAINT tenant_members_pkey PRIMARY KEY (id); - --- --- Name: tenant_members tenant_members_tenant_id_user_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_members ADD CONSTRAINT tenant_members_tenant_id_user_id_key UNIQUE (tenant_id, user_id); - --- --- Name: tenant_modules tenant_modules_owner_id_module_id_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_modules ADD CONSTRAINT tenant_modules_owner_id_module_id_key UNIQUE (owner_id, module_id); - --- --- Name: tenant_modules tenant_modules_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_modules ADD CONSTRAINT tenant_modules_pkey PRIMARY KEY (id); - --- --- Name: tenants tenants_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenants ADD CONSTRAINT tenants_pkey PRIMARY KEY (id); - --- --- Name: therapist_payout_records therapist_payout_records_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.therapist_payout_records ADD CONSTRAINT therapist_payout_records_pkey PRIMARY KEY (payout_id, financial_record_id); - --- --- Name: therapist_payouts therapist_payouts_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.therapist_payouts ADD CONSTRAINT therapist_payouts_pkey PRIMARY KEY (id); - --- --- Name: addon_credits uq_addon_credits_tenant_type; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.twilio_subaccount_usage + ADD CONSTRAINT twilio_subaccount_usage_pkey PRIMARY KEY (id); ALTER TABLE ONLY public.addon_credits ADD CONSTRAINT uq_addon_credits_tenant_type UNIQUE (tenant_id, addon_type); - --- --- Name: notification_channels uq_channel_per_owner; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_channels ADD CONSTRAINT uq_channel_per_owner UNIQUE NULLS NOT DISTINCT (owner_id, channel, deleted_at); - --- --- Name: notification_preferences uq_notif_prefs_patient_owner; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_preferences ADD CONSTRAINT uq_notif_prefs_patient_owner UNIQUE NULLS NOT DISTINCT (owner_id, patient_id, deleted_at); - --- --- Name: notification_queue uq_notif_queue_idempotency; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_queue ADD CONSTRAINT uq_notif_queue_idempotency UNIQUE (idempotency_key); - --- --- Name: notification_schedules uq_notif_schedule_owner; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_schedules ADD CONSTRAINT uq_notif_schedule_owner UNIQUE NULLS NOT DISTINCT (owner_id, schedule_key, deleted_at); - --- --- Name: notification_templates uq_notif_template_key; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_templates ADD CONSTRAINT uq_notif_template_key UNIQUE NULLS NOT DISTINCT (tenant_id, owner_id, key, deleted_at); - --- --- Name: user_settings user_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.user_settings ADD CONSTRAINT user_settings_pkey PRIMARY KEY (user_id); - --- --- Name: messages messages_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_realtime_admin --- - -ALTER TABLE ONLY realtime.messages - ADD CONSTRAINT messages_pkey PRIMARY KEY (id, inserted_at); - - --- --- Name: messages_2026_03_20 messages_2026_03_20_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages_2026_03_20 - ADD CONSTRAINT messages_2026_03_20_pkey PRIMARY KEY (id, inserted_at); - - --- --- Name: messages_2026_03_21 messages_2026_03_21_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages_2026_03_21 - ADD CONSTRAINT messages_2026_03_21_pkey PRIMARY KEY (id, inserted_at); - - --- --- Name: messages_2026_03_22 messages_2026_03_22_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages_2026_03_22 - ADD CONSTRAINT messages_2026_03_22_pkey PRIMARY KEY (id, inserted_at); - - --- --- Name: messages_2026_03_23 messages_2026_03_23_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages_2026_03_23 - ADD CONSTRAINT messages_2026_03_23_pkey PRIMARY KEY (id, inserted_at); - - --- --- Name: messages_2026_03_24 messages_2026_03_24_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages_2026_03_24 - ADD CONSTRAINT messages_2026_03_24_pkey PRIMARY KEY (id, inserted_at); - - --- --- Name: messages_2026_03_25 messages_2026_03_25_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages_2026_03_25 - ADD CONSTRAINT messages_2026_03_25_pkey PRIMARY KEY (id, inserted_at); - - --- --- Name: messages_2026_03_26 messages_2026_03_26_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.messages_2026_03_26 - ADD CONSTRAINT messages_2026_03_26_pkey PRIMARY KEY (id, inserted_at); - - --- --- Name: subscription pk_subscription; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.subscription - ADD CONSTRAINT pk_subscription PRIMARY KEY (id); - - --- --- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY realtime.schema_migrations - ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version); - - --- --- Name: buckets_analytics buckets_analytics_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.buckets_analytics - ADD CONSTRAINT buckets_analytics_pkey PRIMARY KEY (id); - - --- --- Name: buckets buckets_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.buckets - ADD CONSTRAINT buckets_pkey PRIMARY KEY (id); - - --- --- Name: buckets_vectors buckets_vectors_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.buckets_vectors - ADD CONSTRAINT buckets_vectors_pkey PRIMARY KEY (id); - - --- --- Name: iceberg_namespaces iceberg_namespaces_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.iceberg_namespaces - ADD CONSTRAINT iceberg_namespaces_pkey PRIMARY KEY (id); - - --- --- Name: iceberg_tables iceberg_tables_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.iceberg_tables - ADD CONSTRAINT iceberg_tables_pkey PRIMARY KEY (id); - - --- --- Name: migrations migrations_name_key; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.migrations - ADD CONSTRAINT migrations_name_key UNIQUE (name); - - --- --- Name: migrations migrations_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.migrations - ADD CONSTRAINT migrations_pkey PRIMARY KEY (id); - - --- --- Name: objects objects_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.objects - ADD CONSTRAINT objects_pkey PRIMARY KEY (id); - - --- --- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.s3_multipart_uploads_parts - ADD CONSTRAINT s3_multipart_uploads_parts_pkey PRIMARY KEY (id); - - --- --- Name: s3_multipart_uploads s3_multipart_uploads_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.s3_multipart_uploads - ADD CONSTRAINT s3_multipart_uploads_pkey PRIMARY KEY (id); - - --- --- Name: vector_indexes vector_indexes_pkey; Type: CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.vector_indexes - ADD CONSTRAINT vector_indexes_pkey PRIMARY KEY (id); - - --- --- Name: hooks hooks_pkey; Type: CONSTRAINT; Schema: supabase_functions; Owner: supabase_functions_admin --- - -ALTER TABLE ONLY supabase_functions.hooks - ADD CONSTRAINT hooks_pkey PRIMARY KEY (id); - - --- --- Name: migrations migrations_pkey; Type: CONSTRAINT; Schema: supabase_functions; Owner: supabase_functions_admin --- - -ALTER TABLE ONLY supabase_functions.migrations - ADD CONSTRAINT migrations_pkey PRIMARY KEY (version); - - --- --- Name: extensions_tenant_external_id_index; Type: INDEX; Schema: _realtime; Owner: supabase_admin --- - - --- ═══ Foreign Keys ═══ - - - --- --- Name: extensions extensions_tenant_external_id_fkey; Type: FK CONSTRAINT; Schema: _realtime; Owner: supabase_admin --- - -ALTER TABLE ONLY _realtime.extensions - ADD CONSTRAINT extensions_tenant_external_id_fkey FOREIGN KEY (tenant_external_id) REFERENCES _realtime.tenants(external_id) ON DELETE CASCADE; - - --- --- Name: identities identities_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.identities - ADD CONSTRAINT identities_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - - --- --- Name: mfa_amr_claims mfa_amr_claims_session_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.mfa_amr_claims - ADD CONSTRAINT mfa_amr_claims_session_id_fkey FOREIGN KEY (session_id) REFERENCES auth.sessions(id) ON DELETE CASCADE; - - --- --- Name: mfa_challenges mfa_challenges_auth_factor_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.mfa_challenges - ADD CONSTRAINT mfa_challenges_auth_factor_id_fkey FOREIGN KEY (factor_id) REFERENCES auth.mfa_factors(id) ON DELETE CASCADE; - - --- --- Name: mfa_factors mfa_factors_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.mfa_factors - ADD CONSTRAINT mfa_factors_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - - --- --- Name: oauth_authorizations oauth_authorizations_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_authorizations - ADD CONSTRAINT oauth_authorizations_client_id_fkey FOREIGN KEY (client_id) REFERENCES auth.oauth_clients(id) ON DELETE CASCADE; - - --- --- Name: oauth_authorizations oauth_authorizations_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_authorizations - ADD CONSTRAINT oauth_authorizations_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - - --- --- Name: oauth_consents oauth_consents_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_consents - ADD CONSTRAINT oauth_consents_client_id_fkey FOREIGN KEY (client_id) REFERENCES auth.oauth_clients(id) ON DELETE CASCADE; - - --- --- Name: oauth_consents oauth_consents_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.oauth_consents - ADD CONSTRAINT oauth_consents_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - - --- --- Name: one_time_tokens one_time_tokens_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.one_time_tokens - ADD CONSTRAINT one_time_tokens_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - - --- --- Name: refresh_tokens refresh_tokens_session_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.refresh_tokens - ADD CONSTRAINT refresh_tokens_session_id_fkey FOREIGN KEY (session_id) REFERENCES auth.sessions(id) ON DELETE CASCADE; - - --- --- Name: saml_providers saml_providers_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.saml_providers - ADD CONSTRAINT saml_providers_sso_provider_id_fkey FOREIGN KEY (sso_provider_id) REFERENCES auth.sso_providers(id) ON DELETE CASCADE; - - --- --- Name: saml_relay_states saml_relay_states_flow_state_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.saml_relay_states - ADD CONSTRAINT saml_relay_states_flow_state_id_fkey FOREIGN KEY (flow_state_id) REFERENCES auth.flow_state(id) ON DELETE CASCADE; - - --- --- Name: saml_relay_states saml_relay_states_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.saml_relay_states - ADD CONSTRAINT saml_relay_states_sso_provider_id_fkey FOREIGN KEY (sso_provider_id) REFERENCES auth.sso_providers(id) ON DELETE CASCADE; - - --- --- Name: sessions sessions_oauth_client_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.sessions - ADD CONSTRAINT sessions_oauth_client_id_fkey FOREIGN KEY (oauth_client_id) REFERENCES auth.oauth_clients(id) ON DELETE CASCADE; - - --- --- Name: sessions sessions_user_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.sessions - ADD CONSTRAINT sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - - --- --- Name: sso_domains sso_domains_sso_provider_id_fkey; Type: FK CONSTRAINT; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE ONLY auth.sso_domains - ADD CONSTRAINT sso_domains_sso_provider_id_fkey FOREIGN KEY (sso_provider_id) REFERENCES auth.sso_providers(id) ON DELETE CASCADE; - - --- --- Name: addon_credits addon_credits_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_credits ADD CONSTRAINT addon_credits_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id); - --- --- Name: addon_credits addon_credits_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_credits ADD CONSTRAINT addon_credits_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id); - --- --- Name: addon_transactions addon_transactions_admin_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_transactions ADD CONSTRAINT addon_transactions_admin_user_id_fkey FOREIGN KEY (admin_user_id) REFERENCES auth.users(id); - --- --- Name: addon_transactions addon_transactions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_transactions ADD CONSTRAINT addon_transactions_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id); - --- --- Name: addon_transactions addon_transactions_product_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_transactions ADD CONSTRAINT addon_transactions_product_id_fkey FOREIGN KEY (product_id) REFERENCES public.addon_products(id); - --- --- Name: addon_transactions addon_transactions_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.addon_transactions ADD CONSTRAINT addon_transactions_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id); - --- --- Name: agenda_bloqueios agenda_bloqueios_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_bloqueios ADD CONSTRAINT agenda_bloqueios_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: agenda_bloqueios agenda_bloqueios_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_bloqueios ADD CONSTRAINT agenda_bloqueios_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE SET NULL; - --- --- Name: agenda_configuracoes agenda_configuracoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_configuracoes ADD CONSTRAINT agenda_configuracoes_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: agenda_eventos agenda_eventos_billing_contract_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_billing_contract_id_fkey FOREIGN KEY (billing_contract_id) REFERENCES public.billing_contracts(id) ON DELETE SET NULL; - --- --- Name: agenda_eventos agenda_eventos_determined_commitment_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_determined_commitment_fk FOREIGN KEY (determined_commitment_id) REFERENCES public.determined_commitments(id) ON DELETE SET NULL; - --- --- Name: agenda_eventos agenda_eventos_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_insurance_plan_id_fkey FOREIGN KEY (insurance_plan_id) REFERENCES public.insurance_plans(id) ON DELETE SET NULL; - --- --- Name: agenda_eventos agenda_eventos_insurance_plan_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_insurance_plan_service_id_fkey FOREIGN KEY (insurance_plan_service_id) REFERENCES public.insurance_plan_services(id) ON DELETE SET NULL; - --- --- Name: agenda_eventos agenda_eventos_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE SET NULL; - --- --- Name: agenda_eventos agenda_eventos_recurrence_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_recurrence_id_fkey FOREIGN KEY (recurrence_id) REFERENCES public.recurrence_rules(id) ON DELETE SET NULL; - --- --- Name: agenda_eventos agenda_eventos_terapeuta_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_eventos ADD CONSTRAINT agenda_eventos_terapeuta_fk FOREIGN KEY (terapeuta_id) REFERENCES auth.users(id) ON DELETE SET NULL; - --- --- Name: agenda_excecoes agenda_excecoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_excecoes ADD CONSTRAINT agenda_excecoes_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: agenda_online_slots agenda_online_slots_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_online_slots ADD CONSTRAINT agenda_online_slots_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: agenda_online_slots agenda_online_slots_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_online_slots ADD CONSTRAINT agenda_online_slots_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: agenda_regras_semanais agenda_regras_semanais_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_regras_semanais ADD CONSTRAINT agenda_regras_semanais_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_slots_bloqueados_semanais ADD CONSTRAINT agenda_slots_bloqueados_semanais_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: agenda_slots_regras agenda_slots_regras_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agenda_slots_regras ADD CONSTRAINT agenda_slots_regras_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: agendador_configuracoes agendador_configuracoes_owner_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agendador_configuracoes ADD CONSTRAINT agendador_configuracoes_owner_fk FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: agendador_configuracoes agendador_configuracoes_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agendador_configuracoes ADD CONSTRAINT agendador_configuracoes_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: agendador_solicitacoes agendador_sol_owner_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agendador_solicitacoes ADD CONSTRAINT agendador_sol_owner_fk FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: agendador_solicitacoes agendador_sol_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.agendador_solicitacoes ADD CONSTRAINT agendador_sol_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: billing_contracts billing_contracts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.billing_contracts ADD CONSTRAINT billing_contracts_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: billing_contracts billing_contracts_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.billing_contracts ADD CONSTRAINT billing_contracts_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; - --- --- Name: commitment_services commitment_services_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.commitment_services ADD CONSTRAINT commitment_services_commitment_id_fkey FOREIGN KEY (commitment_id) REFERENCES public.agenda_eventos(id) ON DELETE CASCADE; - --- --- Name: commitment_services commitment_services_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.commitment_services ADD CONSTRAINT commitment_services_service_id_fkey FOREIGN KEY (service_id) REFERENCES public.services(id) ON DELETE RESTRICT; - --- --- Name: commitment_time_logs commitment_time_logs_calendar_event_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.commitment_time_logs ADD CONSTRAINT commitment_time_logs_calendar_event_id_fkey FOREIGN KEY (calendar_event_id) REFERENCES public.agenda_eventos(id) ON DELETE SET NULL; - --- --- Name: commitment_time_logs commitment_time_logs_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.commitment_time_logs ADD CONSTRAINT commitment_time_logs_commitment_id_fkey FOREIGN KEY (commitment_id) REFERENCES public.determined_commitments(id) ON DELETE CASCADE; - --- --- Name: commitment_time_logs commitment_time_logs_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.commitment_time_logs ADD CONSTRAINT commitment_time_logs_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: company_profiles company_profiles_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.company_profiles - ADD CONSTRAINT company_profiles_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES auth.users(id) ON DELETE CASCADE; - - --- --- Name: determined_commitment_fields determined_commitment_fields_commitment_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- + ADD CONSTRAINT company_profiles_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; ALTER TABLE ONLY public.determined_commitment_fields ADD CONSTRAINT determined_commitment_fields_commitment_id_fkey FOREIGN KEY (commitment_id) REFERENCES public.determined_commitments(id) ON DELETE CASCADE; - --- --- Name: determined_commitment_fields determined_commitment_fields_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.determined_commitment_fields ADD CONSTRAINT determined_commitment_fields_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: determined_commitments determined_commitments_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.determined_commitments ADD CONSTRAINT determined_commitments_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; +ALTER TABLE ONLY public.document_access_logs + ADD CONSTRAINT document_access_logs_documento_id_fkey FOREIGN KEY (documento_id) REFERENCES public.documents(id) ON DELETE CASCADE; --- --- Name: email_layout_config email_layout_config_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.document_generated + ADD CONSTRAINT document_generated_documento_id_fkey FOREIGN KEY (documento_id) REFERENCES public.documents(id) ON DELETE SET NULL; + +ALTER TABLE ONLY public.document_generated + ADD CONSTRAINT document_generated_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + +ALTER TABLE ONLY public.document_generated + ADD CONSTRAINT document_generated_template_id_fkey FOREIGN KEY (template_id) REFERENCES public.document_templates(id) ON DELETE RESTRICT; + +ALTER TABLE ONLY public.document_share_links + ADD CONSTRAINT document_share_links_documento_id_fkey FOREIGN KEY (documento_id) REFERENCES public.documents(id) ON DELETE CASCADE; + +ALTER TABLE ONLY public.document_signatures + ADD CONSTRAINT document_signatures_documento_id_fkey FOREIGN KEY (documento_id) REFERENCES public.documents(id) ON DELETE CASCADE; + +ALTER TABLE ONLY public.documents + ADD CONSTRAINT documents_agenda_evento_id_fkey FOREIGN KEY (agenda_evento_id) REFERENCES public.agenda_eventos(id) ON DELETE SET NULL; + +ALTER TABLE ONLY public.documents + ADD CONSTRAINT documents_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; ALTER TABLE ONLY public.email_layout_config ADD CONSTRAINT email_layout_config_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: email_templates_tenant email_templates_tenant_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.email_templates_tenant ADD CONSTRAINT email_templates_tenant_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: email_templates_tenant email_templates_tenant_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.email_templates_tenant ADD CONSTRAINT email_templates_tenant_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: feriados feriados_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.feriados ADD CONSTRAINT feriados_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE SET NULL; - --- --- Name: feriados feriados_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.feriados ADD CONSTRAINT feriados_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: financial_categories financial_categories_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_categories ADD CONSTRAINT financial_categories_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: financial_exceptions financial_exceptions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_exceptions ADD CONSTRAINT financial_exceptions_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: financial_records financial_records_agenda_evento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_records ADD CONSTRAINT financial_records_agenda_evento_id_fkey FOREIGN KEY (agenda_evento_id) REFERENCES public.agenda_eventos(id) ON DELETE SET NULL; - --- --- Name: financial_records financial_records_category_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_records ADD CONSTRAINT financial_records_category_id_fkey FOREIGN KEY (category_id) REFERENCES public.financial_categories(id) ON DELETE SET NULL; - --- --- Name: financial_records financial_records_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_records ADD CONSTRAINT financial_records_insurance_plan_id_fkey FOREIGN KEY (insurance_plan_id) REFERENCES public.insurance_plans(id) ON DELETE SET NULL; - --- --- Name: financial_records financial_records_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_records ADD CONSTRAINT financial_records_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE SET NULL; - --- --- Name: financial_records financial_records_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_records ADD CONSTRAINT financial_records_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE SET NULL; - --- --- Name: financial_records financial_records_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.financial_records ADD CONSTRAINT financial_records_user_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: global_notices global_notices_created_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.global_notices ADD CONSTRAINT global_notices_created_by_fkey FOREIGN KEY (created_by) REFERENCES auth.users(id) ON DELETE SET NULL; - --- --- Name: insurance_plan_services insurance_plan_services_plan_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.insurance_plan_services ADD CONSTRAINT insurance_plan_services_plan_fkey FOREIGN KEY (insurance_plan_id) REFERENCES public.insurance_plans(id) ON DELETE CASCADE; - --- --- Name: insurance_plans insurance_plans_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.insurance_plans ADD CONSTRAINT insurance_plans_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: module_features module_features_feature_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.module_features ADD CONSTRAINT module_features_feature_id_fkey FOREIGN KEY (feature_id) REFERENCES public.features(id) ON DELETE CASCADE; - --- --- Name: module_features module_features_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.module_features ADD CONSTRAINT module_features_module_id_fkey FOREIGN KEY (module_id) REFERENCES public.modules(id) ON DELETE CASCADE; - --- --- Name: notice_dismissals notice_dismissals_notice_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notice_dismissals ADD CONSTRAINT notice_dismissals_notice_id_fkey FOREIGN KEY (notice_id) REFERENCES public.global_notices(id) ON DELETE CASCADE; - --- --- Name: notice_dismissals notice_dismissals_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notice_dismissals ADD CONSTRAINT notice_dismissals_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: notification_channels notification_channels_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_channels ADD CONSTRAINT notification_channels_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: notification_logs notification_logs_queue_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_logs ADD CONSTRAINT notification_logs_queue_id_fkey FOREIGN KEY (queue_id) REFERENCES public.notification_queue(id) ON DELETE SET NULL; - --- --- Name: notification_schedules notification_schedules_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_schedules ADD CONSTRAINT notification_schedules_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: notification_templates notification_templates_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notification_templates ADD CONSTRAINT notification_templates_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: notifications notifications_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.notifications ADD CONSTRAINT notifications_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; +ALTER TABLE ONLY public.patient_contacts + ADD CONSTRAINT patient_contacts_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; --- --- Name: patient_discounts patient_discounts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.patient_contacts + ADD CONSTRAINT patient_contacts_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; ALTER TABLE ONLY public.patient_discounts ADD CONSTRAINT patient_discounts_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: patient_discounts patient_discounts_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_discounts ADD CONSTRAINT patient_discounts_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; - --- --- Name: patient_group_patient patient_group_patient_patient_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_group_patient ADD CONSTRAINT patient_group_patient_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; - --- --- Name: patient_group_patient patient_group_patient_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_group_patient ADD CONSTRAINT patient_group_patient_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: patient_groups patient_groups_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_groups ADD CONSTRAINT patient_groups_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: patient_intake_requests patient_intake_requests_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_intake_requests ADD CONSTRAINT patient_intake_requests_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: patient_invites patient_invites_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_invites ADD CONSTRAINT patient_invites_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: patient_patient_tag patient_patient_tag_tag_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_patient_tag ADD CONSTRAINT patient_patient_tag_tag_id_fkey FOREIGN KEY (tag_id) REFERENCES public.patient_tags(id) ON DELETE CASCADE; - --- --- Name: patient_patient_tag patient_patient_tag_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_patient_tag ADD CONSTRAINT patient_patient_tag_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; +ALTER TABLE ONLY public.patient_status_history + ADD CONSTRAINT patient_status_history_alterado_por_fkey FOREIGN KEY (alterado_por) REFERENCES auth.users(id) ON DELETE SET NULL; --- --- Name: patient_tags patient_tags_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.patient_status_history + ADD CONSTRAINT patient_status_history_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + +ALTER TABLE ONLY public.patient_status_history + ADD CONSTRAINT patient_status_history_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; + +ALTER TABLE ONLY public.patient_support_contacts + ADD CONSTRAINT patient_support_contacts_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; ALTER TABLE ONLY public.patient_tags ADD CONSTRAINT patient_tags_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; +ALTER TABLE ONLY public.patient_timeline + ADD CONSTRAINT patient_timeline_gerado_por_fkey FOREIGN KEY (gerado_por) REFERENCES auth.users(id) ON DELETE SET NULL; --- --- Name: patients patients_responsible_member_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.patient_timeline + ADD CONSTRAINT patient_timeline_patient_id_fkey FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; + +ALTER TABLE ONLY public.patient_timeline + ADD CONSTRAINT patient_timeline_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; + +ALTER TABLE ONLY public.patients + ADD CONSTRAINT patients_convenio_id_fkey FOREIGN KEY (convenio_id) REFERENCES public.insurance_plans(id) ON DELETE SET NULL; ALTER TABLE ONLY public.patients ADD CONSTRAINT patients_responsible_member_id_fkey FOREIGN KEY (responsible_member_id) REFERENCES public.tenant_members(id) ON DELETE RESTRICT; - --- --- Name: patients patients_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.patients + ADD CONSTRAINT patients_risco_sinalizado_por_fkey FOREIGN KEY (risco_sinalizado_por) REFERENCES auth.users(id) ON DELETE SET NULL; ALTER TABLE ONLY public.patients ADD CONSTRAINT patients_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: patients patients_therapist_member_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patients ADD CONSTRAINT patients_therapist_member_id_fkey FOREIGN KEY (therapist_member_id) REFERENCES public.tenant_members(id); - --- --- Name: patients patients_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patients ADD CONSTRAINT patients_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE SET NULL; - --- --- Name: payment_settings payment_settings_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.payment_settings ADD CONSTRAINT payment_settings_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: payment_settings payment_settings_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.payment_settings ADD CONSTRAINT payment_settings_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: plan_features plan_features_feature_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_features ADD CONSTRAINT plan_features_feature_id_fkey FOREIGN KEY (feature_id) REFERENCES public.features(id) ON DELETE CASCADE; - --- --- Name: plan_features plan_features_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_features ADD CONSTRAINT plan_features_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public.plans(id) ON DELETE CASCADE; - --- --- Name: plan_prices plan_prices_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_prices ADD CONSTRAINT plan_prices_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public.plans(id) ON DELETE CASCADE; - --- --- Name: plan_public_bullets plan_public_bullets_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_public_bullets ADD CONSTRAINT plan_public_bullets_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public.plans(id) ON DELETE CASCADE; - --- --- Name: plan_public plan_public_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.plan_public ADD CONSTRAINT plan_public_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public.plans(id) ON DELETE CASCADE; - --- --- Name: patient_patient_tag ppt_patient_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_patient_tag ADD CONSTRAINT ppt_patient_fk FOREIGN KEY (patient_id) REFERENCES public.patients(id) ON DELETE CASCADE; - --- --- Name: patient_patient_tag ppt_tag_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.patient_patient_tag ADD CONSTRAINT ppt_tag_fk FOREIGN KEY (tag_id) REFERENCES public.patient_tags(id) ON DELETE CASCADE; - --- --- Name: professional_pricing professional_pricing_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.professional_pricing ADD CONSTRAINT professional_pricing_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: profiles profiles_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.profiles ADD CONSTRAINT profiles_id_fkey FOREIGN KEY (id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: recurrence_exceptions recurrence_exceptions_agenda_evento_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.profiles + ADD CONSTRAINT profiles_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id); ALTER TABLE ONLY public.recurrence_exceptions ADD CONSTRAINT recurrence_exceptions_agenda_evento_id_fkey FOREIGN KEY (agenda_evento_id) REFERENCES public.agenda_eventos(id) ON DELETE SET NULL; - --- --- Name: recurrence_exceptions recurrence_exceptions_recurrence_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_exceptions ADD CONSTRAINT recurrence_exceptions_recurrence_id_fkey FOREIGN KEY (recurrence_id) REFERENCES public.recurrence_rules(id) ON DELETE CASCADE; - --- --- Name: recurrence_rule_services recurrence_rule_services_rule_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_rule_services ADD CONSTRAINT recurrence_rule_services_rule_id_fkey FOREIGN KEY (rule_id) REFERENCES public.recurrence_rules(id) ON DELETE CASCADE; - --- --- Name: recurrence_rule_services recurrence_rule_services_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_rule_services ADD CONSTRAINT recurrence_rule_services_service_id_fkey FOREIGN KEY (service_id) REFERENCES public.services(id) ON DELETE RESTRICT; - --- --- Name: recurrence_rules recurrence_rules_insurance_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_rules ADD CONSTRAINT recurrence_rules_insurance_plan_id_fkey FOREIGN KEY (insurance_plan_id) REFERENCES public.insurance_plans(id) ON DELETE SET NULL; - --- --- Name: recurrence_rules recurrence_rules_insurance_plan_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.recurrence_rules ADD CONSTRAINT recurrence_rules_insurance_plan_service_id_fkey FOREIGN KEY (insurance_plan_service_id) REFERENCES public.insurance_plan_services(id) ON DELETE SET NULL; - --- --- Name: saas_admins saas_admins_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_admins ADD CONSTRAINT saas_admins_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: saas_doc_votos saas_doc_votos_doc_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_doc_votos ADD CONSTRAINT saas_doc_votos_doc_id_fkey FOREIGN KEY (doc_id) REFERENCES public.saas_docs(id) ON DELETE CASCADE; - --- --- Name: saas_doc_votos saas_doc_votos_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_doc_votos ADD CONSTRAINT saas_doc_votos_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: saas_faq_itens saas_faq_itens_doc_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.saas_faq_itens ADD CONSTRAINT saas_faq_itens_doc_id_fkey FOREIGN KEY (doc_id) REFERENCES public.saas_docs(id) ON DELETE CASCADE; - --- --- Name: services services_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.services ADD CONSTRAINT services_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: subscription_intents_personal sint_personal_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_intents_personal ADD CONSTRAINT sint_personal_subscription_id_fkey FOREIGN KEY (subscription_id) REFERENCES public.subscriptions(id) ON DELETE SET NULL; - --- --- Name: subscription_intents_tenant sint_tenant_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_intents_tenant ADD CONSTRAINT sint_tenant_subscription_id_fkey FOREIGN KEY (subscription_id) REFERENCES public.subscriptions(id) ON DELETE SET NULL; - --- --- Name: subscription_events subscription_events_subscription_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_events ADD CONSTRAINT subscription_events_subscription_id_fkey FOREIGN KEY (subscription_id) REFERENCES public.subscriptions(id) ON DELETE CASCADE; - --- --- Name: subscription_intents_personal subscription_intents_personal_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_intents_personal ADD CONSTRAINT subscription_intents_personal_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public.plans(id) ON DELETE RESTRICT; - --- --- Name: subscription_intents_tenant subscription_intents_tenant_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_intents_tenant ADD CONSTRAINT subscription_intents_tenant_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public.plans(id) ON DELETE RESTRICT; - --- --- Name: subscription_intents_legacy subscription_intents_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscription_intents_legacy ADD CONSTRAINT subscription_intents_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE SET NULL; - --- --- Name: subscriptions subscriptions_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscriptions ADD CONSTRAINT subscriptions_owner_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: subscriptions subscriptions_plan_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.subscriptions ADD CONSTRAINT subscriptions_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public.plans(id) ON DELETE RESTRICT; - --- --- Name: support_sessions support_sessions_admin_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.support_sessions ADD CONSTRAINT support_sessions_admin_fk FOREIGN KEY (admin_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: support_sessions support_sessions_tenant_fk; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.support_sessions ADD CONSTRAINT support_sessions_tenant_fk FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: tenant_features tenant_features_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_features ADD CONSTRAINT tenant_features_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: tenant_invites tenant_invites_accepted_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_invites ADD CONSTRAINT tenant_invites_accepted_by_fkey FOREIGN KEY (accepted_by) REFERENCES auth.users(id) ON DELETE SET NULL; - --- --- Name: tenant_invites tenant_invites_invited_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_invites ADD CONSTRAINT tenant_invites_invited_by_fkey FOREIGN KEY (invited_by) REFERENCES auth.users(id) ON DELETE SET NULL; - --- --- Name: tenant_invites tenant_invites_revoked_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_invites ADD CONSTRAINT tenant_invites_revoked_by_fkey FOREIGN KEY (revoked_by) REFERENCES auth.users(id) ON DELETE SET NULL; - --- --- Name: tenant_invites tenant_invites_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_invites ADD CONSTRAINT tenant_invites_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: tenant_members tenant_members_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_members ADD CONSTRAINT tenant_members_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: tenant_members tenant_members_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_members ADD CONSTRAINT tenant_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: tenant_modules tenant_modules_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_modules ADD CONSTRAINT tenant_modules_module_id_fkey FOREIGN KEY (module_id) REFERENCES public.modules(id) ON DELETE CASCADE; - --- --- Name: tenant_modules tenant_modules_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.tenant_modules ADD CONSTRAINT tenant_modules_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: therapist_payout_records therapist_payout_records_financial_record_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.therapist_payout_records ADD CONSTRAINT therapist_payout_records_financial_record_id_fkey FOREIGN KEY (financial_record_id) REFERENCES public.financial_records(id) ON DELETE RESTRICT; - --- --- Name: therapist_payout_records therapist_payout_records_payout_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.therapist_payout_records ADD CONSTRAINT therapist_payout_records_payout_id_fkey FOREIGN KEY (payout_id) REFERENCES public.therapist_payouts(id) ON DELETE CASCADE; - --- --- Name: therapist_payouts therapist_payouts_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.therapist_payouts ADD CONSTRAINT therapist_payouts_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES auth.users(id) ON DELETE CASCADE; - --- --- Name: therapist_payouts therapist_payouts_tenant_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- - ALTER TABLE ONLY public.therapist_payouts ADD CONSTRAINT therapist_payouts_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE; - --- --- Name: user_settings user_settings_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: supabase_admin --- +ALTER TABLE ONLY public.twilio_subaccount_usage + ADD CONSTRAINT twilio_subaccount_usage_channel_fk FOREIGN KEY (channel_id) REFERENCES public.notification_channels(id) ON DELETE CASCADE; ALTER TABLE ONLY public.user_settings ADD CONSTRAINT user_settings_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth.users(id) ON DELETE CASCADE; - - --- --- Name: iceberg_namespaces iceberg_namespaces_catalog_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.iceberg_namespaces - ADD CONSTRAINT iceberg_namespaces_catalog_id_fkey FOREIGN KEY (catalog_id) REFERENCES storage.buckets_analytics(id) ON DELETE CASCADE; - - --- --- Name: iceberg_tables iceberg_tables_catalog_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.iceberg_tables - ADD CONSTRAINT iceberg_tables_catalog_id_fkey FOREIGN KEY (catalog_id) REFERENCES storage.buckets_analytics(id) ON DELETE CASCADE; - - --- --- Name: iceberg_tables iceberg_tables_namespace_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.iceberg_tables - ADD CONSTRAINT iceberg_tables_namespace_id_fkey FOREIGN KEY (namespace_id) REFERENCES storage.iceberg_namespaces(id) ON DELETE CASCADE; - - --- --- Name: objects objects_bucketId_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.objects - ADD CONSTRAINT "objects_bucketId_fkey" FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id); - - --- --- Name: s3_multipart_uploads s3_multipart_uploads_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.s3_multipart_uploads - ADD CONSTRAINT s3_multipart_uploads_bucket_id_fkey FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id); - - --- --- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.s3_multipart_uploads_parts - ADD CONSTRAINT s3_multipart_uploads_parts_bucket_id_fkey FOREIGN KEY (bucket_id) REFERENCES storage.buckets(id); - - --- --- Name: s3_multipart_uploads_parts s3_multipart_uploads_parts_upload_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.s3_multipart_uploads_parts - ADD CONSTRAINT s3_multipart_uploads_parts_upload_id_fkey FOREIGN KEY (upload_id) REFERENCES storage.s3_multipart_uploads(id) ON DELETE CASCADE; - - --- --- Name: vector_indexes vector_indexes_bucket_id_fkey; Type: FK CONSTRAINT; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE ONLY storage.vector_indexes - ADD CONSTRAINT vector_indexes_bucket_id_fkey FOREIGN KEY (bucket_id) REFERENCES storage.buckets_vectors(id); - - --- --- Name: audit_log_entries; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - diff --git a/database-novo/schema/08_triggers/triggers.sql b/database-novo/schema/08_triggers/triggers.sql index d015679..88538b6 100644 --- a/database-novo/schema/08_triggers/triggers.sql +++ b/database-novo/schema/08_triggers/triggers.sql @@ -1,481 +1,163 @@ --- ============================================================================= --- AgenciaPsi — Triggers --- ============================================================================= +-- Triggers +-- Gerado automaticamente em 2026-04-17T12:23:05.238Z +-- Total: 80 CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.handle_new_user(); - --- --- Name: users trg_seed_patient_groups; Type: TRIGGER; Schema: auth; Owner: supabase_auth_admin --- - CREATE TRIGGER trg_seed_patient_groups AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.on_new_user_seed_patient_groups(); - --- --- Name: agenda_bloqueios agenda_bloqueios_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER agenda_bloqueios_updated_at BEFORE UPDATE ON public.agenda_bloqueios FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: agendador_configuracoes agendador_slug_trigger; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER agendador_slug_trigger BEFORE INSERT OR UPDATE ON public.agendador_configuracoes FOR EACH ROW EXECUTE FUNCTION public.agendador_gerar_slug(); - --- --- Name: tenant_members prevent_saas_membership_trigger; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER prevent_saas_membership_trigger BEFORE INSERT ON public.tenant_members FOR EACH ROW EXECUTE FUNCTION public.prevent_saas_membership(); - --- --- Name: insurance_plan_services set_insurance_plan_services_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER set_insurance_plan_services_updated_at BEFORE UPDATE ON public.insurance_plan_services FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: user_settings t_user_settings_set_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER t_user_settings_set_updated_at BEFORE UPDATE ON public.user_settings FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: agenda_configuracoes tg_agenda_configuracoes_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER tg_agenda_configuracoes_updated_at BEFORE UPDATE ON public.agenda_configuracoes FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: agenda_eventos tg_agenda_eventos_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER tg_agenda_eventos_updated_at BEFORE UPDATE ON public.agenda_eventos FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: agenda_excecoes tg_agenda_excecoes_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER tg_agenda_excecoes_updated_at BEFORE UPDATE ON public.agenda_excecoes FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: agenda_regras_semanais tg_agenda_regras_semanais_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER tg_agenda_regras_semanais_updated_at BEFORE UPDATE ON public.agenda_regras_semanais FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: recurrence_rules tg_recurrence_rules_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER tg_recurrence_rules_updated_at BEFORE UPDATE ON public.recurrence_rules FOR EACH ROW EXECUTE FUNCTION public.set_updated_at_recurrence(); - --- --- Name: plan_public tr_plan_public_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER tr_plan_public_updated_at BEFORE UPDATE ON public.plan_public FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: profiles trg_account_type_immutable; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_account_type_immutable BEFORE UPDATE OF account_type ON public.profiles FOR EACH ROW EXECUTE FUNCTION public.guard_account_type_immutable(); - --- --- Name: agenda_configuracoes trg_agenda_cfg_sync; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_agenda_cfg_sync BEFORE INSERT OR UPDATE ON public.agenda_configuracoes FOR EACH ROW EXECUTE FUNCTION public.agenda_cfg_sync(); - --- --- Name: agenda_eventos trg_agenda_eventos_busy_mirror_del; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_agenda_eventos_busy_mirror_del AFTER DELETE ON public.agenda_eventos FOR EACH ROW WHEN (((old.mirror_of_event_id IS NULL) AND (old.tenant_id = old.owner_id))) EXECUTE FUNCTION public.sync_busy_mirror_agenda_eventos(); - --- --- Name: agenda_eventos trg_agenda_eventos_busy_mirror_ins; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_agenda_eventos_busy_mirror_ins AFTER INSERT ON public.agenda_eventos FOR EACH ROW WHEN (((new.mirror_of_event_id IS NULL) AND (new.tenant_id = new.owner_id) AND (new.visibility_scope = ANY (ARRAY['busy_only'::text, 'private'::text])))) EXECUTE FUNCTION public.sync_busy_mirror_agenda_eventos(); - --- --- Name: agenda_eventos trg_agenda_eventos_busy_mirror_upd; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_agenda_eventos_busy_mirror_upd AFTER UPDATE ON public.agenda_eventos FOR EACH ROW WHEN (((new.mirror_of_event_id IS NULL) AND (new.tenant_id = new.owner_id) AND ((new.visibility_scope IS DISTINCT FROM old.visibility_scope) OR (new.inicio_em IS DISTINCT FROM old.inicio_em) OR (new.fim_em IS DISTINCT FROM old.fim_em) OR (new.owner_id IS DISTINCT FROM old.owner_id) OR (new.tenant_id IS DISTINCT FROM old.tenant_id)))) EXECUTE FUNCTION public.sync_busy_mirror_agenda_eventos(); - --- --- Name: agenda_regras_semanais trg_agenda_regras_semanais_no_overlap; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_agenda_regras_semanais_no_overlap BEFORE INSERT OR UPDATE ON public.agenda_regras_semanais FOR EACH ROW EXECUTE FUNCTION public.fn_agenda_regras_semanais_no_overlap(); - --- --- Name: agenda_eventos trg_auto_financial_from_session; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_auto_financial_from_session AFTER UPDATE OF status ON public.agenda_eventos FOR EACH ROW EXECUTE FUNCTION public.auto_create_financial_record_from_session(); - --- --- Name: notification_preferences trg_cancel_notifs_on_opt_out; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_cancel_notifs_on_opt_out AFTER UPDATE ON public.notification_preferences FOR EACH ROW EXECUTE FUNCTION public.cancel_notifications_on_opt_out(); - --- --- Name: agenda_eventos trg_cancel_notifs_on_session_cancel; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_cancel_notifs_on_session_cancel AFTER UPDATE ON public.agenda_eventos FOR EACH ROW WHEN ((new.status IS DISTINCT FROM old.status)) EXECUTE FUNCTION public.cancel_notifications_on_session_cancel(); - --- --- Name: company_profiles trg_company_profiles_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_company_profiles_updated_at BEFORE UPDATE ON public.company_profiles FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: determined_commitment_fields trg_determined_commitment_fields_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_determined_commitment_fields_updated_at BEFORE UPDATE ON public.determined_commitment_fields FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: determined_commitments trg_determined_commitments_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_determined_commitments_updated_at BEFORE UPDATE ON public.determined_commitments FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); +CREATE TRIGGER trg_documents_timeline_insert AFTER INSERT ON public.documents FOR EACH ROW EXECUTE FUNCTION public.fn_documents_timeline_insert(); --- --- Name: email_layout_config trg_email_layout_config_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- +CREATE TRIGGER trg_documents_updated_at BEFORE UPDATE ON public.documents FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); + +CREATE TRIGGER trg_ds_timeline AFTER UPDATE ON public.document_signatures FOR EACH ROW EXECUTE FUNCTION public.fn_document_signature_timeline(); + +CREATE TRIGGER trg_ds_updated_at BEFORE UPDATE ON public.document_signatures FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); + +CREATE TRIGGER trg_dt_updated_at BEFORE UPDATE ON public.document_templates FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); CREATE TRIGGER trg_email_layout_config_updated_at BEFORE UPDATE ON public.email_layout_config FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: email_templates_global trg_email_templates_global_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_email_templates_global_updated_at BEFORE UPDATE ON public.email_templates_global FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: email_templates_tenant trg_email_templates_tenant_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_email_templates_tenant_updated_at BEFORE UPDATE ON public.email_templates_tenant FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: financial_exceptions trg_financial_exceptions_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_financial_exceptions_updated_at BEFORE UPDATE ON public.financial_exceptions FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: financial_records trg_financial_records_auto_overdue; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_financial_records_auto_overdue BEFORE UPDATE ON public.financial_records FOR EACH ROW EXECUTE FUNCTION public.trg_fn_financial_records_auto_overdue(); - --- --- Name: financial_records trg_financial_records_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_financial_records_updated_at BEFORE UPDATE ON public.financial_records FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: global_notices trg_global_notices_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_global_notices_updated_at BEFORE UPDATE ON public.global_notices FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: insurance_plans trg_insurance_plans_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_insurance_plans_updated_at BEFORE UPDATE ON public.insurance_plans FOR EACH ROW EXECUTE FUNCTION public.set_insurance_plans_updated_at(); - --- --- Name: plans trg_no_change_core_plan_key; Type: TRIGGER; Schema: public; Owner: supabase_admin --- +CREATE TRIGGER trg_medicos_updated_at BEFORE UPDATE ON public.medicos FOR EACH ROW EXECUTE FUNCTION public.set_medicos_updated_at(); CREATE TRIGGER trg_no_change_core_plan_key BEFORE UPDATE ON public.plans FOR EACH ROW EXECUTE FUNCTION public.guard_no_change_core_plan_key(); - --- --- Name: plans trg_no_change_plan_target; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_no_change_plan_target BEFORE UPDATE ON public.plans FOR EACH ROW EXECUTE FUNCTION public.guard_no_change_plan_target(); - --- --- Name: plans trg_no_delete_core_plans; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_no_delete_core_plans BEFORE DELETE ON public.plans FOR EACH ROW EXECUTE FUNCTION public.guard_no_delete_core_plans(); - --- --- Name: notification_channels trg_notification_channels_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notification_channels_updated_at BEFORE UPDATE ON public.notification_channels FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: notification_logs trg_notification_logs_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notification_logs_updated_at BEFORE UPDATE ON public.notification_logs FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: notification_preferences trg_notification_preferences_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notification_preferences_updated_at BEFORE UPDATE ON public.notification_preferences FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: notification_queue trg_notification_queue_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notification_queue_updated_at BEFORE UPDATE ON public.notification_queue FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: notification_schedules trg_notification_schedules_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notification_schedules_updated_at BEFORE UPDATE ON public.notification_schedules FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: notification_templates trg_notification_templates_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notification_templates_updated_at BEFORE UPDATE ON public.notification_templates FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: patient_intake_requests trg_notify_on_intake; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notify_on_intake AFTER INSERT ON public.patient_intake_requests FOR EACH ROW EXECUTE FUNCTION public.notify_on_intake(); - --- --- Name: agendador_solicitacoes trg_notify_on_scheduling; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notify_on_scheduling AFTER INSERT ON public.agendador_solicitacoes FOR EACH ROW EXECUTE FUNCTION public.notify_on_scheduling(); - --- --- Name: agenda_eventos trg_notify_on_session_status; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_notify_on_session_status AFTER UPDATE OF status ON public.agenda_eventos FOR EACH ROW EXECUTE FUNCTION public.notify_on_session_status(); - --- --- Name: tenant_members trg_patient_cannot_own_tenant; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_patient_cannot_own_tenant BEFORE INSERT OR UPDATE ON public.tenant_members FOR EACH ROW EXECUTE FUNCTION public.guard_patient_cannot_own_tenant(); - --- --- Name: patient_groups trg_patient_groups_set_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- +CREATE TRIGGER trg_patient_contacts_updated_at BEFORE UPDATE ON public.patient_contacts FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); CREATE TRIGGER trg_patient_groups_set_updated_at BEFORE UPDATE ON public.patient_groups FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: patient_intake_requests trg_patient_intake_requests_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_patient_intake_requests_updated_at BEFORE UPDATE ON public.patient_intake_requests FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); +CREATE TRIGGER trg_patient_risco_timeline AFTER UPDATE OF risco_elevado ON public.patients FOR EACH ROW EXECUTE FUNCTION public.trg_fn_patient_risco_timeline(); --- --- Name: patient_tags trg_patient_tags_set_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- +CREATE TRIGGER trg_patient_status_history AFTER INSERT OR UPDATE OF status ON public.patients FOR EACH ROW EXECUTE FUNCTION public.trg_fn_patient_status_history(); + +CREATE TRIGGER trg_patient_status_timeline AFTER INSERT OR UPDATE OF status ON public.patients FOR EACH ROW EXECUTE FUNCTION public.trg_fn_patient_status_timeline(); CREATE TRIGGER trg_patient_tags_set_updated_at BEFORE UPDATE ON public.patient_tags FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: patients trg_patients_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_patients_updated_at BEFORE UPDATE ON public.patients FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: patients trg_patients_validate_members; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_patients_validate_members BEFORE INSERT OR UPDATE OF tenant_id, responsible_member_id, patient_scope, therapist_member_id ON public.patients FOR EACH ROW EXECUTE FUNCTION public.patients_validate_member_consistency(); - --- --- Name: payment_settings trg_payment_settings_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_payment_settings_updated_at BEFORE UPDATE ON public.payment_settings FOR EACH ROW EXECUTE FUNCTION public.update_payment_settings_updated_at(); - --- --- Name: patient_groups trg_prevent_promoting_to_system; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_prevent_promoting_to_system BEFORE UPDATE ON public.patient_groups FOR EACH ROW EXECUTE FUNCTION public.prevent_promoting_to_system(); - --- --- Name: patient_groups trg_prevent_system_group_changes; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_prevent_system_group_changes BEFORE DELETE OR UPDATE ON public.patient_groups FOR EACH ROW EXECUTE FUNCTION public.prevent_system_group_changes(); - --- --- Name: professional_pricing trg_professional_pricing_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_professional_pricing_updated_at BEFORE UPDATE ON public.professional_pricing FOR EACH ROW EXECUTE FUNCTION public.update_professional_pricing_updated_at(); - --- --- Name: profiles trg_profiles_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_profiles_updated_at BEFORE UPDATE ON public.profiles FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: services trg_services_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- +CREATE TRIGGER trg_psc_updated_at BEFORE UPDATE ON public.patient_support_contacts FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); CREATE TRIGGER trg_services_updated_at BEFORE UPDATE ON public.services FOR EACH ROW EXECUTE FUNCTION public.set_services_updated_at(); - --- --- Name: subscription_intents trg_subscription_intents_view_insert; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_subscription_intents_view_insert INSTEAD OF INSERT ON public.subscription_intents FOR EACH ROW EXECUTE FUNCTION public.subscription_intents_view_insert(); - --- --- Name: subscriptions trg_subscriptions_validate_scope; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_subscriptions_validate_scope BEFORE INSERT OR UPDATE ON public.subscriptions FOR EACH ROW EXECUTE FUNCTION public.subscriptions_validate_scope(); - --- --- Name: tenant_features trg_tenant_features_guard_with_plan; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_tenant_features_guard_with_plan BEFORE INSERT OR UPDATE ON public.tenant_features FOR EACH ROW EXECUTE FUNCTION public.tenant_features_guard_with_plan(); - --- --- Name: tenant_features trg_tenant_features_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_tenant_features_updated_at BEFORE UPDATE ON public.tenant_features FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: tenants trg_tenant_kind_immutable; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_tenant_kind_immutable BEFORE UPDATE OF kind ON public.tenants FOR EACH ROW EXECUTE FUNCTION public.guard_tenant_kind_immutable(); - --- --- Name: therapist_payouts trg_therapist_payouts_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_therapist_payouts_updated_at BEFORE UPDATE ON public.therapist_payouts FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: user_settings trg_user_settings_updated_at; Type: TRIGGER; Schema: public; Owner: supabase_admin --- - CREATE TRIGGER trg_user_settings_updated_at BEFORE UPDATE ON public.user_settings FOR EACH ROW EXECUTE FUNCTION public.set_updated_at(); - --- --- Name: subscription tr_check_filters; Type: TRIGGER; Schema: realtime; Owner: supabase_admin --- - CREATE TRIGGER tr_check_filters BEFORE INSERT OR UPDATE ON realtime.subscription FOR EACH ROW EXECUTE FUNCTION realtime.subscription_check_filters(); - --- --- Name: buckets enforce_bucket_name_length_trigger; Type: TRIGGER; Schema: storage; Owner: supabase_storage_admin --- - CREATE TRIGGER enforce_bucket_name_length_trigger BEFORE INSERT OR UPDATE OF name ON storage.buckets FOR EACH ROW EXECUTE FUNCTION storage.enforce_bucket_name_length(); - --- --- Name: buckets protect_buckets_delete; Type: TRIGGER; Schema: storage; Owner: supabase_storage_admin --- - CREATE TRIGGER protect_buckets_delete BEFORE DELETE ON storage.buckets FOR EACH STATEMENT EXECUTE FUNCTION storage.protect_delete(); - --- --- Name: objects protect_objects_delete; Type: TRIGGER; Schema: storage; Owner: supabase_storage_admin --- - CREATE TRIGGER protect_objects_delete BEFORE DELETE ON storage.objects FOR EACH STATEMENT EXECUTE FUNCTION storage.protect_delete(); - --- --- Name: objects update_objects_updated_at; Type: TRIGGER; Schema: storage; Owner: supabase_storage_admin --- - CREATE TRIGGER update_objects_updated_at BEFORE UPDATE ON storage.objects FOR EACH ROW EXECUTE FUNCTION storage.update_updated_at_column(); diff --git a/database-novo/schema/09_policies/policies.sql b/database-novo/schema/09_policies/policies.sql index 426edd1..ff69308 100644 --- a/database-novo/schema/09_policies/policies.sql +++ b/database-novo/schema/09_policies/policies.sql @@ -1,2313 +1,761 @@ --- ============================================================================= --- AgenciaPsi — Row Level Security Policies --- ============================================================================= - -ALTER TABLE auth.audit_log_entries ENABLE ROW LEVEL SECURITY; - --- --- Name: flow_state; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.flow_state ENABLE ROW LEVEL SECURITY; - --- --- Name: identities; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.identities ENABLE ROW LEVEL SECURITY; - --- --- Name: instances; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.instances ENABLE ROW LEVEL SECURITY; - --- --- Name: mfa_amr_claims; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.mfa_amr_claims ENABLE ROW LEVEL SECURITY; - --- --- Name: mfa_challenges; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.mfa_challenges ENABLE ROW LEVEL SECURITY; - --- --- Name: mfa_factors; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.mfa_factors ENABLE ROW LEVEL SECURITY; - --- --- Name: one_time_tokens; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.one_time_tokens ENABLE ROW LEVEL SECURITY; - --- --- Name: refresh_tokens; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.refresh_tokens ENABLE ROW LEVEL SECURITY; - --- --- Name: saml_providers; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.saml_providers ENABLE ROW LEVEL SECURITY; - --- --- Name: saml_relay_states; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.saml_relay_states ENABLE ROW LEVEL SECURITY; - --- --- Name: schema_migrations; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.schema_migrations ENABLE ROW LEVEL SECURITY; - --- --- Name: sessions; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.sessions ENABLE ROW LEVEL SECURITY; - --- --- Name: sso_domains; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.sso_domains ENABLE ROW LEVEL SECURITY; - --- --- Name: sso_providers; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.sso_providers ENABLE ROW LEVEL SECURITY; - --- --- Name: users; Type: ROW SECURITY; Schema: auth; Owner: supabase_auth_admin --- - -ALTER TABLE auth.users ENABLE ROW LEVEL SECURITY; - --- --- Name: addon_credits; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- +-- RLS Policies +-- Gerado automaticamente em 2026-04-17T12:23:05.240Z +-- Enable RLS: 88 tabelas +-- Policies: 252 +-- Enable RLS ALTER TABLE public.addon_credits ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.addon_products ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.addon_transactions ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agenda_bloqueios ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agenda_configuracoes ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agenda_eventos ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agenda_excecoes ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agenda_online_slots ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agenda_regras_semanais ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agenda_slots_bloqueados_semanais ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agenda_slots_regras ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agendador_configuracoes ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.agendador_solicitacoes ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.billing_contracts ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.commitment_services ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.commitment_time_logs ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.company_profiles ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.determined_commitment_fields ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.determined_commitments ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.dev_user_credentials ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.document_access_logs ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.document_generated ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.document_share_links ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.document_signatures ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.document_templates ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.documents ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.email_layout_config ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.email_templates_global ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.email_templates_tenant ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.entitlements_invalidation ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.features ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.feriados ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.financial_categories ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.financial_exceptions ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.financial_records ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.global_notices ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.insurance_plan_services ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.insurance_plans ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.login_carousel_slides ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.medicos ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.module_features ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.modules ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.notice_dismissals ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.notification_channels ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.notification_logs ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.notification_preferences ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.notification_queue ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.notification_schedules ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.notification_templates ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.notifications ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.owner_users ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_contacts ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_discounts ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_group_patient ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_groups ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_intake_requests ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_invites ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_patient_tag ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_status_history ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_support_contacts ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_tags ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patient_timeline ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.patients ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.payment_settings ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.plan_features ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.plans ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.professional_pricing ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.recurrence_exceptions ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.recurrence_rule_services ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.recurrence_rules ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.saas_admins ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.saas_doc_votos ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.saas_docs ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.saas_faq ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.saas_faq_itens ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.services ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.subscription_events ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.subscription_intents_legacy ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.subscriptions ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.support_sessions ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.tenant_members ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.tenant_modules ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.tenants ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.therapist_payout_records ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.therapist_payouts ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.twilio_subaccount_usage ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.user_settings ENABLE ROW LEVEL SECURITY; --- --- Name: addon_credits addon_credits_admin_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - +-- Policies CREATE POLICY addon_credits_admin_select ON public.addon_credits FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: addon_credits addon_credits_admin_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY addon_credits_admin_write ON public.addon_credits TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: addon_credits addon_credits_select_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY addon_credits_select_own ON public.addon_credits FOR SELECT TO authenticated USING ((public.is_tenant_member(tenant_id) OR (owner_id = auth.uid()))); - --- --- Name: addon_products; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.addon_products ENABLE ROW LEVEL SECURITY; - --- --- Name: addon_products addon_products_admin_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY addon_products_admin_all ON public.addon_products TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: addon_products addon_products_select_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY addon_products_select_authenticated ON public.addon_products FOR SELECT TO authenticated USING (((deleted_at IS NULL) AND (is_active = true) AND (is_visible = true))); - --- --- Name: addon_transactions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.addon_transactions ENABLE ROW LEVEL SECURITY; - --- --- Name: addon_transactions addon_transactions_admin_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY addon_transactions_admin_insert ON public.addon_transactions FOR INSERT TO authenticated WITH CHECK ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: addon_transactions addon_transactions_admin_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY addon_transactions_admin_select ON public.addon_transactions FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: addon_transactions addon_transactions_select_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY addon_transactions_select_own ON public.addon_transactions FOR SELECT TO authenticated USING ((public.is_tenant_member(tenant_id) OR (owner_id = auth.uid()))); - --- --- Name: agenda_bloqueios; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agenda_bloqueios ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_configuracoes; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agenda_configuracoes ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_configuracoes agenda_configuracoes_clinic_read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_configuracoes_clinic_read ON public.agenda_configuracoes FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); - --- --- Name: agenda_configuracoes agenda_configuracoes_clinic_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_configuracoes_clinic_write ON public.agenda_configuracoes USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); - --- --- Name: agenda_configuracoes agenda_configuracoes_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_configuracoes_owner ON public.agenda_configuracoes USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: agenda_eventos; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agenda_eventos ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_eventos agenda_eventos_delete; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_eventos_delete ON public.agenda_eventos FOR DELETE USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.delete'::text))); - --- --- Name: agenda_eventos agenda_eventos_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_eventos_insert ON public.agenda_eventos FOR INSERT WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.create'::text))); - --- --- Name: agenda_eventos agenda_eventos_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_eventos_owner_all ON public.agenda_eventos TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: agenda_eventos agenda_eventos_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_eventos_select ON public.agenda_eventos FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); - --- --- Name: agenda_eventos agenda_eventos_update; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_eventos_update ON public.agenda_eventos FOR UPDATE USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); - --- --- Name: agenda_excecoes; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agenda_excecoes ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_excecoes agenda_excecoes_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_excecoes_owner ON public.agenda_excecoes USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: agenda_excecoes agenda_excecoes_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_excecoes_select ON public.agenda_excecoes FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); - --- --- Name: agenda_excecoes agenda_excecoes_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_excecoes_write ON public.agenda_excecoes USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); - --- --- Name: agenda_online_slots; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agenda_online_slots ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_online_slots agenda_online_slots_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_online_slots_owner ON public.agenda_online_slots USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: agenda_online_slots agenda_online_slots_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_online_slots_select ON public.agenda_online_slots FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); - --- --- Name: agenda_online_slots agenda_online_slots_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_online_slots_write ON public.agenda_online_slots USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); - --- --- Name: agenda_regras_semanais; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agenda_regras_semanais ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_regras_semanais agenda_regras_semanais_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_regras_semanais_owner ON public.agenda_regras_semanais USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: agenda_regras_semanais agenda_regras_semanais_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_regras_semanais_select ON public.agenda_regras_semanais FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); - --- --- Name: agenda_regras_semanais agenda_regras_semanais_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_regras_semanais_write ON public.agenda_regras_semanais USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); - --- --- Name: agenda_slots_bloqueados_semanais; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agenda_slots_bloqueados_semanais ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_slots_bloqueados_semanais_select ON public.agenda_slots_bloqueados_semanais FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); - --- --- Name: agenda_slots_bloqueados_semanais agenda_slots_bloqueados_semanais_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_slots_bloqueados_semanais_write ON public.agenda_slots_bloqueados_semanais USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); - --- --- Name: agenda_slots_regras; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agenda_slots_regras ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_slots_regras agenda_slots_regras_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_slots_regras_select ON public.agenda_slots_regras FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); - --- --- Name: agenda_slots_regras agenda_slots_regras_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agenda_slots_regras_write ON public.agenda_slots_regras USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); - --- --- Name: agendador_configuracoes agendador_cfg_public_read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agendador_cfg_public_read ON public.agendador_configuracoes FOR SELECT TO anon USING (((ativo = true) AND (link_slug IS NOT NULL))); - --- --- Name: agendador_configuracoes agendador_cfg_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agendador_cfg_select ON public.agendador_configuracoes FOR SELECT USING ((auth.uid() = owner_id)); - --- --- Name: agendador_configuracoes agendador_cfg_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agendador_cfg_write ON public.agendador_configuracoes USING ((auth.uid() = owner_id)) WITH CHECK ((auth.uid() = owner_id)); - --- --- Name: agendador_configuracoes; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agendador_configuracoes ENABLE ROW LEVEL SECURITY; - --- --- Name: agendador_solicitacoes agendador_sol_owner_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agendador_sol_owner_select ON public.agendador_solicitacoes FOR SELECT USING ((auth.uid() = owner_id)); - --- --- Name: agendador_solicitacoes agendador_sol_owner_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agendador_sol_owner_write ON public.agendador_solicitacoes USING ((auth.uid() = owner_id)) WITH CHECK ((auth.uid() = owner_id)); - --- --- Name: agendador_solicitacoes agendador_sol_patient_read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agendador_sol_patient_read ON public.agendador_solicitacoes FOR SELECT TO authenticated USING (((auth.uid() = user_id) OR (auth.uid() = owner_id))); - --- --- Name: agendador_solicitacoes agendador_sol_public_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY agendador_sol_public_insert ON public.agendador_solicitacoes FOR INSERT TO anon WITH CHECK (true); - --- --- Name: agendador_solicitacoes; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.agendador_solicitacoes ENABLE ROW LEVEL SECURITY; - --- --- Name: billing_contracts; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.billing_contracts ENABLE ROW LEVEL SECURITY; - --- --- Name: billing_contracts billing_contracts: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "billing_contracts: owner full access" ON public.billing_contracts USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: agenda_bloqueios bloqueios_delete; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY bloqueios_delete ON public.agenda_bloqueios FOR DELETE TO authenticated USING ((owner_id = auth.uid())); - --- --- Name: agenda_bloqueios bloqueios_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY bloqueios_insert ON public.agenda_bloqueios FOR INSERT TO authenticated WITH CHECK ((owner_id = auth.uid())); - --- --- Name: agenda_bloqueios bloqueios_select_clinic; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY bloqueios_select_clinic ON public.agenda_bloqueios FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT tenant_members.tenant_id FROM public.tenant_members WHERE ((tenant_members.user_id = auth.uid()) AND (tenant_members.role = ANY (ARRAY['admin'::text, 'clinic_admin'::text, 'tenant_admin'::text, 'secretary'::text])))))); - --- --- Name: agenda_bloqueios bloqueios_select_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY bloqueios_select_own ON public.agenda_bloqueios FOR SELECT TO authenticated USING ((owner_id = auth.uid())); - --- --- Name: agenda_bloqueios bloqueios_update; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY bloqueios_update ON public.agenda_bloqueios FOR UPDATE TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: saas_docs clinic_admin_read_all_docs; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY clinic_admin_read_all_docs ON public.saas_docs FOR SELECT TO authenticated USING (((ativo = true) AND (EXISTS ( SELECT 1 FROM public.profiles WHERE ((profiles.id = auth.uid()) AND (profiles.role = ANY (ARRAY['clinic_admin'::text, 'tenant_admin'::text]))))))); - --- --- Name: commitment_services; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.commitment_services ENABLE ROW LEVEL SECURITY; - --- --- Name: commitment_services commitment_services: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "commitment_services: owner full access" ON public.commitment_services USING ((EXISTS ( SELECT 1 FROM public.services s WHERE ((s.id = commitment_services.service_id) AND (s.owner_id = auth.uid()))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.services s WHERE ((s.id = commitment_services.service_id) AND (s.owner_id = auth.uid()))))); +CREATE POLICY company_profiles_delete ON public.company_profiles FOR DELETE USING ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))); --- --- Name: commitment_time_logs; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- +CREATE POLICY company_profiles_insert ON public.company_profiles FOR INSERT WITH CHECK ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))); -ALTER TABLE public.commitment_time_logs ENABLE ROW LEVEL SECURITY; +CREATE POLICY company_profiles_select ON public.company_profiles FOR SELECT USING ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))); --- --- Name: company_profiles; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.company_profiles ENABLE ROW LEVEL SECURITY; - --- --- Name: company_profiles company_profiles_delete; Type: POLICY; Schema: public; Owner: supabase_admin --- - -CREATE POLICY company_profiles_delete ON public.company_profiles FOR DELETE USING ((tenant_id = auth.uid())); - - --- --- Name: company_profiles company_profiles_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - -CREATE POLICY company_profiles_insert ON public.company_profiles FOR INSERT WITH CHECK ((tenant_id = auth.uid())); - - --- --- Name: company_profiles company_profiles_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - -CREATE POLICY company_profiles_select ON public.company_profiles FOR SELECT USING ((tenant_id = auth.uid())); - - --- --- Name: company_profiles company_profiles_update; Type: POLICY; Schema: public; Owner: supabase_admin --- - -CREATE POLICY company_profiles_update ON public.company_profiles FOR UPDATE USING ((tenant_id = auth.uid())); - - --- --- Name: commitment_time_logs ctl_delete_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- +CREATE POLICY company_profiles_update ON public.company_profiles FOR UPDATE USING ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))) WITH CHECK ((EXISTS ( SELECT 1 + FROM public.tenant_members + WHERE ((tenant_members.tenant_id = company_profiles.tenant_id) AND (tenant_members.user_id = auth.uid()))))); CREATE POLICY ctl_delete_for_active_member ON public.commitment_time_logs FOR DELETE TO authenticated USING ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = commitment_time_logs.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: commitment_time_logs ctl_insert_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY ctl_insert_for_active_member ON public.commitment_time_logs FOR INSERT TO authenticated WITH CHECK ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = commitment_time_logs.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: commitment_time_logs ctl_select_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY ctl_select_for_active_member ON public.commitment_time_logs FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = commitment_time_logs.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: commitment_time_logs ctl_update_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY ctl_update_for_active_member ON public.commitment_time_logs FOR UPDATE TO authenticated USING ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = commitment_time_logs.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = commitment_time_logs.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); +CREATE POLICY "dal: tenant members can insert" ON public.document_access_logs FOR INSERT WITH CHECK (true); --- --- Name: determined_commitments dc_delete_custom_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- +CREATE POLICY "dal: tenant members can select" ON public.document_access_logs FOR SELECT USING ((tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); CREATE POLICY dc_delete_custom_for_active_member ON public.determined_commitments FOR DELETE TO authenticated USING (((is_native = false) AND (EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitments.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text)))))); - --- --- Name: determined_commitments dc_insert_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dc_insert_for_active_member ON public.determined_commitments FOR INSERT TO authenticated WITH CHECK ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitments.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: determined_commitments dc_select_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dc_select_for_active_member ON public.determined_commitments FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitments.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: determined_commitments dc_update_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dc_update_for_active_member ON public.determined_commitments FOR UPDATE TO authenticated USING ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitments.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitments.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: determined_commitment_fields dcf_delete_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dcf_delete_for_active_member ON public.determined_commitment_fields FOR DELETE TO authenticated USING ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitment_fields.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: determined_commitment_fields dcf_insert_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dcf_insert_for_active_member ON public.determined_commitment_fields FOR INSERT TO authenticated WITH CHECK ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitment_fields.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: determined_commitment_fields dcf_select_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dcf_select_for_active_member ON public.determined_commitment_fields FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitment_fields.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: determined_commitment_fields dcf_update_for_active_member; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dcf_update_for_active_member ON public.determined_commitment_fields FOR UPDATE TO authenticated USING ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitment_fields.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = determined_commitment_fields.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); - --- --- Name: agenda_bloqueios delete own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "delete own" ON public.agenda_bloqueios FOR DELETE USING ((owner_id = auth.uid())); - --- --- Name: determined_commitment_fields; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.determined_commitment_fields ENABLE ROW LEVEL SECURITY; - --- --- Name: determined_commitments; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.determined_commitments ENABLE ROW LEVEL SECURITY; - --- --- Name: dev_user_credentials dev_creds_select_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dev_creds_select_saas_admin ON public.dev_user_credentials FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 FROM public.profiles p WHERE ((p.id = auth.uid()) AND (p.role = 'saas_admin'::text))))); - --- --- Name: dev_user_credentials dev_creds_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY dev_creds_write_saas_admin ON public.dev_user_credentials TO authenticated USING ((EXISTS ( SELECT 1 FROM public.profiles p WHERE ((p.id = auth.uid()) AND (p.role = 'saas_admin'::text))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.profiles p WHERE ((p.id = auth.uid()) AND (p.role = 'saas_admin'::text))))); +CREATE POLICY "dg: generator full access" ON public.document_generated USING ((gerado_por = auth.uid())) WITH CHECK ((gerado_por = auth.uid())); --- --- Name: dev_user_credentials; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- +CREATE POLICY "dg: tenant members can select" ON public.document_generated FOR SELECT USING ((tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); -ALTER TABLE public.dev_user_credentials ENABLE ROW LEVEL SECURITY; +CREATE POLICY "documents: owner full access" ON public.documents USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); --- --- Name: email_layout_config; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- +CREATE POLICY "ds: tenant members access" ON public.document_signatures USING ((tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))) WITH CHECK ((tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text))))); -ALTER TABLE public.email_layout_config ENABLE ROW LEVEL SECURITY; +CREATE POLICY "dsl: creator full access" ON public.document_share_links USING ((criado_por = auth.uid())) WITH CHECK ((criado_por = auth.uid())); --- --- Name: email_templates_global; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- +CREATE POLICY "dsl: public read by token" ON public.document_share_links FOR SELECT USING (((ativo = true) AND (expira_em > now()) AND (usos < usos_max))); -ALTER TABLE public.email_templates_global ENABLE ROW LEVEL SECURITY; +CREATE POLICY "dt: global templates readable by all" ON public.document_templates FOR SELECT USING ((is_global = true)); --- --- Name: email_templates_tenant; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- +CREATE POLICY "dt: owner can delete" ON public.document_templates FOR DELETE USING (((owner_id = auth.uid()) AND (is_global = false))); -ALTER TABLE public.email_templates_tenant ENABLE ROW LEVEL SECURITY; +CREATE POLICY "dt: owner can insert" ON public.document_templates FOR INSERT WITH CHECK (((owner_id = auth.uid()) AND (is_global = false))); --- --- Name: entitlements_invalidation ent_inv_select_own; Type: POLICY; Schema: public; Owner: supabase_admin --- +CREATE POLICY "dt: owner can update" ON public.document_templates FOR UPDATE USING (((owner_id = auth.uid()) AND (is_global = false))) WITH CHECK (((owner_id = auth.uid()) AND (is_global = false))); + +CREATE POLICY "dt: saas admin can delete global" ON public.document_templates FOR DELETE USING (((is_global = true) AND public.is_saas_admin())); + +CREATE POLICY "dt: saas admin can insert global" ON public.document_templates FOR INSERT WITH CHECK (((is_global = true) AND public.is_saas_admin())); + +CREATE POLICY "dt: saas admin can update global" ON public.document_templates FOR UPDATE USING (((is_global = true) AND public.is_saas_admin())) WITH CHECK (((is_global = true) AND public.is_saas_admin())); + +CREATE POLICY "dt: tenant members can select" ON public.document_templates FOR SELECT USING (((is_global = false) AND (tenant_id IN ( SELECT tm.tenant_id + FROM public.tenant_members tm + WHERE ((tm.user_id = auth.uid()) AND (tm.status = 'active'::text)))))); CREATE POLICY ent_inv_select_own ON public.entitlements_invalidation FOR SELECT USING (((owner_id = auth.uid()) OR public.is_saas_admin())); - --- --- Name: entitlements_invalidation ent_inv_update_saas; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY ent_inv_update_saas ON public.entitlements_invalidation FOR UPDATE USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: entitlements_invalidation ent_inv_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY ent_inv_write_saas ON public.entitlements_invalidation FOR INSERT WITH CHECK (public.is_saas_admin()); - --- --- Name: entitlements_invalidation; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.entitlements_invalidation ENABLE ROW LEVEL SECURITY; - --- --- Name: saas_faq faq_admin_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY faq_admin_write ON public.saas_faq TO authenticated USING ((EXISTS ( SELECT 1 FROM public.profiles WHERE ((profiles.id = auth.uid()) AND (profiles.role = ANY (ARRAY['saas_admin'::text, 'tenant_admin'::text, 'clinic_admin'::text])))))); - --- --- Name: saas_faq faq_auth_read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY faq_auth_read ON public.saas_faq FOR SELECT TO authenticated USING ((ativo = true)); - --- --- Name: saas_faq_itens faq_itens_admin_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY faq_itens_admin_write ON public.saas_faq_itens TO authenticated USING ((EXISTS ( SELECT 1 FROM public.profiles WHERE ((profiles.id = auth.uid()) AND (profiles.role = ANY (ARRAY['saas_admin'::text, 'tenant_admin'::text, 'clinic_admin'::text])))))); - --- --- Name: saas_faq_itens faq_itens_auth_read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY faq_itens_auth_read ON public.saas_faq_itens FOR SELECT TO authenticated USING (((ativo = true) AND (EXISTS ( SELECT 1 FROM public.saas_docs d WHERE ((d.id = saas_faq_itens.doc_id) AND (d.ativo = true)))))); - --- --- Name: saas_faq faq_public_read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY faq_public_read ON public.saas_faq FOR SELECT USING (((publico = true) AND (ativo = true))); - --- --- Name: features; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.features ENABLE ROW LEVEL SECURITY; - --- --- Name: features features_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY features_read_authenticated ON public.features FOR SELECT TO authenticated USING (true); - --- --- Name: features features_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY features_write_saas_admin ON public.features TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: feriados; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.feriados ENABLE ROW LEVEL SECURITY; - --- --- Name: feriados feriados_delete; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY feriados_delete ON public.feriados FOR DELETE USING ((owner_id = auth.uid())); - --- --- Name: feriados feriados_global_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY feriados_global_select ON public.feriados FOR SELECT USING ((tenant_id IS NULL)); - --- --- Name: feriados feriados_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY feriados_insert ON public.feriados FOR INSERT WITH CHECK ((tenant_id IN ( SELECT tenant_members.tenant_id FROM public.tenant_members WHERE (tenant_members.user_id = auth.uid())))); - --- --- Name: feriados feriados_saas_delete; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY feriados_saas_delete ON public.feriados FOR DELETE USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: feriados feriados_saas_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY feriados_saas_insert ON public.feriados FOR INSERT WITH CHECK ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: feriados feriados_saas_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY feriados_saas_select ON public.feriados FOR SELECT USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: feriados feriados_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY feriados_select ON public.feriados FOR SELECT USING ((tenant_id IN ( SELECT tenant_members.tenant_id FROM public.tenant_members WHERE (tenant_members.user_id = auth.uid())))); - --- --- Name: financial_categories; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.financial_categories ENABLE ROW LEVEL SECURITY; - --- --- Name: financial_categories financial_categories_self; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY financial_categories_self ON public.financial_categories USING ((auth.uid() = user_id)) WITH CHECK ((auth.uid() = user_id)); - --- --- Name: financial_exceptions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.financial_exceptions ENABLE ROW LEVEL SECURITY; - --- --- Name: financial_exceptions financial_exceptions: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "financial_exceptions: owner full access" ON public.financial_exceptions USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: financial_exceptions financial_exceptions: tenant members read clinic rules; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "financial_exceptions: tenant members read clinic rules" ON public.financial_exceptions FOR SELECT USING (((owner_id IS NULL) AND (EXISTS ( SELECT 1 FROM public.owner_users ou WHERE ((ou.owner_id = financial_exceptions.tenant_id) AND (ou.user_id = auth.uid())))))); - --- --- Name: financial_records; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.financial_records ENABLE ROW LEVEL SECURITY; - --- --- Name: financial_records financial_records_self; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY financial_records_self ON public.financial_records USING ((auth.uid() = owner_id)) WITH CHECK ((auth.uid() = owner_id)); - --- --- Name: financial_records financial_records_tenant_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY financial_records_tenant_admin ON public.financial_records FOR SELECT USING (((tenant_id IS NOT NULL) AND public.is_tenant_admin(tenant_id))); - --- --- Name: financial_records financial_records_tenant_member_read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY financial_records_tenant_member_read ON public.financial_records FOR SELECT USING (((tenant_id IS NOT NULL) AND (EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = financial_records.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text)))))); - --- --- Name: email_templates_global global templates readable by authenticated; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "global templates readable by authenticated" ON public.email_templates_global FOR SELECT USING ((auth.role() = 'authenticated'::text)); - --- --- Name: global_notices; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.global_notices ENABLE ROW LEVEL SECURITY; - --- --- Name: global_notices global_notices_saas_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY global_notices_saas_all ON public.global_notices TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: global_notices global_notices_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY global_notices_select ON public.global_notices FOR SELECT TO authenticated USING ((is_active = true)); - --- --- Name: agenda_bloqueios insert own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "insert own" ON public.agenda_bloqueios FOR INSERT WITH CHECK ((owner_id = auth.uid())); - --- --- Name: insurance_plan_services; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.insurance_plan_services ENABLE ROW LEVEL SECURITY; - --- --- Name: insurance_plan_services insurance_plan_services_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY insurance_plan_services_owner ON public.insurance_plan_services USING ((EXISTS ( SELECT 1 FROM public.insurance_plans ip WHERE ((ip.id = insurance_plan_services.insurance_plan_id) AND (ip.owner_id = auth.uid()))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.insurance_plans ip WHERE ((ip.id = insurance_plan_services.insurance_plan_id) AND (ip.owner_id = auth.uid()))))); - --- --- Name: insurance_plans; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.insurance_plans ENABLE ROW LEVEL SECURITY; - --- --- Name: insurance_plans insurance_plans: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "insurance_plans: owner full access" ON public.insurance_plans USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: login_carousel_slides; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.login_carousel_slides ENABLE ROW LEVEL SECURITY; - --- --- Name: module_features; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.module_features ENABLE ROW LEVEL SECURITY; - --- --- Name: module_features module_features_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin --- +CREATE POLICY "medicos: owner full access" ON public.medicos USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); CREATE POLICY module_features_read_authenticated ON public.module_features FOR SELECT TO authenticated USING (true); - --- --- Name: module_features module_features_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY module_features_write_saas_admin ON public.module_features TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: modules; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.modules ENABLE ROW LEVEL SECURITY; - --- --- Name: modules modules_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY modules_read_authenticated ON public.modules FOR SELECT TO authenticated USING (true); - --- --- Name: modules modules_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY modules_write_saas_admin ON public.modules TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: notice_dismissals; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.notice_dismissals ENABLE ROW LEVEL SECURITY; - --- --- Name: notice_dismissals notice_dismissals_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notice_dismissals_own ON public.notice_dismissals TO authenticated USING ((user_id = auth.uid())) WITH CHECK ((user_id = auth.uid())); - --- --- Name: notification_logs notif_logs_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notif_logs_owner ON public.notification_logs FOR SELECT USING ((owner_id = auth.uid())); - --- --- Name: notification_preferences notif_prefs_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notif_prefs_owner ON public.notification_preferences USING (((owner_id = auth.uid()) AND (deleted_at IS NULL))) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: notification_queue notif_queue_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notif_queue_owner ON public.notification_queue FOR SELECT USING ((owner_id = auth.uid())); - --- --- Name: notification_schedules notif_schedules_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notif_schedules_owner ON public.notification_schedules USING (((owner_id = auth.uid()) AND (deleted_at IS NULL))) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: notification_templates notif_templates_admin_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notif_templates_admin_all ON public.notification_templates TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: notification_templates notif_templates_read_global; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notif_templates_read_global ON public.notification_templates FOR SELECT TO authenticated USING (((deleted_at IS NULL) AND (((tenant_id IS NULL) AND (is_default = true)) OR (owner_id = auth.uid()) OR public.is_tenant_member(tenant_id)))); - --- --- Name: notification_templates notif_templates_write_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notif_templates_write_owner ON public.notification_templates TO authenticated USING (((owner_id = auth.uid()) OR public.is_tenant_member(tenant_id))) WITH CHECK (((owner_id = auth.uid()) OR public.is_tenant_member(tenant_id))); - --- --- Name: notification_channels; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.notification_channels ENABLE ROW LEVEL SECURITY; - --- --- Name: notification_channels notification_channels_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY notification_channels_owner ON public.notification_channels USING (((owner_id = auth.uid()) AND (deleted_at IS NULL))) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: notification_logs; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.notification_logs ENABLE ROW LEVEL SECURITY; - --- --- Name: notification_preferences; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.notification_preferences ENABLE ROW LEVEL SECURITY; - --- --- Name: notification_queue; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.notification_queue ENABLE ROW LEVEL SECURITY; - --- --- Name: notification_schedules; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.notification_schedules ENABLE ROW LEVEL SECURITY; - --- --- Name: notification_templates; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.notification_templates ENABLE ROW LEVEL SECURITY; - --- --- Name: notifications; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.notifications ENABLE ROW LEVEL SECURITY; - --- --- Name: notifications owner only; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "owner only" ON public.notifications USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: owner_users; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.owner_users ENABLE ROW LEVEL SECURITY; - --- --- Name: owner_users owner_users: user can read own links; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "owner_users: user can read own links" ON public.owner_users FOR SELECT TO authenticated USING ((user_id = auth.uid())); +CREATE POLICY patient_contacts_select ON public.patient_contacts FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); --- --- Name: patient_discounts; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.patient_discounts ENABLE ROW LEVEL SECURITY; - --- --- Name: patient_discounts patient_discounts: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- +CREATE POLICY patient_contacts_write ON public.patient_contacts USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); CREATE POLICY "patient_discounts: owner full access" ON public.patient_discounts USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: patient_group_patient; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.patient_group_patient ENABLE ROW LEVEL SECURITY; - --- --- Name: patient_group_patient patient_group_patient_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_group_patient_owner_all ON public.patient_group_patient TO authenticated USING ((EXISTS ( SELECT 1 FROM public.patients p WHERE ((p.id = patient_group_patient.patient_id) AND (p.owner_id = auth.uid()))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.patients p WHERE ((p.id = patient_group_patient.patient_id) AND (p.owner_id = auth.uid()))))); - --- --- Name: patient_group_patient patient_group_patient_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_group_patient_select ON public.patient_group_patient FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); - --- --- Name: patient_group_patient patient_group_patient_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_group_patient_write ON public.patient_group_patient USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); - --- --- Name: patient_groups; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.patient_groups ENABLE ROW LEVEL SECURITY; - --- --- Name: patient_groups patient_groups_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_groups_owner_all ON public.patient_groups TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: patient_groups patient_groups_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_groups_select ON public.patient_groups FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); - --- --- Name: patient_groups patient_groups_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_groups_write ON public.patient_groups USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); - --- --- Name: patient_intake_requests; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.patient_intake_requests ENABLE ROW LEVEL SECURITY; - --- --- Name: patient_intake_requests patient_intake_requests_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_intake_requests_owner_all ON public.patient_intake_requests TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: patient_intake_requests patient_intake_requests_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_intake_requests_select ON public.patient_intake_requests FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); - --- --- Name: patient_intake_requests patient_intake_requests_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_intake_requests_write ON public.patient_intake_requests USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); - --- --- Name: patient_invites; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.patient_invites ENABLE ROW LEVEL SECURITY; - --- --- Name: patient_invites patient_invites_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_invites_owner_all ON public.patient_invites TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: patient_invites patient_invites_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_invites_select ON public.patient_invites FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); - --- --- Name: patient_invites patient_invites_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_invites_write ON public.patient_invites USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); - --- --- Name: patient_patient_tag; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.patient_patient_tag ENABLE ROW LEVEL SECURITY; - --- --- Name: patient_patient_tag patient_patient_tag_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_patient_tag_owner_all ON public.patient_patient_tag TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: patient_patient_tag patient_patient_tag_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_patient_tag_select ON public.patient_patient_tag FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); - --- --- Name: patient_patient_tag patient_patient_tag_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_patient_tag_write ON public.patient_patient_tag USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); - --- --- Name: patient_tags; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.patient_tags ENABLE ROW LEVEL SECURITY; - --- --- Name: patient_tags patient_tags_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_tags_owner_all ON public.patient_tags TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: patient_tags patient_tags_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_tags_select ON public.patient_tags FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); - --- --- Name: patient_tags patient_tags_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patient_tags_write ON public.patient_tags USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); - --- --- Name: patients; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.patients ENABLE ROW LEVEL SECURITY; - --- --- Name: patients patients_delete; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patients_delete ON public.patients FOR DELETE USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.delete'::text))); - --- --- Name: patients patients_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patients_insert ON public.patients FOR INSERT WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.create'::text))); - --- --- Name: patients patients_owner_all; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patients_owner_all ON public.patients TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: patients patients_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patients_select ON public.patients FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); - --- --- Name: patients patients_update; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY patients_update ON public.patients FOR UPDATE USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); - --- --- Name: payment_settings; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.payment_settings ENABLE ROW LEVEL SECURITY; - --- --- Name: payment_settings payment_settings: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "payment_settings: owner full access" ON public.payment_settings USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: plan_features; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.plan_features ENABLE ROW LEVEL SECURITY; - --- --- Name: plan_features plan_features_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY plan_features_read_authenticated ON public.plan_features FOR SELECT TO authenticated USING (true); - --- --- Name: plan_features plan_features_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY plan_features_write_saas_admin ON public.plan_features TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: plans; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.plans ENABLE ROW LEVEL SECURITY; - --- --- Name: plans plans_read_authenticated; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY plans_read_authenticated ON public.plans FOR SELECT TO authenticated USING (true); - --- --- Name: plans plans_write_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY plans_write_saas_admin ON public.plans TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: professional_pricing; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.professional_pricing ENABLE ROW LEVEL SECURITY; - --- --- Name: professional_pricing professional_pricing: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "professional_pricing: owner full access" ON public.professional_pricing USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: profiles; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY; - --- --- Name: profiles profiles_insert_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY profiles_insert_own ON public.profiles FOR INSERT WITH CHECK ((id = auth.uid())); - --- --- Name: profiles profiles_read_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY profiles_read_saas_admin ON public.profiles FOR SELECT USING (public.is_saas_admin()); - --- --- Name: profiles profiles_select_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY profiles_select_own ON public.profiles FOR SELECT USING ((id = auth.uid())); - --- --- Name: profiles profiles_update_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY profiles_update_own ON public.profiles FOR UPDATE USING ((id = auth.uid())) WITH CHECK ((id = auth.uid())); +CREATE POLICY "psc: owner full access" ON public.patient_support_contacts USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); --- --- Name: login_carousel_slides public_read; Type: POLICY; Schema: public; Owner: supabase_admin --- +CREATE POLICY psh_insert ON public.patient_status_history FOR INSERT WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); + +CREATE POLICY psh_select ON public.patient_status_history FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); + +CREATE POLICY pt_insert ON public.patient_timeline FOR INSERT WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.edit'::text))); + +CREATE POLICY pt_select ON public.patient_timeline FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'patients.view'::text))); CREATE POLICY public_read ON public.login_carousel_slides FOR SELECT USING ((ativo = true)); - --- --- Name: features read features (auth); Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "read features (auth)" ON public.features FOR SELECT TO authenticated USING (true); - --- --- Name: plan_features read plan_features (auth); Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "read plan_features (auth)" ON public.plan_features FOR SELECT TO authenticated USING (true); - --- --- Name: plans read plans (auth); Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "read plans (auth)" ON public.plans FOR SELECT TO authenticated USING (true); - --- --- Name: recurrence_exceptions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.recurrence_exceptions ENABLE ROW LEVEL SECURITY; - --- --- Name: recurrence_exceptions recurrence_exceptions_tenant; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY recurrence_exceptions_tenant ON public.recurrence_exceptions TO authenticated USING ((tenant_id IN ( SELECT tenant_members.tenant_id FROM public.tenant_members WHERE (tenant_members.user_id = auth.uid())))) WITH CHECK ((tenant_id IN ( SELECT tenant_members.tenant_id FROM public.tenant_members WHERE (tenant_members.user_id = auth.uid())))); - --- --- Name: recurrence_rule_services; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.recurrence_rule_services ENABLE ROW LEVEL SECURITY; - --- --- Name: recurrence_rule_services recurrence_rule_services: clinic read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "recurrence_rule_services: clinic read" ON public.recurrence_rule_services FOR SELECT USING ((EXISTS ( SELECT 1 FROM public.recurrence_rules r WHERE ((r.id = recurrence_rule_services.rule_id) AND public.is_clinic_tenant(r.tenant_id) AND public.is_tenant_member(r.tenant_id) AND public.tenant_has_feature(r.tenant_id, 'agenda.view'::text))))); - --- --- Name: recurrence_rule_services recurrence_rule_services: clinic write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "recurrence_rule_services: clinic write" ON public.recurrence_rule_services USING ((EXISTS ( SELECT 1 FROM public.recurrence_rules r WHERE ((r.id = recurrence_rule_services.rule_id) AND public.is_clinic_tenant(r.tenant_id) AND public.is_tenant_member(r.tenant_id) AND public.tenant_has_feature(r.tenant_id, 'agenda.edit'::text))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.recurrence_rules r WHERE ((r.id = recurrence_rule_services.rule_id) AND public.is_clinic_tenant(r.tenant_id) AND public.is_tenant_member(r.tenant_id) AND public.tenant_has_feature(r.tenant_id, 'agenda.edit'::text))))); - --- --- Name: recurrence_rule_services recurrence_rule_services: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "recurrence_rule_services: owner full access" ON public.recurrence_rule_services TO authenticated USING ((EXISTS ( SELECT 1 FROM public.recurrence_rules r WHERE ((r.id = recurrence_rule_services.rule_id) AND (r.owner_id = auth.uid()))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.recurrence_rules r WHERE ((r.id = recurrence_rule_services.rule_id) AND (r.owner_id = auth.uid()))))); - --- --- Name: recurrence_rules; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.recurrence_rules ENABLE ROW LEVEL SECURITY; - --- --- Name: recurrence_rules recurrence_rules_clinic_read; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY recurrence_rules_clinic_read ON public.recurrence_rules FOR SELECT USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.view'::text))); - --- --- Name: recurrence_rules recurrence_rules_clinic_write; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY recurrence_rules_clinic_write ON public.recurrence_rules USING ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))) WITH CHECK ((public.is_clinic_tenant(tenant_id) AND public.is_tenant_member(tenant_id) AND public.tenant_has_feature(tenant_id, 'agenda.edit'::text))); - --- --- Name: recurrence_rules recurrence_rules_owner; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY recurrence_rules_owner ON public.recurrence_rules TO authenticated USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: subscription_intents_legacy saas_admin can read subscription_intents; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "saas_admin can read subscription_intents" ON public.subscription_intents_legacy FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins a WHERE (a.user_id = auth.uid())))); - --- --- Name: subscription_intents_legacy saas_admin can update subscription_intents; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "saas_admin can update subscription_intents" ON public.subscription_intents_legacy FOR UPDATE TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins a WHERE (a.user_id = auth.uid())))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.saas_admins a WHERE (a.user_id = auth.uid())))); - --- --- Name: login_carousel_slides saas_admin_full; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY saas_admin_full ON public.login_carousel_slides USING ((EXISTS ( SELECT 1 FROM public.profiles WHERE ((profiles.id = auth.uid()) AND (profiles.role = 'saas_admin'::text))))); - --- --- Name: saas_docs saas_admin_full_access; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY saas_admin_full_access ON public.saas_docs TO authenticated USING ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid())))); - --- --- Name: saas_admins; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.saas_admins ENABLE ROW LEVEL SECURITY; - --- --- Name: saas_admins saas_admins_select_self; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY saas_admins_select_self ON public.saas_admins FOR SELECT TO authenticated USING ((user_id = auth.uid())); - --- --- Name: saas_doc_votos; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.saas_doc_votos ENABLE ROW LEVEL SECURITY; - --- --- Name: saas_docs; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.saas_docs ENABLE ROW LEVEL SECURITY; - --- --- Name: saas_faq; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.saas_faq ENABLE ROW LEVEL SECURITY; - --- --- Name: saas_faq_itens; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.saas_faq_itens ENABLE ROW LEVEL SECURITY; - --- --- Name: agenda_bloqueios select own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "select own" ON public.agenda_bloqueios FOR SELECT USING ((owner_id = auth.uid())); - --- --- Name: services; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.services ENABLE ROW LEVEL SECURITY; - --- --- Name: services services: owner full access; Type: POLICY; Schema: public; Owner: supabase_admin --- +CREATE POLICY service_role_manage_usage ON public.twilio_subaccount_usage USING ((auth.role() = 'service_role'::text)); CREATE POLICY "services: owner full access" ON public.services USING ((owner_id = auth.uid())) WITH CHECK ((owner_id = auth.uid())); - --- --- Name: subscription_events; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.subscription_events ENABLE ROW LEVEL SECURITY; - --- --- Name: subscription_events subscription_events_read_saas; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscription_events_read_saas ON public.subscription_events FOR SELECT USING (public.is_saas_admin()); - --- --- Name: subscription_events subscription_events_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscription_events_write_saas ON public.subscription_events FOR INSERT WITH CHECK (public.is_saas_admin()); - --- --- Name: subscription_intents_legacy subscription_intents_insert_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscription_intents_insert_own ON public.subscription_intents_legacy FOR INSERT TO authenticated WITH CHECK ((user_id = auth.uid())); - --- --- Name: subscription_intents_legacy; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.subscription_intents_legacy ENABLE ROW LEVEL SECURITY; - --- --- Name: subscription_intents_legacy subscription_intents_select_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscription_intents_select_own ON public.subscription_intents_legacy FOR SELECT TO authenticated USING ((user_id = auth.uid())); - --- --- Name: subscriptions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.subscriptions ENABLE ROW LEVEL SECURITY; - --- --- Name: subscriptions subscriptions read own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "subscriptions read own" ON public.subscriptions FOR SELECT TO authenticated USING ((user_id = auth.uid())); - --- --- Name: subscriptions subscriptions: read if linked owner_users; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "subscriptions: read if linked owner_users" ON public.subscriptions FOR SELECT TO authenticated USING ((EXISTS ( SELECT 1 FROM public.owner_users ou WHERE ((ou.owner_id = subscriptions.user_id) AND (ou.user_id = auth.uid()))))); - --- --- Name: subscriptions subscriptions_insert_own_personal; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscriptions_insert_own_personal ON public.subscriptions FOR INSERT TO authenticated WITH CHECK (((user_id = auth.uid()) AND (tenant_id IS NULL))); - --- --- Name: subscriptions subscriptions_no_direct_update; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscriptions_no_direct_update ON public.subscriptions FOR UPDATE TO authenticated USING (false) WITH CHECK (false); - --- --- Name: subscriptions subscriptions_read_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscriptions_read_own ON public.subscriptions FOR SELECT TO authenticated USING (((user_id = auth.uid()) OR public.is_saas_admin())); - --- --- Name: subscriptions subscriptions_select_for_tenant_members; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscriptions_select_for_tenant_members ON public.subscriptions FOR SELECT TO authenticated USING (((tenant_id IS NOT NULL) AND (EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = subscriptions.tenant_id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text)))))); - --- --- Name: subscriptions subscriptions_select_own_personal; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscriptions_select_own_personal ON public.subscriptions FOR SELECT TO authenticated USING (((user_id = auth.uid()) AND (tenant_id IS NULL))); - --- --- Name: subscriptions subscriptions_update_only_saas_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY subscriptions_update_only_saas_admin ON public.subscriptions FOR UPDATE TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: support_sessions; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.support_sessions ENABLE ROW LEVEL SECURITY; - --- --- Name: support_sessions support_sessions_saas_delete; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY support_sessions_saas_delete ON public.support_sessions FOR DELETE USING (((auth.uid() = admin_id) AND (EXISTS ( SELECT 1 FROM public.profiles WHERE ((profiles.id = auth.uid()) AND (profiles.role = 'saas_admin'::text)))))); - --- --- Name: support_sessions support_sessions_saas_insert; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY support_sessions_saas_insert ON public.support_sessions FOR INSERT WITH CHECK (((auth.uid() = admin_id) AND (EXISTS ( SELECT 1 FROM public.profiles WHERE ((profiles.id = auth.uid()) AND (profiles.role = 'saas_admin'::text)))))); - --- --- Name: support_sessions support_sessions_saas_select; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY support_sessions_saas_select ON public.support_sessions FOR SELECT USING (((auth.uid() = admin_id) AND (EXISTS ( SELECT 1 FROM public.profiles WHERE ((profiles.id = auth.uid()) AND (profiles.role = 'saas_admin'::text)))))); - --- --- Name: email_templates_tenant tenant manages own overrides; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "tenant manages own overrides" ON public.email_templates_tenant USING ((tenant_id = auth.uid())) WITH CHECK ((tenant_id = auth.uid())); - --- --- Name: email_layout_config tenant owns email layout config; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "tenant owns email layout config" ON public.email_layout_config USING ((tenant_id = auth.uid())) WITH CHECK ((tenant_id = auth.uid())); - --- --- Name: tenant_members; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.tenant_members ENABLE ROW LEVEL SECURITY; - --- --- Name: tenant_members tenant_members_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY tenant_members_write_saas ON public.tenant_members TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: tenant_modules; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.tenant_modules ENABLE ROW LEVEL SECURITY; - --- --- Name: tenant_modules tenant_modules_read_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY tenant_modules_read_own ON public.tenant_modules FOR SELECT TO authenticated USING (((owner_id = auth.uid()) OR public.is_saas_admin())); - --- --- Name: tenant_modules tenant_modules_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY tenant_modules_write_saas ON public.tenant_modules TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: tenants; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.tenants ENABLE ROW LEVEL SECURITY; - --- --- Name: tenants tenants_read_members; Type: POLICY; Schema: public; Owner: supabase_admin --- +CREATE POLICY tenant_select_own_usage ON public.twilio_subaccount_usage FOR SELECT USING ((tenant_id IN ( SELECT tenant_members.tenant_id + FROM public.tenant_members + WHERE (tenant_members.user_id = auth.uid())))); CREATE POLICY tenants_read_members ON public.tenants FOR SELECT TO authenticated USING ((public.is_saas_admin() OR (EXISTS ( SELECT 1 FROM public.tenant_members tm WHERE ((tm.tenant_id = tenants.id) AND (tm.user_id = auth.uid()) AND (tm.status = 'active'::text)))))); - --- --- Name: tenants tenants_write_saas; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY tenants_write_saas ON public.tenants TO authenticated USING (public.is_saas_admin()) WITH CHECK (public.is_saas_admin()); - --- --- Name: therapist_payout_records; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.therapist_payout_records ENABLE ROW LEVEL SECURITY; - --- --- Name: therapist_payout_records therapist_payout_records_self; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY therapist_payout_records_self ON public.therapist_payout_records USING ((EXISTS ( SELECT 1 FROM public.therapist_payouts tp WHERE ((tp.id = therapist_payout_records.payout_id) AND (tp.owner_id = auth.uid()))))) WITH CHECK ((EXISTS ( SELECT 1 FROM public.therapist_payouts tp WHERE ((tp.id = therapist_payout_records.payout_id) AND (tp.owner_id = auth.uid()))))); - --- --- Name: therapist_payout_records therapist_payout_records_tenant_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY therapist_payout_records_tenant_admin ON public.therapist_payout_records FOR SELECT USING ((EXISTS ( SELECT 1 FROM public.therapist_payouts tp WHERE ((tp.id = therapist_payout_records.payout_id) AND public.is_tenant_admin(tp.tenant_id))))); - --- --- Name: therapist_payouts; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.therapist_payouts ENABLE ROW LEVEL SECURITY; - --- --- Name: therapist_payouts therapist_payouts_self; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY therapist_payouts_self ON public.therapist_payouts USING ((auth.uid() = owner_id)) WITH CHECK ((auth.uid() = owner_id)); - --- --- Name: therapist_payouts therapist_payouts_tenant_admin; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY therapist_payouts_tenant_admin ON public.therapist_payouts FOR SELECT USING (((tenant_id IS NOT NULL) AND public.is_tenant_admin(tenant_id))); - --- --- Name: tenant_members tm_select_admin_all_members; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY tm_select_admin_all_members ON public.tenant_members FOR SELECT TO authenticated USING (public.is_tenant_admin(tenant_id)); - --- --- Name: tenant_members tm_select_own_membership; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY tm_select_own_membership ON public.tenant_members FOR SELECT TO authenticated USING ((user_id = auth.uid())); - --- --- Name: agenda_bloqueios update own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY "update own" ON public.agenda_bloqueios FOR UPDATE USING ((owner_id = auth.uid())); - --- --- Name: user_settings; Type: ROW SECURITY; Schema: public; Owner: supabase_admin --- - -ALTER TABLE public.user_settings ENABLE ROW LEVEL SECURITY; - --- --- Name: user_settings user_settings_insert_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY user_settings_insert_own ON public.user_settings FOR INSERT WITH CHECK ((user_id = auth.uid())); - --- --- Name: user_settings user_settings_select_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY user_settings_select_own ON public.user_settings FOR SELECT USING ((user_id = auth.uid())); - --- --- Name: user_settings user_settings_update_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY user_settings_update_own ON public.user_settings FOR UPDATE USING ((user_id = auth.uid())) WITH CHECK ((user_id = auth.uid())); - --- --- Name: saas_docs users_read_usuario_docs; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY users_read_usuario_docs ON public.saas_docs FOR SELECT TO authenticated USING (((ativo = true) AND (tipo_acesso = 'usuario'::text))); - --- --- Name: saas_doc_votos votos_select_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY votos_select_own ON public.saas_doc_votos FOR SELECT TO authenticated USING ((user_id = auth.uid())); - --- --- Name: saas_doc_votos votos_upsert_own; Type: POLICY; Schema: public; Owner: supabase_admin --- - CREATE POLICY votos_upsert_own ON public.saas_doc_votos TO authenticated USING ((user_id = auth.uid())) WITH CHECK ((user_id = auth.uid())); +CREATE POLICY "Allow authenticated updates" ON storage.objects FOR UPDATE TO authenticated USING ((bucket_id = ANY (ARRAY['avatars'::text, 'logos'::text]))); --- --- Name: messages; Type: ROW SECURITY; Schema: realtime; Owner: supabase_realtime_admin --- +CREATE POLICY "Allow authenticated uploads" ON storage.objects FOR INSERT TO authenticated WITH CHECK ((bucket_id = ANY (ARRAY['avatars'::text, 'logos'::text]))); -ALTER TABLE realtime.messages ENABLE ROW LEVEL SECURITY; - --- --- Name: objects agendador_storage_owner_delete; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- +CREATE POLICY "Public read" ON storage.objects FOR SELECT USING ((bucket_id = ANY (ARRAY['avatars'::text, 'logos'::text]))); CREATE POLICY agendador_storage_owner_delete ON storage.objects FOR DELETE TO authenticated USING (((bucket_id = 'agendador'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); - --- --- Name: objects agendador_storage_owner_insert; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY agendador_storage_owner_insert ON storage.objects FOR INSERT TO authenticated WITH CHECK (((bucket_id = 'agendador'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); - --- --- Name: objects agendador_storage_owner_update; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY agendador_storage_owner_update ON storage.objects FOR UPDATE TO authenticated USING (((bucket_id = 'agendador'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); - --- --- Name: objects agendador_storage_public_read; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY agendador_storage_public_read ON storage.objects FOR SELECT USING ((bucket_id = 'agendador'::text)); - --- --- Name: objects avatars authenticated upload; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY "avatars authenticated upload" ON storage.objects FOR INSERT WITH CHECK (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); - --- --- Name: objects avatars owner delete; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY "avatars owner delete" ON storage.objects FOR DELETE USING (((bucket_id = 'avatars'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); - --- --- Name: objects avatars owner update; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY "avatars owner update" ON storage.objects FOR UPDATE USING (((bucket_id = 'avatars'::text) AND ((storage.foldername(name))[1] = (auth.uid())::text))); - --- --- Name: objects avatars public read; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY "avatars public read" ON storage.objects FOR SELECT USING ((bucket_id = 'avatars'::text)); - --- --- Name: objects avatars_delete_own; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY avatars_delete_own ON storage.objects FOR DELETE TO authenticated USING (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))); - --- --- Name: objects avatars_delete_own_folder; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY avatars_delete_own_folder ON storage.objects FOR DELETE USING (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND (name ~~ (('owners/'::text || auth.uid()) || '/%'::text)))); - --- --- Name: objects avatars_insert_own; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY avatars_insert_own ON storage.objects FOR INSERT TO authenticated WITH CHECK (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))); - --- --- Name: objects avatars_insert_own_folder; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY avatars_insert_own_folder ON storage.objects FOR INSERT WITH CHECK (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND (name ~~ (('owners/'::text || auth.uid()) || '/%'::text)))); - --- --- Name: objects avatars_read; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY avatars_read ON storage.objects FOR SELECT USING ((bucket_id = 'avatars'::text)); - --- --- Name: objects avatars_select_own; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY avatars_select_own ON storage.objects FOR SELECT TO authenticated USING (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))); - --- --- Name: objects avatars_update_own; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY avatars_update_own ON storage.objects FOR UPDATE TO authenticated USING (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))) WITH CHECK (((bucket_id = 'avatars'::text) AND (name ~~ ((auth.uid())::text || '/%'::text)))); - --- --- Name: objects avatars_update_own_folder; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY avatars_update_own_folder ON storage.objects FOR UPDATE USING (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND (name ~~ (('owners/'::text || auth.uid()) || '/%'::text)))) WITH CHECK (((bucket_id = 'avatars'::text) AND (auth.role() = 'authenticated'::text) AND (name ~~ (('owners/'::text || auth.uid()) || '/%'::text)))); +CREATE POLICY "documents: authenticated delete" ON storage.objects FOR DELETE TO authenticated USING ((bucket_id = 'documents'::text)); --- --- Name: buckets; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- +CREATE POLICY "documents: authenticated read" ON storage.objects FOR SELECT TO authenticated USING ((bucket_id = 'documents'::text)); -ALTER TABLE storage.buckets ENABLE ROW LEVEL SECURITY; +CREATE POLICY "documents: authenticated upload" ON storage.objects FOR INSERT TO authenticated WITH CHECK ((bucket_id = 'documents'::text)); --- --- Name: buckets_analytics; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- +CREATE POLICY "generated-docs: authenticated delete" ON storage.objects FOR DELETE TO authenticated USING ((bucket_id = 'generated-docs'::text)); -ALTER TABLE storage.buckets_analytics ENABLE ROW LEVEL SECURITY; +CREATE POLICY "generated-docs: authenticated read" ON storage.objects FOR SELECT TO authenticated USING ((bucket_id = 'generated-docs'::text)); --- --- Name: buckets_vectors; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE storage.buckets_vectors ENABLE ROW LEVEL SECURITY; - --- --- Name: iceberg_namespaces; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE storage.iceberg_namespaces ENABLE ROW LEVEL SECURITY; - --- --- Name: iceberg_tables; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE storage.iceberg_tables ENABLE ROW LEVEL SECURITY; - --- --- Name: objects intake_read_anon; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- +CREATE POLICY "generated-docs: authenticated upload" ON storage.objects FOR INSERT TO authenticated WITH CHECK ((bucket_id = 'generated-docs'::text)); CREATE POLICY intake_read_anon ON storage.objects FOR SELECT TO anon USING (((bucket_id = 'avatars'::text) AND (name ~~ 'intakes/%'::text))); - --- --- Name: objects intake_read_public; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY intake_read_public ON storage.objects FOR SELECT USING (((bucket_id = 'avatars'::text) AND (name ~~ 'intakes/%'::text))); - --- --- Name: objects intake_upload_anon; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY intake_upload_anon ON storage.objects FOR INSERT TO anon WITH CHECK (((bucket_id = 'avatars'::text) AND (name ~~ 'intakes/%'::text))); - --- --- Name: objects intake_upload_public; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY intake_upload_public ON storage.objects FOR INSERT WITH CHECK (((bucket_id = 'avatars'::text) AND (name ~~ 'intakes/%'::text))); - --- --- Name: migrations; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE storage.migrations ENABLE ROW LEVEL SECURITY; - --- --- Name: objects; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE storage.objects ENABLE ROW LEVEL SECURITY; - --- --- Name: objects public_read; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY public_read ON storage.objects FOR SELECT USING ((bucket_id = 'saas-docs'::text)); - --- --- Name: s3_multipart_uploads; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE storage.s3_multipart_uploads ENABLE ROW LEVEL SECURITY; - --- --- Name: s3_multipart_uploads_parts; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE storage.s3_multipart_uploads_parts ENABLE ROW LEVEL SECURITY; - --- --- Name: objects saas_admin_delete; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY saas_admin_delete ON storage.objects FOR DELETE TO authenticated USING (((bucket_id = 'saas-docs'::text) AND (EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid()))))); - --- --- Name: objects saas_admin_upload; Type: POLICY; Schema: storage; Owner: supabase_storage_admin --- - CREATE POLICY saas_admin_upload ON storage.objects FOR INSERT TO authenticated WITH CHECK (((bucket_id = 'saas-docs'::text) AND (EXISTS ( SELECT 1 FROM public.saas_admins WHERE (saas_admins.user_id = auth.uid()))))); - - --- --- Name: vector_indexes; Type: ROW SECURITY; Schema: storage; Owner: supabase_storage_admin --- - -ALTER TABLE storage.vector_indexes ENABLE ROW LEVEL SECURITY; - --- --- Name: supabase_realtime; Type: PUBLICATION; Schema: -; Owner: postgres --- - -CREATE PUBLICATION supabase_realtime WITH (publish = 'insert, update, delete, truncate'); - - -ALTER PUBLICATION supabase_realtime OWNER TO postgres; - --- --- Name: supabase_realtime_messages_publication; Type: PUBLICATION; Schema: -; Owner: supabase_admin --- - -CREATE PUBLICATION supabase_realtime_messages_publication WITH (publish = 'insert, update, delete, truncate'); - - -ALTER PUBLICATION supabase_realtime_messages_publication OWNER TO supabase_admin; - --- --- Name: supabase_realtime notifications; Type: PUBLICATION TABLE; Schema: public; Owner: postgres --- - -ALTER PUBLICATION supabase_realtime ADD TABLE ONLY public.notifications; - - --- --- Name: supabase_realtime_messages_publication messages; Type: PUBLICATION TABLE; Schema: realtime; Owner: supabase_admin --- - -ALTER PUBLICATION supabase_realtime_messages_publication ADD TABLE ONLY realtime.messages; - - --- --- Name: SCHEMA auth; Type: ACL; Schema: -; Owner: supabase_admin --- - diff --git a/database-novo/schema/10_grants/grants.sql b/database-novo/schema/10_grants/grants.sql deleted file mode 100644 index f64cece..0000000 --- a/database-novo/schema/10_grants/grants.sql +++ /dev/null @@ -1,6534 +0,0 @@ --- ============================================================================= --- AgenciaPsi — Grants + Default Privileges --- ============================================================================= - -GRANT USAGE ON SCHEMA auth TO anon; -GRANT USAGE ON SCHEMA auth TO authenticated; -GRANT USAGE ON SCHEMA auth TO service_role; -GRANT ALL ON SCHEMA auth TO supabase_auth_admin; -GRANT ALL ON SCHEMA auth TO dashboard_user; -GRANT USAGE ON SCHEMA auth TO postgres; - - --- --- Name: SCHEMA cron; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA cron TO postgres WITH GRANT OPTION; - - --- --- Name: SCHEMA extensions; Type: ACL; Schema: -; Owner: postgres --- - -GRANT USAGE ON SCHEMA extensions TO anon; -GRANT USAGE ON SCHEMA extensions TO authenticated; -GRANT USAGE ON SCHEMA extensions TO service_role; -GRANT ALL ON SCHEMA extensions TO dashboard_user; - - --- --- Name: SCHEMA net; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA net TO supabase_functions_admin; -GRANT USAGE ON SCHEMA net TO postgres; -GRANT USAGE ON SCHEMA net TO anon; -GRANT USAGE ON SCHEMA net TO authenticated; -GRANT USAGE ON SCHEMA net TO service_role; - - --- --- Name: SCHEMA public; Type: ACL; Schema: -; Owner: pg_database_owner --- - -GRANT USAGE ON SCHEMA public TO postgres; -GRANT USAGE ON SCHEMA public TO anon; -GRANT USAGE ON SCHEMA public TO authenticated; -GRANT USAGE ON SCHEMA public TO service_role; - - --- --- Name: SCHEMA realtime; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA realtime TO postgres; -GRANT USAGE ON SCHEMA realtime TO anon; -GRANT USAGE ON SCHEMA realtime TO authenticated; -GRANT USAGE ON SCHEMA realtime TO service_role; -GRANT ALL ON SCHEMA realtime TO supabase_realtime_admin; - - --- --- Name: SCHEMA storage; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA storage TO postgres WITH GRANT OPTION; -GRANT USAGE ON SCHEMA storage TO anon; -GRANT USAGE ON SCHEMA storage TO authenticated; -GRANT USAGE ON SCHEMA storage TO service_role; -GRANT ALL ON SCHEMA storage TO supabase_storage_admin WITH GRANT OPTION; -GRANT ALL ON SCHEMA storage TO dashboard_user; - - --- --- Name: SCHEMA supabase_functions; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA supabase_functions TO postgres; -GRANT USAGE ON SCHEMA supabase_functions TO anon; -GRANT USAGE ON SCHEMA supabase_functions TO authenticated; -GRANT USAGE ON SCHEMA supabase_functions TO service_role; -GRANT ALL ON SCHEMA supabase_functions TO supabase_functions_admin; - - --- --- Name: SCHEMA vault; Type: ACL; Schema: -; Owner: supabase_admin --- - -GRANT USAGE ON SCHEMA vault TO postgres WITH GRANT OPTION; -GRANT USAGE ON SCHEMA vault TO service_role; - - --- --- Name: FUNCTION citextin(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citextin(cstring) TO postgres; -GRANT ALL ON FUNCTION public.citextin(cstring) TO anon; -GRANT ALL ON FUNCTION public.citextin(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.citextin(cstring) TO service_role; - - --- --- Name: FUNCTION citextout(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citextout(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citextout(public.citext) TO anon; -GRANT ALL ON FUNCTION public.citextout(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citextout(public.citext) TO service_role; - - --- --- Name: FUNCTION citextrecv(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citextrecv(internal) TO postgres; -GRANT ALL ON FUNCTION public.citextrecv(internal) TO anon; -GRANT ALL ON FUNCTION public.citextrecv(internal) TO authenticated; -GRANT ALL ON FUNCTION public.citextrecv(internal) TO service_role; - - --- --- Name: FUNCTION citextsend(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citextsend(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citextsend(public.citext) TO anon; -GRANT ALL ON FUNCTION public.citextsend(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citextsend(public.citext) TO service_role; - - --- --- Name: FUNCTION gbtreekey16_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey16_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey16_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey16_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey16_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey16_out(public.gbtreekey16); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey16_out(public.gbtreekey16) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey16_out(public.gbtreekey16) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey16_out(public.gbtreekey16) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey16_out(public.gbtreekey16) TO service_role; - - --- --- Name: FUNCTION gbtreekey2_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey2_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey2_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey2_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey2_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey2_out(public.gbtreekey2); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey2_out(public.gbtreekey2) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey2_out(public.gbtreekey2) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey2_out(public.gbtreekey2) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey2_out(public.gbtreekey2) TO service_role; - - --- --- Name: FUNCTION gbtreekey32_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey32_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey32_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey32_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey32_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey32_out(public.gbtreekey32); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey32_out(public.gbtreekey32) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey32_out(public.gbtreekey32) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey32_out(public.gbtreekey32) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey32_out(public.gbtreekey32) TO service_role; - - --- --- Name: FUNCTION gbtreekey4_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey4_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey4_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey4_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey4_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey4_out(public.gbtreekey4); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey4_out(public.gbtreekey4) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey4_out(public.gbtreekey4) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey4_out(public.gbtreekey4) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey4_out(public.gbtreekey4) TO service_role; - - --- --- Name: FUNCTION gbtreekey8_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey8_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey8_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey8_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey8_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey8_out(public.gbtreekey8); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey8_out(public.gbtreekey8) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey8_out(public.gbtreekey8) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey8_out(public.gbtreekey8) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey8_out(public.gbtreekey8) TO service_role; - - --- --- Name: FUNCTION gbtreekey_var_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey_var_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey_var_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey_var_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey_var_in(cstring) TO service_role; - - --- --- Name: FUNCTION gbtreekey_var_out(public.gbtreekey_var); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbtreekey_var_out(public.gbtreekey_var) TO postgres; -GRANT ALL ON FUNCTION public.gbtreekey_var_out(public.gbtreekey_var) TO anon; -GRANT ALL ON FUNCTION public.gbtreekey_var_out(public.gbtreekey_var) TO authenticated; -GRANT ALL ON FUNCTION public.gbtreekey_var_out(public.gbtreekey_var) TO service_role; - - --- --- Name: FUNCTION gtrgm_in(cstring); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_in(cstring) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_in(cstring) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_in(cstring) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_in(cstring) TO service_role; - - --- --- Name: FUNCTION gtrgm_out(public.gtrgm); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_out(public.gtrgm) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_out(public.gtrgm) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_out(public.gtrgm) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_out(public.gtrgm) TO service_role; - - --- --- Name: FUNCTION citext(boolean); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext(boolean) TO postgres; -GRANT ALL ON FUNCTION public.citext(boolean) TO anon; -GRANT ALL ON FUNCTION public.citext(boolean) TO authenticated; -GRANT ALL ON FUNCTION public.citext(boolean) TO service_role; - - --- --- Name: FUNCTION citext(character); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext(character) TO postgres; -GRANT ALL ON FUNCTION public.citext(character) TO anon; -GRANT ALL ON FUNCTION public.citext(character) TO authenticated; -GRANT ALL ON FUNCTION public.citext(character) TO service_role; - - --- --- Name: FUNCTION citext(inet); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext(inet) TO postgres; -GRANT ALL ON FUNCTION public.citext(inet) TO anon; -GRANT ALL ON FUNCTION public.citext(inet) TO authenticated; -GRANT ALL ON FUNCTION public.citext(inet) TO service_role; - - --- --- Name: FUNCTION email(); Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON FUNCTION auth.email() TO dashboard_user; - - --- --- Name: FUNCTION jwt(); Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON FUNCTION auth.jwt() TO postgres; -GRANT ALL ON FUNCTION auth.jwt() TO dashboard_user; - - --- --- Name: FUNCTION role(); Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON FUNCTION auth.role() TO dashboard_user; - - --- --- Name: FUNCTION uid(); Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON FUNCTION auth.uid() TO dashboard_user; - - --- --- Name: FUNCTION alter_job(job_id bigint, schedule text, command text, database text, username text, active boolean); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.alter_job(job_id bigint, schedule text, command text, database text, username text, active boolean) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION job_cache_invalidate(); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.job_cache_invalidate() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION schedule(schedule text, command text); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.schedule(schedule text, command text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION schedule(job_name text, schedule text, command text); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.schedule(job_name text, schedule text, command text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION schedule_in_database(job_name text, schedule text, command text, database text, username text, active boolean); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.schedule_in_database(job_name text, schedule text, command text, database text, username text, active boolean) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION unschedule(job_id bigint); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.unschedule(job_id bigint) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION unschedule(job_name text); Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION cron.unschedule(job_name text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION armor(bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.armor(bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.armor(bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION armor(bytea, text[], text[]); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.armor(bytea, text[], text[]) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.armor(bytea, text[], text[]) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION crypt(text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.crypt(text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.crypt(text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION dearmor(text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.dearmor(text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.dearmor(text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION decrypt(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.decrypt(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.decrypt(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION decrypt_iv(bytea, bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.decrypt_iv(bytea, bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.decrypt_iv(bytea, bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION digest(bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.digest(bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.digest(bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION digest(text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.digest(text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.digest(text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION encrypt(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.encrypt(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.encrypt(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION encrypt_iv(bytea, bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.encrypt_iv(bytea, bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.encrypt_iv(bytea, bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION gen_random_bytes(integer); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.gen_random_bytes(integer) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.gen_random_bytes(integer) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION gen_random_uuid(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.gen_random_uuid() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.gen_random_uuid() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION gen_salt(text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.gen_salt(text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.gen_salt(text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION gen_salt(text, integer); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.gen_salt(text, integer) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.gen_salt(text, integer) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION grant_pg_cron_access(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION extensions.grant_pg_cron_access() FROM supabase_admin; -GRANT ALL ON FUNCTION extensions.grant_pg_cron_access() TO supabase_admin WITH GRANT OPTION; -GRANT ALL ON FUNCTION extensions.grant_pg_cron_access() TO dashboard_user; - - --- --- Name: FUNCTION grant_pg_graphql_access(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.grant_pg_graphql_access() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION grant_pg_net_access(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION extensions.grant_pg_net_access() FROM supabase_admin; -GRANT ALL ON FUNCTION extensions.grant_pg_net_access() TO supabase_admin WITH GRANT OPTION; -GRANT ALL ON FUNCTION extensions.grant_pg_net_access() TO dashboard_user; - - --- --- Name: FUNCTION hmac(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.hmac(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.hmac(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION hmac(text, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.hmac(text, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.hmac(text, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pg_stat_statements(showtext boolean, OUT userid oid, OUT dbid oid, OUT toplevel boolean, OUT queryid bigint, OUT query text, OUT plans bigint, OUT total_plan_time double precision, OUT min_plan_time double precision, OUT max_plan_time double precision, OUT mean_plan_time double precision, OUT stddev_plan_time double precision, OUT calls bigint, OUT total_exec_time double precision, OUT min_exec_time double precision, OUT max_exec_time double precision, OUT mean_exec_time double precision, OUT stddev_exec_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT shared_blk_read_time double precision, OUT shared_blk_write_time double precision, OUT local_blk_read_time double precision, OUT local_blk_write_time double precision, OUT temp_blk_read_time double precision, OUT temp_blk_write_time double precision, OUT wal_records bigint, OUT wal_fpi bigint, OUT wal_bytes numeric, OUT jit_functions bigint, OUT jit_generation_time double precision, OUT jit_inlining_count bigint, OUT jit_inlining_time double precision, OUT jit_optimization_count bigint, OUT jit_optimization_time double precision, OUT jit_emission_count bigint, OUT jit_emission_time double precision, OUT jit_deform_count bigint, OUT jit_deform_time double precision, OUT stats_since timestamp with time zone, OUT minmax_stats_since timestamp with time zone); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pg_stat_statements(showtext boolean, OUT userid oid, OUT dbid oid, OUT toplevel boolean, OUT queryid bigint, OUT query text, OUT plans bigint, OUT total_plan_time double precision, OUT min_plan_time double precision, OUT max_plan_time double precision, OUT mean_plan_time double precision, OUT stddev_plan_time double precision, OUT calls bigint, OUT total_exec_time double precision, OUT min_exec_time double precision, OUT max_exec_time double precision, OUT mean_exec_time double precision, OUT stddev_exec_time double precision, OUT rows bigint, OUT shared_blks_hit bigint, OUT shared_blks_read bigint, OUT shared_blks_dirtied bigint, OUT shared_blks_written bigint, OUT local_blks_hit bigint, OUT local_blks_read bigint, OUT local_blks_dirtied bigint, OUT local_blks_written bigint, OUT temp_blks_read bigint, OUT temp_blks_written bigint, OUT shared_blk_read_time double precision, OUT shared_blk_write_time double precision, OUT local_blk_read_time double precision, OUT local_blk_write_time double precision, OUT temp_blk_read_time double precision, OUT temp_blk_write_time double precision, OUT wal_records bigint, OUT wal_fpi bigint, OUT wal_bytes numeric, OUT jit_functions bigint, OUT jit_generation_time double precision, OUT jit_inlining_count bigint, OUT jit_inlining_time double precision, OUT jit_optimization_count bigint, OUT jit_optimization_time double precision, OUT jit_emission_count bigint, OUT jit_emission_time double precision, OUT jit_deform_count bigint, OUT jit_deform_time double precision, OUT stats_since timestamp with time zone, OUT minmax_stats_since timestamp with time zone) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pg_stat_statements_info(OUT dealloc bigint, OUT stats_reset timestamp with time zone); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pg_stat_statements_info(OUT dealloc bigint, OUT stats_reset timestamp with time zone) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pg_stat_statements_reset(userid oid, dbid oid, queryid bigint, minmax_only boolean); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pg_stat_statements_reset(userid oid, dbid oid, queryid bigint, minmax_only boolean) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_armor_headers(text, OUT key text, OUT value text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_armor_headers(text, OUT key text, OUT value text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_armor_headers(text, OUT key text, OUT value text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_key_id(bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_key_id(bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_key_id(bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt(bytea, bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt(bytea, bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt(bytea, bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt_bytea(bytea, bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt_bytea(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_decrypt_bytea(bytea, bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_decrypt_bytea(bytea, bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_encrypt(text, bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt(text, bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt(text, bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_encrypt(text, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt(text, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt(text, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_encrypt_bytea(bytea, bytea); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt_bytea(bytea, bytea) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt_bytea(bytea, bytea) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_pub_encrypt_bytea(bytea, bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt_bytea(bytea, bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_pub_encrypt_bytea(bytea, bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_decrypt(bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt(bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt(bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_decrypt(bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt(bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt(bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_decrypt_bytea(bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt_bytea(bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt_bytea(bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_decrypt_bytea(bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt_bytea(bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_decrypt_bytea(bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_encrypt(text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt(text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt(text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_encrypt(text, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt(text, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt(text, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_encrypt_bytea(bytea, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt_bytea(bytea, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt_bytea(bytea, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgp_sym_encrypt_bytea(bytea, text, text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt_bytea(bytea, text, text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.pgp_sym_encrypt_bytea(bytea, text, text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgrst_ddl_watch(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgrst_ddl_watch() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION pgrst_drop_watch(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.pgrst_drop_watch() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION set_graphql_placeholder(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.set_graphql_placeholder() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v1(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v1() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v1() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v1mc(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v1mc() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v1mc() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v3(namespace uuid, name text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v3(namespace uuid, name text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v3(namespace uuid, name text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v4(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v4() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v4() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_generate_v5(namespace uuid, name text); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_generate_v5(namespace uuid, name text) TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_generate_v5(namespace uuid, name text) TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_nil(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_nil() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_nil() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_ns_dns(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_ns_dns() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_ns_dns() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_ns_oid(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_ns_oid() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_ns_oid() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_ns_url(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_ns_url() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_ns_url() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION uuid_ns_x500(); Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION extensions.uuid_ns_x500() TO dashboard_user; -GRANT ALL ON FUNCTION extensions.uuid_ns_x500() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION graphql("operationName" text, query text, variables jsonb, extensions jsonb); Type: ACL; Schema: graphql_public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION graphql_public.graphql("operationName" text, query text, variables jsonb, extensions jsonb) TO postgres; -GRANT ALL ON FUNCTION graphql_public.graphql("operationName" text, query text, variables jsonb, extensions jsonb) TO anon; -GRANT ALL ON FUNCTION graphql_public.graphql("operationName" text, query text, variables jsonb, extensions jsonb) TO authenticated; -GRANT ALL ON FUNCTION graphql_public.graphql("operationName" text, query text, variables jsonb, extensions jsonb) TO service_role; - - --- --- Name: FUNCTION http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer); Type: ACL; Schema: net; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO postgres; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO anon; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO authenticated; -GRANT ALL ON FUNCTION net.http_get(url text, params jsonb, headers jsonb, timeout_milliseconds integer) TO service_role; - - --- --- Name: FUNCTION http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer); Type: ACL; Schema: net; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) FROM PUBLIC; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO supabase_functions_admin; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO postgres; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO anon; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO authenticated; -GRANT ALL ON FUNCTION net.http_post(url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer) TO service_role; - - --- --- Name: FUNCTION pg_reload_conf(); Type: ACL; Schema: pg_catalog; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION pg_catalog.pg_reload_conf() TO postgres WITH GRANT OPTION; - - --- --- Name: FUNCTION get_auth(p_usename text); Type: ACL; Schema: pgbouncer; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION pgbouncer.get_auth(p_usename text) FROM PUBLIC; -GRANT ALL ON FUNCTION pgbouncer.get_auth(p_usename text) TO pgbouncer; - - --- --- Name: FUNCTION __rls_ping(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.__rls_ping() TO postgres; -GRANT ALL ON FUNCTION public.__rls_ping() TO anon; -GRANT ALL ON FUNCTION public.__rls_ping() TO authenticated; -GRANT ALL ON FUNCTION public.__rls_ping() TO service_role; - - --- --- Name: TABLE subscriptions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscriptions TO postgres; -GRANT ALL ON TABLE public.subscriptions TO anon; -GRANT ALL ON TABLE public.subscriptions TO authenticated; -GRANT ALL ON TABLE public.subscriptions TO service_role; - - --- --- Name: FUNCTION activate_subscription_from_intent(p_intent_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) TO anon; -GRANT ALL ON FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.activate_subscription_from_intent(p_intent_id uuid) TO service_role; - - --- --- Name: FUNCTION admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) TO postgres; -GRANT ALL ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) TO anon; -GRANT ALL ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) TO authenticated; -GRANT ALL ON FUNCTION public.admin_credit_addon(p_tenant_id uuid, p_addon_type text, p_amount integer, p_product_id uuid, p_description text, p_payment_method text, p_price_cents integer) TO service_role; - - --- --- Name: FUNCTION admin_delete_email_template_global(p_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.admin_delete_email_template_global(p_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.admin_delete_email_template_global(p_id uuid) TO anon; -GRANT ALL ON FUNCTION public.admin_delete_email_template_global(p_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.admin_delete_email_template_global(p_id uuid) TO service_role; - - --- --- Name: FUNCTION admin_fix_plan_target(p_plan_key text, p_new_target text); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) FROM PUBLIC; -GRANT ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) TO postgres; -GRANT ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) TO anon; -GRANT ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) TO authenticated; -GRANT ALL ON FUNCTION public.admin_fix_plan_target(p_plan_key text, p_new_target text) TO service_role; - - --- --- Name: FUNCTION admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) TO postgres; -GRANT ALL ON FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) TO anon; -GRANT ALL ON FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) TO authenticated; -GRANT ALL ON FUNCTION public.admin_upsert_email_template_global(p_id uuid, p_key text, p_domain text, p_channel text, p_subject text, p_body_html text, p_body_text text, p_is_active boolean, p_variables jsonb) TO service_role; - - --- --- Name: FUNCTION agenda_cfg_sync(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.agenda_cfg_sync() TO postgres; -GRANT ALL ON FUNCTION public.agenda_cfg_sync() TO anon; -GRANT ALL ON FUNCTION public.agenda_cfg_sync() TO authenticated; -GRANT ALL ON FUNCTION public.agenda_cfg_sync() TO service_role; - - --- --- Name: FUNCTION agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) TO postgres; -GRANT ALL ON FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) TO anon; -GRANT ALL ON FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) TO authenticated; -GRANT ALL ON FUNCTION public.agendador_dias_disponiveis(p_slug text, p_ano integer, p_mes integer) TO service_role; - - --- --- Name: FUNCTION agendador_gerar_slug(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.agendador_gerar_slug() TO postgres; -GRANT ALL ON FUNCTION public.agendador_gerar_slug() TO anon; -GRANT ALL ON FUNCTION public.agendador_gerar_slug() TO authenticated; -GRANT ALL ON FUNCTION public.agendador_gerar_slug() TO service_role; - - --- --- Name: FUNCTION agendador_slots_disponiveis(p_slug text, p_data date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) TO postgres; -GRANT ALL ON FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) TO anon; -GRANT ALL ON FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) TO authenticated; -GRANT ALL ON FUNCTION public.agendador_slots_disponiveis(p_slug text, p_data date) TO service_role; - - --- --- Name: FUNCTION auto_create_financial_record_from_session(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.auto_create_financial_record_from_session() TO postgres; -GRANT ALL ON FUNCTION public.auto_create_financial_record_from_session() TO anon; -GRANT ALL ON FUNCTION public.auto_create_financial_record_from_session() TO authenticated; -GRANT ALL ON FUNCTION public.auto_create_financial_record_from_session() TO service_role; - - --- --- Name: FUNCTION can_delete_patient(p_patient_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.can_delete_patient(p_patient_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.can_delete_patient(p_patient_id uuid) TO anon; -GRANT ALL ON FUNCTION public.can_delete_patient(p_patient_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.can_delete_patient(p_patient_id uuid) TO service_role; - - --- --- Name: FUNCTION cancel_notifications_on_opt_out(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_notifications_on_opt_out() TO postgres; -GRANT ALL ON FUNCTION public.cancel_notifications_on_opt_out() TO anon; -GRANT ALL ON FUNCTION public.cancel_notifications_on_opt_out() TO authenticated; -GRANT ALL ON FUNCTION public.cancel_notifications_on_opt_out() TO service_role; - - --- --- Name: FUNCTION cancel_notifications_on_session_cancel(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_notifications_on_session_cancel() TO postgres; -GRANT ALL ON FUNCTION public.cancel_notifications_on_session_cancel() TO anon; -GRANT ALL ON FUNCTION public.cancel_notifications_on_session_cancel() TO authenticated; -GRANT ALL ON FUNCTION public.cancel_notifications_on_session_cancel() TO service_role; - - --- --- Name: FUNCTION cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) TO anon; -GRANT ALL ON FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.cancel_patient_pending_notifications(p_patient_id uuid, p_channel text, p_evento_id uuid) TO service_role; - - --- --- Name: FUNCTION cancel_recurrence_from(p_recurrence_id uuid, p_from_date date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) TO postgres; -GRANT ALL ON FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) TO anon; -GRANT ALL ON FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) TO authenticated; -GRANT ALL ON FUNCTION public.cancel_recurrence_from(p_recurrence_id uuid, p_from_date date) TO service_role; - - --- --- Name: FUNCTION cancel_subscription(p_subscription_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancel_subscription(p_subscription_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.cancel_subscription(p_subscription_id uuid) TO anon; -GRANT ALL ON FUNCTION public.cancel_subscription(p_subscription_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.cancel_subscription(p_subscription_id uuid) TO service_role; - - --- --- Name: FUNCTION cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) TO postgres; -GRANT ALL ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) TO anon; -GRANT ALL ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) TO authenticated; -GRANT ALL ON FUNCTION public.cancelar_eventos_serie(p_serie_id uuid, p_a_partir_de timestamp with time zone) TO service_role; - - --- --- Name: FUNCTION cash_dist(money, money); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cash_dist(money, money) TO postgres; -GRANT ALL ON FUNCTION public.cash_dist(money, money) TO anon; -GRANT ALL ON FUNCTION public.cash_dist(money, money) TO authenticated; -GRANT ALL ON FUNCTION public.cash_dist(money, money) TO service_role; - - --- --- Name: FUNCTION change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) TO anon; -GRANT ALL ON FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.change_subscription_plan(p_subscription_id uuid, p_new_plan_id uuid) TO service_role; - - --- --- Name: FUNCTION citext_cmp(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_cmp(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_cmp(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_cmp(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_cmp(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_eq(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_eq(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_eq(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_eq(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_eq(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_ge(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_ge(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_ge(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_ge(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_ge(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_gt(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_gt(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_gt(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_gt(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_gt(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_hash(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_hash(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_hash(public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_hash(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_hash(public.citext) TO service_role; - - --- --- Name: FUNCTION citext_hash_extended(public.citext, bigint); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_hash_extended(public.citext, bigint) TO postgres; -GRANT ALL ON FUNCTION public.citext_hash_extended(public.citext, bigint) TO anon; -GRANT ALL ON FUNCTION public.citext_hash_extended(public.citext, bigint) TO authenticated; -GRANT ALL ON FUNCTION public.citext_hash_extended(public.citext, bigint) TO service_role; - - --- --- Name: FUNCTION citext_larger(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_larger(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_larger(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_larger(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_larger(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_le(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_le(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_le(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_le(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_le(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_lt(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_lt(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_lt(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_lt(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_lt(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_ne(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_ne(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_ne(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_ne(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_ne(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_cmp(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_cmp(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_cmp(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_cmp(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_cmp(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_ge(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_ge(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_ge(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_ge(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_ge(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_gt(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_gt(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_gt(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_gt(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_gt(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_le(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_le(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_le(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_le(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_le(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_pattern_lt(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_pattern_lt(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_pattern_lt(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_pattern_lt(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_pattern_lt(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION citext_smaller(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.citext_smaller(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.citext_smaller(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.citext_smaller(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.citext_smaller(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION cleanup_notification_queue(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.cleanup_notification_queue() TO postgres; -GRANT ALL ON FUNCTION public.cleanup_notification_queue() TO anon; -GRANT ALL ON FUNCTION public.cleanup_notification_queue() TO authenticated; -GRANT ALL ON FUNCTION public.cleanup_notification_queue() TO service_role; - - --- --- Name: FUNCTION create_clinic_tenant(p_name text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_clinic_tenant(p_name text) TO postgres; -GRANT ALL ON FUNCTION public.create_clinic_tenant(p_name text) TO anon; -GRANT ALL ON FUNCTION public.create_clinic_tenant(p_name text) TO authenticated; -GRANT ALL ON FUNCTION public.create_clinic_tenant(p_name text) TO service_role; - - --- --- Name: TABLE financial_records; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.financial_records TO postgres; -GRANT ALL ON TABLE public.financial_records TO anon; -GRANT ALL ON TABLE public.financial_records TO authenticated; -GRANT ALL ON TABLE public.financial_records TO service_role; - - --- --- Name: FUNCTION create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) TO postgres; -GRANT ALL ON FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) TO anon; -GRANT ALL ON FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) TO authenticated; -GRANT ALL ON FUNCTION public.create_financial_record_for_session(p_tenant_id uuid, p_owner_id uuid, p_patient_id uuid, p_agenda_evento_id uuid, p_amount numeric, p_due_date date) TO service_role; - - --- --- Name: FUNCTION create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) TO postgres; -GRANT ALL ON FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) TO anon; -GRANT ALL ON FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) TO authenticated; -GRANT ALL ON FUNCTION public.create_patient_intake_request(p_token text, p_name text, p_email text, p_phone text, p_notes text, p_consent boolean) TO service_role; - - --- --- Name: FUNCTION create_patient_intake_request_v2(p_token text, p_payload jsonb); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) FROM PUBLIC; -GRANT ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) TO postgres; -GRANT ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) TO anon; -GRANT ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) TO authenticated; -GRANT ALL ON FUNCTION public.create_patient_intake_request_v2(p_token text, p_payload jsonb) TO service_role; - - --- --- Name: FUNCTION create_support_session(p_tenant_id uuid, p_ttl_minutes integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) TO postgres; -GRANT ALL ON FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) TO anon; -GRANT ALL ON FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) TO authenticated; -GRANT ALL ON FUNCTION public.create_support_session(p_tenant_id uuid, p_ttl_minutes integer) TO service_role; - - --- --- Name: TABLE therapist_payouts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.therapist_payouts TO postgres; -GRANT ALL ON TABLE public.therapist_payouts TO anon; -GRANT ALL ON TABLE public.therapist_payouts TO authenticated; -GRANT ALL ON TABLE public.therapist_payouts TO service_role; - - --- --- Name: FUNCTION create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) TO postgres; -GRANT ALL ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) TO anon; -GRANT ALL ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) TO authenticated; -GRANT ALL ON FUNCTION public.create_therapist_payout(p_tenant_id uuid, p_therapist_id uuid, p_period_start date, p_period_end date) TO service_role; - - --- --- Name: FUNCTION current_member_id(p_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.current_member_id(p_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.current_member_id(p_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.current_member_id(p_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.current_member_id(p_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION current_member_role(p_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.current_member_role(p_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.current_member_role(p_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.current_member_role(p_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.current_member_role(p_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION date_dist(date, date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.date_dist(date, date) TO postgres; -GRANT ALL ON FUNCTION public.date_dist(date, date) TO anon; -GRANT ALL ON FUNCTION public.date_dist(date, date) TO authenticated; -GRANT ALL ON FUNCTION public.date_dist(date, date) TO service_role; - - --- --- Name: FUNCTION debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) TO postgres; -GRANT ALL ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) TO anon; -GRANT ALL ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) TO authenticated; -GRANT ALL ON FUNCTION public.debit_addon_credit(p_tenant_id uuid, p_addon_type text, p_queue_id uuid, p_description text) TO service_role; - - --- --- Name: FUNCTION delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid); Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) TO anon; -GRANT ALL ON FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.delete_commitment_full(p_tenant_id uuid, p_commitment_id uuid) TO service_role; - - --- --- Name: FUNCTION delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) TO anon; -GRANT ALL ON FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.delete_determined_commitment(p_tenant_id uuid, p_commitment_id uuid) TO service_role; - - --- --- Name: FUNCTION dev_list_auth_users(p_limit integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.dev_list_auth_users(p_limit integer) TO postgres; -GRANT ALL ON FUNCTION public.dev_list_auth_users(p_limit integer) TO anon; -GRANT ALL ON FUNCTION public.dev_list_auth_users(p_limit integer) TO authenticated; -GRANT ALL ON FUNCTION public.dev_list_auth_users(p_limit integer) TO service_role; - - --- --- Name: FUNCTION dev_list_custom_users(); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.dev_list_custom_users() FROM PUBLIC; -GRANT ALL ON FUNCTION public.dev_list_custom_users() TO postgres; -GRANT ALL ON FUNCTION public.dev_list_custom_users() TO anon; -GRANT ALL ON FUNCTION public.dev_list_custom_users() TO authenticated; -GRANT ALL ON FUNCTION public.dev_list_custom_users() TO service_role; - - --- --- Name: FUNCTION dev_list_intent_leads(); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.dev_list_intent_leads() FROM PUBLIC; -GRANT ALL ON FUNCTION public.dev_list_intent_leads() TO postgres; -GRANT ALL ON FUNCTION public.dev_list_intent_leads() TO anon; -GRANT ALL ON FUNCTION public.dev_list_intent_leads() TO authenticated; -GRANT ALL ON FUNCTION public.dev_list_intent_leads() TO service_role; - - --- --- Name: FUNCTION dev_public_debug_snapshot(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.dev_public_debug_snapshot() TO postgres; -GRANT ALL ON FUNCTION public.dev_public_debug_snapshot() TO anon; -GRANT ALL ON FUNCTION public.dev_public_debug_snapshot() TO authenticated; -GRANT ALL ON FUNCTION public.dev_public_debug_snapshot() TO service_role; - - --- --- Name: FUNCTION ensure_personal_tenant(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.ensure_personal_tenant() TO postgres; -GRANT ALL ON FUNCTION public.ensure_personal_tenant() TO anon; -GRANT ALL ON FUNCTION public.ensure_personal_tenant() TO authenticated; -GRANT ALL ON FUNCTION public.ensure_personal_tenant() TO service_role; - - --- --- Name: FUNCTION ensure_personal_tenant_for_user(p_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.ensure_personal_tenant_for_user(p_user_id uuid) TO service_role; - - --- --- Name: FUNCTION faq_votar(faq_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.faq_votar(faq_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.faq_votar(faq_id uuid) TO anon; -GRANT ALL ON FUNCTION public.faq_votar(faq_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.faq_votar(faq_id uuid) TO service_role; - - --- --- Name: FUNCTION fix_all_subscription_mismatches(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.fix_all_subscription_mismatches() TO postgres; -GRANT ALL ON FUNCTION public.fix_all_subscription_mismatches() TO anon; -GRANT ALL ON FUNCTION public.fix_all_subscription_mismatches() TO authenticated; -GRANT ALL ON FUNCTION public.fix_all_subscription_mismatches() TO service_role; - - --- --- Name: FUNCTION float4_dist(real, real); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.float4_dist(real, real) TO postgres; -GRANT ALL ON FUNCTION public.float4_dist(real, real) TO anon; -GRANT ALL ON FUNCTION public.float4_dist(real, real) TO authenticated; -GRANT ALL ON FUNCTION public.float4_dist(real, real) TO service_role; - - --- --- Name: FUNCTION float8_dist(double precision, double precision); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.float8_dist(double precision, double precision) TO postgres; -GRANT ALL ON FUNCTION public.float8_dist(double precision, double precision) TO anon; -GRANT ALL ON FUNCTION public.float8_dist(double precision, double precision) TO authenticated; -GRANT ALL ON FUNCTION public.float8_dist(double precision, double precision) TO service_role; - - --- --- Name: FUNCTION fn_agenda_regras_semanais_no_overlap(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.fn_agenda_regras_semanais_no_overlap() TO postgres; -GRANT ALL ON FUNCTION public.fn_agenda_regras_semanais_no_overlap() TO anon; -GRANT ALL ON FUNCTION public.fn_agenda_regras_semanais_no_overlap() TO authenticated; -GRANT ALL ON FUNCTION public.fn_agenda_regras_semanais_no_overlap() TO service_role; - - --- --- Name: FUNCTION gbt_bit_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_consistent(internal, bit, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_consistent(internal, bit, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_consistent(internal, bit, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_consistent(internal, bit, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_consistent(internal, bit, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bit_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bit_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bit_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bit_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bit_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_consistent(internal, boolean, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_consistent(internal, boolean, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_consistent(internal, boolean, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_consistent(internal, boolean, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_consistent(internal, boolean, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_same(public.gbtreekey2, public.gbtreekey2, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bool_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bool_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bool_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bool_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bool_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bpchar_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bpchar_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bpchar_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bpchar_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bpchar_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bpchar_consistent(internal, character, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bpchar_consistent(internal, character, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bpchar_consistent(internal, character, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bpchar_consistent(internal, character, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bpchar_consistent(internal, character, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_consistent(internal, bytea, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_consistent(internal, bytea, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_consistent(internal, bytea, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_consistent(internal, bytea, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_consistent(internal, bytea, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO service_role; - - --- --- Name: FUNCTION gbt_bytea_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_bytea_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_bytea_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_bytea_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_bytea_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_consistent(internal, money, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_consistent(internal, money, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_consistent(internal, money, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_consistent(internal, money, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_consistent(internal, money, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_distance(internal, money, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_distance(internal, money, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_distance(internal, money, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_distance(internal, money, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_distance(internal, money, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_cash_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_cash_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_cash_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_cash_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_cash_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_consistent(internal, date, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_consistent(internal, date, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_consistent(internal, date, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_consistent(internal, date, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_consistent(internal, date, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_distance(internal, date, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_distance(internal, date, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_distance(internal, date, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_distance(internal, date, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_distance(internal, date, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_date_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_date_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_date_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_date_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_date_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_decompress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_decompress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_decompress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_decompress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_decompress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_consistent(internal, anyenum, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_consistent(internal, anyenum, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_consistent(internal, anyenum, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_consistent(internal, anyenum, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_consistent(internal, anyenum, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_enum_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_enum_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_enum_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_enum_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_enum_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_consistent(internal, real, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_consistent(internal, real, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_consistent(internal, real, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_consistent(internal, real, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_consistent(internal, real, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_distance(internal, real, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_distance(internal, real, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_distance(internal, real, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_distance(internal, real, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_distance(internal, real, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float4_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float4_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float4_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float4_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float4_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_consistent(internal, double precision, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_consistent(internal, double precision, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_consistent(internal, double precision, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_consistent(internal, double precision, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_consistent(internal, double precision, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_distance(internal, double precision, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_distance(internal, double precision, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_distance(internal, double precision, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_distance(internal, double precision, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_distance(internal, double precision, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_float8_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_float8_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_float8_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_float8_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_float8_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_consistent(internal, inet, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_consistent(internal, inet, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_consistent(internal, inet, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_consistent(internal, inet, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_consistent(internal, inet, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_inet_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_inet_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_inet_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_inet_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_inet_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_consistent(internal, smallint, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_consistent(internal, smallint, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_consistent(internal, smallint, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_consistent(internal, smallint, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_consistent(internal, smallint, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_distance(internal, smallint, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_distance(internal, smallint, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_distance(internal, smallint, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_distance(internal, smallint, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_distance(internal, smallint, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_same(public.gbtreekey4, public.gbtreekey4, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int2_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int2_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int2_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int2_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int2_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_consistent(internal, integer, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_consistent(internal, integer, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_consistent(internal, integer, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_consistent(internal, integer, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_consistent(internal, integer, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_distance(internal, integer, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_distance(internal, integer, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_distance(internal, integer, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_distance(internal, integer, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_distance(internal, integer, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int4_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int4_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int4_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int4_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int4_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_consistent(internal, bigint, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_consistent(internal, bigint, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_consistent(internal, bigint, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_consistent(internal, bigint, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_consistent(internal, bigint, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_distance(internal, bigint, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_distance(internal, bigint, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_distance(internal, bigint, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_distance(internal, bigint, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_distance(internal, bigint, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_int8_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_int8_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_int8_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_int8_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_int8_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_consistent(internal, interval, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_consistent(internal, interval, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_consistent(internal, interval, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_consistent(internal, interval, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_consistent(internal, interval, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_decompress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_decompress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_decompress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_decompress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_decompress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_distance(internal, interval, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_distance(internal, interval, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_distance(internal, interval, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_distance(internal, interval, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_distance(internal, interval, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_same(public.gbtreekey32, public.gbtreekey32, internal) TO service_role; - - --- --- Name: FUNCTION gbt_intv_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_intv_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_intv_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_intv_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_intv_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad8_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad8_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad8_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad8_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad8_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_consistent(internal, macaddr, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_consistent(internal, macaddr, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_consistent(internal, macaddr, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_consistent(internal, macaddr, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_consistent(internal, macaddr, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_macad_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_macad_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_macad_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_macad_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_macad_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_consistent(internal, numeric, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_consistent(internal, numeric, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_consistent(internal, numeric, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_consistent(internal, numeric, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_consistent(internal, numeric, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO service_role; - - --- --- Name: FUNCTION gbt_numeric_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_numeric_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_numeric_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_numeric_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_numeric_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_consistent(internal, oid, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_consistent(internal, oid, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_consistent(internal, oid, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_consistent(internal, oid, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_consistent(internal, oid, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_distance(internal, oid, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_distance(internal, oid, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_distance(internal, oid, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_distance(internal, oid, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_distance(internal, oid, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_same(public.gbtreekey8, public.gbtreekey8, internal) TO service_role; - - --- --- Name: FUNCTION gbt_oid_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_oid_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_oid_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_oid_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_oid_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_consistent(internal, text, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_consistent(internal, text, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_consistent(internal, text, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_consistent(internal, text, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_consistent(internal, text, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_same(public.gbtreekey_var, public.gbtreekey_var, internal) TO service_role; - - --- --- Name: FUNCTION gbt_text_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_text_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_text_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_text_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_text_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_consistent(internal, time without time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_consistent(internal, time without time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_consistent(internal, time without time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_consistent(internal, time without time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_consistent(internal, time without time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_distance(internal, time without time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_distance(internal, time without time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_distance(internal, time without time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_distance(internal, time without time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_distance(internal, time without time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_time_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_time_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_time_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_time_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_time_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_timetz_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_timetz_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_timetz_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_timetz_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_timetz_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_same(public.gbtreekey16, public.gbtreekey16, internal) TO service_role; - - --- --- Name: FUNCTION gbt_ts_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_ts_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_ts_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_ts_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_ts_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_tstz_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_tstz_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_tstz_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_tstz_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_tstz_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_compress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_consistent(internal, uuid, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_consistent(internal, uuid, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_consistent(internal, uuid, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_consistent(internal, uuid, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_consistent(internal, uuid, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_fetch(internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_same(public.gbtreekey32, public.gbtreekey32, internal) TO service_role; - - --- --- Name: FUNCTION gbt_uuid_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_uuid_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_uuid_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_uuid_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_uuid_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION gbt_var_decompress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_var_decompress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_var_decompress(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_var_decompress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_var_decompress(internal) TO service_role; - - --- --- Name: FUNCTION gbt_var_fetch(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gbt_var_fetch(internal) TO postgres; -GRANT ALL ON FUNCTION public.gbt_var_fetch(internal) TO anon; -GRANT ALL ON FUNCTION public.gbt_var_fetch(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gbt_var_fetch(internal) TO service_role; - - --- --- Name: FUNCTION get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) TO postgres; -GRANT ALL ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) TO anon; -GRANT ALL ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) TO authenticated; -GRANT ALL ON FUNCTION public.get_financial_report(p_owner_id uuid, p_start_date date, p_end_date date, p_group_by text) TO service_role; - - --- --- Name: FUNCTION get_financial_summary(p_owner_id uuid, p_year integer, p_month integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) TO postgres; -GRANT ALL ON FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) TO anon; -GRANT ALL ON FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) TO authenticated; -GRANT ALL ON FUNCTION public.get_financial_summary(p_owner_id uuid, p_year integer, p_month integer) TO service_role; - - --- --- Name: FUNCTION get_my_email(); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.get_my_email() FROM PUBLIC; -GRANT ALL ON FUNCTION public.get_my_email() TO postgres; -GRANT ALL ON FUNCTION public.get_my_email() TO anon; -GRANT ALL ON FUNCTION public.get_my_email() TO authenticated; -GRANT ALL ON FUNCTION public.get_my_email() TO service_role; - - --- --- Name: FUNCTION gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gin_extract_query_trgm(text, internal, smallint, internal, internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gin_extract_value_trgm(text, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gin_extract_value_trgm(text, internal) TO postgres; -GRANT ALL ON FUNCTION public.gin_extract_value_trgm(text, internal) TO anon; -GRANT ALL ON FUNCTION public.gin_extract_value_trgm(text, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gin_extract_value_trgm(text, internal) TO service_role; - - --- --- Name: FUNCTION gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gin_trgm_consistent(internal, smallint, text, integer, internal, internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gin_trgm_triconsistent(internal, smallint, text, integer, internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_compress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_compress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_compress(internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_compress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_compress(internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_consistent(internal, text, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_consistent(internal, text, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_consistent(internal, text, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_consistent(internal, text, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_consistent(internal, text, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_decompress(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_decompress(internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_decompress(internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_decompress(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_decompress(internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_distance(internal, text, smallint, oid, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_distance(internal, text, smallint, oid, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_distance(internal, text, smallint, oid, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_distance(internal, text, smallint, oid, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_distance(internal, text, smallint, oid, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_options(internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_options(internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_options(internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_options(internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_options(internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_penalty(internal, internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_penalty(internal, internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_penalty(internal, internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_penalty(internal, internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_penalty(internal, internal, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_picksplit(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_picksplit(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_picksplit(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_picksplit(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_picksplit(internal, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_same(public.gtrgm, public.gtrgm, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_same(public.gtrgm, public.gtrgm, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_same(public.gtrgm, public.gtrgm, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_same(public.gtrgm, public.gtrgm, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_same(public.gtrgm, public.gtrgm, internal) TO service_role; - - --- --- Name: FUNCTION gtrgm_union(internal, internal); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.gtrgm_union(internal, internal) TO postgres; -GRANT ALL ON FUNCTION public.gtrgm_union(internal, internal) TO anon; -GRANT ALL ON FUNCTION public.gtrgm_union(internal, internal) TO authenticated; -GRANT ALL ON FUNCTION public.gtrgm_union(internal, internal) TO service_role; - - --- --- Name: FUNCTION guard_account_type_immutable(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_account_type_immutable() TO postgres; -GRANT ALL ON FUNCTION public.guard_account_type_immutable() TO anon; -GRANT ALL ON FUNCTION public.guard_account_type_immutable() TO authenticated; -GRANT ALL ON FUNCTION public.guard_account_type_immutable() TO service_role; - - --- --- Name: FUNCTION guard_locked_commitment(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_locked_commitment() TO postgres; -GRANT ALL ON FUNCTION public.guard_locked_commitment() TO anon; -GRANT ALL ON FUNCTION public.guard_locked_commitment() TO authenticated; -GRANT ALL ON FUNCTION public.guard_locked_commitment() TO service_role; - - --- --- Name: FUNCTION guard_no_change_core_plan_key(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_no_change_core_plan_key() TO postgres; -GRANT ALL ON FUNCTION public.guard_no_change_core_plan_key() TO anon; -GRANT ALL ON FUNCTION public.guard_no_change_core_plan_key() TO authenticated; -GRANT ALL ON FUNCTION public.guard_no_change_core_plan_key() TO service_role; - - --- --- Name: FUNCTION guard_no_change_plan_target(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_no_change_plan_target() TO postgres; -GRANT ALL ON FUNCTION public.guard_no_change_plan_target() TO anon; -GRANT ALL ON FUNCTION public.guard_no_change_plan_target() TO authenticated; -GRANT ALL ON FUNCTION public.guard_no_change_plan_target() TO service_role; - - --- --- Name: FUNCTION guard_no_delete_core_plans(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_no_delete_core_plans() TO postgres; -GRANT ALL ON FUNCTION public.guard_no_delete_core_plans() TO anon; -GRANT ALL ON FUNCTION public.guard_no_delete_core_plans() TO authenticated; -GRANT ALL ON FUNCTION public.guard_no_delete_core_plans() TO service_role; - - --- --- Name: FUNCTION guard_patient_cannot_own_tenant(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_patient_cannot_own_tenant() TO postgres; -GRANT ALL ON FUNCTION public.guard_patient_cannot_own_tenant() TO anon; -GRANT ALL ON FUNCTION public.guard_patient_cannot_own_tenant() TO authenticated; -GRANT ALL ON FUNCTION public.guard_patient_cannot_own_tenant() TO service_role; - - --- --- Name: FUNCTION guard_tenant_kind_immutable(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.guard_tenant_kind_immutable() TO postgres; -GRANT ALL ON FUNCTION public.guard_tenant_kind_immutable() TO anon; -GRANT ALL ON FUNCTION public.guard_tenant_kind_immutable() TO authenticated; -GRANT ALL ON FUNCTION public.guard_tenant_kind_immutable() TO service_role; - - --- --- Name: FUNCTION handle_new_user(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.handle_new_user() TO postgres; -GRANT ALL ON FUNCTION public.handle_new_user() TO anon; -GRANT ALL ON FUNCTION public.handle_new_user() TO authenticated; -GRANT ALL ON FUNCTION public.handle_new_user() TO service_role; - - --- --- Name: FUNCTION handle_new_user_create_personal_tenant(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.handle_new_user_create_personal_tenant() TO postgres; -GRANT ALL ON FUNCTION public.handle_new_user_create_personal_tenant() TO anon; -GRANT ALL ON FUNCTION public.handle_new_user_create_personal_tenant() TO authenticated; -GRANT ALL ON FUNCTION public.handle_new_user_create_personal_tenant() TO service_role; - - --- --- Name: FUNCTION has_feature(p_owner_id uuid, p_feature_key text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) TO postgres; -GRANT ALL ON FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) TO anon; -GRANT ALL ON FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) TO authenticated; -GRANT ALL ON FUNCTION public.has_feature(p_owner_id uuid, p_feature_key text) TO service_role; - - --- --- Name: FUNCTION int2_dist(smallint, smallint); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.int2_dist(smallint, smallint) TO postgres; -GRANT ALL ON FUNCTION public.int2_dist(smallint, smallint) TO anon; -GRANT ALL ON FUNCTION public.int2_dist(smallint, smallint) TO authenticated; -GRANT ALL ON FUNCTION public.int2_dist(smallint, smallint) TO service_role; - - --- --- Name: FUNCTION int4_dist(integer, integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.int4_dist(integer, integer) TO postgres; -GRANT ALL ON FUNCTION public.int4_dist(integer, integer) TO anon; -GRANT ALL ON FUNCTION public.int4_dist(integer, integer) TO authenticated; -GRANT ALL ON FUNCTION public.int4_dist(integer, integer) TO service_role; - - --- --- Name: FUNCTION int8_dist(bigint, bigint); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.int8_dist(bigint, bigint) TO postgres; -GRANT ALL ON FUNCTION public.int8_dist(bigint, bigint) TO anon; -GRANT ALL ON FUNCTION public.int8_dist(bigint, bigint) TO authenticated; -GRANT ALL ON FUNCTION public.int8_dist(bigint, bigint) TO service_role; - - --- --- Name: FUNCTION interval_dist(interval, interval); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.interval_dist(interval, interval) TO postgres; -GRANT ALL ON FUNCTION public.interval_dist(interval, interval) TO anon; -GRANT ALL ON FUNCTION public.interval_dist(interval, interval) TO authenticated; -GRANT ALL ON FUNCTION public.interval_dist(interval, interval) TO service_role; - - --- --- Name: FUNCTION is_clinic_tenant(_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_clinic_tenant(_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.is_clinic_tenant(_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.is_clinic_tenant(_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.is_clinic_tenant(_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION is_saas_admin(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_saas_admin() TO postgres; -GRANT ALL ON FUNCTION public.is_saas_admin() TO anon; -GRANT ALL ON FUNCTION public.is_saas_admin() TO authenticated; -GRANT ALL ON FUNCTION public.is_saas_admin() TO service_role; - - --- --- Name: FUNCTION is_tenant_admin(p_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_tenant_admin(p_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.is_tenant_admin(p_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.is_tenant_admin(p_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.is_tenant_admin(p_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION is_tenant_member(_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_tenant_member(_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.is_tenant_member(_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.is_tenant_member(_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.is_tenant_member(_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION is_therapist_tenant(_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.is_therapist_tenant(_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.is_therapist_tenant(_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.is_therapist_tenant(_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.is_therapist_tenant(_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION jwt_email(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.jwt_email() TO postgres; -GRANT ALL ON FUNCTION public.jwt_email() TO anon; -GRANT ALL ON FUNCTION public.jwt_email() TO authenticated; -GRANT ALL ON FUNCTION public.jwt_email() TO service_role; - - --- --- Name: FUNCTION list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) TO postgres; -GRANT ALL ON FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) TO anon; -GRANT ALL ON FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) TO authenticated; -GRANT ALL ON FUNCTION public.list_financial_records(p_owner_id uuid, p_year integer, p_month integer, p_type text, p_status text, p_patient_id uuid, p_limit integer, p_offset integer) TO service_role; - - --- --- Name: FUNCTION mark_as_paid(p_financial_record_id uuid, p_payment_method text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) TO postgres; -GRANT ALL ON FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) TO anon; -GRANT ALL ON FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) TO authenticated; -GRANT ALL ON FUNCTION public.mark_as_paid(p_financial_record_id uuid, p_payment_method text) TO service_role; - - --- --- Name: FUNCTION mark_payout_as_paid(p_payout_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) TO anon; -GRANT ALL ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.mark_payout_as_paid(p_payout_id uuid) TO service_role; - - --- --- Name: FUNCTION my_tenants(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.my_tenants() TO postgres; -GRANT ALL ON FUNCTION public.my_tenants() TO anon; -GRANT ALL ON FUNCTION public.my_tenants() TO authenticated; -GRANT ALL ON FUNCTION public.my_tenants() TO service_role; - - --- --- Name: FUNCTION notice_track_click(p_notice_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notice_track_click(p_notice_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.notice_track_click(p_notice_id uuid) TO anon; -GRANT ALL ON FUNCTION public.notice_track_click(p_notice_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.notice_track_click(p_notice_id uuid) TO service_role; - - --- --- Name: FUNCTION notice_track_view(p_notice_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notice_track_view(p_notice_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.notice_track_view(p_notice_id uuid) TO anon; -GRANT ALL ON FUNCTION public.notice_track_view(p_notice_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.notice_track_view(p_notice_id uuid) TO service_role; - - --- --- Name: FUNCTION notify_on_intake(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notify_on_intake() TO postgres; -GRANT ALL ON FUNCTION public.notify_on_intake() TO anon; -GRANT ALL ON FUNCTION public.notify_on_intake() TO authenticated; -GRANT ALL ON FUNCTION public.notify_on_intake() TO service_role; - - --- --- Name: FUNCTION notify_on_scheduling(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notify_on_scheduling() TO postgres; -GRANT ALL ON FUNCTION public.notify_on_scheduling() TO anon; -GRANT ALL ON FUNCTION public.notify_on_scheduling() TO authenticated; -GRANT ALL ON FUNCTION public.notify_on_scheduling() TO service_role; - - --- --- Name: FUNCTION notify_on_session_status(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.notify_on_session_status() TO postgres; -GRANT ALL ON FUNCTION public.notify_on_session_status() TO anon; -GRANT ALL ON FUNCTION public.notify_on_session_status() TO authenticated; -GRANT ALL ON FUNCTION public.notify_on_session_status() TO service_role; - - --- --- Name: FUNCTION oid_dist(oid, oid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.oid_dist(oid, oid) TO postgres; -GRANT ALL ON FUNCTION public.oid_dist(oid, oid) TO anon; -GRANT ALL ON FUNCTION public.oid_dist(oid, oid) TO authenticated; -GRANT ALL ON FUNCTION public.oid_dist(oid, oid) TO service_role; - - --- --- Name: FUNCTION on_new_user_seed_patient_groups(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.on_new_user_seed_patient_groups() TO postgres; -GRANT ALL ON FUNCTION public.on_new_user_seed_patient_groups() TO anon; -GRANT ALL ON FUNCTION public.on_new_user_seed_patient_groups() TO authenticated; -GRANT ALL ON FUNCTION public.on_new_user_seed_patient_groups() TO service_role; - - --- --- Name: FUNCTION patients_validate_member_consistency(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.patients_validate_member_consistency() TO postgres; -GRANT ALL ON FUNCTION public.patients_validate_member_consistency() TO anon; -GRANT ALL ON FUNCTION public.patients_validate_member_consistency() TO authenticated; -GRANT ALL ON FUNCTION public.patients_validate_member_consistency() TO service_role; - - --- --- Name: FUNCTION patients_validate_responsible_member_tenant(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.patients_validate_responsible_member_tenant() TO postgres; -GRANT ALL ON FUNCTION public.patients_validate_responsible_member_tenant() TO anon; -GRANT ALL ON FUNCTION public.patients_validate_responsible_member_tenant() TO authenticated; -GRANT ALL ON FUNCTION public.patients_validate_responsible_member_tenant() TO service_role; - - --- --- Name: FUNCTION populate_notification_queue(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.populate_notification_queue() TO postgres; -GRANT ALL ON FUNCTION public.populate_notification_queue() TO anon; -GRANT ALL ON FUNCTION public.populate_notification_queue() TO authenticated; -GRANT ALL ON FUNCTION public.populate_notification_queue() TO service_role; - - --- --- Name: FUNCTION prevent_promoting_to_system(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.prevent_promoting_to_system() TO postgres; -GRANT ALL ON FUNCTION public.prevent_promoting_to_system() TO anon; -GRANT ALL ON FUNCTION public.prevent_promoting_to_system() TO authenticated; -GRANT ALL ON FUNCTION public.prevent_promoting_to_system() TO service_role; - - --- --- Name: FUNCTION prevent_saas_membership(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.prevent_saas_membership() TO postgres; -GRANT ALL ON FUNCTION public.prevent_saas_membership() TO anon; -GRANT ALL ON FUNCTION public.prevent_saas_membership() TO authenticated; -GRANT ALL ON FUNCTION public.prevent_saas_membership() TO service_role; - - --- --- Name: FUNCTION prevent_system_group_changes(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.prevent_system_group_changes() TO postgres; -GRANT ALL ON FUNCTION public.prevent_system_group_changes() TO anon; -GRANT ALL ON FUNCTION public.prevent_system_group_changes() TO authenticated; -GRANT ALL ON FUNCTION public.prevent_system_group_changes() TO service_role; - - --- --- Name: FUNCTION provision_account_tenant(p_user_id uuid, p_kind text, p_name text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) TO postgres; -GRANT ALL ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) TO anon; -GRANT ALL ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) TO authenticated; -GRANT ALL ON FUNCTION public.provision_account_tenant(p_user_id uuid, p_kind text, p_name text) TO service_role; - - --- --- Name: FUNCTION reactivate_subscription(p_subscription_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.reactivate_subscription(p_subscription_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.reactivate_subscription(p_subscription_id uuid) TO anon; -GRANT ALL ON FUNCTION public.reactivate_subscription(p_subscription_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.reactivate_subscription(p_subscription_id uuid) TO service_role; - - --- --- Name: FUNCTION rebuild_owner_entitlements(p_owner_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) TO anon; -GRANT ALL ON FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.rebuild_owner_entitlements(p_owner_id uuid) TO service_role; - - --- --- Name: FUNCTION regexp_match(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION regexp_match(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_match(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION regexp_matches(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION regexp_matches(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_matches(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION regexp_replace(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION regexp_replace(public.citext, public.citext, text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_replace(public.citext, public.citext, text, text) TO service_role; - - --- --- Name: FUNCTION regexp_split_to_array(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION regexp_split_to_array(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_split_to_array(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION regexp_split_to_table(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION regexp_split_to_table(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.regexp_split_to_table(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION replace(public.citext, public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.replace(public.citext, public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.replace(public.citext, public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.replace(public.citext, public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.replace(public.citext, public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION revoke_support_session(p_token text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.revoke_support_session(p_token text) TO postgres; -GRANT ALL ON FUNCTION public.revoke_support_session(p_token text) TO anon; -GRANT ALL ON FUNCTION public.revoke_support_session(p_token text) TO authenticated; -GRANT ALL ON FUNCTION public.revoke_support_session(p_token text) TO service_role; - - --- --- Name: FUNCTION rotate_patient_invite_token(p_new_token text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.rotate_patient_invite_token(p_new_token text) TO postgres; -GRANT ALL ON FUNCTION public.rotate_patient_invite_token(p_new_token text) TO anon; -GRANT ALL ON FUNCTION public.rotate_patient_invite_token(p_new_token text) TO authenticated; -GRANT ALL ON FUNCTION public.rotate_patient_invite_token(p_new_token text) TO service_role; - - --- --- Name: FUNCTION saas_votar_doc(p_doc_id uuid, p_util boolean); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) TO postgres; -GRANT ALL ON FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) TO anon; -GRANT ALL ON FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) TO authenticated; -GRANT ALL ON FUNCTION public.saas_votar_doc(p_doc_id uuid, p_util boolean) TO service_role; - - --- --- Name: FUNCTION safe_delete_patient(p_patient_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.safe_delete_patient(p_patient_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.safe_delete_patient(p_patient_id uuid) TO anon; -GRANT ALL ON FUNCTION public.safe_delete_patient(p_patient_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.safe_delete_patient(p_patient_id uuid) TO service_role; - - --- --- Name: FUNCTION sanitize_phone_br(raw_phone text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.sanitize_phone_br(raw_phone text) TO postgres; -GRANT ALL ON FUNCTION public.sanitize_phone_br(raw_phone text) TO anon; -GRANT ALL ON FUNCTION public.sanitize_phone_br(raw_phone text) TO authenticated; -GRANT ALL ON FUNCTION public.sanitize_phone_br(raw_phone text) TO service_role; - - --- --- Name: FUNCTION seed_default_financial_categories(p_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.seed_default_financial_categories(p_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.seed_default_financial_categories(p_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.seed_default_financial_categories(p_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.seed_default_financial_categories(p_user_id uuid) TO service_role; - - --- --- Name: FUNCTION seed_determined_commitments(p_tenant_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.seed_determined_commitments(p_tenant_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.seed_determined_commitments(p_tenant_id uuid) TO anon; -GRANT ALL ON FUNCTION public.seed_determined_commitments(p_tenant_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.seed_determined_commitments(p_tenant_id uuid) TO service_role; - - --- --- Name: FUNCTION set_insurance_plans_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_insurance_plans_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.set_insurance_plans_updated_at() TO anon; -GRANT ALL ON FUNCTION public.set_insurance_plans_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.set_insurance_plans_updated_at() TO service_role; - - --- --- Name: FUNCTION set_limit(real); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_limit(real) TO postgres; -GRANT ALL ON FUNCTION public.set_limit(real) TO anon; -GRANT ALL ON FUNCTION public.set_limit(real) TO authenticated; -GRANT ALL ON FUNCTION public.set_limit(real) TO service_role; - - --- --- Name: FUNCTION set_owner_id(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_owner_id() TO postgres; -GRANT ALL ON FUNCTION public.set_owner_id() TO anon; -GRANT ALL ON FUNCTION public.set_owner_id() TO authenticated; -GRANT ALL ON FUNCTION public.set_owner_id() TO service_role; - - --- --- Name: FUNCTION set_services_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_services_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.set_services_updated_at() TO anon; -GRANT ALL ON FUNCTION public.set_services_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.set_services_updated_at() TO service_role; - - --- --- Name: FUNCTION set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) TO postgres; -GRANT ALL ON FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) TO anon; -GRANT ALL ON FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) TO authenticated; -GRANT ALL ON FUNCTION public.set_tenant_feature_exception(p_tenant_id uuid, p_feature_key text, p_enabled boolean, p_reason text) TO service_role; - - --- --- Name: FUNCTION set_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.set_updated_at() TO anon; -GRANT ALL ON FUNCTION public.set_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.set_updated_at() TO service_role; - - --- --- Name: FUNCTION set_updated_at_recurrence(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.set_updated_at_recurrence() TO postgres; -GRANT ALL ON FUNCTION public.set_updated_at_recurrence() TO anon; -GRANT ALL ON FUNCTION public.set_updated_at_recurrence() TO authenticated; -GRANT ALL ON FUNCTION public.set_updated_at_recurrence() TO service_role; - - --- --- Name: FUNCTION show_limit(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.show_limit() TO postgres; -GRANT ALL ON FUNCTION public.show_limit() TO anon; -GRANT ALL ON FUNCTION public.show_limit() TO authenticated; -GRANT ALL ON FUNCTION public.show_limit() TO service_role; - - --- --- Name: FUNCTION show_trgm(text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.show_trgm(text) TO postgres; -GRANT ALL ON FUNCTION public.show_trgm(text) TO anon; -GRANT ALL ON FUNCTION public.show_trgm(text) TO authenticated; -GRANT ALL ON FUNCTION public.show_trgm(text) TO service_role; - - --- --- Name: FUNCTION similarity(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.similarity(text, text) TO postgres; -GRANT ALL ON FUNCTION public.similarity(text, text) TO anon; -GRANT ALL ON FUNCTION public.similarity(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.similarity(text, text) TO service_role; - - --- --- Name: FUNCTION similarity_dist(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.similarity_dist(text, text) TO postgres; -GRANT ALL ON FUNCTION public.similarity_dist(text, text) TO anon; -GRANT ALL ON FUNCTION public.similarity_dist(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.similarity_dist(text, text) TO service_role; - - --- --- Name: FUNCTION similarity_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.similarity_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.similarity_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.similarity_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.similarity_op(text, text) TO service_role; - - --- --- Name: FUNCTION split_part(public.citext, public.citext, integer); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.split_part(public.citext, public.citext, integer) TO postgres; -GRANT ALL ON FUNCTION public.split_part(public.citext, public.citext, integer) TO anon; -GRANT ALL ON FUNCTION public.split_part(public.citext, public.citext, integer) TO authenticated; -GRANT ALL ON FUNCTION public.split_part(public.citext, public.citext, integer) TO service_role; - - --- --- Name: FUNCTION split_recurrence_at(p_recurrence_id uuid, p_from_date date); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) TO postgres; -GRANT ALL ON FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) TO anon; -GRANT ALL ON FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) TO authenticated; -GRANT ALL ON FUNCTION public.split_recurrence_at(p_recurrence_id uuid, p_from_date date) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity(text, text) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity_commutator_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity_commutator_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity_commutator_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity_commutator_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity_commutator_op(text, text) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity_dist_commutator_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_commutator_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_commutator_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_commutator_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_commutator_op(text, text) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity_dist_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity_dist_op(text, text) TO service_role; - - --- --- Name: FUNCTION strict_word_similarity_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strict_word_similarity_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.strict_word_similarity_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.strict_word_similarity_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.strict_word_similarity_op(text, text) TO service_role; - - --- --- Name: FUNCTION strpos(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.strpos(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.strpos(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.strpos(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.strpos(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION subscription_intents_view_insert(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.subscription_intents_view_insert() TO postgres; -GRANT ALL ON FUNCTION public.subscription_intents_view_insert() TO anon; -GRANT ALL ON FUNCTION public.subscription_intents_view_insert() TO authenticated; -GRANT ALL ON FUNCTION public.subscription_intents_view_insert() TO service_role; - - --- --- Name: FUNCTION subscriptions_validate_scope(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.subscriptions_validate_scope() TO postgres; -GRANT ALL ON FUNCTION public.subscriptions_validate_scope() TO anon; -GRANT ALL ON FUNCTION public.subscriptions_validate_scope() TO authenticated; -GRANT ALL ON FUNCTION public.subscriptions_validate_scope() TO service_role; - - --- --- Name: FUNCTION sync_busy_mirror_agenda_eventos(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.sync_busy_mirror_agenda_eventos() TO postgres; -GRANT ALL ON FUNCTION public.sync_busy_mirror_agenda_eventos() TO anon; -GRANT ALL ON FUNCTION public.sync_busy_mirror_agenda_eventos() TO authenticated; -GRANT ALL ON FUNCTION public.sync_busy_mirror_agenda_eventos() TO service_role; - - --- --- Name: FUNCTION sync_overdue_financial_records(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.sync_overdue_financial_records() TO postgres; -GRANT ALL ON FUNCTION public.sync_overdue_financial_records() TO anon; -GRANT ALL ON FUNCTION public.sync_overdue_financial_records() TO authenticated; -GRANT ALL ON FUNCTION public.sync_overdue_financial_records() TO service_role; - - --- --- Name: FUNCTION tenant_accept_invite(p_token uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_accept_invite(p_token uuid) TO postgres; -GRANT ALL ON FUNCTION public.tenant_accept_invite(p_token uuid) TO anon; -GRANT ALL ON FUNCTION public.tenant_accept_invite(p_token uuid) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_accept_invite(p_token uuid) TO service_role; - - --- --- Name: TABLE tenant_members; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_members TO postgres; -GRANT SELECT,REFERENCES,TRIGGER,TRUNCATE,MAINTAIN ON TABLE public.tenant_members TO authenticated; -GRANT ALL ON TABLE public.tenant_members TO service_role; - - --- --- Name: FUNCTION tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO anon; -GRANT ALL ON FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_add_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO service_role; - - --- --- Name: FUNCTION tenant_feature_allowed(p_tenant_id uuid, p_feature_key text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) TO anon; -GRANT ALL ON FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_feature_allowed(p_tenant_id uuid, p_feature_key text) TO service_role; - - --- --- Name: FUNCTION tenant_feature_enabled(p_tenant_id uuid, p_feature_key text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) TO anon; -GRANT ALL ON FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_feature_enabled(p_tenant_id uuid, p_feature_key text) TO service_role; - - --- --- Name: FUNCTION tenant_features_guard_with_plan(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_features_guard_with_plan() TO postgres; -GRANT ALL ON FUNCTION public.tenant_features_guard_with_plan() TO anon; -GRANT ALL ON FUNCTION public.tenant_features_guard_with_plan() TO authenticated; -GRANT ALL ON FUNCTION public.tenant_features_guard_with_plan() TO service_role; - - --- --- Name: FUNCTION tenant_has_feature(_tenant_id uuid, _feature text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) TO anon; -GRANT ALL ON FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_has_feature(_tenant_id uuid, _feature text) TO service_role; - - --- --- Name: FUNCTION tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text); Type: ACL; Schema: public; Owner: supabase_admin --- - -REVOKE ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) FROM PUBLIC; -GRANT ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO anon; -GRANT ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_invite_member_by_email(p_tenant_id uuid, p_email text, p_role text) TO service_role; - - --- --- Name: FUNCTION tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_reactivate_member(p_tenant_id uuid, p_member_user_id uuid) TO service_role; - - --- --- Name: FUNCTION tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_remove_member(p_tenant_id uuid, p_member_user_id uuid) TO service_role; - - --- --- Name: FUNCTION tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) TO postgres; -GRANT ALL ON FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) TO anon; -GRANT ALL ON FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_remove_member_soft(p_tenant_id uuid, p_member_user_id uuid) TO service_role; - - --- --- Name: FUNCTION tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) TO anon; -GRANT ALL ON FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_revoke_invite(p_tenant_id uuid, p_email text, p_role text) TO service_role; - - --- --- Name: FUNCTION tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) TO anon; -GRANT ALL ON FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_set_member_status(p_tenant_id uuid, p_member_user_id uuid, p_new_status text) TO service_role; - - --- --- Name: FUNCTION tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) TO postgres; -GRANT ALL ON FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) TO anon; -GRANT ALL ON FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) TO authenticated; -GRANT ALL ON FUNCTION public.tenant_update_member_role(p_tenant_id uuid, p_member_user_id uuid, p_new_role text) TO service_role; - - --- --- Name: FUNCTION texticlike(public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticlike(public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.texticlike(public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.texticlike(public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.texticlike(public.citext, text) TO service_role; - - --- --- Name: FUNCTION texticlike(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticlike(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.texticlike(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.texticlike(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.texticlike(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION texticnlike(public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticnlike(public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, text) TO service_role; - - --- --- Name: FUNCTION texticnlike(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticnlike(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.texticnlike(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION texticregexeq(public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, text) TO service_role; - - --- --- Name: FUNCTION texticregexeq(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.texticregexeq(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION texticregexne(public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticregexne(public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, text) TO service_role; - - --- --- Name: FUNCTION texticregexne(public.citext, public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.texticregexne(public.citext, public.citext) TO postgres; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, public.citext) TO anon; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.texticregexne(public.citext, public.citext) TO service_role; - - --- --- Name: FUNCTION time_dist(time without time zone, time without time zone); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.time_dist(time without time zone, time without time zone) TO postgres; -GRANT ALL ON FUNCTION public.time_dist(time without time zone, time without time zone) TO anon; -GRANT ALL ON FUNCTION public.time_dist(time without time zone, time without time zone) TO authenticated; -GRANT ALL ON FUNCTION public.time_dist(time without time zone, time without time zone) TO service_role; - - --- --- Name: FUNCTION toggle_plan(owner uuid); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.toggle_plan(owner uuid) TO postgres; -GRANT ALL ON FUNCTION public.toggle_plan(owner uuid) TO anon; -GRANT ALL ON FUNCTION public.toggle_plan(owner uuid) TO authenticated; -GRANT ALL ON FUNCTION public.toggle_plan(owner uuid) TO service_role; - - --- --- Name: FUNCTION transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) TO postgres; -GRANT ALL ON FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) TO anon; -GRANT ALL ON FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) TO authenticated; -GRANT ALL ON FUNCTION public.transition_subscription(p_subscription_id uuid, p_to_status text, p_reason text, p_metadata jsonb) TO service_role; - - --- --- Name: FUNCTION translate(public.citext, public.citext, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.translate(public.citext, public.citext, text) TO postgres; -GRANT ALL ON FUNCTION public.translate(public.citext, public.citext, text) TO anon; -GRANT ALL ON FUNCTION public.translate(public.citext, public.citext, text) TO authenticated; -GRANT ALL ON FUNCTION public.translate(public.citext, public.citext, text) TO service_role; - - --- --- Name: FUNCTION trg_fn_financial_records_auto_overdue(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.trg_fn_financial_records_auto_overdue() TO postgres; -GRANT ALL ON FUNCTION public.trg_fn_financial_records_auto_overdue() TO anon; -GRANT ALL ON FUNCTION public.trg_fn_financial_records_auto_overdue() TO authenticated; -GRANT ALL ON FUNCTION public.trg_fn_financial_records_auto_overdue() TO service_role; - - --- --- Name: FUNCTION ts_dist(timestamp without time zone, timestamp without time zone); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.ts_dist(timestamp without time zone, timestamp without time zone) TO postgres; -GRANT ALL ON FUNCTION public.ts_dist(timestamp without time zone, timestamp without time zone) TO anon; -GRANT ALL ON FUNCTION public.ts_dist(timestamp without time zone, timestamp without time zone) TO authenticated; -GRANT ALL ON FUNCTION public.ts_dist(timestamp without time zone, timestamp without time zone) TO service_role; - - --- --- Name: FUNCTION tstz_dist(timestamp with time zone, timestamp with time zone); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.tstz_dist(timestamp with time zone, timestamp with time zone) TO postgres; -GRANT ALL ON FUNCTION public.tstz_dist(timestamp with time zone, timestamp with time zone) TO anon; -GRANT ALL ON FUNCTION public.tstz_dist(timestamp with time zone, timestamp with time zone) TO authenticated; -GRANT ALL ON FUNCTION public.tstz_dist(timestamp with time zone, timestamp with time zone) TO service_role; - - --- --- Name: FUNCTION unstick_notification_queue(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.unstick_notification_queue() TO postgres; -GRANT ALL ON FUNCTION public.unstick_notification_queue() TO anon; -GRANT ALL ON FUNCTION public.unstick_notification_queue() TO authenticated; -GRANT ALL ON FUNCTION public.unstick_notification_queue() TO service_role; - - --- --- Name: FUNCTION update_payment_settings_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.update_payment_settings_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.update_payment_settings_updated_at() TO anon; -GRANT ALL ON FUNCTION public.update_payment_settings_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.update_payment_settings_updated_at() TO service_role; - - --- --- Name: FUNCTION update_professional_pricing_updated_at(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.update_professional_pricing_updated_at() TO postgres; -GRANT ALL ON FUNCTION public.update_professional_pricing_updated_at() TO anon; -GRANT ALL ON FUNCTION public.update_professional_pricing_updated_at() TO authenticated; -GRANT ALL ON FUNCTION public.update_professional_pricing_updated_at() TO service_role; - - --- --- Name: FUNCTION user_has_feature(_user_id uuid, _feature text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.user_has_feature(_user_id uuid, _feature text) TO postgres; -GRANT ALL ON FUNCTION public.user_has_feature(_user_id uuid, _feature text) TO anon; -GRANT ALL ON FUNCTION public.user_has_feature(_user_id uuid, _feature text) TO authenticated; -GRANT ALL ON FUNCTION public.user_has_feature(_user_id uuid, _feature text) TO service_role; - - --- --- Name: FUNCTION validate_support_session(p_token text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.validate_support_session(p_token text) TO postgres; -GRANT ALL ON FUNCTION public.validate_support_session(p_token text) TO anon; -GRANT ALL ON FUNCTION public.validate_support_session(p_token text) TO authenticated; -GRANT ALL ON FUNCTION public.validate_support_session(p_token text) TO service_role; - - --- --- Name: FUNCTION whoami(); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.whoami() TO postgres; -GRANT ALL ON FUNCTION public.whoami() TO anon; -GRANT ALL ON FUNCTION public.whoami() TO authenticated; -GRANT ALL ON FUNCTION public.whoami() TO service_role; - - --- --- Name: FUNCTION word_similarity(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity(text, text) TO service_role; - - --- --- Name: FUNCTION word_similarity_commutator_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity_commutator_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity_commutator_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity_commutator_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity_commutator_op(text, text) TO service_role; - - --- --- Name: FUNCTION word_similarity_dist_commutator_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity_dist_commutator_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity_dist_commutator_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity_dist_commutator_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity_dist_commutator_op(text, text) TO service_role; - - --- --- Name: FUNCTION word_similarity_dist_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity_dist_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity_dist_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity_dist_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity_dist_op(text, text) TO service_role; - - --- --- Name: FUNCTION word_similarity_op(text, text); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.word_similarity_op(text, text) TO postgres; -GRANT ALL ON FUNCTION public.word_similarity_op(text, text) TO anon; -GRANT ALL ON FUNCTION public.word_similarity_op(text, text) TO authenticated; -GRANT ALL ON FUNCTION public.word_similarity_op(text, text) TO service_role; - - --- --- Name: FUNCTION apply_rls(wal jsonb, max_record_bytes integer); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO postgres; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO anon; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO authenticated; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO service_role; -GRANT ALL ON FUNCTION realtime.apply_rls(wal jsonb, max_record_bytes integer) TO supabase_realtime_admin; - - --- --- Name: FUNCTION broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text) TO postgres; -GRANT ALL ON FUNCTION realtime.broadcast_changes(topic_name text, event_name text, operation text, table_name text, table_schema text, new record, old record, level text) TO dashboard_user; - - --- --- Name: FUNCTION build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO postgres; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO anon; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO authenticated; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO service_role; -GRANT ALL ON FUNCTION realtime.build_prepared_statement_sql(prepared_statement_name text, entity regclass, columns realtime.wal_column[]) TO supabase_realtime_admin; - - --- --- Name: FUNCTION "cast"(val text, type_ regtype); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO postgres; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO dashboard_user; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO anon; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO authenticated; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO service_role; -GRANT ALL ON FUNCTION realtime."cast"(val text, type_ regtype) TO supabase_realtime_admin; - - --- --- Name: FUNCTION check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO postgres; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO anon; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO authenticated; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO service_role; -GRANT ALL ON FUNCTION realtime.check_equality_op(op realtime.equality_op, type_ regtype, val_1 text, val_2 text) TO supabase_realtime_admin; - - --- --- Name: FUNCTION is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO postgres; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO anon; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO authenticated; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO service_role; -GRANT ALL ON FUNCTION realtime.is_visible_through_filters(columns realtime.wal_column[], filters realtime.user_defined_filter[]) TO supabase_realtime_admin; - - --- --- Name: FUNCTION list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO postgres; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO anon; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO authenticated; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO service_role; -GRANT ALL ON FUNCTION realtime.list_changes(publication name, slot_name name, max_changes integer, max_record_bytes integer) TO supabase_realtime_admin; - - --- --- Name: FUNCTION quote_wal2json(entity regclass); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO postgres; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO anon; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO authenticated; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO service_role; -GRANT ALL ON FUNCTION realtime.quote_wal2json(entity regclass) TO supabase_realtime_admin; - - --- --- Name: FUNCTION send(payload jsonb, event text, topic text, private boolean); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean) TO postgres; -GRANT ALL ON FUNCTION realtime.send(payload jsonb, event text, topic text, private boolean) TO dashboard_user; - - --- --- Name: FUNCTION subscription_check_filters(); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO postgres; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO dashboard_user; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO anon; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO authenticated; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO service_role; -GRANT ALL ON FUNCTION realtime.subscription_check_filters() TO supabase_realtime_admin; - - --- --- Name: FUNCTION to_regrole(role_name text); Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO postgres; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO dashboard_user; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO anon; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO authenticated; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO service_role; -GRANT ALL ON FUNCTION realtime.to_regrole(role_name text) TO supabase_realtime_admin; - - --- --- Name: FUNCTION topic(); Type: ACL; Schema: realtime; Owner: supabase_realtime_admin --- - -GRANT ALL ON FUNCTION realtime.topic() TO postgres; -GRANT ALL ON FUNCTION realtime.topic() TO dashboard_user; - - --- --- Name: FUNCTION http_request(); Type: ACL; Schema: supabase_functions; Owner: supabase_functions_admin --- - -REVOKE ALL ON FUNCTION supabase_functions.http_request() FROM PUBLIC; -GRANT ALL ON FUNCTION supabase_functions.http_request() TO postgres; -GRANT ALL ON FUNCTION supabase_functions.http_request() TO anon; -GRANT ALL ON FUNCTION supabase_functions.http_request() TO authenticated; -GRANT ALL ON FUNCTION supabase_functions.http_request() TO service_role; - - --- --- Name: FUNCTION _crypto_aead_det_decrypt(message bytea, additional bytea, key_id bigint, context bytea, nonce bytea); Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION vault._crypto_aead_det_decrypt(message bytea, additional bytea, key_id bigint, context bytea, nonce bytea) TO postgres WITH GRANT OPTION; -GRANT ALL ON FUNCTION vault._crypto_aead_det_decrypt(message bytea, additional bytea, key_id bigint, context bytea, nonce bytea) TO service_role; - - --- --- Name: FUNCTION create_secret(new_secret text, new_name text, new_description text, new_key_id uuid); Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION vault.create_secret(new_secret text, new_name text, new_description text, new_key_id uuid) TO postgres WITH GRANT OPTION; -GRANT ALL ON FUNCTION vault.create_secret(new_secret text, new_name text, new_description text, new_key_id uuid) TO service_role; - - --- --- Name: FUNCTION update_secret(secret_id uuid, new_secret text, new_name text, new_description text, new_key_id uuid); Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION vault.update_secret(secret_id uuid, new_secret text, new_name text, new_description text, new_key_id uuid) TO postgres WITH GRANT OPTION; -GRANT ALL ON FUNCTION vault.update_secret(secret_id uuid, new_secret text, new_name text, new_description text, new_key_id uuid) TO service_role; - - --- --- Name: FUNCTION max(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.max(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.max(public.citext) TO anon; -GRANT ALL ON FUNCTION public.max(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.max(public.citext) TO service_role; - - --- --- Name: FUNCTION min(public.citext); Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON FUNCTION public.min(public.citext) TO postgres; -GRANT ALL ON FUNCTION public.min(public.citext) TO anon; -GRANT ALL ON FUNCTION public.min(public.citext) TO authenticated; -GRANT ALL ON FUNCTION public.min(public.citext) TO service_role; - - --- --- Name: TABLE audit_log_entries; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.audit_log_entries TO dashboard_user; -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.audit_log_entries TO postgres; -GRANT SELECT ON TABLE auth.audit_log_entries TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE flow_state; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.flow_state TO postgres; -GRANT SELECT ON TABLE auth.flow_state TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.flow_state TO dashboard_user; - - --- --- Name: TABLE identities; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.identities TO postgres; -GRANT SELECT ON TABLE auth.identities TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.identities TO dashboard_user; - - --- --- Name: TABLE instances; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.instances TO dashboard_user; -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.instances TO postgres; -GRANT SELECT ON TABLE auth.instances TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE mfa_amr_claims; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.mfa_amr_claims TO postgres; -GRANT SELECT ON TABLE auth.mfa_amr_claims TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.mfa_amr_claims TO dashboard_user; - - --- --- Name: TABLE mfa_challenges; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.mfa_challenges TO postgres; -GRANT SELECT ON TABLE auth.mfa_challenges TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.mfa_challenges TO dashboard_user; - - --- --- Name: TABLE mfa_factors; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.mfa_factors TO postgres; -GRANT SELECT ON TABLE auth.mfa_factors TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.mfa_factors TO dashboard_user; - - --- --- Name: TABLE oauth_authorizations; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.oauth_authorizations TO postgres; -GRANT ALL ON TABLE auth.oauth_authorizations TO dashboard_user; - - --- --- Name: TABLE oauth_client_states; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.oauth_client_states TO postgres; -GRANT ALL ON TABLE auth.oauth_client_states TO dashboard_user; - - --- --- Name: TABLE oauth_clients; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.oauth_clients TO postgres; -GRANT ALL ON TABLE auth.oauth_clients TO dashboard_user; - - --- --- Name: TABLE oauth_consents; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.oauth_consents TO postgres; -GRANT ALL ON TABLE auth.oauth_consents TO dashboard_user; - - --- --- Name: TABLE one_time_tokens; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.one_time_tokens TO postgres; -GRANT SELECT ON TABLE auth.one_time_tokens TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.one_time_tokens TO dashboard_user; - - --- --- Name: TABLE refresh_tokens; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.refresh_tokens TO dashboard_user; -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.refresh_tokens TO postgres; -GRANT SELECT ON TABLE auth.refresh_tokens TO postgres WITH GRANT OPTION; - - --- --- Name: SEQUENCE refresh_tokens_id_seq; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON SEQUENCE auth.refresh_tokens_id_seq TO dashboard_user; -GRANT ALL ON SEQUENCE auth.refresh_tokens_id_seq TO postgres; - - --- --- Name: TABLE saml_providers; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.saml_providers TO postgres; -GRANT SELECT ON TABLE auth.saml_providers TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.saml_providers TO dashboard_user; - - --- --- Name: TABLE saml_relay_states; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.saml_relay_states TO postgres; -GRANT SELECT ON TABLE auth.saml_relay_states TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.saml_relay_states TO dashboard_user; - - --- --- Name: TABLE schema_migrations; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT SELECT ON TABLE auth.schema_migrations TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE sessions; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.sessions TO postgres; -GRANT SELECT ON TABLE auth.sessions TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.sessions TO dashboard_user; - - --- --- Name: TABLE sso_domains; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.sso_domains TO postgres; -GRANT SELECT ON TABLE auth.sso_domains TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.sso_domains TO dashboard_user; - - --- --- Name: TABLE sso_providers; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.sso_providers TO postgres; -GRANT SELECT ON TABLE auth.sso_providers TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE auth.sso_providers TO dashboard_user; - - --- --- Name: TABLE users; Type: ACL; Schema: auth; Owner: supabase_auth_admin --- - -GRANT ALL ON TABLE auth.users TO dashboard_user; -GRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,MAINTAIN,UPDATE ON TABLE auth.users TO postgres; -GRANT SELECT ON TABLE auth.users TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE job; Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT SELECT ON TABLE cron.job TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE job_run_details; Type: ACL; Schema: cron; Owner: supabase_admin --- - -GRANT ALL ON TABLE cron.job_run_details TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE pg_stat_statements; Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON TABLE extensions.pg_stat_statements TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE pg_stat_statements_info; Type: ACL; Schema: extensions; Owner: supabase_admin --- - -GRANT ALL ON TABLE extensions.pg_stat_statements_info TO postgres WITH GRANT OPTION; - - --- --- Name: TABLE addon_credits; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.addon_credits TO postgres; -GRANT ALL ON TABLE public.addon_credits TO anon; -GRANT ALL ON TABLE public.addon_credits TO authenticated; -GRANT ALL ON TABLE public.addon_credits TO service_role; - - --- --- Name: TABLE addon_products; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.addon_products TO postgres; -GRANT ALL ON TABLE public.addon_products TO anon; -GRANT ALL ON TABLE public.addon_products TO authenticated; -GRANT ALL ON TABLE public.addon_products TO service_role; - - --- --- Name: TABLE addon_transactions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.addon_transactions TO postgres; -GRANT ALL ON TABLE public.addon_transactions TO anon; -GRANT ALL ON TABLE public.addon_transactions TO authenticated; -GRANT ALL ON TABLE public.addon_transactions TO service_role; - - --- --- Name: TABLE agenda_bloqueios; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_bloqueios TO postgres; -GRANT ALL ON TABLE public.agenda_bloqueios TO anon; -GRANT ALL ON TABLE public.agenda_bloqueios TO authenticated; -GRANT ALL ON TABLE public.agenda_bloqueios TO service_role; - - --- --- Name: TABLE agenda_configuracoes; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_configuracoes TO postgres; -GRANT ALL ON TABLE public.agenda_configuracoes TO anon; -GRANT ALL ON TABLE public.agenda_configuracoes TO authenticated; -GRANT ALL ON TABLE public.agenda_configuracoes TO service_role; - - --- --- Name: TABLE agenda_eventos; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_eventos TO postgres; -GRANT ALL ON TABLE public.agenda_eventos TO anon; -GRANT ALL ON TABLE public.agenda_eventos TO authenticated; -GRANT ALL ON TABLE public.agenda_eventos TO service_role; - - --- --- Name: TABLE agenda_excecoes; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_excecoes TO postgres; -GRANT ALL ON TABLE public.agenda_excecoes TO anon; -GRANT ALL ON TABLE public.agenda_excecoes TO authenticated; -GRANT ALL ON TABLE public.agenda_excecoes TO service_role; - - --- --- Name: TABLE agenda_online_slots; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_online_slots TO postgres; -GRANT ALL ON TABLE public.agenda_online_slots TO anon; -GRANT ALL ON TABLE public.agenda_online_slots TO authenticated; -GRANT ALL ON TABLE public.agenda_online_slots TO service_role; - - --- --- Name: SEQUENCE agenda_online_slots_id_seq; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON SEQUENCE public.agenda_online_slots_id_seq TO postgres; -GRANT ALL ON SEQUENCE public.agenda_online_slots_id_seq TO anon; -GRANT ALL ON SEQUENCE public.agenda_online_slots_id_seq TO authenticated; -GRANT ALL ON SEQUENCE public.agenda_online_slots_id_seq TO service_role; - - --- --- Name: TABLE agenda_regras_semanais; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_regras_semanais TO postgres; -GRANT ALL ON TABLE public.agenda_regras_semanais TO anon; -GRANT ALL ON TABLE public.agenda_regras_semanais TO authenticated; -GRANT ALL ON TABLE public.agenda_regras_semanais TO service_role; - - --- --- Name: TABLE agenda_slots_bloqueados_semanais; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_slots_bloqueados_semanais TO postgres; -GRANT ALL ON TABLE public.agenda_slots_bloqueados_semanais TO anon; -GRANT ALL ON TABLE public.agenda_slots_bloqueados_semanais TO authenticated; -GRANT ALL ON TABLE public.agenda_slots_bloqueados_semanais TO service_role; - - --- --- Name: TABLE agenda_slots_regras; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agenda_slots_regras TO postgres; -GRANT ALL ON TABLE public.agenda_slots_regras TO anon; -GRANT ALL ON TABLE public.agenda_slots_regras TO authenticated; -GRANT ALL ON TABLE public.agenda_slots_regras TO service_role; - - --- --- Name: TABLE agendador_configuracoes; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agendador_configuracoes TO postgres; -GRANT ALL ON TABLE public.agendador_configuracoes TO anon; -GRANT ALL ON TABLE public.agendador_configuracoes TO authenticated; -GRANT ALL ON TABLE public.agendador_configuracoes TO service_role; - - --- --- Name: TABLE agendador_solicitacoes; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.agendador_solicitacoes TO postgres; -GRANT ALL ON TABLE public.agendador_solicitacoes TO anon; -GRANT ALL ON TABLE public.agendador_solicitacoes TO authenticated; -GRANT ALL ON TABLE public.agendador_solicitacoes TO service_role; - - --- --- Name: TABLE billing_contracts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.billing_contracts TO postgres; -GRANT ALL ON TABLE public.billing_contracts TO anon; -GRANT ALL ON TABLE public.billing_contracts TO authenticated; -GRANT ALL ON TABLE public.billing_contracts TO service_role; - - --- --- Name: TABLE commitment_services; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.commitment_services TO postgres; -GRANT ALL ON TABLE public.commitment_services TO anon; -GRANT ALL ON TABLE public.commitment_services TO authenticated; -GRANT ALL ON TABLE public.commitment_services TO service_role; - - --- --- Name: TABLE commitment_time_logs; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.commitment_time_logs TO postgres; -GRANT ALL ON TABLE public.commitment_time_logs TO anon; -GRANT ALL ON TABLE public.commitment_time_logs TO authenticated; -GRANT ALL ON TABLE public.commitment_time_logs TO service_role; - - --- --- Name: TABLE company_profiles; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.company_profiles TO postgres; -GRANT ALL ON TABLE public.company_profiles TO anon; -GRANT ALL ON TABLE public.company_profiles TO authenticated; -GRANT ALL ON TABLE public.company_profiles TO service_role; - - --- --- Name: TABLE current_tenant_id; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.current_tenant_id TO postgres; -GRANT ALL ON TABLE public.current_tenant_id TO anon; -GRANT ALL ON TABLE public.current_tenant_id TO authenticated; -GRANT ALL ON TABLE public.current_tenant_id TO service_role; - - --- --- Name: TABLE determined_commitment_fields; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.determined_commitment_fields TO postgres; -GRANT ALL ON TABLE public.determined_commitment_fields TO anon; -GRANT ALL ON TABLE public.determined_commitment_fields TO authenticated; -GRANT ALL ON TABLE public.determined_commitment_fields TO service_role; - - --- --- Name: TABLE determined_commitments; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.determined_commitments TO postgres; -GRANT ALL ON TABLE public.determined_commitments TO anon; -GRANT ALL ON TABLE public.determined_commitments TO authenticated; -GRANT ALL ON TABLE public.determined_commitments TO service_role; - - --- --- Name: TABLE dev_user_credentials; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.dev_user_credentials TO postgres; -GRANT ALL ON TABLE public.dev_user_credentials TO anon; -GRANT ALL ON TABLE public.dev_user_credentials TO authenticated; -GRANT ALL ON TABLE public.dev_user_credentials TO service_role; - - --- --- Name: TABLE email_layout_config; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.email_layout_config TO postgres; -GRANT ALL ON TABLE public.email_layout_config TO anon; -GRANT ALL ON TABLE public.email_layout_config TO authenticated; -GRANT ALL ON TABLE public.email_layout_config TO service_role; - - --- --- Name: TABLE email_templates_global; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.email_templates_global TO postgres; -GRANT ALL ON TABLE public.email_templates_global TO anon; -GRANT ALL ON TABLE public.email_templates_global TO authenticated; -GRANT ALL ON TABLE public.email_templates_global TO service_role; - - --- --- Name: TABLE email_templates_tenant; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.email_templates_tenant TO postgres; -GRANT ALL ON TABLE public.email_templates_tenant TO anon; -GRANT ALL ON TABLE public.email_templates_tenant TO authenticated; -GRANT ALL ON TABLE public.email_templates_tenant TO service_role; - - --- --- Name: TABLE entitlements_invalidation; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.entitlements_invalidation TO postgres; -GRANT ALL ON TABLE public.entitlements_invalidation TO anon; -GRANT ALL ON TABLE public.entitlements_invalidation TO authenticated; -GRANT ALL ON TABLE public.entitlements_invalidation TO service_role; - - --- --- Name: TABLE features; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.features TO postgres; -GRANT ALL ON TABLE public.features TO anon; -GRANT ALL ON TABLE public.features TO authenticated; -GRANT ALL ON TABLE public.features TO service_role; - - --- --- Name: TABLE feriados; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.feriados TO postgres; -GRANT ALL ON TABLE public.feriados TO anon; -GRANT ALL ON TABLE public.feriados TO authenticated; -GRANT ALL ON TABLE public.feriados TO service_role; - - --- --- Name: TABLE financial_categories; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.financial_categories TO postgres; -GRANT ALL ON TABLE public.financial_categories TO anon; -GRANT ALL ON TABLE public.financial_categories TO authenticated; -GRANT ALL ON TABLE public.financial_categories TO service_role; - - --- --- Name: TABLE financial_exceptions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.financial_exceptions TO postgres; -GRANT ALL ON TABLE public.financial_exceptions TO anon; -GRANT ALL ON TABLE public.financial_exceptions TO authenticated; -GRANT ALL ON TABLE public.financial_exceptions TO service_role; - - --- --- Name: TABLE global_notices; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.global_notices TO postgres; -GRANT ALL ON TABLE public.global_notices TO anon; -GRANT ALL ON TABLE public.global_notices TO authenticated; -GRANT ALL ON TABLE public.global_notices TO service_role; - - --- --- Name: TABLE insurance_plan_services; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.insurance_plan_services TO postgres; -GRANT ALL ON TABLE public.insurance_plan_services TO anon; -GRANT ALL ON TABLE public.insurance_plan_services TO authenticated; -GRANT ALL ON TABLE public.insurance_plan_services TO service_role; - - --- --- Name: TABLE insurance_plans; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.insurance_plans TO postgres; -GRANT ALL ON TABLE public.insurance_plans TO anon; -GRANT ALL ON TABLE public.insurance_plans TO authenticated; -GRANT ALL ON TABLE public.insurance_plans TO service_role; - - --- --- Name: TABLE login_carousel_slides; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.login_carousel_slides TO postgres; -GRANT ALL ON TABLE public.login_carousel_slides TO anon; -GRANT ALL ON TABLE public.login_carousel_slides TO authenticated; -GRANT ALL ON TABLE public.login_carousel_slides TO service_role; - - --- --- Name: TABLE module_features; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.module_features TO postgres; -GRANT ALL ON TABLE public.module_features TO anon; -GRANT ALL ON TABLE public.module_features TO authenticated; -GRANT ALL ON TABLE public.module_features TO service_role; - - --- --- Name: TABLE modules; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.modules TO postgres; -GRANT ALL ON TABLE public.modules TO anon; -GRANT ALL ON TABLE public.modules TO authenticated; -GRANT ALL ON TABLE public.modules TO service_role; - - --- --- Name: TABLE notice_dismissals; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notice_dismissals TO postgres; -GRANT ALL ON TABLE public.notice_dismissals TO anon; -GRANT ALL ON TABLE public.notice_dismissals TO authenticated; -GRANT ALL ON TABLE public.notice_dismissals TO service_role; - - --- --- Name: TABLE notification_channels; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_channels TO postgres; -GRANT ALL ON TABLE public.notification_channels TO anon; -GRANT ALL ON TABLE public.notification_channels TO authenticated; -GRANT ALL ON TABLE public.notification_channels TO service_role; - - --- --- Name: TABLE notification_logs; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_logs TO postgres; -GRANT ALL ON TABLE public.notification_logs TO anon; -GRANT ALL ON TABLE public.notification_logs TO authenticated; -GRANT ALL ON TABLE public.notification_logs TO service_role; - - --- --- Name: TABLE notification_preferences; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_preferences TO postgres; -GRANT ALL ON TABLE public.notification_preferences TO anon; -GRANT ALL ON TABLE public.notification_preferences TO authenticated; -GRANT ALL ON TABLE public.notification_preferences TO service_role; - - --- --- Name: TABLE notification_queue; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_queue TO postgres; -GRANT ALL ON TABLE public.notification_queue TO anon; -GRANT ALL ON TABLE public.notification_queue TO authenticated; -GRANT ALL ON TABLE public.notification_queue TO service_role; - - --- --- Name: TABLE notification_schedules; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_schedules TO postgres; -GRANT ALL ON TABLE public.notification_schedules TO anon; -GRANT ALL ON TABLE public.notification_schedules TO authenticated; -GRANT ALL ON TABLE public.notification_schedules TO service_role; - - --- --- Name: TABLE notification_templates; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notification_templates TO postgres; -GRANT ALL ON TABLE public.notification_templates TO anon; -GRANT ALL ON TABLE public.notification_templates TO authenticated; -GRANT ALL ON TABLE public.notification_templates TO service_role; - - --- --- Name: TABLE notifications; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.notifications TO postgres; -GRANT ALL ON TABLE public.notifications TO anon; -GRANT ALL ON TABLE public.notifications TO authenticated; -GRANT ALL ON TABLE public.notifications TO service_role; - - --- --- Name: TABLE plan_features; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plan_features TO postgres; -GRANT ALL ON TABLE public.plan_features TO anon; -GRANT ALL ON TABLE public.plan_features TO authenticated; -GRANT ALL ON TABLE public.plan_features TO service_role; - - --- --- Name: TABLE tenant_modules; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_modules TO postgres; -GRANT ALL ON TABLE public.tenant_modules TO anon; -GRANT ALL ON TABLE public.tenant_modules TO authenticated; -GRANT ALL ON TABLE public.tenant_modules TO service_role; - - --- --- Name: TABLE owner_feature_entitlements; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.owner_feature_entitlements TO postgres; -GRANT ALL ON TABLE public.owner_feature_entitlements TO anon; -GRANT ALL ON TABLE public.owner_feature_entitlements TO authenticated; -GRANT ALL ON TABLE public.owner_feature_entitlements TO service_role; - - --- --- Name: TABLE owner_users; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.owner_users TO postgres; -GRANT ALL ON TABLE public.owner_users TO anon; -GRANT ALL ON TABLE public.owner_users TO authenticated; -GRANT ALL ON TABLE public.owner_users TO service_role; - - --- --- Name: TABLE patient_discounts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_discounts TO postgres; -GRANT ALL ON TABLE public.patient_discounts TO anon; -GRANT ALL ON TABLE public.patient_discounts TO authenticated; -GRANT ALL ON TABLE public.patient_discounts TO service_role; - - --- --- Name: TABLE patient_group_patient; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_group_patient TO postgres; -GRANT ALL ON TABLE public.patient_group_patient TO anon; -GRANT ALL ON TABLE public.patient_group_patient TO authenticated; -GRANT ALL ON TABLE public.patient_group_patient TO service_role; - - --- --- Name: TABLE patient_groups; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_groups TO postgres; -GRANT ALL ON TABLE public.patient_groups TO anon; -GRANT ALL ON TABLE public.patient_groups TO authenticated; -GRANT ALL ON TABLE public.patient_groups TO service_role; - - --- --- Name: TABLE patient_intake_requests; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_intake_requests TO postgres; -GRANT ALL ON TABLE public.patient_intake_requests TO authenticated; -GRANT ALL ON TABLE public.patient_intake_requests TO service_role; - - --- --- Name: TABLE patient_invites; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_invites TO postgres; -GRANT ALL ON TABLE public.patient_invites TO authenticated; -GRANT ALL ON TABLE public.patient_invites TO service_role; - - --- --- Name: TABLE patient_patient_tag; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_patient_tag TO postgres; -GRANT ALL ON TABLE public.patient_patient_tag TO anon; -GRANT ALL ON TABLE public.patient_patient_tag TO authenticated; -GRANT ALL ON TABLE public.patient_patient_tag TO service_role; - - --- --- Name: TABLE patient_tags; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patient_tags TO postgres; -GRANT ALL ON TABLE public.patient_tags TO anon; -GRANT ALL ON TABLE public.patient_tags TO authenticated; -GRANT ALL ON TABLE public.patient_tags TO service_role; - - --- --- Name: TABLE patients; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.patients TO postgres; -GRANT ALL ON TABLE public.patients TO anon; -GRANT ALL ON TABLE public.patients TO authenticated; -GRANT ALL ON TABLE public.patients TO service_role; - - --- --- Name: TABLE payment_settings; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.payment_settings TO postgres; -GRANT ALL ON TABLE public.payment_settings TO anon; -GRANT ALL ON TABLE public.payment_settings TO authenticated; -GRANT ALL ON TABLE public.payment_settings TO service_role; - - --- --- Name: TABLE plan_prices; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plan_prices TO postgres; -GRANT ALL ON TABLE public.plan_prices TO anon; -GRANT ALL ON TABLE public.plan_prices TO authenticated; -GRANT ALL ON TABLE public.plan_prices TO service_role; - - --- --- Name: TABLE plan_public; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plan_public TO postgres; -GRANT ALL ON TABLE public.plan_public TO anon; -GRANT ALL ON TABLE public.plan_public TO authenticated; -GRANT ALL ON TABLE public.plan_public TO service_role; - - --- --- Name: TABLE plan_public_bullets; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plan_public_bullets TO postgres; -GRANT ALL ON TABLE public.plan_public_bullets TO anon; -GRANT ALL ON TABLE public.plan_public_bullets TO authenticated; -GRANT ALL ON TABLE public.plan_public_bullets TO service_role; - - --- --- Name: TABLE plans; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.plans TO postgres; -GRANT ALL ON TABLE public.plans TO anon; -GRANT ALL ON TABLE public.plans TO authenticated; -GRANT ALL ON TABLE public.plans TO service_role; - - --- --- Name: TABLE professional_pricing; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.professional_pricing TO postgres; -GRANT ALL ON TABLE public.professional_pricing TO anon; -GRANT ALL ON TABLE public.professional_pricing TO authenticated; -GRANT ALL ON TABLE public.professional_pricing TO service_role; - - --- --- Name: TABLE profiles; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.profiles TO postgres; -GRANT ALL ON TABLE public.profiles TO anon; -GRANT ALL ON TABLE public.profiles TO authenticated; -GRANT ALL ON TABLE public.profiles TO service_role; - - --- --- Name: TABLE recurrence_exceptions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.recurrence_exceptions TO postgres; -GRANT ALL ON TABLE public.recurrence_exceptions TO anon; -GRANT ALL ON TABLE public.recurrence_exceptions TO authenticated; -GRANT ALL ON TABLE public.recurrence_exceptions TO service_role; - - --- --- Name: TABLE recurrence_rule_services; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.recurrence_rule_services TO postgres; -GRANT ALL ON TABLE public.recurrence_rule_services TO anon; -GRANT ALL ON TABLE public.recurrence_rule_services TO authenticated; -GRANT ALL ON TABLE public.recurrence_rule_services TO service_role; - - --- --- Name: TABLE recurrence_rules; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.recurrence_rules TO postgres; -GRANT ALL ON TABLE public.recurrence_rules TO anon; -GRANT ALL ON TABLE public.recurrence_rules TO authenticated; -GRANT ALL ON TABLE public.recurrence_rules TO service_role; - - --- --- Name: TABLE saas_admins; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_admins TO postgres; -GRANT ALL ON TABLE public.saas_admins TO anon; -GRANT ALL ON TABLE public.saas_admins TO authenticated; -GRANT ALL ON TABLE public.saas_admins TO service_role; - - --- --- Name: TABLE saas_doc_votos; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_doc_votos TO postgres; -GRANT ALL ON TABLE public.saas_doc_votos TO anon; -GRANT ALL ON TABLE public.saas_doc_votos TO authenticated; -GRANT ALL ON TABLE public.saas_doc_votos TO service_role; - - --- --- Name: TABLE saas_docs; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_docs TO postgres; -GRANT ALL ON TABLE public.saas_docs TO anon; -GRANT ALL ON TABLE public.saas_docs TO authenticated; -GRANT ALL ON TABLE public.saas_docs TO service_role; - - --- --- Name: TABLE saas_faq; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_faq TO postgres; -GRANT ALL ON TABLE public.saas_faq TO anon; -GRANT ALL ON TABLE public.saas_faq TO authenticated; -GRANT ALL ON TABLE public.saas_faq TO service_role; - - --- --- Name: TABLE saas_faq_itens; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.saas_faq_itens TO postgres; -GRANT ALL ON TABLE public.saas_faq_itens TO anon; -GRANT ALL ON TABLE public.saas_faq_itens TO authenticated; -GRANT ALL ON TABLE public.saas_faq_itens TO service_role; - - --- --- Name: TABLE services; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.services TO postgres; -GRANT ALL ON TABLE public.services TO anon; -GRANT ALL ON TABLE public.services TO authenticated; -GRANT ALL ON TABLE public.services TO service_role; - - --- --- Name: TABLE subscription_events; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_events TO postgres; -GRANT ALL ON TABLE public.subscription_events TO anon; -GRANT ALL ON TABLE public.subscription_events TO authenticated; -GRANT ALL ON TABLE public.subscription_events TO service_role; - - --- --- Name: TABLE subscription_intents_personal; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_intents_personal TO postgres; -GRANT ALL ON TABLE public.subscription_intents_personal TO anon; -GRANT ALL ON TABLE public.subscription_intents_personal TO authenticated; -GRANT ALL ON TABLE public.subscription_intents_personal TO service_role; - - --- --- Name: TABLE subscription_intents_tenant; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_intents_tenant TO postgres; -GRANT ALL ON TABLE public.subscription_intents_tenant TO anon; -GRANT ALL ON TABLE public.subscription_intents_tenant TO authenticated; -GRANT ALL ON TABLE public.subscription_intents_tenant TO service_role; - - --- --- Name: TABLE subscription_intents; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_intents TO postgres; -GRANT ALL ON TABLE public.subscription_intents TO anon; -GRANT ALL ON TABLE public.subscription_intents TO authenticated; -GRANT ALL ON TABLE public.subscription_intents TO service_role; - - --- --- Name: TABLE subscription_intents_legacy; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.subscription_intents_legacy TO postgres; -GRANT ALL ON TABLE public.subscription_intents_legacy TO anon; -GRANT ALL ON TABLE public.subscription_intents_legacy TO authenticated; -GRANT ALL ON TABLE public.subscription_intents_legacy TO service_role; - - --- --- Name: TABLE support_sessions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.support_sessions TO postgres; -GRANT ALL ON TABLE public.support_sessions TO anon; -GRANT ALL ON TABLE public.support_sessions TO authenticated; -GRANT ALL ON TABLE public.support_sessions TO service_role; - - --- --- Name: TABLE tenant_feature_exceptions_log; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_feature_exceptions_log TO postgres; -GRANT ALL ON TABLE public.tenant_feature_exceptions_log TO anon; -GRANT ALL ON TABLE public.tenant_feature_exceptions_log TO authenticated; -GRANT ALL ON TABLE public.tenant_feature_exceptions_log TO service_role; - - --- --- Name: TABLE tenant_features; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_features TO postgres; -GRANT ALL ON TABLE public.tenant_features TO anon; -GRANT ALL ON TABLE public.tenant_features TO authenticated; -GRANT ALL ON TABLE public.tenant_features TO service_role; - - --- --- Name: TABLE tenant_invites; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenant_invites TO postgres; -GRANT ALL ON TABLE public.tenant_invites TO authenticated; -GRANT ALL ON TABLE public.tenant_invites TO service_role; - - --- --- Name: TABLE tenants; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.tenants TO postgres; -GRANT ALL ON TABLE public.tenants TO anon; -GRANT ALL ON TABLE public.tenants TO authenticated; -GRANT ALL ON TABLE public.tenants TO service_role; - - --- --- Name: TABLE therapist_payout_records; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.therapist_payout_records TO postgres; -GRANT ALL ON TABLE public.therapist_payout_records TO anon; -GRANT ALL ON TABLE public.therapist_payout_records TO authenticated; -GRANT ALL ON TABLE public.therapist_payout_records TO service_role; - - --- --- Name: TABLE user_settings; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.user_settings TO postgres; -GRANT ALL ON TABLE public.user_settings TO anon; -GRANT ALL ON TABLE public.user_settings TO authenticated; -GRANT ALL ON TABLE public.user_settings TO service_role; - - --- --- Name: TABLE v_auth_users_public; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_auth_users_public TO postgres; -GRANT ALL ON TABLE public.v_auth_users_public TO anon; -GRANT ALL ON TABLE public.v_auth_users_public TO authenticated; -GRANT ALL ON TABLE public.v_auth_users_public TO service_role; - - --- --- Name: TABLE v_cashflow_projection; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_cashflow_projection TO postgres; -GRANT ALL ON TABLE public.v_cashflow_projection TO anon; -GRANT ALL ON TABLE public.v_cashflow_projection TO authenticated; -GRANT ALL ON TABLE public.v_cashflow_projection TO service_role; - - --- --- Name: TABLE v_commitment_totals; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_commitment_totals TO postgres; -GRANT ALL ON TABLE public.v_commitment_totals TO anon; -GRANT ALL ON TABLE public.v_commitment_totals TO authenticated; -GRANT ALL ON TABLE public.v_commitment_totals TO service_role; - - --- --- Name: TABLE v_patient_groups_with_counts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_patient_groups_with_counts TO postgres; -GRANT ALL ON TABLE public.v_patient_groups_with_counts TO anon; -GRANT ALL ON TABLE public.v_patient_groups_with_counts TO authenticated; -GRANT ALL ON TABLE public.v_patient_groups_with_counts TO service_role; - - --- --- Name: TABLE v_plan_active_prices; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_plan_active_prices TO postgres; -GRANT ALL ON TABLE public.v_plan_active_prices TO anon; -GRANT ALL ON TABLE public.v_plan_active_prices TO authenticated; -GRANT ALL ON TABLE public.v_plan_active_prices TO service_role; - - --- --- Name: TABLE v_public_pricing; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_public_pricing TO postgres; -GRANT ALL ON TABLE public.v_public_pricing TO anon; -GRANT ALL ON TABLE public.v_public_pricing TO authenticated; -GRANT ALL ON TABLE public.v_public_pricing TO service_role; - - --- --- Name: TABLE v_subscription_feature_mismatch; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_subscription_feature_mismatch TO postgres; -GRANT ALL ON TABLE public.v_subscription_feature_mismatch TO anon; -GRANT ALL ON TABLE public.v_subscription_feature_mismatch TO authenticated; -GRANT ALL ON TABLE public.v_subscription_feature_mismatch TO service_role; - - --- --- Name: TABLE v_subscription_health; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_subscription_health TO postgres; -GRANT ALL ON TABLE public.v_subscription_health TO anon; -GRANT ALL ON TABLE public.v_subscription_health TO authenticated; -GRANT ALL ON TABLE public.v_subscription_health TO service_role; - - --- --- Name: TABLE v_subscription_health_v2; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_subscription_health_v2 TO postgres; -GRANT ALL ON TABLE public.v_subscription_health_v2 TO anon; -GRANT ALL ON TABLE public.v_subscription_health_v2 TO authenticated; -GRANT ALL ON TABLE public.v_subscription_health_v2 TO service_role; - - --- --- Name: TABLE v_tag_patient_counts; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tag_patient_counts TO postgres; -GRANT ALL ON TABLE public.v_tag_patient_counts TO anon; -GRANT ALL ON TABLE public.v_tag_patient_counts TO authenticated; -GRANT ALL ON TABLE public.v_tag_patient_counts TO service_role; - - --- --- Name: TABLE v_tenant_active_subscription; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_active_subscription TO postgres; -GRANT ALL ON TABLE public.v_tenant_active_subscription TO anon; -GRANT ALL ON TABLE public.v_tenant_active_subscription TO authenticated; -GRANT ALL ON TABLE public.v_tenant_active_subscription TO service_role; - - --- --- Name: TABLE v_tenant_entitlements; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_entitlements TO postgres; -GRANT ALL ON TABLE public.v_tenant_entitlements TO anon; -GRANT ALL ON TABLE public.v_tenant_entitlements TO authenticated; -GRANT ALL ON TABLE public.v_tenant_entitlements TO service_role; - - --- --- Name: TABLE v_tenant_entitlements_full; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_entitlements_full TO postgres; -GRANT ALL ON TABLE public.v_tenant_entitlements_full TO anon; -GRANT ALL ON TABLE public.v_tenant_entitlements_full TO authenticated; -GRANT ALL ON TABLE public.v_tenant_entitlements_full TO service_role; - - --- --- Name: TABLE v_tenant_entitlements_json; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_entitlements_json TO postgres; -GRANT ALL ON TABLE public.v_tenant_entitlements_json TO anon; -GRANT ALL ON TABLE public.v_tenant_entitlements_json TO authenticated; -GRANT ALL ON TABLE public.v_tenant_entitlements_json TO service_role; - - --- --- Name: TABLE v_tenant_feature_exceptions; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_feature_exceptions TO postgres; -GRANT ALL ON TABLE public.v_tenant_feature_exceptions TO anon; -GRANT ALL ON TABLE public.v_tenant_feature_exceptions TO authenticated; -GRANT ALL ON TABLE public.v_tenant_feature_exceptions TO service_role; - - --- --- Name: TABLE v_tenant_feature_mismatch; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_feature_mismatch TO postgres; -GRANT ALL ON TABLE public.v_tenant_feature_mismatch TO anon; -GRANT ALL ON TABLE public.v_tenant_feature_mismatch TO authenticated; -GRANT ALL ON TABLE public.v_tenant_feature_mismatch TO service_role; - - --- --- Name: TABLE v_tenant_members_with_profiles; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_members_with_profiles TO postgres; -GRANT ALL ON TABLE public.v_tenant_members_with_profiles TO anon; -GRANT ALL ON TABLE public.v_tenant_members_with_profiles TO authenticated; -GRANT ALL ON TABLE public.v_tenant_members_with_profiles TO service_role; - - --- --- Name: TABLE v_tenant_people; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_people TO postgres; -GRANT ALL ON TABLE public.v_tenant_people TO anon; -GRANT ALL ON TABLE public.v_tenant_people TO authenticated; -GRANT ALL ON TABLE public.v_tenant_people TO service_role; - - --- --- Name: TABLE v_tenant_staff; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_tenant_staff TO postgres; -GRANT ALL ON TABLE public.v_tenant_staff TO anon; -GRANT ALL ON TABLE public.v_tenant_staff TO authenticated; -GRANT ALL ON TABLE public.v_tenant_staff TO service_role; - - --- --- Name: TABLE v_user_active_subscription; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_user_active_subscription TO postgres; -GRANT ALL ON TABLE public.v_user_active_subscription TO anon; -GRANT ALL ON TABLE public.v_user_active_subscription TO authenticated; -GRANT ALL ON TABLE public.v_user_active_subscription TO service_role; - - --- --- Name: TABLE v_user_entitlements; Type: ACL; Schema: public; Owner: supabase_admin --- - -GRANT ALL ON TABLE public.v_user_entitlements TO postgres; -GRANT ALL ON TABLE public.v_user_entitlements TO anon; -GRANT ALL ON TABLE public.v_user_entitlements TO authenticated; -GRANT ALL ON TABLE public.v_user_entitlements TO service_role; - - --- --- Name: TABLE messages; Type: ACL; Schema: realtime; Owner: supabase_realtime_admin --- - -GRANT ALL ON TABLE realtime.messages TO postgres; -GRANT ALL ON TABLE realtime.messages TO dashboard_user; -GRANT SELECT,INSERT,UPDATE ON TABLE realtime.messages TO anon; -GRANT SELECT,INSERT,UPDATE ON TABLE realtime.messages TO authenticated; -GRANT SELECT,INSERT,UPDATE ON TABLE realtime.messages TO service_role; - - --- --- Name: TABLE messages_2026_03_20; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_20 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_20 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_21; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_21 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_21 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_22; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_22 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_22 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_23; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_23 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_23 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_24; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_24 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_24 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_25; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_25 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_25 TO dashboard_user; - - --- --- Name: TABLE messages_2026_03_26; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.messages_2026_03_26 TO postgres; -GRANT ALL ON TABLE realtime.messages_2026_03_26 TO dashboard_user; - - --- --- Name: TABLE schema_migrations; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.schema_migrations TO postgres; -GRANT ALL ON TABLE realtime.schema_migrations TO dashboard_user; -GRANT SELECT ON TABLE realtime.schema_migrations TO anon; -GRANT SELECT ON TABLE realtime.schema_migrations TO authenticated; -GRANT SELECT ON TABLE realtime.schema_migrations TO service_role; -GRANT ALL ON TABLE realtime.schema_migrations TO supabase_realtime_admin; - - --- --- Name: TABLE subscription; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON TABLE realtime.subscription TO postgres; -GRANT ALL ON TABLE realtime.subscription TO dashboard_user; -GRANT SELECT ON TABLE realtime.subscription TO anon; -GRANT SELECT ON TABLE realtime.subscription TO authenticated; -GRANT SELECT ON TABLE realtime.subscription TO service_role; -GRANT ALL ON TABLE realtime.subscription TO supabase_realtime_admin; - - --- --- Name: SEQUENCE subscription_id_seq; Type: ACL; Schema: realtime; Owner: supabase_admin --- - -GRANT ALL ON SEQUENCE realtime.subscription_id_seq TO postgres; -GRANT ALL ON SEQUENCE realtime.subscription_id_seq TO dashboard_user; -GRANT USAGE ON SEQUENCE realtime.subscription_id_seq TO anon; -GRANT USAGE ON SEQUENCE realtime.subscription_id_seq TO authenticated; -GRANT USAGE ON SEQUENCE realtime.subscription_id_seq TO service_role; -GRANT ALL ON SEQUENCE realtime.subscription_id_seq TO supabase_realtime_admin; - - --- --- Name: TABLE buckets; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.buckets TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE storage.buckets TO service_role; -GRANT ALL ON TABLE storage.buckets TO authenticated; -GRANT ALL ON TABLE storage.buckets TO anon; - - --- --- Name: TABLE buckets_analytics; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.buckets_analytics TO service_role; -GRANT ALL ON TABLE storage.buckets_analytics TO authenticated; -GRANT ALL ON TABLE storage.buckets_analytics TO anon; - - --- --- Name: TABLE buckets_vectors; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT SELECT ON TABLE storage.buckets_vectors TO service_role; -GRANT SELECT ON TABLE storage.buckets_vectors TO authenticated; -GRANT SELECT ON TABLE storage.buckets_vectors TO anon; - - --- --- Name: TABLE iceberg_namespaces; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.iceberg_namespaces TO service_role; -GRANT SELECT ON TABLE storage.iceberg_namespaces TO authenticated; -GRANT SELECT ON TABLE storage.iceberg_namespaces TO anon; - - --- --- Name: TABLE iceberg_tables; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.iceberg_tables TO service_role; -GRANT SELECT ON TABLE storage.iceberg_tables TO authenticated; -GRANT SELECT ON TABLE storage.iceberg_tables TO anon; - - --- --- Name: TABLE objects; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.objects TO postgres WITH GRANT OPTION; -GRANT ALL ON TABLE storage.objects TO service_role; -GRANT ALL ON TABLE storage.objects TO authenticated; -GRANT ALL ON TABLE storage.objects TO anon; - - --- --- Name: TABLE s3_multipart_uploads; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.s3_multipart_uploads TO service_role; -GRANT SELECT ON TABLE storage.s3_multipart_uploads TO authenticated; -GRANT SELECT ON TABLE storage.s3_multipart_uploads TO anon; - - --- --- Name: TABLE s3_multipart_uploads_parts; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT ALL ON TABLE storage.s3_multipart_uploads_parts TO service_role; -GRANT SELECT ON TABLE storage.s3_multipart_uploads_parts TO authenticated; -GRANT SELECT ON TABLE storage.s3_multipart_uploads_parts TO anon; - - --- --- Name: TABLE vector_indexes; Type: ACL; Schema: storage; Owner: supabase_storage_admin --- - -GRANT SELECT ON TABLE storage.vector_indexes TO service_role; -GRANT SELECT ON TABLE storage.vector_indexes TO authenticated; -GRANT SELECT ON TABLE storage.vector_indexes TO anon; - - --- --- Name: TABLE hooks; Type: ACL; Schema: supabase_functions; Owner: supabase_functions_admin --- - -GRANT ALL ON TABLE supabase_functions.hooks TO postgres; -GRANT ALL ON TABLE supabase_functions.hooks TO anon; -GRANT ALL ON TABLE supabase_functions.hooks TO authenticated; -GRANT ALL ON TABLE supabase_functions.hooks TO service_role; - - --- --- Name: SEQUENCE hooks_id_seq; Type: ACL; Schema: supabase_functions; Owner: supabase_functions_admin --- - -GRANT ALL ON SEQUENCE supabase_functions.hooks_id_seq TO postgres; -GRANT ALL ON SEQUENCE supabase_functions.hooks_id_seq TO anon; -GRANT ALL ON SEQUENCE supabase_functions.hooks_id_seq TO authenticated; -GRANT ALL ON SEQUENCE supabase_functions.hooks_id_seq TO service_role; - - --- --- Name: TABLE migrations; Type: ACL; Schema: supabase_functions; Owner: supabase_functions_admin --- - -GRANT ALL ON TABLE supabase_functions.migrations TO postgres; -GRANT ALL ON TABLE supabase_functions.migrations TO anon; -GRANT ALL ON TABLE supabase_functions.migrations TO authenticated; -GRANT ALL ON TABLE supabase_functions.migrations TO service_role; - - --- --- Name: TABLE secrets; Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT SELECT,REFERENCES,DELETE,TRUNCATE ON TABLE vault.secrets TO postgres WITH GRANT OPTION; -GRANT SELECT,DELETE ON TABLE vault.secrets TO service_role; - - --- --- Name: TABLE decrypted_secrets; Type: ACL; Schema: vault; Owner: supabase_admin --- - -GRANT SELECT,REFERENCES,DELETE,TRUNCATE ON TABLE vault.decrypted_secrets TO postgres WITH GRANT OPTION; -GRANT SELECT,DELETE ON TABLE vault.decrypted_secrets TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: auth; Owner: supabase_auth_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON SEQUENCES TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: auth; Owner: supabase_auth_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON FUNCTIONS TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: auth; Owner: supabase_auth_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_auth_admin IN SCHEMA auth GRANT ALL ON TABLES TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: cron; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA cron GRANT ALL ON SEQUENCES TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: cron; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA cron GRANT ALL ON FUNCTIONS TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: cron; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA cron GRANT ALL ON TABLES TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: extensions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA extensions GRANT ALL ON SEQUENCES TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: extensions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA extensions GRANT ALL ON FUNCTIONS TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: extensions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA extensions GRANT ALL ON TABLES TO postgres WITH GRANT OPTION; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: graphql; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: graphql; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: graphql; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: graphql_public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: graphql_public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: graphql_public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA graphql_public GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: realtime; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON SEQUENCES TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: realtime; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON FUNCTIONS TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: realtime; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA realtime GRANT ALL ON TABLES TO dashboard_user; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: storage; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: storage; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: storage; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA storage GRANT ALL ON TABLES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: supabase_functions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON SEQUENCES TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: supabase_functions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON FUNCTIONS TO service_role; - - --- --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: supabase_functions; Owner: supabase_admin --- - -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA supabase_functions GRANT ALL ON TABLES TO service_role; - - --- --- Name: issue_graphql_placeholder; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin --- - -CREATE EVENT TRIGGER issue_graphql_placeholder ON sql_drop - WHEN TAG IN ('DROP EXTENSION') - EXECUTE FUNCTION extensions.set_graphql_placeholder(); - - -ALTER EVENT TRIGGER issue_graphql_placeholder OWNER TO supabase_admin; - --- --- Name: issue_pg_cron_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin --- - -CREATE EVENT TRIGGER issue_pg_cron_access ON ddl_command_end - WHEN TAG IN ('CREATE EXTENSION') - EXECUTE FUNCTION extensions.grant_pg_cron_access(); - - -ALTER EVENT TRIGGER issue_pg_cron_access OWNER TO supabase_admin; - --- --- Name: issue_pg_graphql_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin --- - -CREATE EVENT TRIGGER issue_pg_graphql_access ON ddl_command_end - WHEN TAG IN ('CREATE FUNCTION') - EXECUTE FUNCTION extensions.grant_pg_graphql_access(); - - -ALTER EVENT TRIGGER issue_pg_graphql_access OWNER TO supabase_admin; - --- --- Name: issue_pg_net_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin --- - -CREATE EVENT TRIGGER issue_pg_net_access ON ddl_command_end - WHEN TAG IN ('CREATE EXTENSION') - EXECUTE FUNCTION extensions.grant_pg_net_access(); - - -ALTER EVENT TRIGGER issue_pg_net_access OWNER TO supabase_admin; - --- --- Name: pgrst_ddl_watch; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin --- - -CREATE EVENT TRIGGER pgrst_ddl_watch ON ddl_command_end - EXECUTE FUNCTION extensions.pgrst_ddl_watch(); - - -ALTER EVENT TRIGGER pgrst_ddl_watch OWNER TO supabase_admin; - --- --- Name: pgrst_drop_watch; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin --- - -CREATE EVENT TRIGGER pgrst_drop_watch ON sql_drop - EXECUTE FUNCTION extensions.pgrst_drop_watch(); - - -ALTER EVENT TRIGGER pgrst_drop_watch OWNER TO supabase_admin; - --- --- PostgreSQL database dump complete --- - -\unrestrict ABfzP9IZJ8pAzvgt6E9jKpFn1phQ3b3Lgk09BZZTle5el6ODr77nIXlXnCf1PS1 - diff --git a/database-novo/seeds/seed_030_dev_phases_items.sql b/database-novo/seeds/seed_030_dev_phases_items.sql new file mode 100644 index 0000000..16abca2 --- /dev/null +++ b/database-novo/seeds/seed_030_dev_phases_items.sql @@ -0,0 +1,229 @@ +-- ============================================================================= +-- Seed 030 — dev_roadmap_phases + dev_roadmap_items +-- Importa Fase 1 / 2 / 3 do development/04-roadmap/ROADMAP.md +-- ============================================================================= +-- ATENÇÃO: este seed faz TRUNCATE RESTART IDENTITY CASCADE. +-- Re-rodá-lo **apaga** edições feitas na UI (roadmap). Rode só no 1º setup ou +-- depois de confirmar que quer redefinir. +-- ============================================================================= + +BEGIN; + +TRUNCATE TABLE public.dev_roadmap_items RESTART IDENTITY CASCADE; +TRUNCATE TABLE public.dev_roadmap_phases RESTART IDENTITY CASCADE; + +-- ----------------------------------------------------------------------------- +-- Fases +-- ----------------------------------------------------------------------------- +INSERT INTO public.dev_roadmap_phases (numero, nome, objetivo, timeline_sugerida, criterio_saida, status, ordem) VALUES +(1, 'MVP Launch', + 'Ter um produto cobrável, confiável, completo o suficiente pra um terapeuta solo trocar Psicomanager/PsicoPlanner pelo AgenciaPsi.', + '4-6 semanas', + '5 usuários pagantes em produção sem churn por "falta de feature básica".', + 'em_andamento', 1), +(2, 'Paridade Competitiva', + 'Qualquer usuário avaliando AgenciaPsi × Psicomanager × PsicoPlanner deve ver paridade ou mais de features. Nenhum "ah, mas lá tem X" válido.', + '2-3 meses após Fase 1', + 'Feature checklist empatada com top-3 concorrentes nichados.', + 'planejada', 2), +(3, 'Diferenciação IA-first', + 'Ter 2-3 features que nenhum concorrente BR tem em paridade. Virar marketing: "o sistema com IA pra psicólogos".', + '3-6 meses após Fase 2', + 'Justificar tier premium 2x mais caro que o básico.', + 'planejada', 3); + +-- ----------------------------------------------------------------------------- +-- FASE 1 — MVP Launch (18 items) +-- ----------------------------------------------------------------------------- + +-- 1.1 Monetização (bloqueador) +INSERT INTO public.dev_roadmap_items (phase_id, numero, bloco, feature, descricao, esforco, prioridade, status, ordem) VALUES +(1, 1, 'Monetização', 'Integração com gateway de pagamento', + 'Asaas ou Iugu (PIX + cartão + boleto nativos). Escolher 1. Stripe só se for internacional depois.', + 'L', 'bloqueador', 'pendente', 1), +(1, 2, 'Monetização', 'Cartão on file (tokenização)', + 'Desdobra do gateway — salvar cartão do paciente pra cobranças recorrentes.', + 'M', 'bloqueador', 'pendente', 2), +(1, 3, 'Monetização', 'Auto-billing recorrente', + 'Trigger: sessão realizada → gera fatura → cobra automaticamente no cartão on file.', + 'M', 'bloqueador', 'pendente', 3), +(1, 4, 'Monetização', 'Cobrança das próprias assinaturas SaaS', + 'Tenants pagam pelo plano via gateway. Aproveita estrutura de subscriptions que já existe.', + 'M', 'bloqueador', 'pendente', 4), + +-- 1.2 Compliance básico BR +(1, 5, 'Compliance BR', 'Tipo de registro profissional', + 'Campo obrigatório no cadastro (CRP, CRM, CRFa, RMS…). Aparece em recibos/laudos.', + 'S', 'bloqueador', 'pendente', 5), +(1, 6, 'Compliance BR', 'Biblioteca de consent forms editáveis', + 'Templates pré-prontos: TCLE, Telehealth, LGPD, Gravação, TCLE menores. Profissional customiza.', + 'M', 'bloqueador', 'pendente', 6), +(1, 7, 'Compliance BR', 'Assinatura eletrônica pelo paciente no portal', + 'Simples — IP + timestamp. Não precisa ICP-Brasil nesta fase.', + 'M', 'bloqueador', 'pendente', 7), +(1, 8, 'Compliance BR', 'Nome social no cadastro', + 'Além do nome de registro. CFP exige. Aparece em todas as telas voltadas ao paciente.', + 'S', 'bloqueador', 'pendente', 8), +(1, 9, 'Compliance BR', 'Especialidades no cadastro do profissional', + 'Lista pré-definida + "outra". DB: tabela specialties + FK em profiles.', + 'S', 'bloqueador', 'pendente', 9), + +-- 1.3 UX mínima esperada +(1, 10, 'UX mínima', 'Busca global no topbar', + 'Paciente, email, telefone. Autocomplete com debounce + highlight.', + 'S', 'alta', 'pendente', 10), +(1, 11, 'UX mínima', 'Recently viewed (últimos 5 pacientes)', + 'Por usuário. localStorage ou tabela user_recent_access.', + 'S', 'alta', 'pendente', 11), +(1, 12, 'UX mínima', 'Papel timbrado', + 'Portar do UniaoApp (já existe noutro projeto) — só adaptar pro AgenciaPsi.', + 'M', 'alta', 'pendente', 12), +(1, 13, 'UX mínima', 'Relatórios com export PDF/Excel', + 'Fechar gaps que o MVP assessment apontou. Estrutura já existe.', + 'M', 'alta', 'pendente', 13), + +-- 1.4 Fiscal mínimo +(1, 14, 'Fiscal mínimo', 'Recibo profissional (PDF)', + 'Gerado com dados CFP (nome, CRP, especialidade, tenant). Já tem base de documentos — formalizar template.', + 'S', 'alta', 'pendente', 14), +(1, 15, 'Fiscal mínimo', 'NFS-e emissão', + 'Integração Focus NF-e ou NFS-e direto da prefeitura. Pode empurrar pra 1.5 se apertar prazo. Diferencia de Psicomanager.', + 'L', 'alta', 'pendente', 15), + +-- 1.5 Qualidade pra lançar +(1, 16, 'Qualidade', 'Testes E2E dos fluxos críticos', + 'Playwright ou Cypress. Prioridade: cadastro, login, agendamento, cobrança, prontuário.', + 'L', 'alta', 'pendente', 16), +(1, 17, 'Qualidade', 'Responsividade mobile validada', + 'Terapeuta consulta agenda no celular. Auditoria de breakpoints + fix.', + 'M', 'alta', 'pendente', 17), +(1, 18, 'Qualidade', 'Monitoramento de produção', + 'Sentry + Supabase dashboards. Detectar bugs antes do usuário reclamar.', + 'S', 'alta', 'pendente', 18); + +-- ----------------------------------------------------------------------------- +-- FASE 2 — Paridade Competitiva (16 items) +-- ----------------------------------------------------------------------------- + +-- 2.1 Comunicação / Engajamento +INSERT INTO public.dev_roadmap_items (phase_id, numero, bloco, feature, descricao, esforco, prioridade, status, ordem) VALUES +(2, 19, 'Comunicação / Engajamento', 'Agenda diária automática 7h via WhatsApp', + 'Cron job + template. Feature signature do PsicoPlanner.', + 'S', 'alta', 'pendente', 1), +(2, 20, 'Comunicação / Engajamento', 'Confirmação de presença pelo paciente', + 'Parser de resposta WhatsApp/SMS ("SIM") → atualiza status da sessão.', + 'M', 'alta', 'pendente', 2), +(2, 21, 'Comunicação / Engajamento', 'Rastreamento de engajamento em tempo real', + 'Webhooks da Evolution API → dashboard (recebeu/leu/respondeu).', + 'M', 'alta', 'pendente', 3), +(2, 22, 'Comunicação / Engajamento', 'Envio de prescrição/documento via WhatsApp direto', + 'Botão "Enviar via WA" gerando link temporário pro documento.', + 'S', 'alta', 'pendente', 4), + +-- 2.2 Prontuário +(2, 23, 'Prontuário', 'Templates de nota (SOAP / DAP / BIRP / CFP)', + 'Biblioteca com templates selecionáveis ao criar evolução.', + 'M', 'alta', 'pendente', 5), +(2, 24, 'Prontuário', 'Biblioteca de instrumentos de avaliação', + 'GAD-7, PHQ-9, BDI, BAI, DASS-21, SRQ-20 com scoring automático + gráfico de evolução.', + 'L', 'alta', 'pendente', 6), +(2, 25, 'Prontuário', 'Histórico em gráfico/tabela', + 'Evolução de escalas ao longo do tempo. Chart.js já no projeto.', + 'M', 'alta', 'pendente', 7), +(2, 26, 'Prontuário', 'Versionamento de notas', + 'Auditoria de alterações + diff visual.', + 'M', 'media', 'pendente', 8), + +-- 2.3 Intake / Onboarding +(2, 27, 'Intake / Onboarding', 'Pacote de intake pré-1ª-sessão', + 'Formulários + anamnese + consent forms enviados ao paciente antes da 1ª sessão. Fluxo: terapeuta monta pacote → paciente recebe link → preenche → assina → terapeuta vê tudo.', + 'M', 'media', 'pendente', 9), +(2, 28, 'Intake / Onboarding', 'Upload de arquivo pelo paciente', + 'Exames, relatórios externos. Storage bucket já configurado.', + 'S', 'media', 'pendente', 10), + +-- 2.4 Agenda / Integrações +(2, 29, 'Agenda / Integrações', 'Google Calendar 2-way sync', + 'API OAuth + conflict resolution. Feature mais pedida.', + 'L', 'media', 'pendente', 11), +(2, 30, 'Agenda / Integrações', 'iCal feed (Apple Calendar / Outlook)', + 'Endpoint que serve .ics. Read-only.', + 'S', 'media', 'pendente', 12), + +-- 2.5 Fiscal avançado BR +(2, 31, 'Fiscal avançado BR', 'Assinatura digital ICP-Brasil', + 'Laudos com validade jurídica. Integração com ValidCertificadora ou similar.', + 'L', 'media', 'pendente', 13), +(2, 32, 'Fiscal avançado BR', 'Faturamento TISS básico', + 'Pra clínicas que têm convênio. Nichado — só se tier clínica/rede for prioridade. Recomendado NÃO fazer nesta fase.', + 'XL', 'media', 'pendente', 14), + +-- 2.6 Marketing / Presença +(2, 33, 'Marketing / Presença', 'Perfil público do terapeuta', + 'Página /p/ com bio, horários, agendamento. Já tem agendador público — só enriquecer.', + 'M', 'media', 'pendente', 15), +(2, 34, 'Marketing / Presença', 'SEO básico', + 'schema.org/MedicalBusiness + meta tags. Melhora descoberta orgânica.', + 'S', 'media', 'pendente', 16); + +-- ----------------------------------------------------------------------------- +-- FASE 3 — Diferenciação IA-first (14 items) +-- ----------------------------------------------------------------------------- + +-- 3.1 IA +INSERT INTO public.dev_roadmap_items (phase_id, numero, bloco, feature, descricao, esforco, prioridade, status, ordem) VALUES +(3, 35, 'IA', 'Bot WhatsApp que agenda sozinho', + 'Equivalente Amélia Agendamento da Amplimed. Stack: Evolution API + LLM + RAG na disponibilidade da agenda. ROI: 24/7 sem recepcionista.', + 'XL', 'diferencial', 'pendente', 1), +(3, 36, 'IA', 'Transcrição de sessão áudio→texto', + 'Equivalente AI Scribe do Jane / Amélia Transcrição. Whisper API ou Deepgram. Paciente consente. Transcrição vira rascunho de nota.', + 'L', 'diferencial', 'pendente', 2), +(3, 37, 'IA', 'Copilot no prontuário', + 'Resumir histórico, sugerir diagnóstico diferencial, busca semântica em notas anteriores. RAG em cima das notas do paciente.', + 'L', 'diferencial', 'pendente', 3), +(3, 38, 'IA', 'Gerador de documentos com compliance CFP', + 'Equivalente PsiAssist do PsicoPlanner. LLM com system prompt CFP + templates.', + 'M', 'diferencial', 'pendente', 4), + +-- 3.2 Teleconsulta nativa +(3, 39, 'Teleconsulta', 'Vídeo nativo integrado', + 'Daily.co ou Jitsi Meet. Sala gerada por consulta + link no lembrete.', + 'L', 'diferencial', 'pendente', 5), +(3, 40, 'Teleconsulta', 'Sala de espera virtual', + 'Profissional admite paciente quando estiver pronto.', + 'M', 'diferencial', 'pendente', 6), +(3, 41, 'Teleconsulta', 'Whiteboard digital + screen share', + 'Daily.co tem nativo. Útil pra TCC visual e crianças.', + 'M', 'diferencial', 'pendente', 7), + +-- 3.3 Rede / Multi-unidade +(3, 42, 'Rede / Multi-unidade', 'Multi-unidade / filiais com Main Office', + 'Tabela clinic_units + FK em consultas/profissionais. Só se posicionar pra tier enterprise.', + 'L', 'diferencial', 'pendente', 8), +(3, 43, 'Rede / Multi-unidade', 'Salas e equipamentos como recursos', + 'Estilo Jane App. Evita double-booking.', + 'M', 'diferencial', 'pendente', 9), +(3, 44, 'Rede / Multi-unidade', 'CRM de leads', + 'Captura de landing → funil → matching com terapeuta. Aproveita perfil público da Fase 2.', + 'L', 'diferencial', 'pendente', 10), +(3, 45, 'Rede / Multi-unidade', 'BI avançado', + 'MRR, cohort retention, LTV por terapeuta. Dashboards dedicados.', + 'M', 'diferencial', 'pendente', 11), + +-- 3.4 UX premium / diferenciação fina +(3, 46, 'UX premium', 'Website builder pra clínica', + 'Estilo Jane — sem precisar de Wix/WordPress. Grande mas ROI de marketing enorme.', + 'XL', 'diferencial', 'pendente', 12), +(3, 47, 'UX premium', 'App mobile (PWA otimizado)', + 'Paciente instala no celular. Vue já dá PWA grátis, só polir.', + 'M', 'diferencial', 'pendente', 13), +(3, 48, 'UX premium', 'Migração assistida de Psicomanager', + 'Importador de CSV/API. Feature de venda: "deixa o outro, a gente migra".', + 'M', 'diferencial', 'pendente', 14); + +COMMIT; + +-- Log +INSERT INTO public.dev_generation_log (tipo, comando, sucesso, metadata) +VALUES ('seed', 'seed_030_dev_phases_items.sql', true, + jsonb_build_object('phases', 3, 'items', 48, 'source', 'development/04-roadmap/ROADMAP.md')); diff --git a/database-novo/seeds/seed_031_dev_auditoria.sql b/database-novo/seeds/seed_031_dev_auditoria.sql new file mode 100644 index 0000000..fec2129 --- /dev/null +++ b/database-novo/seeds/seed_031_dev_auditoria.sql @@ -0,0 +1,142 @@ +-- ============================================================================= +-- Seed 031 — dev_auditoria_items +-- Importa bugs/débitos técnicos do development/02-auditoria/AUDITORIA.md +-- ============================================================================= +-- ATENÇÃO: TRUNCATE RESTART IDENTITY — re-rodar apaga edições na UI. +-- ============================================================================= + +BEGIN; + +TRUNCATE TABLE public.dev_auditoria_items RESTART IDENTITY CASCADE; + +-- ----------------------------------------------------------------------------- +-- Bugs e dívidas técnicas identificadas em 2026-03-11 (Sessões 1-4) +-- Fonte: AUDITORIA.md +-- ----------------------------------------------------------------------------- + +INSERT INTO public.dev_auditoria_items + (categoria, titulo, descricao_problema, solucao, severidade, status, resolvido_em, sessao_resolucao, arquivo_afetado, tags) +VALUES + +-- Bugs Críticos +('Bug crítico', + 'useRecurrence.js — variável occurrenceCount não declarada', + 'Branches custom_weekdays, monthly e yearly usavam occurrenceCount sem declará-la → ReferenceError em runtime. Nenhum dos três contava ocorrências anteriores ao range, então max_occurrences nunca funcionava corretamente.', + 'Cada branch ganhou let occurrenceCount = 0 + fase de pré-contagem de ruleStart até effStart.', + 'critico', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11', + 'src/features/agenda/composables/useRecurrence.js', + ARRAY['agenda','recorrencia','runtime-error']), + +('Bug crítico', + 'Exceção de remarcação fora do range não aparece', + 'loadExceptions só buscava original_date no range. Se original_date estivesse fora mas new_date caísse dentro, a sessão remarcada não aparecia.', + 'loadExceptions: duas queries paralelas — q1 (original_date no range) + q2 (reschedule com new_date no range). Mescladas e deduplicadas por id. expandRules post-pass: itera exceções não consumidas, injeta inbound reschedules.', + 'alto', 'resolvido', '2026-03-11', 'Sessão 3 — 2026-03-11', + 'src/features/agenda/composables/useRecurrence.js', + ARRAY['agenda','recorrencia','edge-case']), + +-- Segurança +('Segurança', + 'SQL dumps no repositório', + 'Dumps com dados sensíveis versionados no git.', + 'Removidos do tracking + adicionados ao .gitignore. Backups ficam em database-novo/backups/ (também gitignored).', + 'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11', + '.gitignore', + ARRAY['segurança','git','lgpd']), + +('Segurança', + 'useAgendaEvents — sem tenant_id em nenhuma operação', + 'Todas as operações CRUD de eventos faltavam filtro tenant_id → risco de vazamento cross-tenant.', + 'Adicionado filtro tenant_id em select/insert/update/delete + validação na composable.', + 'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11', + 'src/features/agenda/composables/useAgendaEvents.js', + ARRAY['multi-tenant','rls','segurança']), + +('Segurança', + 'loadRules em useRecurrence sem filtro tenant_id', + 'Regras de recorrência carregavam sem filtrar por tenant → possível leak.', + 'Filtro tenant_id adicionado em loadRules.', + 'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11', + 'src/features/agenda/composables/useRecurrence.js', + ARRAY['multi-tenant','segurança']), + +('Segurança', + 'console.log expõe dados de pacientes no browser', + 'Logs com PII (nome, CPF, email, telefone) sendo enviados ao console.', + 'Removidos console.log sensíveis. Logs restantes filtrados via wrapper que só loga em dev mode.', + 'alto', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11', + 'multiple', + ARRAY['segurança','lgpd','logs']), + +-- Arquitetura / Performance +('Arquitetura', + 'window.__guardsBound / window.__supabaseAuthListenerBound', + 'Uso de flags globais no window para evitar bind duplicado de listeners. Anti-pattern — vazamento de escopo + difícil debug.', + NULL, + 'medio', 'aberto', NULL, NULL, + 'src/router/guards.js', + ARRAY['arquitetura','global-state','refactor']), + +('Arquitetura', + 'globalRole do profiles sem cache no guard', + 'Guard fazia fetch do profile a cada navegação — N queries desnecessárias.', + 'Cache de globalRole no store com invalidation via Supabase auth state changes.', + 'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11', + 'src/router/guards.js', + ARRAY['performance','cache']), + +('Arquitetura', + 'Dois composables para a mesma entidade', + 'Duplicação: useAgendaEvents e outro composable fazendo a mesma coisa.', + 'Consolidado em um único useAgendaEvents. Outro removido.', + 'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11', + 'src/features/agenda/composables/', + ARRAY['refactor','duplicação']), + +('Arquitetura', + 'Dois mappers para agenda', + 'Duplicação: agendaMapper e outro mapper convertendo mesma estrutura.', + 'Unificados em um único agendaMapper canônico.', + 'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11', + 'src/features/agenda/mappers/', + ARRAY['refactor','duplicação']), + +('Performance', + 'N+1 Query — migração paciente_id → patient_id', + 'Queries em N+1 pattern durante transição de naming. Cada agenda_evento fazia query separada pra paciente.', + 'Migrados todos os queries pra usar JOIN em patient_id. Migration de schema unificou naming.', + 'alto', 'resolvido', '2026-03-11', 'Sessão 4 — 2026-03-11', + 'multiple', + ARRAY['performance','query','n+1']), + +-- Build / Produção +('Build', + 'Template Sakai removido — bundle de produção', + 'Bundle de produção carregando código do template Sakai que não era usado. Peso desnecessário.', + 'Cleanup do template, tree-shake manual dos componentes não usados.', + 'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11', + 'vite.config.mjs', + ARRAY['build','bundle-size']), + +('Dívida técnica', + 'Arquivos obsoletos no projeto', + 'Vários arquivos .vue/.js deprecated ou não importados ainda no repo, confundindo navegação.', + 'Parcial — alguns removidos, outros ainda a mapear.', + 'baixo', 'em_analise', NULL, NULL, + 'multiple', + ARRAY['cleanup','dívida-técnica']), + +('Produção', + 'Logs excessivos em produção', + 'Muitos console.log/console.trace rodando em prod degradando performance.', + 'Removidos console.trace em router.push e queries Supabase. Logs restantes condicionais a DEV mode.', + 'medio', 'resolvido', '2026-03-11', 'Sessão 4 — 2026-03-11', + 'multiple', + ARRAY['performance','logs','produção']); + +COMMIT; + +-- Log +INSERT INTO public.dev_generation_log (tipo, comando, sucesso, metadata) +VALUES ('seed', 'seed_031_dev_auditoria.sql', true, + jsonb_build_object('items', 14, 'abertos', 2, 'resolvidos', 12, 'source', 'development/02-auditoria/AUDITORIA.md')); diff --git a/database-novo/seeds/seed_032_dev_competitors.sql b/database-novo/seeds/seed_032_dev_competitors.sql new file mode 100644 index 0000000..1b0cf55 --- /dev/null +++ b/database-novo/seeds/seed_032_dev_competitors.sql @@ -0,0 +1,271 @@ +-- ============================================================================= +-- Seed 032 — dev_competitors + dev_competitor_features + dev_comparison_matrix +-- Importa benchmark do development/03-concorrentes/concorrentes.md +-- ============================================================================= +-- ATENÇÃO: TRUNCATE RESTART IDENTITY CASCADE — re-rodar apaga edições na UI. +-- ============================================================================= + +BEGIN; + +TRUNCATE TABLE public.dev_comparison_competitor_status RESTART IDENTITY CASCADE; +TRUNCATE TABLE public.dev_comparison_matrix RESTART IDENTITY CASCADE; +TRUNCATE TABLE public.dev_competitor_features RESTART IDENTITY CASCADE; +TRUNCATE TABLE public.dev_competitors RESTART IDENTITY CASCADE; + +-- ============================================================================= +-- 1. dev_competitors — 7 players +-- ============================================================================= +INSERT INTO public.dev_competitors + (slug, nome, pais, foco, pricing, posicionamento, url, ultima_pesquisa, ordem) +VALUES +('simplepractice', 'SimplePractice', 'EUA', + 'Mental health EHR', + 'USD ~29-99/mês por profissional (Essential, Plus). 30-day ou 7-day trial.', + '"Salesforce da saúde mental" — líder EUA com 20M+ clientes e 250k+ practitioners. HIPAA+HITRUST+PCI+BAA.', + 'https://www.simplepractice.com', + '2026-04-17', 1), + +('psicomanager', 'Psicomanager', 'BR', + 'Psicologia-first', + 'R$ ~50-150/mês/profissional (confirmar)', + 'O "padrão" do mercado brasileiro pra psicólogos. Site é SPA — info via exploração manual.', + 'https://psicomanager.com.br', + NULL, 2), + +('psicoplanner', 'PsicoPlanner', 'BR', + 'Psicologia-first', + 'Individual R$ 59/mês · Plus R$ 79 · Duo R$ 99 · Clínicas R$ 395 (até 5 profissionais)', + '"Psicólogo que odeia planilha" — simples, WhatsApp-first, IA nativa (PsiAssist com compliance CFP).', + 'https://psicoplanner.com.br', + '2026-04-17', 3), + +('iclinic', 'iClinic', 'BR', + 'Multispecialidade', + 'A confirmar', + 'EHR completo pro consultório/clínica médica BR. Psicólogos usam bastante apesar de não ser foco.', + 'https://iclinic.com.br', + '2026-04-17', 4), + +('amplimed', 'Amplimed', 'BR', + 'Multispecialidade com IA', + 'A confirmar', + '"IA que trabalha pela sua clínica" — suite Amélia (agendamento 24/7, transcrição, copilot) + TISS automatizado + NFS-e + ICP-Brasil.', + 'https://www.amplimed.com.br', + '2026-04-17', 5), + +('ninsaude', 'Ninsaúde', 'BR', + 'ERP clínico', + 'A confirmar', + 'ERP clínico completo (várias especialidades) — mais robusto/caro. Produtos satélites: CRM, Safe, Sign.', + 'https://ninsaude.com', + '2026-04-17', 6), + +('jane-app', 'Jane App', 'CA', + 'Practice management premium', + 'A confirmar (mercados CA, US, UK)', + '"O app mais amado pelos profissionais de saúde" — referência internacional de UX. AI Scribe + Jane Payments (online+POS físico) + HIPAA/PIPEDA/GDPR/SOC-2.', + 'https://jane.app', + '2026-04-17', 7); + +-- ============================================================================= +-- 2. dev_competitor_features — features por concorrente +-- ============================================================================= + +-- SimplePractice (fetched) +INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Compliance', 'HIPAA + HITRUST + PCI + BAA', 'Certificações de segurança top-tier', 'fetched', 'https://www.simplepractice.com/features/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Vídeo nativo integrado', 'Launch sessions direto do calendário, sem extra login', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Sala de espera virtual', 'Admit client quando pronto', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Digital whiteboard', 'Quadro branco colaborativo na sessão', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Video em grupo (até 15)', 'Sessões de grupo/terapia familiar', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Telehealth', 'Screen sharing + blurred background', 'Compartilhamento de tela e fundo desfocado', 'fetched', 'https://www.simplepractice.com/features/telehealth/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Self-scheduling', 'Paciente solicita/cancela/reagenda', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Paperless intake forms', 'Formulários de entrada preenchidos online', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Questionnaires (measures)', 'Instrumentos de medição (GAD-7, PHQ-9, etc)', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Portal em espanhol', 'Multi-idioma pro LATAM', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Secure messaging', 'Chat seguro terapeuta↔cliente', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Portal Paciente', 'Invoice payment pelo portal', 'Paciente paga fatura diretamente', 'fetched', 'https://www.simplepractice.com/features/client-portal/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Documentação', 'Biblioteca GAD-7/PHQ-9/BDI', 'Instrumentos validados com scoring', 'publico', NULL, NULL, true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Documentação', 'Consent forms assinados', 'Biblioteca editável + assinatura eletrônica via portal', 'observacao', NULL, '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Billing', 'AutoPay + Superbills', 'Cobrança automática + recibo detalhado', 'publico', NULL, NULL, false), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Onboarding', 'Credentialing grátis', 'Auxílio com credenciamento junto a seguradoras', 'fetched', 'https://www.simplepractice.com/features/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='simplepractice'), 'Onboarding', 'Switching Assistance', 'Suporte de migração de outra plataforma', 'fetched', 'https://www.simplepractice.com/features/', '2026-04-17', false); + +-- Psicomanager (publico only - site SPA) +INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, destaque) VALUES +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Agenda', 'Agenda online/presencial + recorrências', 'Agenda nativa multi-profissional', 'publico', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Prontuário', 'Prontuário eletrônico', 'Anamnese + evolução + sessões', 'publico', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Financeiro', 'Cobranças via PIX/cartão', 'Gateway a confirmar (Asaas? Iugu?)', 'publico', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Comunicação', 'Lembretes Email/SMS/WhatsApp', 'Sistema de notificações', 'publico', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Fiscal', 'Recibo / NFSe', 'Emissão de nota fiscal de serviço', 'publico', true), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Telehealth', 'Teleconsulta integrada', 'Próprio ou via parceiro (confirmar)', 'publico', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Portal Paciente', 'Portal do Paciente', 'Visão das sessões/faturas', 'publico', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Documentação', 'Documentos / atestados', 'Laudos, declarações', 'publico', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Compliance', 'LGPD compliance', 'Consentimento de dados', 'publico', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicomanager'), 'Multi-profissional', 'Gestão de clínica multi-pro', 'Multi-terapeuta na mesma instância', 'publico', false); + +-- PsicoPlanner (fetched) +INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES +((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Comunicação', 'Lembretes WhatsApp ilimitados', 'Personalizáveis por profissional', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Comunicação', 'Agenda diária automática 7h via WhatsApp', 'Push automático do cronograma do dia — diferencial', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Comunicação', 'Rastreamento engajamento tempo real', 'Recebeu/leu/respondeu', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Telehealth', 'Sala de vídeo integrada', 'Nativa no app', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Prontuário', 'Prontuários + anamnese customizáveis', 'Adaptável à metodologia do profissional', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Agenda', 'Autoagendamento por link', 'Paciente escolhe horário', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'Financeiro', 'Gestão financeira visual', 'Pagamentos, recebidos, pendentes', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='psicoplanner'), 'IA', 'PsiAssist AI com compliance CFP', 'Gera relatórios/documentos/resumos com regras CFP', 'fetched', 'https://psicoplanner.com.br/', '2026-04-17', true); + +-- iClinic (fetched) +INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES +((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prontuário', 'Histórico de valores (gráfico/tabela)', 'Evolução de dados do paciente', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prontuário', 'Campos personalizados por especialidade', 'Adaptável a qualquer medicina', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prontuário', 'Assinatura digital com validade jurídica', 'Documentação assinada juridicamente', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prontuário', 'CID-10 integrado', 'Consulta de códigos internacionais', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Prescrição', 'Prescrição eletrônica com envio WhatsApp', 'Base de medicamentos + envio direto', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Documentos', 'Modelos com campos automáticos', 'Preenchimento automático de dados do paciente', 'fetched', 'https://iclinic.com.br/funcionalidades/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Marketing', 'Marketing Médico (email campaigns)', 'Otimização de experiência do paciente', 'fetched', 'https://iclinic.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='iclinic'), 'Operação', 'Módulo Recepcionista', 'Fluxo de atendimento', 'fetched', 'https://iclinic.com.br/', '2026-04-17', false); + +-- Amplimed (fetched) — AI-heavy +INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'IA', 'Amélia Agendamento (bot WhatsApp 24/7)', 'Atende e responde pacientes via WhatsApp com sincronização automática da agenda', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'IA', 'Amélia Transcrição (áudio→texto)', 'Converte áudio em texto e preenche prontuário automaticamente', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'IA', 'Amélia Copilot (prontuário)', 'Localiza, resume e organiza info do paciente', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Agenda', 'Agenda inteligente (redução 38% ausências)', 'ML pra otimização', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Fiscal', 'Faturamento TISS (99% menos glosas)', 'Padrão automático de validação', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Fiscal', 'NFS-e emissão integrada', 'Simplificada ao faturamento', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Fiscal', 'Certificado Digital ICP-Brasil', 'Assinatura com validade jurídica', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Telehealth', 'Teleconsulta E2E + prescrição digital', 'Criptografia ponta a ponta', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Comunicação', 'WhatsApp Connect + SMS', 'Mensagens personalizadas automáticas', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='amplimed'), 'Operação', 'Painel de chamados (TV recepção)', 'Fluxo organizado com exibição pública', 'fetched', 'https://www.amplimed.com.br/', '2026-04-17', false); + +-- Ninsaúde (fetched) +INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Prontuário', 'Prontuário Eletrônico', 'Registro digital estruturado', 'fetched', 'https://ninsaude.com/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Financeiro', 'Faturamento de Convênios', 'Integração com planos de saúde', 'fetched', 'https://ninsaude.com/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Operação', 'Controle de Estoque', 'Medicamentos e materiais', 'fetched', 'https://ninsaude.com/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'CRM', 'Ninsaúde CRM', 'Gestão de leads e funil', 'fetched', 'https://ninsaude.com/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Segurança', 'Ninsaúde Safe', 'Produto satélite de segurança', 'fetched', 'https://ninsaude.com/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Documentos', 'Ninsaúde Sign', 'Assinatura digital', 'fetched', 'https://ninsaude.com/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Cadastro', 'Nome Social', 'Respeita identidade de gênero', 'fetched', 'https://ninsaude.com/', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'BI', 'Análise Inteligente', 'Relatórios e insights da operação', 'fetched', 'https://ninsaude.com/', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='ninsaude'), 'Retenção', 'Retenção de Pacientes automatizada', 'Estratégias automatizadas', 'fetched', 'https://ninsaude.com/', '2026-04-17', false); + +-- Jane App (fetched) +INSERT INTO public.dev_competitor_features (competitor_id, categoria, nome, descricao, fonte, fonte_url, data_fonte, destaque) VALUES +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Agenda', 'Online Booking com branding', 'Site visita → consulta marcada 24/7', 'fetched', 'https://jane.app/features', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Agenda', 'Staff Scheduling multi-location', 'Serviços, salas, recursos, waitlist na mesma visão', 'fetched', 'https://jane.app/features', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Documentação', 'Template library (SOAP, forms, surveys)', 'Customizável por tipo de clínica', 'fetched', 'https://jane.app/features', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'IA', 'AI Scribe (grava e gera nota)', 'Record/dictate e rascunho em minutos', 'fetched', 'https://jane.app/features', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Telehealth', 'Telehealth até 12 clientes', 'Video HIPAA-compliant', 'fetched', 'https://jane.app/features', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Pagamentos', 'Jane Payments (online + terminal POS)', 'PCI-compliant', 'fetched', 'https://jane.app/features', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Fiscal', 'Insurance eligibility + claims (CA/US/UK)', 'Multi-região', 'fetched', 'https://jane.app/features', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'BI', 'Real-time dashboards', 'Métricas de saúde do negócio', 'fetched', 'https://jane.app/features', '2026-04-17', false), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Compliance', 'HIPAA + PIPEDA + GDPR + SOC-2', 'Certificações multi-região', 'fetched', 'https://jane.app/features', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Marketing', 'Website Builder com IA', 'Cria site da clínica auto-sincronizado', 'fetched', 'https://jane.app/features', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Onboarding', 'Migração de dados grátis', 'Feature de venda', 'fetched', 'https://jane.app/features', '2026-04-17', true), +((SELECT id FROM public.dev_competitors WHERE slug='jane-app'), 'Suporte', 'Suporte ilimitado phone/email/chat', 'Premium', 'fetched', 'https://jane.app/features', '2026-04-17', false); + +-- ============================================================================= +-- 3. dev_comparison_matrix — AgenciaPsi × features esperadas do mercado +-- ============================================================================= +INSERT INTO public.dev_comparison_matrix (dominio, feature, nosso_status, nossa_nota, importancia, ordem) VALUES +-- Cadastro/Clientes +('Pacientes', 'Cadastro de pacientes', 'tem', 'Completo', 'alta', 1), +('Pacientes', 'Grupos / Tags', 'tem', NULL, 'media', 2), +('Pacientes', 'Busca global no topbar', 'gap', 'Todos os concorrentes têm — quick win', 'alta', 3), +('Pacientes', 'Recently viewed (últimos acessados)', 'gap', 'Quick win de UX', 'media', 4), +('Pacientes', 'Merge de duplicatas', 'gap', NULL, 'baixa', 5), +('Pacientes', 'Nome social', 'a_definir', 'Validar se já temos — CFP/LGPD exige', 'alta', 6), + +-- Agenda +('Agenda', 'Agenda / Calendário', 'tem', 'FullCalendar completo', 'alta', 10), +('Agenda', 'Recorrências', 'tem', 'useRecurrence composable', 'alta', 11), +('Agenda', 'Agendamento online público', 'tem', NULL, 'alta', 12), +('Agenda', 'Google Calendar 2-way sync', 'gap', 'Fase 2', 'alta', 13), +('Agenda', 'iCal feed', 'gap', 'Fase 2 - quick win', 'media', 14), +('Agenda', 'Agenda diária 7h WhatsApp automática', 'gap', 'Diferencial PsicoPlanner - Fase 2', 'alta', 15), + +-- Teleconsulta +('Teleconsulta', 'Vídeo nativo integrado', 'gap', 'Fase 3 - aposta diferenciação', 'alta', 20), +('Teleconsulta', 'Sala de espera virtual', 'gap', 'Fase 3', 'media', 21), +('Teleconsulta', 'Screen sharing + whiteboard', 'gap', 'SimplePractice benchmark', 'media', 22), +('Teleconsulta', 'Video em grupo (5+ pessoas)', 'gap', 'SP faz até 15, Jane até 12', 'media', 23), + +-- Prontuário +('Prontuário', 'Prontuário eletrônico', 'tem', 'Completo', 'alta', 30), +('Prontuário', 'Templates de nota (SOAP/DAP/BIRP)', 'a_definir', 'Validar - Fase 2', 'alta', 31), +('Prontuário', 'Versionamento de notas', 'a_definir', 'Validar - Fase 2', 'media', 32), +('Prontuário', 'Biblioteca de avaliações (GAD-7/PHQ-9)', 'gap', 'Diferencial forte BR - Fase 2', 'alta', 33), +('Prontuário', 'Histórico em gráfico (evolução)', 'a_definir', 'Validar - Fase 2', 'media', 34), + +-- Compliance / Legal +('Compliance', 'Consent forms editáveis (TCLE etc)', 'gap', 'Bloqueador MVP - Fase 1', 'alta', 40), +('Compliance', 'Assinatura eletrônica paciente', 'gap', 'Fase 1', 'alta', 41), +('Compliance', 'Assinatura digital ICP-Brasil', 'gap', 'Fase 2', 'media', 42), +('Compliance', 'Papel timbrado', 'gap', 'Portar do UniaoApp - Fase 1', 'alta', 43), +('Compliance', 'Tipo de registro (CRP/CRM)', 'gap', 'Bloqueador MVP - Fase 1', 'alta', 44), +('Compliance', 'Especialidades no cadastro', 'gap', 'Bloqueador MVP - Fase 1', 'alta', 45), + +-- Intake / Onboarding +('Intake', 'Pacote de intake pré-1ª-sessão', 'parcial', 'Documentos existem, pacote estruturado não', 'media', 50), +('Intake', 'Upload de arquivo pelo paciente', 'a_definir', 'Validar no portal', 'media', 51), + +-- Financeiro +('Financeiro', 'Lançamentos financeiros', 'tem', 'Completo', 'alta', 60), +('Financeiro', 'Gateway de pagamento (Stripe/PIX)', 'gap', 'BLOQUEADOR MVP - Fase 1', 'alta', 61), +('Financeiro', 'Cartão on file', 'gap', 'Bloqueador MVP - Fase 1', 'alta', 62), +('Financeiro', 'Auto-billing recorrente', 'parcial', 'Recorrência de consulta sim, cobrança não', 'alta', 63), +('Financeiro', 'Superbill / recibo detalhado', 'parcial', 'Recibo existe, formato detalhado a validar', 'media', 64), +('Financeiro', 'NFS-e emissão', 'gap', 'Fase 1 (preferível) ou 2', 'alta', 65), +('Financeiro', 'Faturamento TISS', 'gap', 'Nichado - Fase 2+ se for enterprise', 'baixa', 66), + +-- Comunicação +('Comunicação', 'Lembretes Email/SMS/WhatsApp', 'tem', 'Completo', 'alta', 70), +('Comunicação', 'Confirmação do paciente ("SIM")', 'a_definir', 'Validar no sistema - Fase 2', 'media', 71), +('Comunicação', 'Rastreamento engajamento tempo real', 'gap', 'Diferencial PsicoPlanner - Fase 2', 'media', 72), + +-- Portal Paciente +('Portal Paciente', 'Portal do paciente autenticado', 'parcial', 'Existe mas limitado - expandir Fase 2', 'alta', 80), +('Portal Paciente', 'Self-scheduling no portal', 'parcial', 'Agendador público existe, portal autenticado não', 'media', 81), +('Portal Paciente', 'Push notifications (portal)', 'gap', NULL, 'baixa', 82), +('Portal Paciente', 'Portal multi-idioma (ES)', 'gap', 'Pensar pra LATAM', 'baixa', 83), +('Portal Paciente', 'Paciente paga fatura no portal', 'gap', 'Depende do gateway (Fase 1)', 'alta', 84), +('Portal Paciente', 'App mobile paciente', 'gap', 'PWA pode resolver - Fase 3', 'media', 85), + +-- Analytics +('Analytics', 'Dashboard com KPIs', 'tem', 'Existe mas pode ampliar', 'alta', 90), +('Analytics', 'Relatórios com export PDF/Excel', 'parcial', 'Estrutura existe, fechar na Fase 1', 'alta', 91), +('Analytics', 'BI avançado (MRR/cohort/LTV)', 'gap', 'Fase 3', 'baixa', 92), + +-- Supervisão +('Supervisão', 'Sala de Supervisão', 'parcial', 'Estrutura existe, features avançadas não', 'media', 100), +('Supervisão', 'Co-assinatura de supervisor em notas', 'gap', 'Fase 2+', 'media', 101), + +-- Infra / Multi-tenant +('Infra', 'Multi-tenant SaaS', 'tem', 'RLS por tenant_id em todas tabelas', 'alta', 110), +('Infra', 'Multi-unidade / filiais', 'gap', 'Fase 3 se for enterprise', 'baixa', 111), +('Infra', 'Compliance LGPD', 'parcial', 'RLS + logs, faltam políticas formais', 'alta', 112), + +-- Marketing +('Marketing', 'Perfil público do terapeuta', 'gap', 'Fase 2', 'media', 120), +('Marketing', 'SEO básico', 'gap', 'Fase 2', 'baixa', 121), +('Marketing', 'Website builder', 'gap', 'Fase 3 - Jane benchmark', 'baixa', 122), + +-- IA (tendência 2026) +('IA', 'Bot WhatsApp que agenda sozinho', 'gap', 'Diferencial Fase 3 - Amplimed benchmark', 'alta', 130), +('IA', 'Transcrição áudio→texto', 'gap', 'Diferencial Fase 3 - Jane/Amplimed', 'alta', 131), +('IA', 'Copilot no prontuário', 'gap', 'Diferencial Fase 3 - Amplimed', 'alta', 132), +('IA', 'Gerador de documentos (compliance CFP)', 'gap', 'Diferencial Fase 3 - PsicoPlanner benchmark', 'alta', 133); + +COMMIT; + +-- Log +INSERT INTO public.dev_generation_log (tipo, comando, sucesso, metadata) +VALUES ('seed', 'seed_032_dev_competitors.sql', true, + jsonb_build_object( + 'competitors', 7, + 'features', (SELECT count(*) FROM public.dev_competitor_features), + 'comparison_rows', (SELECT count(*) FROM public.dev_comparison_matrix), + 'source', 'development/03-concorrentes/concorrentes.md' + )); diff --git a/database-novo/supabase/backup_full.sql b/database-novo/supabase/backup_full.sql new file mode 100644 index 0000000000000000000000000000000000000000..2f52a48702706614526de09043a8c213a49aae75 GIT binary patch literal 234104 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 xSmC{=wMEwD%j=Wq6IV8^cQqzykFc%MDq>`FS4 zm2@&r9qD|3yys}u|Ni|mya>nPZFr;4PvQG8($9G~3tN3A`fS35u6z|%VX5!iFb!*6 z+33nBypQ)s`aKGj?$7lD=S<(PbnQlzYtg2^7y7mdi%3(6`^)e}coklUQ`zt)9PPB9 z>JB>FR(#y)tD+5Px)9YUTt^*OvTc|hkHa_NNjM0P!=XN3i)$hoTm8G;>0ZiTY&UOA z@+RC$4>}j3T8mV^XbmhV{xK+rnuq9S&ZOFawp+0-K(Sx z$+H+uY$JYNWVnZ|77L=6Ji)q4-Mf}-?t6JUlYI2AMMd6TC>N*7%dx({(qH7~2YpU- z4bSV9FcRJC@MHXaA`eI5W%x}Jjw0t9eSfQKe?)mF@}Iwn`BM5U^2z_-Ym!gGJINS@ zkMbICvQKMWnd%Du%=LW|GqqNJnpv=@uS7kThu6y7D#o7NlD~EQ>x1ra1%6_MJyaIm zKopK;^YJccmF`o!#CR?V%ka0jR}D_&n16Ijy(J(s#p&AwMuw$XzN<-JKs)lu(MM-}Po zl8|{WE4PwDB#1F`wvs+`=r_B#(f?y*f*hs}120VfMp9RzNZ2!$wNxd&U^udocb~`o zUe=N~(>RXNp!d+QkmU!uV>#}()#C&ou42sST_WaDU4&24W>HUGK}%j9Vu{Chtr+45 z*;w60&)0(28~vOqCwzm7+*8ALtuN+vIuNZ=bg5!rQXStsT^r#uHDaiR{b#a-N~1cc zwlme9FMTNQ_)e-Xr|!pC8p-QiC_$Z69oo4As?&RP1Uwd9e8_#&jBb<9<}Wxj%sOT* zJwnEOj*?<555RotFlopbVKa?Rrn~)Kwt6XRH}fwdiqg4wT-wy8q0emY(G9u!+LXj` zt%z320qD5c`I#xH;H4<)vpL11O?NJ8I^2+sIxK0>Hy zW~r%G($sZ>h8Mb@@Td=^=>)@kiwxN!b4{%!UE-itX5k-6KvTxxbpJrt(s!gA#eVr@ zDA`eZX*R87?<7)G5ovv#@@Ow(rfeR~WEt5Z=2*7A!-Kkf+k-%{mAJ`@_5H1Qh?}RU z#BflEjn6vTqXvnnq$^3b&D5siK3c0%wi4U(sDZlerDUcmo`cclEcCeOBD$M7OQe^< zHXL&7TUByco{9BTwxN|Psg9c#mYf%HEylhx=zI@q>^=vC@Yb(;fYZD0reH z;!HBD3#-GfiiKvOA7s-v)PhB59iNr*{HxcI&zJGf_De5Y#>s5GinwcCMSSw?tn0G< zn)!^KRMYv+ySC-X0n^j2@lZ*g<=Al}&1qB5=wWd)g!4G9g7J{en|WhcmU3j((XOYG z4~*k!$evB;?y<5=oY}nRPG9WfE>Y9do%RXxl4=93!wAsGrQKN;YAj5k)hKWU< zm@xKK$GJmSFZJt%?-1+gJSH(u%(l;36|k!gK3Fm9JGxyIMpO@2J!|DAqq+fy;3-Fn@1)P(dE7N%1Psc`DiT+0a zc0DmX`IO|v1$$X+y2-*laU)4SA6dV1pI)(|S4?vC~L;gLSyO3I^n(s~%a zi#dH5?=zg>I1J${DqyroM>*zWWu4fBSovI#gpI{^HFo{}X^Wyua$*BJbsS GWBotg5fJ+T literal 0 HcmV?d00001 diff --git a/database-novo/supabase/backup_volume_agenciapsi.tar.gz b/database-novo/supabase/backup_volume_agenciapsi.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c3dadfe772255783b327de19676d069b1ae635cf GIT binary patch literal 13144396 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
TlahVRvqQm}a_m^|VKRE(Hfm~#Bl@aa~{LGr$ z_t0iuyIUDgdnOegV9{rm`ovtJ)3hhnR8v)SrJ$< zk#VTPl1(5g%^&BUySQ@v+(ZN)3Ey3-&X+pPM`W<1@z%3u#bgv0LZe_ri zyftkycVXp)CvS7MrS)pC-KwMrPr`IkZ2wJ@g(#B+OHV-sgr(YtO60i7g3EGlvfTr; zrF@oSb=I)#bTf7)1<6r~G_yOIp*U|UPB%57o+t2m7RUHaliIHU+bplZ

twn-i&H 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 ?#xsd$ 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

$Y0Gvf@{wf*O5_PJvfI! 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 =o*Ng{RCfGl@&{40rnh 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

w@9L~S;i)@A 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%0DVQP z*b8L%4@k!|6~HLB)>$6W!yZrrmhf(94++DA`6;np(%uFE-F(wE&-;ViLw z7adi6p+q0=s$tsp#zIA14y*=(LR-Fd2IOOs9MCXZPJzqM9sI$`iJZYb`{Y@j+lkNX z#Q_NTVxX=)moIUhNumBIL%s1{+{f9thQ$gG>W)npr}02V55e{<_w4{NZY|#)=gp>9 zd`*d+a`6UvF{Q?+R}-5SHROvX%Q)U}DfW5Bf`hYKnI=58_Qgft8VhuBD%^#mzfg2s zM_2zzUskh_woB%K0pezOgvF20p_nj}lf@kBsUv~q70G#GHLK#=023-xQ&+0V~QUGaUo+H

$u_6d=I4fLV;ErOMrv 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�#k4njp*j$K6jtMxr{oOwLsrrbwu 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≥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

Carregando… @@ -2482,8 +2482,8 @@ function statusExtraClass(v) { padding: 0.75rem; } -/* ── tag: remarcar (roxo — sem severity nativo no PrimeVue) ─ */ -:deep(.tag-remarcar) { +/* ── tag: remarcado (roxo — sem severity nativo no PrimeVue) ─ */ +:deep(.tag-remarcado) { background: #a855f7 !important; color: #fff !important; } @@ -3302,7 +3302,7 @@ function statusExtraClass(v) { .serie-pill--cancelado { border-left-color: var(--surface-border); } -.serie-pill--remarcar { +.serie-pill--remarcado { border-left-color: var(--orange-400, #fb923c); } .serie-pill__date { diff --git a/src/features/agenda/components/BloqueioDialog.vue b/src/features/agenda/components/BloqueioDialog.vue index 3b77f7c..c274d81 100644 --- a/src/features/agenda/components/BloqueioDialog.vue +++ b/src/features/agenda/components/BloqueioDialog.vue @@ -207,7 +207,7 @@ async function confirmar() { const { error } = await supabase.from('agenda_bloqueios').insert(rows); if (error) throw error; - // Marcar sessões existentes como "remarcar" + // Marcar sessões existentes como "remarcado" await marcarSessoesParaRemarcar(rows); toast.add({ @@ -226,10 +226,10 @@ async function confirmar() { } async function marcarSessoesParaRemarcar(bloqueios) { - // Para cada bloqueio, tenta marcar sessões existentes como 'remarcar' + // Para cada bloqueio, tenta marcar sessões existentes como 'remarcado' for (const b of bloqueios) { try { - let query = supabase.from('agenda_eventos').update({ status: 'remarcar' }).eq('owner_id', props.ownerId).eq('tipo', 'sessao').gte('inicio_em', `${b.data_inicio}T00:00:00`).lte('inicio_em', `${b.data_fim}T23:59:59`); + let query = supabase.from('agenda_eventos').update({ status: 'remarcado' }).eq('owner_id', props.ownerId).eq('tipo', 'sessao').gte('inicio_em', `${b.data_inicio}T00:00:00`).lte('inicio_em', `${b.data_fim}T23:59:59`); if (b.hora_inicio && b.hora_fim) { // filtra pela hora aproximada — comparação UTC simplificada diff --git a/src/features/agenda/components/ProximosFeriadosCard.vue b/src/features/agenda/components/ProximosFeriadosCard.vue index 1435e53..1f55356 100644 --- a/src/features/agenda/components/ProximosFeriadosCard.vue +++ b/src/features/agenda/components/ProximosFeriadosCard.vue @@ -156,8 +156,8 @@ async function confirmarBloqueio(feriado) { const { error } = await supabase.from('agenda_bloqueios').insert([row]); if (error) throw error; - // Marcar sessões existentes no dia como 'remarcar' - await supabase.from('agenda_eventos').update({ status: 'remarcar' }).eq('owner_id', _ownerId.value).eq('tipo', 'sessao').gte('inicio_em', `${feriado.data}T00:00:00`).lte('inicio_em', `${feriado.data}T23:59:59`); + // Marcar sessões existentes no dia como 'remarcado' + await supabase.from('agenda_eventos').update({ status: 'remarcado' }).eq('owner_id', _ownerId.value).eq('tipo', 'sessao').gte('inicio_em', `${feriado.data}T00:00:00`).lte('inicio_em', `${feriado.data}T23:59:59`); bloqueiosDatas.value = new Set([...bloqueiosDatas.value, feriado.data]); toast.add({ diff --git a/src/features/agenda/composables/__tests__/useAgendaEvents.spec.js b/src/features/agenda/composables/__tests__/useAgendaEvents.spec.js new file mode 100644 index 0000000..245e04c --- /dev/null +++ b/src/features/agenda/composables/__tests__/useAgendaEvents.spec.js @@ -0,0 +1,155 @@ +/** + * useAgendaEvents.spec.js — T#9 + * + * Wrapper fino do agendaRepository. Cobertura focada nos contratos: + * - rows/loading/error reativos + * - delega I/O ao repository (nada de fetch direto) + * - sem ownerId, loadMyRange é no-op (proteção tenant scoping) + * - error é capturado em loadMyRange e zera rows; create/update/remove propagam + */ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +const listMock = vi.fn(); +const createMock = vi.fn(); +const updateMock = vi.fn(); +const removeMock = vi.fn(); + +vi.mock('@/features/agenda/services/agendaRepository', () => ({ + listMyAgendaEvents: (...a) => listMock(...a), + createAgendaEvento: (...a) => createMock(...a), + updateAgendaEvento: (...a) => updateMock(...a), + deleteAgendaEvento: (...a) => removeMock(...a) +})); + +const { useAgendaEvents } = await import('../useAgendaEvents.js'); + +beforeEach(() => { + listMock.mockReset(); + createMock.mockReset(); + updateMock.mockReset(); + removeMock.mockReset(); +}); + +describe('useAgendaEvents — estado inicial', () => { + it('rows vazio, loading false, error null', () => { + const { rows, loading, error } = useAgendaEvents(); + expect(rows.value).toEqual([]); + expect(loading.value).toBe(false); + expect(error.value).toBe(null); + }); +}); + +describe('loadMyRange', () => { + it('sem ownerId, não chama o repository (no-op de segurança)', async () => { + const { rows, loadMyRange } = useAgendaEvents(); + await loadMyRange('2026-01-01', '2026-01-31', null); + await loadMyRange('2026-01-01', '2026-01-31', ''); + await loadMyRange('2026-01-01', '2026-01-31', undefined); + expect(listMock).not.toHaveBeenCalled(); + expect(rows.value).toEqual([]); + }); + + it('chama listMyAgendaEvents com payload correto e popula rows', async () => { + listMock.mockResolvedValue([{ id: 'a' }, { id: 'b' }]); + const { rows, loading, loadMyRange } = useAgendaEvents(); + + const promise = loadMyRange('2026-01-01', '2026-01-31', 'u-1'); + // loading vira true durante a execução + expect(loading.value).toBe(true); + await promise; + + expect(listMock).toHaveBeenCalledWith({ + startISO: '2026-01-01', + endISO: '2026-01-31', + ownerId: 'u-1' + }); + expect(rows.value).toEqual([{ id: 'a' }, { id: 'b' }]); + expect(loading.value).toBe(false); + }); + + it('captura erro, zera rows e seta error.message', async () => { + listMock.mockRejectedValue(new Error('fetch fail')); + const { rows, loading, error, loadMyRange } = useAgendaEvents(); + + await loadMyRange('2026-01-01', '2026-01-31', 'u-1'); + + expect(rows.value).toEqual([]); + expect(loading.value).toBe(false); + expect(error.value).toBe('fetch fail'); + }); + + it('reseta error em call subsequente bem-sucedida', async () => { + listMock.mockRejectedValueOnce(new Error('first fail')).mockResolvedValueOnce([{ id: 'x' }]); + const { error, loadMyRange } = useAgendaEvents(); + + await loadMyRange('2026-01-01', '2026-01-31', 'u-1'); + expect(error.value).toBe('first fail'); + + await loadMyRange('2026-01-01', '2026-01-31', 'u-1'); + expect(error.value).toBe(null); + }); + + it('error sem message vira fallback string', async () => { + listMock.mockRejectedValue({}); // sem .message + const { error, loadMyRange } = useAgendaEvents(); + await loadMyRange('2026-01-01', '2026-01-31', 'u-1'); + expect(error.value).toBe('Erro ao carregar eventos'); + }); +}); + +describe('create / update / remove — delegação pura', () => { + it('create encaminha payload e retorna o resultado do repository', async () => { + createMock.mockResolvedValue({ id: 'new', titulo: 'X' }); + const { create } = useAgendaEvents(); + const result = await create({ titulo: 'X' }); + expect(createMock).toHaveBeenCalledWith({ titulo: 'X' }); + expect(result).toEqual({ id: 'new', titulo: 'X' }); + }); + + it('update encaminha id+patch e retorna o resultado', async () => { + updateMock.mockResolvedValue({ id: '42', titulo: 'updated' }); + const { update } = useAgendaEvents(); + const result = await update('42', { titulo: 'updated' }); + expect(updateMock).toHaveBeenCalledWith('42', { titulo: 'updated' }); + expect(result).toEqual({ id: '42', titulo: 'updated' }); + }); + + it('remove encaminha id (sem retorno)', async () => { + removeMock.mockResolvedValue(undefined); + const { remove } = useAgendaEvents(); + const result = await remove('99'); + expect(removeMock).toHaveBeenCalledWith('99'); + expect(result).toBeUndefined(); + }); + + it('create propaga erro (não engole)', async () => { + createMock.mockRejectedValue(new Error('insert blocked by RLS')); + const { create } = useAgendaEvents(); + await expect(create({ titulo: 'X' })).rejects.toThrow(/RLS/); + }); + + it('update propaga erro', async () => { + updateMock.mockRejectedValue(new Error('not found')); + const { update } = useAgendaEvents(); + await expect(update('1', { x: 1 })).rejects.toThrow(/not found/); + }); + + it('remove propaga erro', async () => { + removeMock.mockRejectedValue(new Error('cascade fail')); + const { remove } = useAgendaEvents(); + await expect(remove('1')).rejects.toThrow(/cascade/); + }); +}); + +describe('isolamento entre instâncias', () => { + it('cada useAgendaEvents() retorna refs independentes', async () => { + listMock.mockResolvedValue([{ id: 'a' }]); + const a = useAgendaEvents(); + const b = useAgendaEvents(); + + await a.loadMyRange('2026-01-01', '2026-01-31', 'u-1'); + + expect(a.rows.value).toEqual([{ id: 'a' }]); + expect(b.rows.value).toEqual([]); // b não foi tocado + }); +}); diff --git a/src/features/agenda/composables/useAgendaEvents.js b/src/features/agenda/composables/useAgendaEvents.js index c00d83d..8568474 100644 --- a/src/features/agenda/composables/useAgendaEvents.js +++ b/src/features/agenda/composables/useAgendaEvents.js @@ -16,75 +16,33 @@ */ /** * useAgendaEvents.js - * src/features/agenda/composables/useAgendaEvents.js * - * Gerencia apenas eventos reais (agenda_eventos). - * Sessões com recurrence_id são sessões reais de uma série. + * Wrapper fino sobre agendaRepository — agrega estado reativo (rows/loading/error) + * e delega toda a lógica de I/O ao repository. Mesmo padrão de useAgendaClinicEvents. + * + * Só gerencia eventos reais (agenda_eventos). Ocorrências virtuais de séries são + * responsabilidade do useRecurrence. */ import { ref } from 'vue'; -import { supabase } from '@/lib/supabase/client'; -import { useTenantStore } from '@/stores/tenantStore'; - -// ─── helpers internos ──────────────────────────────────────────────────────── - -function assertTenantId(tenantId) { - if (!tenantId || tenantId === 'null' || tenantId === 'undefined') { - throw new Error('Tenant ativo inválido. Selecione a clínica/tenant antes de operar na agenda.'); - } -} - -async function getUid() { - const { data, error } = await supabase.auth.getUser(); - if (error) throw error; - const uid = data?.user?.id; - if (!uid) throw new Error('Usuário não autenticado.'); - return uid; -} - -const BASE_SELECT = ` - id, owner_id, patient_id, tipo, status, - titulo, titulo_custom, observacoes, inicio_em, fim_em, - terapeuta_id, tenant_id, visibility_scope, - determined_commitment_id, link_online, extra_fields, modalidade, - recurrence_id, recurrence_date, - mirror_of_event_id, price, - insurance_plan_id, insurance_guide_number, insurance_value, insurance_plan_service_id, - patients!agenda_eventos_patient_id_fkey ( - id, nome_completo, avatar_url, status - ), - determined_commitments!agenda_eventos_determined_commitment_fk ( - id, bg_color, text_color - ) -`.trim(); +import { + listMyAgendaEvents, + createAgendaEvento, + updateAgendaEvento, + deleteAgendaEvento +} from '@/features/agenda/services/agendaRepository'; export function useAgendaEvents() { const rows = ref([]); const loading = ref(false); const error = ref(null); - async function loadMyRange(start, end, ownerId) { + async function loadMyRange(startISO, endISO, ownerId) { if (!ownerId) return; - - const tenantStore = useTenantStore(); - const tenantId = tenantStore.activeTenantId; - assertTenantId(tenantId); - loading.value = true; error.value = null; try { - const { data, error: err } = await supabase - .from('agenda_eventos') - .select(BASE_SELECT) - .eq('tenant_id', tenantId) - .eq('owner_id', ownerId) - .is('mirror_of_event_id', null) - .gte('inicio_em', start) - .lte('inicio_em', end) - .order('inicio_em', { ascending: true }); - - if (err) throw err; - rows.value = (data || []).map(flattenRow); + rows.value = await listMyAgendaEvents({ startISO, endISO, ownerId }); } catch (e) { error.value = e?.message || 'Erro ao carregar eventos'; rows.value = []; @@ -93,89 +51,17 @@ export function useAgendaEvents() { } } - /** - * Cria um evento injetando tenant_id e owner_id automaticamente. - * owner_id é sempre o usuário autenticado — nunca vem do payload externo. - * tenant_id vem do tenantStore ativo — nunca do payload externo. - */ async function create(payload) { - const tenantStore = useTenantStore(); - const tenantId = tenantStore.activeTenantId; - assertTenantId(tenantId); - - const uid = await getUid(); - - // eslint-disable-next-line no-unused-vars - const { paciente_id: _dropped, ...rest } = payload; - const safePayload = { - ...rest, - tenant_id: tenantId, - owner_id: uid - }; - - const { data, error: err } = await supabase.from('agenda_eventos').insert([safePayload]).select(BASE_SELECT).single(); - if (err) throw err; - return flattenRow(data); + return createAgendaEvento(payload); } async function update(id, patch) { - if (!id) throw new Error('ID inválido.'); - - const tenantStore = useTenantStore(); - const tenantId = tenantStore.activeTenantId; - assertTenantId(tenantId); - - // eslint-disable-next-line no-unused-vars - const { paciente_id: _dropped, ...safePatch } = patch; - - const { data, error: err } = await supabase.from('agenda_eventos').update(safePatch).eq('id', id).eq('tenant_id', tenantId).select(BASE_SELECT).single(); - if (err) throw err; - return flattenRow(data); + return updateAgendaEvento(id, patch); } async function remove(id) { - if (!id) throw new Error('ID inválido.'); - - const tenantStore = useTenantStore(); - const tenantId = tenantStore.activeTenantId; - assertTenantId(tenantId); - - const { error: err } = await supabase.from('agenda_eventos').delete().eq('id', id).eq('tenant_id', tenantId); - if (err) throw err; + await deleteAgendaEvento(id); } - async function removeSeriesFrom(recurrenceId, fromDateISO) { - if (!recurrenceId) throw new Error('recurrenceId inválido.'); - - const tenantStore = useTenantStore(); - const tenantId = tenantStore.activeTenantId; - assertTenantId(tenantId); - - const { error: err } = await supabase.from('agenda_eventos').delete().eq('recurrence_id', recurrenceId).eq('tenant_id', tenantId).gte('recurrence_date', fromDateISO); - if (err) throw err; - } - - async function removeAllSeries(recurrenceId) { - if (!recurrenceId) throw new Error('recurrenceId inválido.'); - - const tenantStore = useTenantStore(); - const tenantId = tenantStore.activeTenantId; - assertTenantId(tenantId); - - const { error: err } = await supabase.from('agenda_eventos').delete().eq('recurrence_id', recurrenceId).eq('tenant_id', tenantId); - if (err) throw err; - } - - return { rows, loading, error, loadMyRange, create, update, remove, removeSeriesFrom, removeAllSeries }; -} - -function flattenRow(r) { - if (!r) return r; - const patient = r.patients || null; - const out = { ...r }; - delete out.patients; - out.paciente_nome = patient?.nome_completo || out.paciente_nome || ''; - out.paciente_avatar = patient?.avatar_url || out.paciente_avatar || ''; - out.paciente_status = patient?.status || out.paciente_status || ''; - return out; + return { rows, loading, error, loadMyRange, create, update, remove }; } diff --git a/src/features/agenda/composables/useRecurrence.js b/src/features/agenda/composables/useRecurrence.js index b93c829..5f03899 100644 --- a/src/features/agenda/composables/useRecurrence.js +++ b/src/features/agenda/composables/useRecurrence.js @@ -31,6 +31,8 @@ import { ref } from 'vue'; import { supabase } from '@/lib/supabase/client'; +import { useTenantStore } from '@/stores/tenantStore'; +import { assertTenantId } from '@/features/agenda/services/_tenantGuards'; import { logRecurrence, logError, logPerf } from '@/support/supportLogger'; // ─── helpers de data ──────────────────────────────────────────────────────── @@ -197,6 +199,11 @@ export function generateDates(rule, rangeStart, rangeEnd) { // ─── expansão principal ────────────────────────────────────────────────────── +// Cap defensivo: a agenda real sempre passa ranges mensais/semanais (≤42d). +// Range muito grande com muitas regras = milhares de ocorrências no browser. +// Não bloqueamos (relatórios legítimos podem precisar), só avisamos. +const MAX_RANGE_DAYS = 730; // 2 anos + /** * Expande regras em ocorrências, aplica exceções. * @@ -207,6 +214,15 @@ export function generateDates(rule, rangeStart, rangeEnd) { * @returns {Array} occurrences — objetos com shape compatível com FullCalendar */ export function expandRules(rules, exceptions, rangeStart, rangeEnd) { + const rangeDays = Math.round((rangeEnd.getTime() - rangeStart.getTime()) / 86_400_000); + if (rangeDays > MAX_RANGE_DAYS) { + logError('useRecurrence', 'expandRules: range grande pode degradar UI', { + rangeDays, + maxRecommended: MAX_RANGE_DAYS, + ruleCount: (rules || []).length + }); + } + // índice de exceções por regra+data const exMap = new Map(); for (const ex of exceptions || []) { @@ -399,6 +415,13 @@ export function useRecurrence() { const exceptions = ref([]); const loading = ref(false); const error = ref(null); + const tenantStore = useTenantStore(); + + function currentTenantId() { + const tid = tenantStore.activeTenantId; + assertTenantId(tid); + return tid; + } /** * Carrega regras ativas para um owner no range dado. @@ -493,6 +516,7 @@ export function useRecurrence() { return true; }); } catch (e) { + logError('useRecurrence', 'loadExceptions ERRO', e); error.value = e?.message || 'Erro ao carregar exceções'; exceptions.value = []; } @@ -546,13 +570,16 @@ export function useRecurrence() { // ── CRUD de regras ────────────────────────────────────────────────────────── /** - * Cria uma nova regra de recorrência + * Cria uma nova regra de recorrência. + * tenant_id é injetado do tenantStore se não vier no payload (defesa em profundidade). * @param {Object} rule - campos da tabela recurrence_rules * @returns {Object} regra criada */ async function createRule(rule) { + const tenantId = currentTenantId(); logRecurrence('createRule →', { patient_id: rule?.patient_id, type: rule?.type }); - const { data, error: err } = await supabase.from('recurrence_rules').insert([rule]).select('*').single(); + const safeRule = { ...rule, tenant_id: rule?.tenant_id || tenantId }; + const { data, error: err } = await supabase.from('recurrence_rules').insert([safeRule]).select('*').single(); if (err) { logError('useRecurrence', 'createRule ERRO', err); throw err; @@ -562,13 +589,16 @@ export function useRecurrence() { } /** - * Atualiza a regra toda (editar todos) + * Atualiza a regra toda (editar todos). + * Filtro adicional por tenant_id — defesa em profundidade (RLS cobre, mas reforçamos). */ async function updateRule(id, patch) { + const tenantId = currentTenantId(); const { data, error: err } = await supabase .from('recurrence_rules') .update({ ...patch, updated_at: new Date().toISOString() }) .eq('id', id) + .eq('tenant_id', tenantId) .select('*') .single(); if (err) throw err; @@ -576,10 +606,15 @@ export function useRecurrence() { } /** - * Cancela a série inteira + * Cancela a série inteira (filtro por tenant_id — defesa em profundidade). */ async function cancelRule(id) { - const { error: err } = await supabase.from('recurrence_rules').update({ status: 'cancelado', updated_at: new Date().toISOString() }).eq('id', id); + const tenantId = currentTenantId(); + const { error: err } = await supabase + .from('recurrence_rules') + .update({ status: 'cancelado', updated_at: new Date().toISOString() }) + .eq('id', id) + .eq('tenant_id', tenantId); if (err) throw err; } @@ -610,19 +645,33 @@ export function useRecurrence() { // ── CRUD de exceções ──────────────────────────────────────────────────────── /** - * Cria ou atualiza uma exceção para uma ocorrência específica + * Cria ou atualiza uma exceção para uma ocorrência específica. + * tenant_id é injetado do tenantStore se não vier no payload. */ async function upsertException(ex) { - const { data, error: err } = await supabase.from('recurrence_exceptions').upsert([ex], { onConflict: 'recurrence_id,original_date' }).select('*').single(); + const tenantId = currentTenantId(); + const safeEx = { ...ex, tenant_id: ex?.tenant_id || tenantId }; + const { data, error: err } = await supabase + .from('recurrence_exceptions') + .upsert([safeEx], { onConflict: 'recurrence_id,original_date' }) + .select('*') + .single(); if (err) throw err; return data; } /** - * Remove uma exceção (restaura a ocorrência ao normal) + * Remove uma exceção (restaura a ocorrência ao normal). + * Filtro por tenant_id — defesa em profundidade. */ async function deleteException(recurrenceId, originalDate) { - const { error: err } = await supabase.from('recurrence_exceptions').delete().eq('recurrence_id', recurrenceId).eq('original_date', originalDate); + const tenantId = currentTenantId(); + const { error: err } = await supabase + .from('recurrence_exceptions') + .delete() + .eq('recurrence_id', recurrenceId) + .eq('original_date', originalDate) + .eq('tenant_id', tenantId); if (err) throw err; } diff --git a/src/features/agenda/pages/AgendaClinicaPage.vue b/src/features/agenda/pages/AgendaClinicaPage.vue index 6a3a299..e0efd4a 100644 --- a/src/features/agenda/pages/AgendaClinicaPage.vue +++ b/src/features/agenda/pages/AgendaClinicaPage.vue @@ -1968,7 +1968,7 @@ async function bloquearFeriadoDoAlerta(feriado) { } ]); if (error) throw error; - await supabase.from('agenda_eventos').update({ status: 'remarcar' }).eq('owner_id', clinicOwnerId.value).eq('tipo', 'sessao').gte('inicio_em', `${feriado.data}T00:00:00`).lte('inicio_em', `${feriado.data}T23:59:59`); + await supabase.from('agenda_eventos').update({ status: 'remarcado' }).eq('owner_id', clinicOwnerId.value).eq('tipo', 'sessao').gte('inicio_em', `${feriado.data}T00:00:00`).lte('inicio_em', `${feriado.data}T23:59:59`); feriadosAlertaBloqueados.value = new Set([...feriadosAlertaBloqueados.value, feriado.data]); miniBlockedDaySet.value = new Set([...miniBlockedDaySet.value, feriado.data]); diff --git a/src/features/agenda/pages/AgendaTerapeutaPage.vue b/src/features/agenda/pages/AgendaTerapeutaPage.vue index fb54673..13dddf4 100644 --- a/src/features/agenda/pages/AgendaTerapeutaPage.vue +++ b/src/features/agenda/pages/AgendaTerapeutaPage.vue @@ -1330,7 +1330,7 @@ async function bloquearFeriadoDoAlerta(feriado) { } ]); if (error) throw error; - await supabase.from('agenda_eventos').update({ status: 'remarcar' }).eq('owner_id', ownerId.value).eq('tipo', 'sessao').gte('inicio_em', `${feriado.data}T00:00:00`).lte('inicio_em', `${feriado.data}T23:59:59`); + await supabase.from('agenda_eventos').update({ status: 'remarcado' }).eq('owner_id', ownerId.value).eq('tipo', 'sessao').gte('inicio_em', `${feriado.data}T00:00:00`).lte('inicio_em', `${feriado.data}T23:59:59`); feriadosAlertaBloqueados.value = new Set([...feriadosAlertaBloqueados.value, feriado.data]); miniBlockedDaySet.value = new Set([...miniBlockedDaySet.value, feriado.data]); diff --git a/src/features/agenda/services/__tests__/agendaMappers.spec.js b/src/features/agenda/services/__tests__/agendaMappers.spec.js index 9164932..8700414 100644 --- a/src/features/agenda/services/__tests__/agendaMappers.spec.js +++ b/src/features/agenda/services/__tests__/agendaMappers.spec.js @@ -81,12 +81,12 @@ describe('mapAgendaEventosToCalendarEvents', () => { it('aplica cor de fundo para status faltou', () => { const [ev] = mapAgendaEventosToCalendarEvents([evento({ status: 'faltou' })]); - expect(ev.backgroundColor).toBe('#ef4444'); + expect(ev.backgroundColor).toBe('#f97316'); }); it('aplica cor de fundo para status cancelado', () => { const [ev] = mapAgendaEventosToCalendarEvents([evento({ status: 'cancelado' })]); - expect(ev.backgroundColor).toBe('#f97316'); + expect(ev.backgroundColor).toBe('#ef4444'); }); it('aplica cor de fundo para status remarcado', () => { diff --git a/src/features/agenda/services/_tenantGuards.js b/src/features/agenda/services/_tenantGuards.js new file mode 100644 index 0000000..f2b184f --- /dev/null +++ b/src/features/agenda/services/_tenantGuards.js @@ -0,0 +1,33 @@ +/* +|-------------------------------------------------------------------------- +| Agência PSI +|-------------------------------------------------------------------------- +| Arquivo: src/features/agenda/services/_tenantGuards.js +| +| Guards compartilhados entre composables e repositories do feature agenda. +| Antes: assertTenantId e getUid duplicados em 3+ arquivos. +|-------------------------------------------------------------------------- +*/ +import { supabase } from '@/lib/supabase/client'; + +export function assertTenantId(tenantId) { + if (!tenantId || tenantId === 'null' || tenantId === 'undefined') { + throw new Error('Tenant ativo inválido. Selecione a clínica/tenant antes de operar na agenda.'); + } +} + +export async function getUid() { + const { data, error } = await supabase.auth.getUser(); + if (error) throw error; + const uid = data?.user?.id; + if (!uid) throw new Error('Usuário não autenticado.'); + return uid; +} + +export function assertIsoRange(startISO, endISO) { + if (!startISO || !endISO) throw new Error('Intervalo inválido (startISO/endISO).'); +} + +export function sanitizeOwnerIds(ownerIds) { + return (ownerIds || []).filter((id) => typeof id === 'string' && id && id !== 'null' && id !== 'undefined'); +} diff --git a/src/features/agenda/services/agenda.service.js b/src/features/agenda/services/agenda.service.js deleted file mode 100644 index b23604a..0000000 --- a/src/features/agenda/services/agenda.service.js +++ /dev/null @@ -1,16 +0,0 @@ -/* -|-------------------------------------------------------------------------- -| Agência PSI -|-------------------------------------------------------------------------- -| Criado e desenvolvido por Leonardo Nohama -| -| Tecnologia aplicada à escuta. -| Estrutura para o cuidado. -| -| Arquivo: src/features/agenda/services/agenda.service.js -| Data: 2026 -| Local: São Carlos/SP — Brasil -|-------------------------------------------------------------------------- -| © 2026 — Todos os direitos reservados -|-------------------------------------------------------------------------- -*/ diff --git a/src/features/agenda/services/agendaClinicRepository.js b/src/features/agenda/services/agendaClinicRepository.js index df4ec5a..b5d781a 100644 --- a/src/features/agenda/services/agendaClinicRepository.js +++ b/src/features/agenda/services/agendaClinicRepository.js @@ -15,20 +15,12 @@ |-------------------------------------------------------------------------- */ import { supabase } from '@/lib/supabase/client'; - -function assertValidTenantId(tenantId) { - if (!tenantId || tenantId === 'null' || tenantId === 'undefined') { - throw new Error('Tenant ativo inválido. Selecione a clínica/tenant antes de carregar a agenda.'); - } -} - -function assertValidIsoRange(startISO, endISO) { - if (!startISO || !endISO) throw new Error('Intervalo inválido (startISO/endISO).'); -} - -function sanitizeOwnerIds(ownerIds) { - return (ownerIds || []).filter((id) => typeof id === 'string' && id && id !== 'null' && id !== 'undefined'); -} +import { + assertTenantId as assertValidTenantId, + assertIsoRange as assertValidIsoRange, + sanitizeOwnerIds +} from './_tenantGuards'; +import { AGENDA_EVENT_SELECT, flattenAgendaRow } from './agendaSelects'; /** * Lista eventos para mosaico da clínica (admin/secretaria) dentro de um tenant específico. @@ -44,7 +36,7 @@ export async function listClinicEvents({ tenantId, ownerIds, startISO, endISO } const { data, error } = await supabase .from('agenda_eventos') - .select('*, patients!agenda_eventos_patient_id_fkey(id, nome_completo, avatar_url, status), determined_commitments!agenda_eventos_determined_commitment_fk(id, bg_color, text_color)') + .select(AGENDA_EVENT_SELECT) .eq('tenant_id', tenantId) .in('owner_id', safeOwnerIds) .gte('inicio_em', startISO) @@ -52,7 +44,7 @@ export async function listClinicEvents({ tenantId, ownerIds, startISO, endISO } .order('inicio_em', { ascending: true }); if (error) throw error; - return data || []; + return (data || []).map(flattenAgendaRow); } /** @@ -91,10 +83,14 @@ export async function createClinicAgendaEvento(payload, { tenantId } = {}) { tenant_id: tenantId }; - const { data, error } = await supabase.from('agenda_eventos').insert(insertPayload).select('*').single(); + const { data, error } = await supabase + .from('agenda_eventos') + .insert(insertPayload) + .select(AGENDA_EVENT_SELECT) + .single(); if (error) throw error; - return data; + return flattenAgendaRow(data); } /** @@ -107,10 +103,16 @@ export async function updateClinicAgendaEvento(id, patch, { tenantId } = {}) { if (!patch) throw new Error('Patch vazio.'); assertValidTenantId(tenantId); - const { data, error } = await supabase.from('agenda_eventos').update(patch).eq('id', id).eq('tenant_id', tenantId).select('*').single(); + const { data, error } = await supabase + .from('agenda_eventos') + .update(patch) + .eq('id', id) + .eq('tenant_id', tenantId) + .select(AGENDA_EVENT_SELECT) + .single(); if (error) throw error; - return data; + return flattenAgendaRow(data); } /** diff --git a/src/features/agenda/services/agendaMappers.js b/src/features/agenda/services/agendaMappers.js index 5f00900..fd5f0ae 100644 --- a/src/features/agenda/services/agendaMappers.js +++ b/src/features/agenda/services/agendaMappers.js @@ -243,7 +243,7 @@ function _statusBgColor(status) { realizado: '#22c55e', // verde faltou: '#f97316', // laranja cancelado: '#ef4444', // vermelho - remarcar: '#a855f7', // roxo + remarcado: '#a855f7', // roxo bloqueado: '#6b7280' // cinza }; return map[status] ?? null; @@ -253,7 +253,7 @@ function _statusIcon(status, isOccurrence, hasSerie) { if (status === 'realizado') return '✓ '; if (status === 'faltou') return '✗ '; if (status === 'cancelado') return '∅ '; - if (status === 'remarcar') return '↺ '; + if (status === 'remarcado') return '↺ '; if (status === 'bloqueado') return '⊘ '; if (hasSerie || isOccurrence) return '↻ '; return ''; diff --git a/src/features/agenda/services/agendaRepository.js b/src/features/agenda/services/agendaRepository.js index 0b81b0c..1ad2c84 100644 --- a/src/features/agenda/services/agendaRepository.js +++ b/src/features/agenda/services/agendaRepository.js @@ -16,206 +16,140 @@ */ import { supabase } from '@/lib/supabase/client'; import { useTenantStore } from '@/stores/tenantStore'; +import { assertTenantId as assertValidTenantId, assertIsoRange, getUid } from './_tenantGuards'; +import { AGENDA_EVENT_SELECT, flattenAgendaRow } from './agendaSelects'; -function assertValidTenantId(tenantId) { - if (!tenantId || tenantId === 'null' || tenantId === 'undefined') { - throw new Error('Tenant ativo inválido. Selecione a clínica/tenant antes de carregar a agenda.'); - } -} +// ─── Configurações & jornada ──────────────────────────────────────────────── -async function getUid() { - const { data: userRes, error: userErr } = await supabase.auth.getUser(); - if (userErr) throw userErr; - - const uid = userRes?.user?.id; - if (!uid) throw new Error('Usuário não autenticado.'); - return uid; -} - -/** - * Configurações da agenda (por owner) - * Se você decidir que configurações são por tenant também, adicionamos tenant_id aqui. - */ export async function getMyAgendaSettings() { const uid = await getUid(); - - const { data, error } = await supabase.from('agenda_configuracoes').select('*').eq('owner_id', uid).order('created_at', { ascending: false }).limit(1).maybeSingle(); - + const { data, error } = await supabase + .from('agenda_configuracoes') + .select('*') + .eq('owner_id', uid) + .order('created_at', { ascending: false }) + .limit(1) + .maybeSingle(); if (error) throw error; return data; } -/** - * Regras semanais de jornada (agenda_regras_semanais): - * retorna os dias ativos com hora_inicio/hora_fim por dia. - */ export async function getMyWorkSchedule() { const uid = await getUid(); - - const { data, error } = await supabase.from('agenda_regras_semanais').select('dia_semana, hora_inicio, hora_fim, ativo').eq('owner_id', uid).eq('ativo', true).order('dia_semana'); - - if (error) throw error; - return data || []; -} - -/** - * Lista agenda do terapeuta (somente do owner logado) dentro do tenant ativo. - * Isso impede misturar eventos caso o terapeuta atue em múltiplas clínicas. - */ -export async function listMyAgendaEvents({ startISO, endISO, tenantId: tenantIdArg } = {}) { - const uid = await getUid(); - - const tenantStore = useTenantStore(); - const tenantId = tenantIdArg || tenantStore.activeTenantId; - assertValidTenantId(tenantId); - - if (!startISO || !endISO) throw new Error('Intervalo inválido (startISO/endISO).'); - const { data, error } = await supabase - .from('agenda_eventos') - .select('*, patients(id, nome_completo, avatar_url), determined_commitments!determined_commitment_id(id, bg_color, text_color)') - .eq('tenant_id', tenantId) + .from('agenda_regras_semanais') + .select('dia_semana, hora_inicio, hora_fim, ativo') .eq('owner_id', uid) - .gte('inicio_em', startISO) - .lt('inicio_em', endISO) - .order('inicio_em', { ascending: true }); - - if (error) throw error; - return data || []; -} - -/** - * Lista eventos para mosaico da clínica (admin/secretaria) dentro de um tenant específico. - * IMPORTANTE: SEM tenant_id aqui vira vazamento multi-tenant. - */ -export async function listClinicEvents({ tenantId, ownerIds, startISO, endISO }) { - assertValidTenantId(tenantId); - if (!ownerIds?.length) return []; - if (!startISO || !endISO) throw new Error('Intervalo inválido (startISO/endISO).'); - - // Sanitiza ownerIds - const safeOwnerIds = ownerIds.filter((id) => typeof id === 'string' && id && id !== 'null' && id !== 'undefined'); - - if (!safeOwnerIds.length) return []; - - const { data, error } = await supabase - .from('agenda_eventos') - .select('*, determined_commitments!determined_commitment_id(id, bg_color, text_color)') - .eq('tenant_id', tenantId) - .in('owner_id', safeOwnerIds) - .gte('inicio_em', startISO) - .lt('inicio_em', endISO) - .order('inicio_em', { ascending: true }); - + .eq('ativo', true) + .order('dia_semana'); if (error) throw error; return data || []; } export async function listTenantStaff(tenantId) { assertValidTenantId(tenantId); - const { data, error } = await supabase.from('v_tenant_staff').select('*').eq('tenant_id', tenantId); - if (error) throw error; return data || []; } +// ─── Agenda do terapeuta ──────────────────────────────────────────────────── + +function resolveTenantId(tenantIdArg) { + const tenantStore = useTenantStore(); + const tenantId = tenantIdArg || tenantStore.activeTenantId; + assertValidTenantId(tenantId); + return tenantId; +} + +/** + * Lista eventos do terapeuta logado (owner_id = uid) dentro do tenant ativo. + * Retorna rows flattened (paciente_nome/paciente_avatar/paciente_status no topo). + * + * Parâmetros: + * - startISO/endISO: half-open range (lt no final — consistente com clinic) + * - ownerId: opcional — default é o uid do usuário logado + * - tenantId: opcional — default é tenantStore.activeTenantId + * - excludeMirror: se true, filtra mirror_of_event_id IS NULL (agenda do terapeuta + * não deve mostrar eventos espelho de outra clínica) + */ +export async function listMyAgendaEvents({ startISO, endISO, ownerId, tenantId, excludeMirror = true } = {}) { + assertIsoRange(startISO, endISO); + const uid = ownerId || (await getUid()); + const tid = resolveTenantId(tenantId); + + let q = supabase + .from('agenda_eventos') + .select(AGENDA_EVENT_SELECT) + .eq('tenant_id', tid) + .eq('owner_id', uid) + .gte('inicio_em', startISO) + .lt('inicio_em', endISO) + .order('inicio_em', { ascending: true }); + + if (excludeMirror) q = q.is('mirror_of_event_id', null); + + const { data, error } = await q; + if (error) throw error; + return (data || []).map(flattenAgendaRow); +} + /** * Criação segura: * - injeta tenant_id do tenantStore * - injeta owner_id do usuário logado (ignora owner_id vindo de fora) - * - * Observação: - * - Para admin/secretária criar para outros owners, o ideal é ter uma função separada - * (ex.: createClinicAgendaEvento) que permita owner_id explicitamente. - * Por enquanto, deixo esta função como "safe default" para terapeuta. + * - dropa paciente_id (campo legado) se vier no payload */ export async function createAgendaEvento(payload) { - const uid = await getUid(); - const tenantStore = useTenantStore(); - const tenantId = tenantStore.activeTenantId; - assertValidTenantId(tenantId); - if (!payload) throw new Error('Payload vazio.'); + const uid = await getUid(); + const tid = resolveTenantId(); - const insertPayload = { - ...payload, - tenant_id: tenantId, - owner_id: uid - }; + // eslint-disable-next-line no-unused-vars + const { paciente_id: _dropped, ...rest } = payload; + const insertPayload = { ...rest, tenant_id: tid, owner_id: uid }; - const { data, error } = await supabase.from('agenda_eventos').insert(insertPayload).select('*').single(); + const { data, error } = await supabase + .from('agenda_eventos') + .insert([insertPayload]) + .select(AGENDA_EVENT_SELECT) + .single(); if (error) throw error; - return data; + return flattenAgendaRow(data); } /** - * Atualização segura: - * - filtra por id + tenant_id (evita update cruzado por acidente) - * RLS deve reforçar isso no banco. + * Atualização segura: filtra por id + tenant_id (RLS reforça no banco). */ -export async function updateAgendaEvento(id, patch, { tenantId: tenantIdArg } = {}) { +export async function updateAgendaEvento(id, patch, { tenantId } = {}) { if (!id) throw new Error('ID inválido.'); if (!patch) throw new Error('Patch vazio.'); + const tid = resolveTenantId(tenantId); - const tenantStore = useTenantStore(); - const tenantId = tenantIdArg || tenantStore.activeTenantId; - assertValidTenantId(tenantId); + // eslint-disable-next-line no-unused-vars + const { paciente_id: _dropped, ...safePatch } = patch; - const { data, error } = await supabase.from('agenda_eventos').update(patch).eq('id', id).eq('tenant_id', tenantId).select('*').single(); + const { data, error } = await supabase + .from('agenda_eventos') + .update(safePatch) + .eq('id', id) + .eq('tenant_id', tid) + .select(AGENDA_EVENT_SELECT) + .single(); if (error) throw error; - return data; + return flattenAgendaRow(data); } /** - * Delete seguro: - * - filtra por id + tenant_id + * Delete seguro: filtra por id + tenant_id. */ -export async function deleteAgendaEvento(id, { tenantId: tenantIdArg } = {}) { +export async function deleteAgendaEvento(id, { tenantId } = {}) { if (!id) throw new Error('ID inválido.'); + const tid = resolveTenantId(tenantId); - const tenantStore = useTenantStore(); - const tenantId = tenantIdArg || tenantStore.activeTenantId; - assertValidTenantId(tenantId); - - const { error } = await supabase.from('agenda_eventos').delete().eq('id', id).eq('tenant_id', tenantId); - + const { error } = await supabase.from('agenda_eventos').delete().eq('id', id).eq('tenant_id', tid); if (error) throw error; return true; } - -// Adicione no mesmo arquivo: src/features/agenda/services/agendaRepository.js - -/** - * Criação para a área da clínica (admin/secretária): - * - exige tenantId explícito (ou cai no tenantStore) - * - permite definir owner_id (terapeuta dono do compromisso) - * - * Segurança real deve ser garantida por RLS: - * - clinic_admin/tenant_admin pode criar para qualquer owner dentro do tenant - * - therapist não deve conseguir passar daqui (guard + RLS) - */ -export async function createClinicAgendaEvento(payload, { tenantId: tenantIdArg } = {}) { - const tenantStore = useTenantStore(); - const tenantId = tenantIdArg || tenantStore.activeTenantId; - assertValidTenantId(tenantId); - - if (!payload) throw new Error('Payload vazio.'); - - const ownerId = payload.owner_id; - if (!ownerId || ownerId === 'null' || ownerId === 'undefined') { - throw new Error('owner_id é obrigatório para criação pela clínica.'); - } - - const insertPayload = { - ...payload, - tenant_id: tenantId - }; - - const { data, error } = await supabase.from('agenda_eventos').insert(insertPayload).select('*').single(); - - if (error) throw error; - return data; -} diff --git a/src/features/agenda/services/agendaSelects.js b/src/features/agenda/services/agendaSelects.js new file mode 100644 index 0000000..fdf5726 --- /dev/null +++ b/src/features/agenda/services/agendaSelects.js @@ -0,0 +1,50 @@ +/* +|-------------------------------------------------------------------------- +| Agência PSI +|-------------------------------------------------------------------------- +| Arquivo: src/features/agenda/services/agendaSelects.js +| +| Fonte única do SELECT de agenda_eventos. Antes estava duplicado em 3 +| lugares (useAgendaEvents, agendaRepository, agendaClinicRepository) com +| inconsistências sutis (FKs explícitas em uns, não em outros). +|-------------------------------------------------------------------------- +*/ + +/** + * Select canônico de agenda_eventos com joins do paciente e do commitment. + * + * FKs explícitas (obrigatórias para evitar ambiguidade quando agenda_eventos + * tem múltiplas colunas apontando para a mesma tabela): + * - agenda_eventos_patient_id_fkey + * - agenda_eventos_determined_commitment_fk + */ +export const AGENDA_EVENT_SELECT = ` + id, owner_id, patient_id, tipo, status, + titulo, titulo_custom, observacoes, inicio_em, fim_em, + terapeuta_id, tenant_id, visibility_scope, + determined_commitment_id, link_online, extra_fields, modalidade, + recurrence_id, recurrence_date, + mirror_of_event_id, price, + insurance_plan_id, insurance_guide_number, insurance_value, insurance_plan_service_id, + patients!agenda_eventos_patient_id_fkey ( + id, nome_completo, avatar_url, status + ), + determined_commitments!agenda_eventos_determined_commitment_fk ( + id, bg_color, text_color + ) +`.trim(); + +/** + * Achata o aninhamento de patients dentro da row. + * O resto do app usa tanto `paciente_nome` (flat) quanto `patients?.nome_completo` + * (aninhado). Mantemos ambos após o flatten. + */ +export function flattenAgendaRow(r) { + if (!r) return r; + const patient = r.patients || null; + const out = { ...r }; + out.paciente_nome = patient?.nome_completo || r.paciente_nome || ''; + out.paciente_avatar = patient?.avatar_url || r.paciente_avatar || ''; + out.paciente_status = patient?.status || r.paciente_status || ''; + return out; +} diff --git a/src/features/financeiro/pages/FinanceiroDashboardPage.vue b/src/features/financeiro/pages/FinanceiroDashboardPage.vue index 1384c9f..15e878f 100644 --- a/src/features/financeiro/pages/FinanceiroDashboardPage.vue +++ b/src/features/financeiro/pages/FinanceiroDashboardPage.vue @@ -281,7 +281,9 @@ onMounted(async () => { ═══════════════════════════════════════ -->
- +
+ +
Receita × Despesa
Comparativo dos últimos 6 meses
@@ -303,7 +305,9 @@ onMounted(async () => { ═══════════════════════════════════════ -->
- +
+ +
Projeção de Caixa
Cobranças em aberto — próximos 6 meses
@@ -345,7 +349,9 @@ onMounted(async () => { ═══════════════════════════════════════ -->
- +
+ +
Últimos lançamentos
Cobranças e receitas recentes
diff --git a/src/features/financeiro/pages/FinanceiroPage.vue b/src/features/financeiro/pages/FinanceiroPage.vue index 68c0133..51f79a1 100644 --- a/src/features/financeiro/pages/FinanceiroPage.vue +++ b/src/features/financeiro/pages/FinanceiroPage.vue @@ -397,7 +397,9 @@ onBeforeUnmount(() => { ═══════════════════════════════════════ -->
- +
+ +
Filtros
Refine por status, tipo, paciente ou período
@@ -547,7 +549,9 @@ onBeforeUnmount(() => {