Correcao Sidebar Classico e Rail, Correcao Layout, Ajuste de Breakpoint para Tailwind, Ajuste AppTopbar, Ajuste Menu PopOver, Recriado Paleta de Cores, Inserido algumas animações leves, Reajuste Cor items NOVOS da tabela, Drawer Ajuda Corrigido no Logout, Whatsapp, sms, email, recursos extras

This commit is contained in:
Leonardo
2026-03-24 21:26:58 -03:00
parent a89d1f5560
commit 53a4980396
453 changed files with 121427 additions and 174407 deletions

View File

@@ -0,0 +1,176 @@
# Regras de Negócio — Banco de Dados AgenciaPsi
## 1. Planos e Targets
| Target | Planos | Escopo da Subscription |
|--------|--------|----------------------|
| `patient` | patient_free | `user_id` (sem tenant_id) |
| `therapist` | therapist_free, therapist_pro | `user_id` (sem tenant_id) |
| `clinic` | clinic_free, clinic_pro | `tenant_id` (sem user_id) |
| `supervisor` | supervisor_free, supervisor_pro | `user_id` (sem tenant_id) |
**Constraint `subscriptions_owner_xor`**: Uma subscription DEVE ter `tenant_id` XOR `user_id`, nunca ambos.
**Trigger `subscriptions_validate_scope`**: Valida que o target do plano casa com o escopo:
- `clinic` → exige `tenant_id`, rejeita `user_id`
- `therapist`, `supervisor`, `patient` → exige `user_id`, rejeita `tenant_id`
## 2. Planos Core (protegidos)
Os planos `clinic_free`, `clinic_pro`, `therapist_free`, `therapist_pro` são **core**:
- **Não podem ter `key` alterada** (trigger `trg_no_change_core_plan_key`)
- **Não podem ter `target` alterado** (trigger `trg_no_change_plan_target`)
- **Não podem ser deletados** (trigger `trg_no_delete_core_plans`)
Para bypass (migração): `SET LOCAL app.plan_migration_bypass = '1'`
## 3. Entitlements (Features)
### Resolução de features para TENANTS (clínicas)
```
tenant_has_feature(tenant_id, feature_key) =
EXISTS em v_tenant_entitlements (via plano)
OR
EXISTS em tenant_features (override direto)
```
### Resolução de features para USERS (terapeutas, supervisores)
```
user_has_feature(user_id, feature_key) =
EXISTS em v_user_entitlements (via plano pessoal)
```
### Cadeia de resolução
```
subscription → plan → plan_features → features
plan_features.limits (jsonb) → limites quantitativos
```
### Views de entitlements
- `v_tenant_active_subscription` → subscription ativa do tenant
- `v_user_active_subscription` → subscription ativa do user
- `v_tenant_entitlements` → feature_key + allowed
- `v_tenant_entitlements_full` → + limits + plan_id + plan_key
- `v_user_entitlements` → feature_key + allowed (para planos pessoais)
## 4. Tipos de Tenant
| kind | Descrição | Criação |
|------|-----------|---------|
| `therapist` | Terapeuta solo | Automático ao criar conta de terapeuta |
| `clinic_coworking` | Clínica coworking | Manual |
| `clinic_reception` | Clínica com recepção | Manual |
| `clinic_full` | Clínica completa | Manual |
| `supervisor` | Supervisor | Automático |
| `saas` | Sistema (legado) | — |
| `clinic` | Legado | — |
**O `kind` é imutável após criação** (trigger `trg_tenant_kind_immutable`).
## 5. Roles e Permissões
### Profile roles
| Role | Descrição |
|------|-----------|
| `saas_admin` | Administrador da plataforma |
| `tenant_member` | Membro de um ou mais tenants |
| `portal_user` | Paciente (acesso ao portal) |
| `patient` | Paciente (legado) |
### Tenant member roles
| Role | Descrição |
|------|-----------|
| `tenant_admin` | Admin do tenant (dono) |
| `therapist` | Terapeuta membro |
| `clinic_admin` | Admin da clínica (secretária com poderes) |
| `secretary` | Secretária |
| `supervisor` | Supervisor |
| `patient` | Paciente do tenant |
### Platform roles (array em profiles)
| Role | Descrição |
|------|-----------|
| `editor` | Editor de conteúdo da plataforma |
## 6. Compromissos Determinados
A função `seed_determined_commitments(tenant_id)` cria 5 tipos nativos:
| native_key | Nome | locked | active |
|------------|------|--------|--------|
| `session` | Sessão | true | true |
| `reading` | Leitura | false | true |
| `supervision` | Supervisão | false | true |
| `class` | Aula | false | **false** |
| `analysis` | Análise Pessoal | false | true |
- `session` é **locked** (não pode ser editado/deletado)
- O `native_key = 'session'` é usado pelo agendador online para identificar o compromisso padrão
## 7. Grupos de Pacientes Padrão
A função `seed_default_patient_groups(tenant_id)` cria 3 grupos sistema:
| Nome | Cor | is_system |
|------|-----|-----------|
| Crianças | #60a5fa | true |
| Adolescentes | #a78bfa | true |
| Idosos | #34d399 | true |
Grupos sistema não podem ser editados/deletados (trigger `prevent_system_group_changes`).
## 8. Subscriptions — Status
| Status | Descrição |
|--------|-----------|
| `pending` | Aguardando ativação |
| `active` | Ativa |
| `past_due` | Pagamento atrasado |
| `suspended` | Suspensa |
| `cancelled` | Cancelada |
| `expired` | Expirada |
## 9. Templates de Email
**Globais** (`email_templates_global`): templates padrão da plataforma, gerenciados pelo saas_admin.
**Tenant** (`email_templates_tenant`): overrides por tenant. Se existir, usa o do tenant; se não, usa o global.
### Keys de template
| Domínio | Templates |
|---------|-----------|
| session | reminder, confirmation, cancellation, rescheduled |
| intake | received, approved, rejected |
| scheduler | request_accepted, request_rejected |
| system | welcome, password_reset |
Canais: `email`, `whatsapp`, `sms`
## 10. Notificações — Sistema
| Canal | Tipos |
|-------|-------|
| WhatsApp | lembrete_sessao, confirmacao_sessao, cancelamento_sessao |
| SMS | lembrete_sessao |
### Schedule keys
| Key | Descrição |
|-----|-----------|
| `lembrete_24h` | 24 horas antes |
| `lembrete_2h` | 2 horas antes |
| `lembrete_30min` | 30 minutos antes |
| `confirmacao_imediata` | Imediato após confirmar |
| `cancelamento_imediato` | Imediato após cancelar |
## 11. RLS (Row Level Security)
Todas as tabelas do schema `public` têm RLS habilitado. As policies usam:
- `auth.uid()` — ID do usuário autenticado
- `is_saas_admin()` — verifica se é admin da plataforma
- `is_tenant_member(tenant_id)` — verifica se pertence ao tenant
- `is_tenant_admin(tenant_id)` — verifica se é admin do tenant
- `current_member_role(tenant_id)` — role do membro no tenant
- `tenant_has_feature(tenant_id, feature_key)` — verifica feature
**Se as features/plan_features não existirem no banco, as policies de RLS bloqueiam o acesso.**

