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:
566
docs/USER_ARCHETYPES.html
Normal file
566
docs/USER_ARCHETYPES.html
Normal file
@@ -0,0 +1,566 @@
|
||||
<!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>
|
||||
Reference in New Issue
Block a user