🏛️ Plataforma
Usuário (saas@agenciapsi.com.br)
└── profiles.role 'saas_admin'
role: saas_admin
sem tenant
Acesso total à plataforma. Gerencia planos, features, assinaturas e usuários. Nunca entra em contexto de tenant.
Usuário (editor@agenciapsi.com.br)
└── profiles.platform_roles ['editor']
platform_roles: editor
sem tenant
Papel de plataforma (não de tenant). Gerencia conteúdo público, landing pages, textos. Verificado via platform_roles[].
🏥 Clínica
Usuário (admin@clinicax.com.br)
├── profiles.role 'tenant_member'
└── Membership: Clínica X
├── tenant.kind 'clinic'
├── role 'clinic_admin'
└── plano clinic_free | clinic_pro
role: clinic_admin
tenant: clinic
clinic_free
clinic_pro
Dono ou gestor de uma clínica. Gerencia profissionais, pacientes, agenda e módulos da clínica.
Usuário (terapeuta@clinicax.com.br)
├── profiles.role 'tenant_member'
└── Membership: Clínica X
├── tenant.kind 'clinic'
├── role 'therapist'
└── entitlements via plano da clínica
role: therapist
tenant: clinic
entitlements da clínica
Terapeuta vinculado a uma clínica. Seus entitlements vêm do plano do tenant (clínica), não de assinatura pessoal.
🧑💼 Terapeuta Independente
Usuário (terapeuta@gmail.com)
├── profiles.role 'tenant_member'
└── Membership: Tenant Pessoal
├── tenant.kind 'saas'
├── role 'therapist'
└── plano therapist_free | therapist_pro
role: therapist
tenant: saas (pessoal)
therapist_free
therapist_pro
Terapeuta autônomo sem clínica. Assina diretamente. Entitlements vêm de v_user_entitlements (assinatura pessoal).
Usuário (terapeuta@gmail.com)
├── Membership A: Tenant Pessoal
├── tenant.kind 'saas'
├── role 'therapist'
└── plano therapist_pro
└── Membership B: Clínica X
├── tenant.kind 'clinic'
└── role 'therapist'
role: therapist
2 tenants
therapist_pro
switcher de contexto
Atua em dois contextos. No tenant pessoal usa PRO. Na clínica usa os entitlements da clínica. Precisa de switcher de tenant no topbar.
🎓 Supervisor (Fase 1 — novo)
Usuário (supervisor@gmail.com)
├── profiles.role 'tenant_member'
└── Membership: Tenant Supervisão (novo)
├── tenant.kind 'supervisor'
├── role 'supervisor'
├── plano supervisor_free | supervisor_pro
└── max_supervisees 3 | 20
role: supervisor
tenant: supervisor
supervisor_free
supervisor_pro
Novo. Supervisor independente. Tem sua própria sala de supervisão. O plano define o limite de terapeutas supervisionados (plans.max_supervisees).
Usuário (terapeuta@gmail.com)
├── Membership A: Tenant Pessoal
├── tenant.kind 'saas'
├── role 'therapist'
└── plano therapist_pro
└── Membership B: Tenant Supervisão (novo)
├── tenant.kind 'supervisor'
├── role 'supervisor'
└── plano supervisor_pro
therapist
supervisor
2 tenants
therapist_pro
supervisor_pro
O caso mais comum. Atua como terapeuta no tenant pessoal e como supervisor no tenant de supervisão. Switcher de contexto no topbar.
Usuário (terapeuta@clinicax.com.br)
├── Membership A: Clínica X
├── tenant.kind 'clinic'
└── role 'therapist'
└── Membership B: Tenant Supervisão (novo)
├── tenant.kind 'supervisor'
├── role 'supervisor'
└── plano supervisor_free | supervisor_pro
therapist (clínica)
supervisor (independente)
supervisor_pro
Trabalha na clínica como terapeuta e supervisiona outros terapeutas (inclusive colegas da clínica) de forma independente. A clínica não interfere na supervisão.
🚀 Fase 2 — Marketplace de Supervisão
Clínica X
├── Ativa módulo supervisao (feature)
├── Associa supervisor externo via convite
├── Sessões registradas na plataforma
└── Pagamento via AgenciaPsi
Fluxo financeiro
└── Clínica paga R$ 200/sessão
├── Supervisor recebe R$ 180
└── AgenciaPsi retém R$ 20 (10%)
split de pagamento
Stripe Connect / Iugu
Fase 2
Futuro. A clínica contrata supervisão via plataforma. AgenciaPsi faz o split automático. Requer gateway com marketplace split (Stripe Connect, Iugu, Pagar.me).
👤 Paciente / Portal
Usuário (paciente@gmail.com)
├── profiles.role 'portal_user'
└──
role: portal_user
sem tenant
Acessa apenas o portal do paciente. Vê suas sessões, agenda e documentos. Nunca entra na área de tenant-app.
Resumo Técnico — Como o Guard decide o menu
profiles.role = identidade global (saas_admin | tenant_member | portal_user)
memberships.role = papel dentro do tenant (clinic_admin | therapist | supervisor | editor)
tenant.kind = tipo do tenant (clinic | saas | supervisor) → define qual menu e contexto
plans.target = para quem é o plano (clinic | therapist | supervisor)
plans.max_supervisees = limite de supervisionados (novo — Fase 1)
Entitlements: v_tenant_entitlements (plano do tenant) UNION v_user_entitlements (assinatura pessoal)