View File

@@ -0,0 +1,191 @@
# Schema Map — AgenciaPsi
Mapa completo do banco de dados PostgreSQL 17, extraído de `schema.sql` (2026-03-23).
**84 tabelas** no schema `public` + tabelas de infraestrutura (auth, storage, realtime).
## Domínios
### Core (11 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `profiles` | Perfil do usuário (role, account_type, full_name, platform_roles) |
| `tenants` | Organizações (clínicas, terapeutas solo, supervisores) |
| `tenant_members` | Vínculo usuário↔tenant com role (tenant_admin, therapist, secretary, etc.) |
| `tenant_invites` | Convites pendentes para ingressar em um tenant |
| `tenant_features` | Overrides de features por tenant (exceções comerciais) |
| `tenant_feature_exceptions_log` | Log de alterações em tenant_features |
| `saas_admins` | Administradores da plataforma |
| `owner_users` | Mapeamento owner_id→user_id para RLS |
| `user_settings` | Configurações pessoais do usuário |
| `company_profiles` | Perfil da empresa/clínica (logo, endereço, etc.) |
| `dev_user_credentials` | Credenciais de teste (apenas dev) |
### Plans & Billing (20 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `plans` | Planos disponíveis (key, target, price_cents, max_supervisees) |
| `plan_prices` | Preços por intervalo (month/year) com versionamento |
| `plan_features` | Vínculo plano↔feature com limites (limits jsonb) |
| `plan_public` | Info pública dos planos (para página de preços) |
| `plan_public_bullets` | Bullets de marketing dos planos |
| `features` | Features do sistema (key, name, descricao) |
| `entitlements_invalidation` | Cache invalidation de entitlements |
| `subscriptions` | Assinaturas ativas (user_id XOR tenant_id) |
| `subscription_events` | Histórico de eventos de assinatura |
| `subscription_intents_personal` | Intenções de assinatura pessoal |
| `subscription_intents_tenant` | Intenções de assinatura de tenant |
| `subscription_intents_legacy` | Intenções legadas |
| `billing_contracts` | Contratos de cobrança |
| `addon_credits` | Créditos de add-ons por tenant |
| `addon_products` | Produtos add-on disponíveis |
| `addon_transactions` | Transações de add-ons |
| `modules` | Módulos do sistema |
| `module_features` | Features por módulo |
| `tenant_modules` | Módulos ativos por tenant |
### Agenda (11 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `agenda_bloqueios` | Bloqueios de horário |
| `agenda_configuracoes` | Configurações da agenda por tenant_member |
| `agenda_eventos` | Eventos da agenda (sessões, bloqueios) |
| `agenda_excecoes` | Exceções na agenda (horários extras, bloqueios pontuais) |
| `agenda_online_slots` | Slots de agendamento online |
| `agenda_regras_semanais` | Regras semanais de disponibilidade |
| `agenda_slots_bloqueados_semanais` | Slots bloqueados na semana |
| `agenda_slots_regras` | Regras de slots |
| `recurrence_rules` | Regras de recorrência de sessões |
| `recurrence_exceptions` | Exceções a recorrências |
| `recurrence_rule_services` | Serviços vinculados a recorrências |
### Agendador Online (2 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `agendador_configuracoes` | Configurações do agendador online público |
| `agendador_solicitacoes` | Solicitações de agendamento recebidas |
### Pacientes (8 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `patients` | Pacientes vinculados a um tenant |
| `patient_groups` | Grupos de pacientes (sistema + customizados) |
| `patient_group_patient` | Vínculo paciente↔grupo |
| `patient_tags` | Tags personalizadas |
| `patient_patient_tag` | Vínculo paciente↔tag |
| `patient_intake_requests` | Solicitações de cadastro (triagem) |
| `patient_invites` | Convites para portal do paciente |
| `patient_discounts` | Descontos por paciente |
### Compromissos Determinados (4 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `determined_commitments` | Tipos de compromisso (sessão, leitura, supervisão, etc.) |
| `determined_commitment_fields` | Campos customizados por tipo de compromisso |
| `commitment_services` | Serviços vinculados a compromissos |
| `commitment_time_logs` | Logs de tempo por compromisso |
### Financeiro (9 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `financial_records` | Lançamentos financeiros (receita/despesa) |
| `financial_categories` | Categorias de lançamento |
| `financial_exceptions` | Exceções financeiras |
| `payment_settings` | Configurações de pagamento por tenant |
| `professional_pricing` | Precificação por profissional |
| `therapist_payouts` | Repasses a terapeutas |
| `therapist_payout_records` | Registros de repasse |
| `services` | Serviços oferecidos |
| `insurance_plans` + `insurance_plan_services` | Convênios e serviços por convênio |
### Notificações (10 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `notification_channels` | Canais de notificação por tenant |
| `notification_logs` | Logs de envio |
| `notification_preferences` | Preferências do paciente (opt-in/out) |
| `notification_queue` | Fila de envio |
| `notification_schedules` | Agendamentos de notificação |
| `notification_templates` | Templates WhatsApp/SMS (default + tenant) |
| `notifications` | Notificações in-app |
| `email_templates_global` | Templates de email globais (plataforma) |
| `email_templates_tenant` | Overrides de templates por tenant |
| `email_layout_config` | Configuração de layout de email |
### SaaS Admin / UI (8 tabelas)
| Tabela | Descrição |
|--------|-----------|
| `saas_docs` | Documentação da plataforma |
| `saas_doc_votos` | Votos em docs |
| `saas_faq` | Categorias de FAQ |
| `saas_faq_itens` | Itens de FAQ |
| `feriados` | Feriados nacionais/regionais |
| `global_notices` | Avisos globais da plataforma |
| `login_carousel_slides` | Slides do carrossel de login |
| `notice_dismissals` | Dismissals de avisos por usuário |
### Suporte (1 tabela)
| Tabela | Descrição |
|--------|-----------|
| `support_sessions` | Sessões de suporte técnico |
---
## Views Principais
| View | Descrição |
|------|-----------|
| `v_tenant_active_subscription` | Subscription ativa por tenant |
| `v_user_active_subscription` | Subscription ativa por user |
| `v_tenant_entitlements` | Features habilitadas por tenant (via plano) |
| `v_tenant_entitlements_full` | Entitlements + limits + plan info |
| `v_tenant_entitlements_json` | Entitlements agregados como JSON |
| `v_user_entitlements` | Features habilitadas por user (via plano) |
| `v_tenant_members_with_profiles` | Membros do tenant com dados do perfil |
| `v_tenant_staff` | Staff do tenant (membros + convites) |
| `v_tenant_people` | Todas as pessoas do tenant |
| `v_plan_active_prices` | Preços ativos dos planos |
| `v_public_pricing` | Preços públicos para página de marketing |
| `v_subscription_health` | Saúde das subscriptions |
| `v_cashflow_projection` | Projeção de fluxo de caixa |
| `v_commitment_totals` | Totais de compromissos |
| `v_patient_groups_with_counts` | Grupos com contagem de pacientes |
| `v_tag_patient_counts` | Tags com contagem de pacientes |
| `subscription_intents` | View unificada de intenções (com INSTEAD OF trigger) |
| `owner_feature_entitlements` | Entitlements por owner |
| `current_tenant_id` | Tenant ativo do usuário corrente |
---
## Funções Críticas
| Função | Tipo | Descrição |
|--------|------|-----------|
| `tenant_has_feature(uuid, text)` | Query | Verifica se tenant tem feature (plano + override) |
| `user_has_feature(uuid, text)` | Query | Verifica se user tem feature via plano pessoal |
| `has_feature(uuid, text)` | Query | Alias genérico |
| `seed_determined_commitments(uuid)` | Seed | Cria 5 tipos de compromisso nativos por tenant |
| `seed_default_patient_groups(uuid)` | Seed | Cria 3 grupos de pacientes padrão |
| `seed_default_financial_categories(uuid)` | Seed | Cria categorias financeiras padrão |
| `subscriptions_validate_scope()` | Trigger | Valida XOR (user_id vs tenant_id) por target |
| `activate_subscription_from_intent(uuid)` | RPC | Ativa subscription a partir de intent |
| `handle_new_user()` | Trigger | Cria profile + tenant pessoal ao cadastrar |
| `ensure_personal_tenant()` | RPC | Garante que o user tem um tenant pessoal |
| `populate_notification_queue()` | Cron | Popula fila de notificações |
| `agendador_slots_disponiveis(text, date)` | RPC | Retorna slots disponíveis para agendamento |
---
## Enums (public schema)
| Tipo | Valores |
|------|---------|
| `commitment_log_source` | manual, auto |
| `determined_field_type` | text, textarea, number, date, select, boolean |
| `financial_record_type` | receita, despesa |
| `recurrence_exception_type` | cancel_session, reschedule_session, patient_missed, therapist_canceled, holiday_block |
| `recurrence_type` | weekly, biweekly, monthly, yearly, custom_weekdays |
| `status_agenda_serie` | ativo, pausado, cancelado |
| `status_evento_agenda` | agendado, realizado, faltou, cancelado, remarcar |
| `status_excecao_agenda` | pendente, ativo, arquivado |
| `tipo_evento_agenda` | sessao, bloqueio |
| `tipo_excecao_agenda` | bloqueio, horario_extra |

