Files
agenciapsilmno/docs/architecture/Pacientes/cadastro_pacientes_levantamento.html

373 lines
23 KiB
HTML

<style>
* { box-sizing: border-box; }
.page { padding: 0 0 32px; }
.section { margin-bottom: 28px; }
.section-title { font-size: 11px; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; color: var(--color-text-tertiary); margin: 0 0 10px; padding-bottom: 6px; border-bottom: 0.5px solid var(--color-border-tertiary); }
.cards { display: grid; gap: 10px; }
.cards-2 { grid-template-columns: repeat(2, minmax(0,1fr)); }
.cards-3 { grid-template-columns: repeat(3, minmax(0,1fr)); }
.card { background: var(--color-background-primary); border: 0.5px solid var(--color-border-tertiary); border-radius: var(--border-radius-lg); padding: 14px 16px; }
.card-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; margin-bottom: 4px; }
.card-title { font-size: 13px; font-weight: 500; color: var(--color-text-primary); margin: 0; display: flex; align-items: center; gap: 7px; }
.card-desc { font-size: 12px; color: var(--color-text-secondary); line-height: 1.55; margin: 0; }
.card-fields { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 5px; }
.field { font-size: 11px; padding: 3px 8px; border-radius: 20px; border: 0.5px solid var(--color-border-secondary); color: var(--color-text-secondary); background: var(--color-background-secondary); font-family: var(--font-mono); }
.field-has { background: #EAF3DE; border-color: #C0DD97; color: #27500A; }
.field-miss { background: #FCEBEB; border-color: #F7C1C1; color: #791F1F; }
.badge { font-size: 11px; font-weight: 500; padding: 2px 8px; border-radius: 20px; white-space: nowrap; flex-shrink: 0; align-self: flex-start; margin-top: 1px; }
.badge-has { background: #EAF3DE; color: #27500A; }
.badge-part { background: #FAEEDA; color: #633806; }
.badge-miss { background: #FCEBEB; color: #791F1F; }
.badge-diff { background: #E6F1FB; color: #0C447C; }
@media (prefers-color-scheme: dark) {
.field-has { background: #173404; border-color: #27500A; color: #C0DD97; }
.field-miss { background: #501313; border-color: #791F1F; color: #F7C1C1; }
.badge-has { background: #173404; color: #C0DD97; }
.badge-part { background: #412402; color: #FAC775; }
.badge-miss { background: #501313; color: #F7C1C1; }
.badge-diff { background: #042C53; color: #B5D4F4; }
}
.icon-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; display: inline-block; margin-top: 3px; }
.dot-has { background: #639922; }
.dot-part { background: #EF9F27; }
.dot-miss { background: #E24B4A; }
.dot-diff { background: #378ADD; }
.legend { display: flex; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }
.legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--color-text-secondary); }
.sub { font-size: 11px; color: var(--color-text-tertiary); margin: 2px 0 6px; font-family: var(--font-mono); }
.note { font-size: 12px; color: var(--color-text-secondary); background: var(--color-background-secondary); border-left: 2px solid var(--color-border-secondary); padding: 8px 12px; margin-top: 10px; line-height: 1.5; border-radius: 0; }
</style>
<div class="page">
<div class="legend">
<div class="legend-item"><span class="icon-dot dot-has"></span> você já tem</div>
<div class="legend-item"><span class="icon-dot dot-part"></span> tem parcialmente</div>
<div class="legend-item"><span class="icon-dot dot-miss"></span> faltando</div>
<div class="legend-item"><span class="icon-dot dot-diff"></span> diferencial de mercado</div>
</div>
<div class="section">
<div class="section-title">1 · Identificação & dados pessoais</div>
<div class="cards cards-2">
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Dados básicos de identificação</div><div class="sub">núcleo do cadastro</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">Nome, email, telefone, data de nascimento, CPF, RG, gênero, naturalidade, estado civil, escolaridade e profissão.</div>
<div class="card-fields">
<span class="field field-has">nome_completo</span><span class="field field-has">email_principal</span><span class="field field-has">telefone</span><span class="field field-has">data_nascimento</span><span class="field field-has">cpf</span><span class="field field-has">rg</span><span class="field field-has">genero</span><span class="field field-has">estado_civil</span><span class="field field-has">escolaridade</span><span class="field field-has">profissao</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-part"></span> Gênero & pronomes</div><div class="sub">campo genero existe, pronomes não</div></div>
<span class="badge badge-part">parcial</span>
</div>
<div class="card-desc">Você tem o campo <span style="font-family:var(--font-mono);font-size:11px">genero</span> como texto livre. Faltam pronomes preferidos (ele/ela/eles) — padrão nos sistemas modernos de saúde mental, especialmente para público LGBTQIA+.</div>
<div class="card-fields">
<span class="field field-has">genero</span>
<span class="field field-miss">pronomes</span>
<span class="field field-miss">nome_social</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Endereço completo</div><div class="sub">CEP, cidade, estado, complemento</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">CEP, endereço, número, bairro, complemento, cidade, estado e país. Estrutura adequada.</div>
<div class="card-fields">
<span class="field field-has">cep</span><span class="field field-has">endereco</span><span class="field field-has">numero</span><span class="field field-has">bairro</span><span class="field field-has">cidade</span><span class="field field-has">estado</span><span class="field field-has">pais</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-miss"></span> Dados socioeconômicos</div><div class="sub">renda e contexto social</div></div>
<span class="badge badge-miss">faltando</span>
</div>
<div class="card-desc">Faixa de renda, religião/espiritualidade, etnia. Campos opcionais mas relevantes clinicamente e para política de precificação solidária. SimplePractice e Psicologia Viva coletam isso.</div>
<div class="card-fields">
<span class="field field-miss">faixa_renda</span>
<span class="field field-miss">etnia</span>
<span class="field field-miss">religiao</span>
</div>
</div>
</div>
</div>
<div class="section">
<div class="section-title">2 · Contatos & rede de suporte</div>
<div class="cards cards-2">
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-part"></span> Contato de emergência</div><div class="sub">só um contato, sem estrutura</div></div>
<span class="badge badge-part">parcial</span>
</div>
<div class="card-desc">Você tem <span style="font-family:var(--font-mono);font-size:11px">nome_parente</span>, <span style="font-family:var(--font-mono);font-size:11px">grau_parentesco</span> e <span style="font-family:var(--font-mono);font-size:11px">telefone_parente</span> como campos soltos na tabela. Falta suporte a múltiplos contatos e campo de email do contato.</div>
<div class="card-fields">
<span class="field field-has">nome_parente</span><span class="field field-has">grau_parentesco</span><span class="field field-has">telefone_parente</span>
<span class="field field-miss">email_contato</span><span class="field field-miss">multiplos_contatos</span><span class="field field-miss">contato_primario</span>
</div>
<div class="note">Ideal: tabela separada <span style="font-family:var(--font-mono)">patient_contacts</span> com N contatos por paciente.</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Responsável legal</div><div class="sub">para menores de idade</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">Nome, CPF, telefone do responsável e flag de cobrança no responsável. Cobre bem o caso de pacientes menores.</div>
<div class="card-fields">
<span class="field field-has">nome_responsavel</span><span class="field field-has">telefone_responsavel</span><span class="field field-has">cpf_responsavel</span><span class="field field-has">cobranca_no_responsavel</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-miss"></span> Outros profissionais de saúde</div><div class="sub">psiquiatra, médico, nutricionista</div></div>
<span class="badge badge-miss">faltando</span>
</div>
<div class="card-desc">Nome e contato do psiquiatra, médico ou outros profissionais que acompanham o paciente. Essencial para coordenação de cuidados. Presente no SimplePractice e TheraNest.</div>
<div class="card-fields">
<span class="field field-miss">nome_profissional</span><span class="field field-miss">especialidade</span><span class="field field-miss">telefone_profissional</span><span class="field field-miss">email_profissional</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-diff"></span> Preferências de comunicação</div><div class="sub">como o paciente quer ser contatado</div></div>
<span class="badge badge-diff">diferencial</span>
</div>
<div class="card-desc">Canal preferido (WhatsApp, email, SMS), horário preferido para contato, idioma preferido. Alimenta diretamente os lembretes automáticos com as preferências do paciente.</div>
<div class="card-fields">
<span class="field field-miss">canal_preferido</span><span class="field field-miss">horario_contato</span><span class="field field-miss">idioma</span>
</div>
</div>
</div>
</div>
<div class="section">
<div class="section-title">3 · Origem & encaminhamento</div>
<div class="cards cards-2">
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-part"></span> Como chegou ao terapeuta</div><div class="sub">campos existem mas são texto livre</div></div>
<span class="badge badge-part">parcial</span>
</div>
<div class="card-desc">Você tem <span style="font-family:var(--font-mono);font-size:11px">onde_nos_conheceu</span> e <span style="font-family:var(--font-mono);font-size:11px">encaminhado_por</span> como texto livre. Ideal ser enum + texto opcional para permitir filtros e relatórios de origem.</div>
<div class="card-fields">
<span class="field field-has">onde_nos_conheceu</span><span class="field field-has">encaminhado_por</span>
<span class="field field-miss">origem_enum</span><span class="field field-miss">agendador_publico_ref</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-miss"></span> Motivo de inatividade ou alta</div><div class="sub">por que o paciente saiu</div></div>
<span class="badge badge-miss">faltando</span>
</div>
<div class="card-desc">Quando paciente vai para "Alta", "Inativo" ou "Encaminhado" — qual o motivo? Alta terapêutica, abandono, encaminhamento, mudança de cidade. Essencial para relatórios e qualidade clínica.</div>
<div class="card-fields">
<span class="field field-miss">motivo_saida</span><span class="field field-miss">data_saida</span><span class="field field-miss">encaminhado_para</span>
</div>
</div>
</div>
</div>
<div class="section">
<div class="section-title">4 · Status & ciclo de vida do paciente</div>
<div class="cards cards-2">
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Status do paciente</div><div class="sub">Ativo, Inativo, Alta, Encaminhado, Arquivado</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">Enum bem definido com os 5 status mais relevantes. Constraint no banco garante integridade.</div>
<div class="card-fields">
<span class="field field-has">Ativo</span><span class="field field-has">Inativo</span><span class="field field-has">Alta</span><span class="field field-has">Encaminhado</span><span class="field field-has">Arquivado</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-miss"></span> Histórico de mudanças de status</div><div class="sub">trilha de auditoria do ciclo de vida</div></div>
<span class="badge badge-miss">faltando</span>
</div>
<div class="card-desc">Quando o status mudou, quem mudou e por quê. Permite ver o histórico completo: "Ativo → Inativo (01/03) → Ativo (15/04)". Exigência de auditoria clínica.</div>
<div class="card-fields">
<span class="field field-miss">status_anterior</span><span class="field field-miss">status_novo</span><span class="field field-miss">motivo</span><span class="field field-miss">alterado_por</span><span class="field field-miss">alterado_em</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Escopo do paciente (clínica vs. terapeuta)</div><div class="sub">patient_scope bem modelado</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">Distinção entre paciente da clínica (qualquer terapeuta pode atender) e paciente particular do terapeuta. Com constraint de consistência.</div>
<div class="card-fields">
<span class="field field-has">patient_scope</span><span class="field field-has">therapist_member_id</span><span class="field field-has">responsible_member_id</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-diff"></span> Alerta & flag de risco</div><div class="sub">sinalização visível no topo do cadastro</div></div>
<span class="badge badge-diff">diferencial</span>
</div>
<div class="card-desc">Flag booleano de risco elevado com nota associada. Exibe alerta vermelho no topo do cadastro e do prontuário. Terapeuta sinaliza pacientes que precisam de atenção especial (ideação, crise recente).</div>
<div class="card-fields">
<span class="field field-miss">risco_elevado</span><span class="field field-miss">nota_risco</span><span class="field field-miss">sinalizado_em</span><span class="field field-miss">sinalizado_por</span>
</div>
</div>
</div>
</div>
<div class="section">
<div class="section-title">5 · Organização & segmentação</div>
<div class="cards cards-2">
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Tags de paciente</div><div class="sub">patient_tags + patient_patient_tag</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">Tags com nome e cor, por tenant, com many-to-many. Bem estruturado.</div>
<div class="card-fields">
<span class="field field-has">patient_tags</span><span class="field field-has">patient_patient_tag</span><span class="field field-has">cor</span><span class="field field-has">is_padrao</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Grupos de pacientes</div><div class="sub">patient_groups com many-to-many</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">Grupos com nome, cor, descrição, status ativo e flag de sistema. Relação many-to-many com <span style="font-family:var(--font-mono);font-size:11px">patient_group_patient</span>.</div>
<div class="card-fields">
<span class="field field-has">patient_groups</span><span class="field field-has">patient_group_patient</span><span class="field field-has">is_system</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Cor de identificação</div><div class="sub">identification_color na agenda</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">Cor atribuída ao paciente para visualização rápida na agenda. Diferencial visual que poucos sistemas brasileiros têm.</div>
<div class="card-fields">
<span class="field field-has">identification_color</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-diff"></span> Score de engajamento</div><div class="sub">calculado automaticamente</div></div>
<span class="badge badge-diff">diferencial</span>
</div>
<div class="card-desc">Score calculado por view/função baseado em: frequência de sessões, taxa de comparecimento, dias desde última sessão, pagamentos em dia. Exibido como indicador no card do paciente. Ajuda a identificar quem precisa de atenção.</div>
<div class="card-fields">
<span class="field field-miss">engajamento_score</span><span class="field field-miss">taxa_comparecimento</span><span class="field field-miss">dias_sem_sessao</span>
</div>
</div>
</div>
</div>
<div class="section">
<div class="section-title">6 · Financeiro vinculado ao paciente</div>
<div class="cards cards-2">
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-has"></span> Descontos individuais</div><div class="sub">patient_discounts bem modelado</div></div>
<span class="badge badge-has">completo</span>
</div>
<div class="card-desc">Desconto percentual ou fixo por paciente, com período de validade e motivo. Bem estruturado com active_from e active_to.</div>
<div class="card-fields">
<span class="field field-has">discount_pct</span><span class="field field-has">discount_flat</span><span class="field field-has">active_from</span><span class="field field-has">active_to</span><span class="field field-has">reason</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-miss"></span> Limite de sessões por período</div><div class="sub">controle de plano ou convênio</div></div>
<span class="badge badge-miss">faltando</span>
</div>
<div class="card-desc">Pacientes de convênio frequentemente têm limite de sessões autorizadas por mês. Campo para registrar o limite e controlar o consumo — alerta quando está próximo do teto.</div>
<div class="card-fields">
<span class="field field-miss">limite_sessoes_mes</span><span class="field field-miss">sessoes_usadas</span><span class="field field-miss">periodo_referencia</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-miss"></span> Método de pagamento preferido</div><div class="sub">como esse paciente costuma pagar</div></div>
<span class="badge badge-miss">faltando</span>
</div>
<div class="card-desc">PIX, cartão, dinheiro, convênio. Aparece como sugestão padrão ao registrar cobrança. Evita perguntar toda vez como o paciente paga.</div>
<div class="card-fields">
<span class="field field-miss">metodo_pagamento_preferido</span><span class="field field-miss">dados_pagamento_obs</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-diff"></span> LTV & métricas financeiras do paciente</div><div class="sub">calculado por view</div></div>
<span class="badge badge-diff">diferencial</span>
</div>
<div class="card-desc">Total pago desde o início, ticket médio por sessão, total de sessões realizadas. Calculado por view em cima de financial_records — sem armazenar, sem inconsistência.</div>
<div class="card-fields">
<span class="field field-miss">v_patient_ltv</span><span class="field field-miss">total_pago</span><span class="field field-miss">ticket_medio</span><span class="field field-miss">total_sessoes</span>
</div>
</div>
</div>
</div>
<div class="section">
<div class="section-title">7 · Observações & notas internas</div>
<div class="cards cards-2">
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-part"></span> Observações gerais</div><div class="sub">dois campos de texto soltos</div></div>
<span class="badge badge-part">parcial</span>
</div>
<div class="card-desc">Você tem <span style="font-family:var(--font-mono);font-size:11px">observacoes</span> e <span style="font-family:var(--font-mono);font-size:11px">notas_internas</span> como campos de texto livre. Funciona, mas sem distinção clara de propósito ou histórico de edições.</div>
<div class="card-fields">
<span class="field field-has">observacoes</span><span class="field field-has">notas_internas</span>
<span class="field field-miss">historico_edicoes</span><span class="field field-miss">editado_por</span>
</div>
</div>
<div class="card">
<div class="card-header">
<div><div class="card-title"><span class="icon-dot dot-diff"></span> Linha do tempo do paciente</div><div class="sub">feed cronológico de tudo que aconteceu</div></div>
<span class="badge badge-diff">diferencial</span>
</div>
<div class="card-desc">Feed automático com eventos relevantes: "Primeira sessão", "Mudança de status", "Documento assinado", "Escala respondida", "Pagamento em atraso". Visível no topo do cadastro como timeline. SimplePractice tem isso.</div>
<div class="card-fields">
<span class="field field-miss">patient_timeline</span><span class="field field-miss">evento_tipo</span><span class="field field-miss">descricao</span><span class="field field-miss">ocorrido_em</span>
</div>
</div>
</div>
</div>
</div>