Files
agenciapsilmno/USER_ARCHETYPES.html
Leonardo f733db8436 ZERADO
2026-03-06 06:37:13 -03:00

567 lines
28 KiB
HTML

<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AgenciaPsi — Arquétipos de Usuário</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: #0f1117;
color: #e2e8f0;
min-height: 100vh;
padding: 2rem 1rem 4rem;
}
/* ── Header ── */
.page-header {
text-align: center;
margin-bottom: 3rem;
}
.page-header h1 {
font-size: 2rem;
font-weight: 800;
letter-spacing: -0.04em;
background: linear-gradient(135deg, #818cf8, #34d399);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.page-header p {
margin-top: .5rem;
color: #64748b;
font-size: .95rem;
}
/* ── Grid ── */
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
gap: 1.5rem;
max-width: 1400px;
margin: 0 auto;
}
/* ── Card ── */
.card {
background: #1e2330;
border: 1px solid #2d3548;
border-radius: 1.25rem;
padding: 1.5rem;
display: flex;
flex-direction: column;
gap: 1rem;
transition: border-color .2s, transform .2s;
}
.card:hover {
border-color: #4f6ef7;
transform: translateY(-2px);
}
/* ── Card header ── */
.card-header {
display: flex;
align-items: center;
gap: .75rem;
}
.card-icon {
width: 2.75rem;
height: 2.75rem;
border-radius: .75rem;
display: grid;
place-items: center;
font-size: 1.25rem;
flex-shrink: 0;
}
.card-title { font-size: 1.05rem; font-weight: 700; line-height: 1.2; }
.card-subtitle { font-size: .75rem; color: #64748b; margin-top: 2px; font-family: monospace; }
/* ── Tree ── */
.tree {
background: #0f1117;
border-radius: .75rem;
padding: 1rem 1.1rem;
font-family: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
font-size: .78rem;
line-height: 1.8;
}
.tree-root { color: #a5b4fc; font-weight: 600; }
.tree-branch { color: #475569; }
.tree-leaf { color: #cbd5e1; }
.tree-comment { color: #475569; font-style: italic; }
.tree-key { color: #f472b6; }
.tree-val { color: #34d399; }
.tree-warn { color: #fb923c; }
.tree-new { color: #facc15; }
/* ── Badges ── */
.badges { display: flex; flex-wrap: wrap; gap: .4rem; }
.badge {
font-size: .68rem;
font-weight: 600;
padding: .2rem .6rem;
border-radius: 9999px;
border: 1px solid transparent;
letter-spacing: .02em;
}
.badge-purple { background: #312e81; border-color: #4f46e5; color: #a5b4fc; }
.badge-green { background: #064e3b; border-color: #059669; color: #6ee7b7; }
.badge-blue { background: #1e3a5f; border-color: #2563eb; color: #93c5fd; }
.badge-orange { background: #431407; border-color: #ea580c; color: #fdba74; }
.badge-yellow { background: #422006; border-color: #ca8a04; color: #fde047; }
.badge-pink { background: #500724; border-color: #db2777; color: #f9a8d4; }
.badge-gray { background: #1e293b; border-color: #475569; color: #94a3b8; }
.badge-red { background: #450a0a; border-color: #dc2626; color: #fca5a5; }
/* ── Notes ── */
.note {
font-size: .75rem;
color: #64748b;
line-height: 1.5;
border-left: 2px solid #2d3548;
padding-left: .75rem;
}
.note strong { color: #94a3b8; }
/* ── Phase tag ── */
.phase {
display: inline-flex;
align-items: center;
gap: .3rem;
font-size: .7rem;
font-weight: 700;
padding: .15rem .55rem;
border-radius: 9999px;
margin-left: auto;
}
.phase-1 { background: #064e3b; color: #6ee7b7; border: 1px solid #059669; }
.phase-2 { background: #422006; color: #fde047; border: 1px solid #ca8a04; }
/* ── Section label ── */
.section-label {
grid-column: 1 / -1;
font-size: .7rem;
font-weight: 700;
letter-spacing: .12em;
text-transform: uppercase;
color: #475569;
padding: .25rem 0;
border-bottom: 1px solid #2d3548;
margin-bottom: -.25rem;
}
/* ── Legend ── */
.legend {
max-width: 1400px;
margin: 2.5rem auto 0;
background: #1e2330;
border: 1px solid #2d3548;
border-radius: 1.25rem;
padding: 1.25rem 1.5rem;
}
.legend h3 { font-size: .8rem; font-weight: 700; color: #64748b; letter-spacing: .08em; text-transform: uppercase; margin-bottom: .75rem; }
.legend-grid { display: flex; flex-wrap: wrap; gap: 1rem 2rem; }
.legend-item { display: flex; align-items: center; gap: .5rem; font-size: .78rem; color: #94a3b8; }
.legend-dot { width: .65rem; height: .65rem; border-radius: 50%; }
</style>
</head>
<body>
<div class="page-header">
<h1>AgenciaPsi — Arquétipos de Usuário</h1>
<p>Como cada tipo de usuário está estruturado no banco de dados e no sistema de permissões.</p>
</div>
<div class="grid">
<!-- ════════════════════════════════════════ PLATAFORMA ══ -->
<div class="section-label">🏛️ Plataforma</div>
<!-- SaaS Admin -->
<div class="card">
<div class="card-header">
<div class="card-icon" style="background:#312e81">🛡️</div>
<div>
<div class="card-title">SaaS Admin</div>
<div class="card-subtitle">profiles.role = 'saas_admin'</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (saas@agenciapsi.com.br)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'saas_admin'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// sem memberships de tenant</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// acessa /saas/*</span></div>
</div>
<div class="badges">
<span class="badge badge-purple">role: saas_admin</span>
<span class="badge badge-gray">sem tenant</span>
</div>
<p class="note">Acesso total à plataforma. Gerencia planos, features, assinaturas e usuários. Nunca entra em contexto de tenant.</p>
</div>
<!-- Editor -->
<div class="card">
<div class="card-header">
<div class="card-icon" style="background:#1e3a5f">✍️</div>
<div>
<div class="card-title">Editor de Conteúdo</div>
<div class="card-subtitle">profiles.platform_roles[] = 'editor'</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (editor@agenciapsi.com.br)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">profiles.platform_roles</span> <span class="tree-val">['editor']</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// sem memberships de tenant</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// acessa /editor/*</span></div>
</div>
<div class="badges">
<span class="badge badge-blue">platform_roles: editor</span>
<span class="badge badge-gray">sem tenant</span>
</div>
<p class="note">Papel de plataforma (não de tenant). Gerencia conteúdo público, landing pages, textos. Verificado via <code>platform_roles[]</code>.</p>
</div>
<!-- ════════════════════════════════════════ CLÍNICA ══ -->
<div class="section-label">🏥 Clínica</div>
<!-- Clinic Admin -->
<div class="card">
<div class="card-header">
<div class="card-icon" style="background:#064e3b">🏥</div>
<div>
<div class="card-title">Admin da Clínica</div>
<div class="card-subtitle">tenant.kind = 'clinic'</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (admin@clinicax.com.br)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'tenant_member'</span></div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Membership: <span class="tree-val">Clínica X</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'clinic'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'clinic_admin'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-val">clinic_free | clinic_pro</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// acessa /admin/*</span></div>
</div>
<div class="badges">
<span class="badge badge-green">role: clinic_admin</span>
<span class="badge badge-blue">tenant: clinic</span>
<span class="badge badge-gray">clinic_free</span>
<span class="badge badge-purple">clinic_pro</span>
</div>
<p class="note">Dono ou gestor de uma clínica. Gerencia profissionais, pacientes, agenda e módulos da clínica.</p>
</div>
<!-- Terapeuta da Clínica -->
<div class="card">
<div class="card-header">
<div class="card-icon" style="background:#1e3a5f">🧑‍⚕️</div>
<div>
<div class="card-title">Terapeuta da Clínica</div>
<div class="card-subtitle">tenant.kind = 'clinic' / role = 'therapist'</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (terapeuta@clinicax.com.br)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'tenant_member'</span></div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Membership: <span class="tree-val">Clínica X</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'clinic'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">entitlements</span> <span class="tree-val">via plano da clínica</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// acessa /therapist/*</span></div>
</div>
<div class="badges">
<span class="badge badge-green">role: therapist</span>
<span class="badge badge-blue">tenant: clinic</span>
<span class="badge badge-gray">entitlements da clínica</span>
</div>
<p class="note">Terapeuta vinculado a uma clínica. Seus entitlements vêm do plano do tenant (clínica), não de assinatura pessoal.</p>
</div>
<!-- ════════════════════════════════════════ TERAPEUTA INDEPENDENTE ══ -->
<div class="section-label">🧑‍💼 Terapeuta Independente</div>
<!-- Terapeuta Solo -->
<div class="card">
<div class="card-header">
<div class="card-icon" style="background:#064e3b">🧑‍💼</div>
<div>
<div class="card-title">Terapeuta Solo</div>
<div class="card-subtitle">tenant.kind = 'saas'</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (terapeuta@gmail.com)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'tenant_member'</span></div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Membership: <span class="tree-val">Tenant Pessoal</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'saas'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-val">therapist_free | therapist_pro</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// entitlements via v_user_entitlements</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// acessa /therapist/*</span></div>
</div>
<div class="badges">
<span class="badge badge-green">role: therapist</span>
<span class="badge badge-gray">tenant: saas (pessoal)</span>
<span class="badge badge-gray">therapist_free</span>
<span class="badge badge-purple">therapist_pro</span>
</div>
<p class="note">Terapeuta autônomo sem clínica. Assina diretamente. Entitlements vêm de <code>v_user_entitlements</code> (assinatura pessoal).</p>
</div>
<!-- Terapeuta Solo + Clínica -->
<div class="card">
<div class="card-header">
<div class="card-icon" style="background:#1e3a5f">🔀</div>
<div>
<div class="card-title">Terapeuta Solo + Clínica</div>
<div class="card-subtitle">2 memberships / contexto switcher</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (terapeuta@gmail.com)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> Membership A: <span class="tree-val">Tenant Pessoal</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'saas'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-val">therapist_pro</span></div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Membership B: <span class="tree-val">Clínica X</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'clinic'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// switcher de contexto no topbar</span></div>
</div>
<div class="badges">
<span class="badge badge-green">role: therapist</span>
<span class="badge badge-blue">2 tenants</span>
<span class="badge badge-purple">therapist_pro</span>
<span class="badge badge-gray">switcher de contexto</span>
</div>
<p class="note">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.</p>
</div>
<!-- ════════════════════════════════════════ SUPERVISOR ══ -->
<div class="section-label">🎓 Supervisor (Fase 1 — novo)</div>
<!-- Supervisor Solo -->
<div class="card" style="border-color: #ca8a04">
<div class="card-header">
<div class="card-icon" style="background:#422006">🎓</div>
<div>
<div class="card-title">Supervisor Solo</div>
<div class="card-subtitle">tenant.kind = 'supervisor'</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (supervisor@gmail.com)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'tenant_member'</span></div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Membership: <span class="tree-new">Tenant Supervisão (novo)</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-new">'supervisor'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-new">'supervisor'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">plano</span> <span class="tree-new">supervisor_free | supervisor_pro</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">max_supervisees</span> <span class="tree-new">3 | 20</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// acessa /supervisor/*</span></div>
</div>
<div class="badges">
<span class="badge badge-yellow">role: supervisor</span>
<span class="badge badge-yellow">tenant: supervisor</span>
<span class="badge badge-yellow">supervisor_free</span>
<span class="badge badge-orange">supervisor_pro</span>
</div>
<p class="note"><strong>Novo.</strong> Supervisor independente. Tem sua própria sala de supervisão. O plano define o limite de terapeutas supervisionados (<code>plans.max_supervisees</code>).</p>
</div>
<!-- Terapeuta + Supervisor -->
<div class="card" style="border-color: #ca8a04">
<div class="card-header">
<div class="card-icon" style="background:#422006">🔀🎓</div>
<div>
<div class="card-title">Terapeuta + Supervisor</div>
<div class="card-subtitle">2 tenants / 2 papéis</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (terapeuta@gmail.com)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> Membership A: <span class="tree-val">Tenant Pessoal</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'saas'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-val">therapist_pro</span></div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Membership B: <span class="tree-new">Tenant Supervisão (novo)</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-new">'supervisor'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-new">'supervisor'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-new">supervisor_pro</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// switcher: "Meu consultório" / "Minha supervisão"</span></div>
</div>
<div class="badges">
<span class="badge badge-green">therapist</span>
<span class="badge badge-yellow">supervisor</span>
<span class="badge badge-blue">2 tenants</span>
<span class="badge badge-purple">therapist_pro</span>
<span class="badge badge-orange">supervisor_pro</span>
</div>
<p class="note"><strong>O caso mais comum.</strong> Atua como terapeuta no tenant pessoal e como supervisor no tenant de supervisão. Switcher de contexto no topbar.</p>
</div>
<!-- Terapeuta (clínica) + Supervisor -->
<div class="card" style="border-color: #ca8a04">
<div class="card-header">
<div class="card-icon" style="background:#422006">🏥🎓</div>
<div>
<div class="card-title">Terapeuta (Clínica) + Supervisor</div>
<div class="card-subtitle">3 tenants possíveis</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (terapeuta@clinicax.com.br)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> Membership A: <span class="tree-val">Clínica X</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'clinic'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Membership B: <span class="tree-new">Tenant Supervisão (novo)</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-new">'supervisor'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-new">'supervisor'</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-new">supervisor_free | supervisor_pro</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// supervisão é INDEPENDENTE da clínica</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// colegas da clínica podem ser supervisionados</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// via convite no tenant de supervisão</span></div>
</div>
<div class="badges">
<span class="badge badge-green">therapist (clínica)</span>
<span class="badge badge-yellow">supervisor (independente)</span>
<span class="badge badge-orange">supervisor_pro</span>
</div>
<p class="note">Trabalha na clínica como terapeuta <strong>e</strong> supervisiona outros terapeutas (inclusive colegas da clínica) de forma independente. A clínica não interfere na supervisão.</p>
</div>
<!-- ════════════════════════════════════════ FASE 2 ══ -->
<div class="section-label">🚀 Fase 2 — Marketplace de Supervisão</div>
<!-- Clínica com Supervisor Associado -->
<div class="card" style="border-color: #475569; opacity: .8">
<div class="card-header">
<div class="card-icon" style="background:#1e293b">🏥🤝🎓</div>
<div>
<div class="card-title">Clínica com Supervisor Contratado</div>
<div class="card-subtitle">repasse financeiro AgenciaPsi</div>
</div>
<span class="phase phase-2">Fase 2</span>
</div>
<div class="tree">
<div class="tree-root">Clínica X</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> Ativa módulo <span class="tree-key">supervisao</span> (feature)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> Associa supervisor externo via convite</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> Sessões registradas na plataforma</div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Pagamento via AgenciaPsi</div>
<div>&nbsp;</div>
<div class="tree-root">Fluxo financeiro</div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> Clínica paga <span class="tree-warn">R$ 200/sessão</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">├──</span> Supervisor recebe <span class="tree-val">R$ 180</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-branch">└──</span> AgenciaPsi retém <span class="tree-warn">R$ 20 (10%)</span></div>
</div>
<div class="badges">
<span class="badge badge-pink">split de pagamento</span>
<span class="badge badge-gray">Stripe Connect / Iugu</span>
<span class="badge badge-red">Fase 2</span>
</div>
<p class="note"><strong>Futuro.</strong> A clínica contrata supervisão via plataforma. AgenciaPsi faz o split automático. Requer gateway com marketplace split (Stripe Connect, Iugu, Pagar.me).</p>
</div>
<!-- ════════════════════════════════════════ PACIENTE ══ -->
<div class="section-label">👤 Paciente / Portal</div>
<!-- Paciente -->
<div class="card">
<div class="card-header">
<div class="card-icon" style="background:#500724">👤</div>
<div>
<div class="card-title">Paciente</div>
<div class="card-subtitle">profiles.role = 'portal_user'</div>
</div>
<span class="phase phase-1">Fase 1</span>
</div>
<div class="tree">
<div class="tree-root">Usuário (paciente@gmail.com)</div>
<div>&nbsp;&nbsp;<span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'portal_user'</span></div>
<div>&nbsp;&nbsp;<span class="tree-branch">└──</span> <span class="tree-comment">// sem memberships de tenant</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// acessa /portal/*</span></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tree-comment">// identidade global, não tenant</span></div>
</div>
<div class="badges">
<span class="badge badge-pink">role: portal_user</span>
<span class="badge badge-gray">sem tenant</span>
</div>
<p class="note">Acessa apenas o portal do paciente. Vê suas sessões, agenda e documentos. Nunca entra na área de tenant-app.</p>
</div>
</div><!-- /grid -->
<!-- ── LEGEND ── -->
<div class="legend">
<h3>Legenda</h3>
<div class="legend-grid">
<div class="legend-item"><div class="legend-dot" style="background:#facc15"></div> Novo — Fase 1 (supervisor)</div>
<div class="legend-item"><div class="legend-dot" style="background:#6ee7b7"></div> Existente — Fase 1</div>
<div class="legend-item"><div class="legend-dot" style="background:#fb923c"></div> Planejado — Fase 2</div>
<div class="legend-item"><div class="legend-dot" style="background:#a5b4fc"></div> Plataforma (sem tenant)</div>
<div class="legend-item"><div class="legend-dot" style="background:#94a3b8"></div> profiles.role → identidade global</div>
<div class="legend-item"><div class="legend-dot" style="background:#f9a8d4"></div> memberships.role → contexto de tenant</div>
</div>
</div>
<!-- ── RESUMO TÉCNICO ── -->
<div class="legend" style="margin-top: 1rem">
<h3>Resumo Técnico — Como o Guard decide o menu</h3>
<div style="font-family: monospace; font-size: .8rem; line-height: 2; color: #94a3b8;">
<div><span style="color:#a5b4fc">profiles.role</span> = identidade global (saas_admin | tenant_member | portal_user)</div>
<div><span style="color:#6ee7b7">memberships.role</span> = papel dentro do tenant (clinic_admin | therapist | supervisor | editor)</div>
<div><span style="color:#f9a8d4">tenant.kind</span> = tipo do tenant (clinic | saas | supervisor) → define qual menu e contexto</div>
<div><span style="color:#fde047">plans.target</span> = para quem é o plano (clinic | therapist | supervisor)</div>
<div><span style="color:#fdba74">plans.max_supervisees</span> = limite de supervisionados (novo — Fase 1)</div>
<div style="margin-top:.5rem; color: #475569">
Entitlements: v_tenant_entitlements (plano do tenant) UNION v_user_entitlements (assinatura pessoal)
</div>
</div>
</div>
</body>
</html>