View File

@@ -0,0 +1,297 @@
# Guia de Instalação e Uso — AgenciaPsi Database
## Pré-requisitos
1. **Docker Desktop** instalado e rodando
2. **Node.js** 18+ instalado
3. **Supabase CLI** instalado (`npm install -g supabase`)
## Instalação do Zero (banco vazio)
### 1. Iniciar o Supabase
```bash
# Na raiz do projeto (agenciapsi-primesakai/)
npx supabase start
```
Aguarde até o container `supabase_db_agenciapsi-primesakai` estar rodando.
### 2. Verificar se o container está ok
```bash
docker ps | grep supabase_db
```
Deve mostrar o container com status `Up`.
### 3. Instalar o banco completo
```bash
cd database-novo
node db.cjs setup
```
Isso faz tudo automaticamente:
- Aplica o schema completo (84 tabelas, funções, triggers, policies)
- Aplica os 7 fixes conhecidos
- Cria os 11 usuários de teste
- Cria os 7 planos + 4 preços
- Cria as 26 features + 85 vínculos plano↔feature
- Cria as 9 subscriptions + compromissos determinados
- Cria os templates de email, notificação e carousel
- Cria backup automático pós-instalação
- Verifica integridade no final
### 4. Verificar
```bash
node db.cjs status
```
Deve mostrar todos os counts verdes.
## Backup
### Criar backup manual
```bash
node db.cjs backup
```
Salva em `backups/YYYY-MM-DD/` com 3 arquivos:
- `schema.sql` — estrutura do banco
- `data.sql` — dados (sem schemas de infra)
- `full_dump.sql` — tudo junto
### Backup automático
O backup é feito automaticamente:
- Após o `setup`
- Antes de cada `migrate`
- Antes de cada `restore`
- Antes de cada `reset`
### Retenção
Backups com mais de 30 dias são removidos automaticamente. Para alterar, edite `backupRetentionDays` no `db.config.json`.
## Restaurar o Banco
### Restaurar do último backup
```bash
node db.cjs restore
```
### Restaurar de uma data específica
```bash
node db.cjs restore 2026-03-23
```
O restore:
1. Cria backup de segurança do estado atual
2. Limpa o schema public
3. Aplica o full_dump.sql do backup
4. Verifica integridade
## Migrations (alterações no banco)
### Criar uma migration
Crie um arquivo SQL na pasta `migrations/` com nome sequencial:
```
migrations/
├── 001_add_column_x.sql
├── 002_create_table_y.sql
└── 003_fix_something.sql
```
O nome deve começar com número para garantir a ordem.
### Aplicar migrations pendentes
```bash
node db.cjs migrate
```
O CLI:
1. Cria backup automático
2. Compara com a tabela `_db_migrations` no banco
3. Aplica apenas as que ainda não foram executadas
4. Registra cada migration aplicada
5. Se uma falhar, para imediatamente (use `restore` para voltar)
### Ver migrations aplicadas
```bash
node db.cjs status
```
## Seeds (dados de teste)
### Rodar todos os seeds
```bash
node db.cjs seed all # ou simplesmente: node db.cjs seed
```
### Rodar grupo específico
```bash
node db.cjs seed users # Apenas usuários (seed_001 a 003)
node db.cjs seed system # Apenas sistema (seed_010 a 014)
node db.cjs seed test_data # Dados de teste (seed_020)
```
### Ordem dos seeds
| # | Arquivo | O que faz |
|---|---------|-----------|
| 1 | `seed_001_fixed.sql` | 6 usuários base + tenants |
| 2 | `seed_002.sql` | Supervisor + Editor |
| 3 | `seed_003.sql` | Therapist2, Therapist3, Secretary |
| 4 | `seed_010_plans.sql` | 7 planos + 4 preços |
| 5 | `seed_011_features.sql` | 26 features |
| 6 | `seed_012_plan_features.sql` | 85 vínculos plano↔feature |
| 7 | `seed_013_subscriptions.sql` | 9 subscriptions + compromissos |
| 8 | `seed_014_global_data.sql` | Templates + carousel |
## Outros Comandos
### Ver status
```bash
node db.cjs status
```
Mostra: container, backups, migrations aplicadas/pendentes, counts de todas as tabelas.
### Comparar mudanças
```bash
node db.cjs diff
```
Compara o schema atual no banco com o último backup. Mostra tabelas adicionadas, removidas ou alteradas.
### Verificar integridade
```bash
node db.cjs verify
```
Checa se os dados essenciais existem (plans, features, subscriptions, etc).
### Reset completo
```bash
node db.cjs reset
```
**⚠ CUIDADO**: Apaga tudo e reinstala do zero. Cria backup antes.
## Estrutura de Pastas
```
database-novo/
├── db.js ← CLI principal
├── db.config.json ← Configuração (container, seeds, fixes)
├── schema/ ← Schema SQL separado por seção
│ ├── 00_full/ ← Schema completo (referência)
│ ├── 01_extensions/ ← Extensões PostgreSQL
│ ├── 02_types/ ← Enums e tipos
│ ├── 03_functions/ ← Funções (11 arquivos por domínio)
│ ├── 04_tables/ ← Tabelas (10 arquivos por domínio)
│ ├── 05_views/ ← 24 views
│ ├── 06_indexes/ ← Índices
│ ├── 07_foreign_keys/ ← PKs, FKs, constraints
│ ├── 08_triggers/ ← Triggers
│ ├── 09_policies/ ← 217 RLS policies
│ └── 10_grants/ ← Grants
├── seeds/ ← Seeds de dados
│ ├── seed_001_fixed.sql
│ ├── ...
│ └── run_all_seeds.sh
├── migrations/ ← Migrations (alterações incrementais)
├── fixes/ ← Correções aplicadas
├── backups/ ← Backups com data
│ ├── 2026-03-23/
│ └── ...
└── docs/ ← Documentação
├── setup_guide.md ← Este arquivo
├── schema_map.md ← Mapa de 84 tabelas
├── business_rules.md ← Regras de negócio
└── users_test.md ← Usuários de teste
```
## Credenciais de Teste
| Email | Senha | Tipo |
|-------|-------|------|
| paciente@agenciapsi.com.br | Teste@123 | Paciente |
| terapeuta@agenciapsi.com.br | Teste@123 | Terapeuta solo |
| clinica1@agenciapsi.com.br | Teste@123 | Clínica coworking |
| clinica2@agenciapsi.com.br | Teste@123 | Clínica recepção |
| clinica3@agenciapsi.com.br | Teste@123 | Clínica full |
| saas@agenciapsi.com.br | Teste@123 | Admin plataforma |
| supervisor@agenciapsi.com.br | Teste@123 | Supervisor |
| editor@agenciapsi.com.br | Teste@123 | Editor |
| therapist2@agenciapsi.com.br | Teste@123 | Terapeuta |
| therapist3@agenciapsi.com.br | Teste@123 | Terapeuta |
| secretary@agenciapsi.com.br | Teste@123 | Secretária |
## Troubleshooting
### "Container não está rodando"
```bash
# Verificar
docker ps | grep supabase
# Reiniciar
npx supabase stop
npx supabase start
```
### "Tabela não existe" após setup
O schema pode não ter sido aplicado corretamente. Rode:
```bash
node db.cjs reset
```
### "Permission denied" / RLS bloqueando
Se features/plan_features estiverem vazios, o RLS bloqueia tudo. Rode:
```bash
node db.cjs seed system
```
### Migration falhou no meio
```bash
# Voltar ao estado anterior
node db.cjs restore
# Corrigir o SQL da migration, depois tentar de novo
node db.cjs migrate
```
### Quero começar do zero
```bash
node db.cjs reset
```
Isso apaga tudo, reaplica schema, fixes, seeds, e verifica.

