567 lines
28 KiB
HTML
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> <span class="tree-branch">└──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'saas_admin'</span></div>
|
|
<div> <span class="tree-comment">// sem memberships de tenant</span></div>
|
|
<div> <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> <span class="tree-branch">└──</span> <span class="tree-key">profiles.platform_roles</span> <span class="tree-val">['editor']</span></div>
|
|
<div> <span class="tree-comment">// sem memberships de tenant</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'tenant_member'</span></div>
|
|
<div> <span class="tree-branch">└──</span> Membership: <span class="tree-val">Clínica X</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'clinic'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'clinic_admin'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-val">clinic_free | clinic_pro</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'tenant_member'</span></div>
|
|
<div> <span class="tree-branch">└──</span> Membership: <span class="tree-val">Clínica X</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'clinic'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">entitlements</span> <span class="tree-val">via plano da clínica</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'tenant_member'</span></div>
|
|
<div> <span class="tree-branch">└──</span> Membership: <span class="tree-val">Tenant Pessoal</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'saas'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-val">therapist_free | therapist_pro</span></div>
|
|
<div> <span class="tree-comment">// entitlements via v_user_entitlements</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> Membership A: <span class="tree-val">Tenant Pessoal</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'saas'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-val">therapist_pro</span></div>
|
|
<div> <span class="tree-branch">└──</span> Membership B: <span class="tree-val">Clínica X</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'clinic'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'tenant_member'</span></div>
|
|
<div> <span class="tree-branch">└──</span> Membership: <span class="tree-new">Tenant Supervisão (novo)</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-new">'supervisor'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-new">'supervisor'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">plano</span> <span class="tree-new">supervisor_free | supervisor_pro</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">max_supervisees</span> <span class="tree-new">3 | 20</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> Membership A: <span class="tree-val">Tenant Pessoal</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'saas'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-val">therapist_pro</span></div>
|
|
<div> <span class="tree-branch">└──</span> Membership B: <span class="tree-new">Tenant Supervisão (novo)</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-new">'supervisor'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-new">'supervisor'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-new">supervisor_pro</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> Membership A: <span class="tree-val">Clínica X</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-val">'clinic'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">role</span> <span class="tree-val">'therapist'</span></div>
|
|
<div> <span class="tree-branch">└──</span> Membership B: <span class="tree-new">Tenant Supervisão (novo)</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">tenant.kind</span> <span class="tree-new">'supervisor'</span></div>
|
|
<div> <span class="tree-branch">├──</span> <span class="tree-key">role</span> <span class="tree-new">'supervisor'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-key">plano</span> <span class="tree-new">supervisor_free | supervisor_pro</span></div>
|
|
<div> <span class="tree-comment">// supervisão é INDEPENDENTE da clínica</span></div>
|
|
<div> <span class="tree-comment">// colegas da clínica podem ser supervisionados</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> Ativa módulo <span class="tree-key">supervisao</span> (feature)</div>
|
|
<div> <span class="tree-branch">├──</span> Associa supervisor externo via convite</div>
|
|
<div> <span class="tree-branch">├──</span> Sessões registradas na plataforma</div>
|
|
<div> <span class="tree-branch">└──</span> Pagamento via AgenciaPsi</div>
|
|
<div> </div>
|
|
<div class="tree-root">Fluxo financeiro</div>
|
|
<div> <span class="tree-branch">└──</span> Clínica paga <span class="tree-warn">R$ 200/sessão</span></div>
|
|
<div> <span class="tree-branch">├──</span> Supervisor recebe <span class="tree-val">R$ 180</span></div>
|
|
<div> <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> <span class="tree-branch">├──</span> <span class="tree-key">profiles.role</span> <span class="tree-val">'portal_user'</span></div>
|
|
<div> <span class="tree-branch">└──</span> <span class="tree-comment">// sem memberships de tenant</span></div>
|
|
<div> <span class="tree-comment">// acessa /portal/*</span></div>
|
|
<div> <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>
|