🏛️ Plataforma
🛡️
SaaS Admin
profiles.role = 'saas_admin'
Fase 1
Usuário (saas@agenciapsi.com.br)
  └── profiles.role 'saas_admin'
      // sem memberships de tenant
      // acessa /saas/*
role: saas_admin sem tenant

Acesso total à plataforma. Gerencia planos, features, assinaturas e usuários. Nunca entra em contexto de tenant.

✍️
Editor de Conteúdo
profiles.platform_roles[] = 'editor'
Fase 1
Usuário (editor@agenciapsi.com.br)
  └── profiles.platform_roles ['editor']
      // sem memberships de tenant
      // acessa /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
🏥
Admin da Clínica
tenant.kind = 'clinic'
Fase 1
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
          // acessa /admin/*
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.

🧑‍⚕️
Terapeuta da Clínica
tenant.kind = 'clinic' / role = 'therapist'
Fase 1
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
          // acessa /therapist/*
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
🧑‍💼
Terapeuta Solo
tenant.kind = 'saas'
Fase 1
Usuário (terapeuta@gmail.com)
  ├── profiles.role 'tenant_member'
  └── Membership: Tenant Pessoal
      ├── tenant.kind 'saas'
      ├── role 'therapist'
      └── plano therapist_free | therapist_pro
          // entitlements via v_user_entitlements
          // acessa /therapist/*
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).

🔀
Terapeuta Solo + Clínica
2 memberships / contexto switcher
Fase 1
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'
          // switcher de contexto no topbar
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)
🎓
Supervisor Solo
tenant.kind = 'supervisor'
Fase 1
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
          // acessa /supervisor/*
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).

🔀🎓
Terapeuta + Supervisor
2 tenants / 2 papéis
Fase 1
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
          // switcher: "Meu consultório" / "Minha supervisão"
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.

🏥🎓
Terapeuta (Clínica) + Supervisor
3 tenants possíveis
Fase 1
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
          // supervisão é INDEPENDENTE da clínica
          // colegas da clínica podem ser supervisionados
          // via convite no tenant de supervisão
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 com Supervisor Contratado
repasse financeiro AgenciaPsi
Fase 2
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
👤
Paciente
profiles.role = 'portal_user'
Fase 1
Usuário (paciente@gmail.com)
  ├── profiles.role 'portal_user'
  └── // sem memberships de tenant
      // acessa /portal/*
      // identidade global, não tenant
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.

Legenda

Novo — Fase 1 (supervisor)
Existente — Fase 1
Planejado — Fase 2
Plataforma (sem tenant)
profiles.role → identidade global
memberships.role → contexto de tenant

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)