View File

@@ -0,0 +1,90 @@
# Usuários de Teste — AgenciaPsi
Senha de todos: `Teste@123`
## Mapa de UUIDs
### Users (auth.users.id = profiles.id)
| Email | UUID | Nome |
|-------|------|------|
| paciente@agenciapsi.com.br | `aaaaaaaa-0001-0001-0001-000000000001` | Ana Paciente |
| terapeuta@agenciapsi.com.br | `aaaaaaaa-0002-0002-0002-000000000002` | Bruno Terapeuta |
| clinica1@agenciapsi.com.br | `aaaaaaaa-0003-0003-0003-000000000003` | Clínica Espaço Psi |
| clinica2@agenciapsi.com.br | `aaaaaaaa-0004-0004-0004-000000000004` | Clínica Mente sã |
| clinica3@agenciapsi.com.br | `aaaaaaaa-0005-0005-0005-000000000005` | Clínica Bem Estar |
| saas@agenciapsi.com.br | `aaaaaaaa-0006-0006-0006-000000000006` | Admin Plataforma |
| supervisor@agenciapsi.com.br | `aaaaaaaa-0007-0007-0007-000000000007` | Carlos Supervisor |
| editor@agenciapsi.com.br | `aaaaaaaa-0008-0008-0008-000000000008` | Diana Editora |
| therapist2@agenciapsi.com.br | `aaaaaaaa-0009-0009-0009-000000000009` | Eva Terapeuta |
| therapist3@agenciapsi.com.br | `aaaaaaaa-0010-0010-0010-000000000010` | Felipe Terapeuta |
| secretary@agenciapsi.com.br | `aaaaaaaa-0011-0011-0011-000000000011` | Gabriela Secretária |
### Tenants
| Nome | UUID | Kind |
|------|------|------|
| Bruno Terapeuta | `bbbbbbbb-0002-0002-0002-000000000002` | therapist |
| Clínica Espaço Psi | `bbbbbbbb-0003-0003-0003-000000000003` | clinic_coworking |
| Clínica Mente sã | `bbbbbbbb-0004-0004-0004-000000000004` | clinic_reception |
| Clínica Bem Estar | `bbbbbbbb-0005-0005-0005-000000000005` | clinic_full |
| Eva Terapeuta | `bbbbbbbb-0009-0009-0009-000000000009` | therapist |
| Felipe Terapeuta | `bbbbbbbb-0010-0010-0010-000000000010` | therapist |
## Mapa de Vínculos
```
paciente@ → portal_user / patient_free (user_id)
Sem tenant próprio
terapeuta@ → tenant_member / therapist
Tenant: bbbbbbbb-0002 (therapist) → tenant_admin
Clínica 3: bbbbbbbb-0005 → therapist
Subscription: therapist_free (user_id)
clinica1@ → tenant_member / clinic
Tenant: bbbbbbbb-0003 (clinic_coworking) → tenant_admin
Subscription: clinic_free (tenant_id)
clinica2@ → tenant_member / clinic
Tenant: bbbbbbbb-0004 (clinic_reception) → tenant_admin
Subscription: clinic_free (tenant_id)
clinica3@ → tenant_member / clinic
Tenant: bbbbbbbb-0005 (clinic_full) → tenant_admin
Subscription: clinic_free (tenant_id)
saas@ → saas_admin
Sem tenant, sem subscription
supervisor@ → tenant_member / therapist
Clínica 3: bbbbbbbb-0005 → supervisor
Subscription: supervisor_free (user_id)
editor@ → tenant_member / therapist + platform_roles: {editor}
Clínica 3: bbbbbbbb-0005 → therapist
Subscription: therapist_free (user_id)
therapist2@ → tenant_member / therapist
Tenant: bbbbbbbb-0009 (therapist) → tenant_admin
Clínica 3: bbbbbbbb-0005 → therapist
Subscription: therapist_free (user_id)
therapist3@ → tenant_member / therapist
Tenant: bbbbbbbb-0010 (therapist) → tenant_admin
Clínica 3: bbbbbbbb-0005 → therapist
Subscription: therapist_free (user_id)
secretary@ → tenant_member / therapist (profile)
Clínica 2: bbbbbbbb-0004 → clinic_admin
Sem subscription própria (usa plano da Clínica 2)
```
## Clínica 3 — Bem Estar (Full) — Membros
| Membro | Role |
|--------|------|
| clinica3@ | tenant_admin |
| terapeuta@ | therapist |
| supervisor@ | supervisor |
| editor@ | therapist |
| therapist2@ | therapist |
| therapist3@ | therapist |