Indicadores visuais de pagamento
Como o sistema mostra "essa sessão ainda não foi paga" sem que você precise abrir o financeiro pra checar.
Na agenda — 3 estados
- Pendente: sessão com paciente, cobrança gerada mas não paga (ou nenhuma cobrança ainda).
- Pago: record marcado como
paidem/financeiro. Pra ver de relance quais sessões já estão quitadas. - Neutro: sem cobrança (compromisso pessoal, bloqueio) ou ocorrência virtual de pacote upfront/saldo — controlados pelo contrato.
- Os 3 canais não competem: esquerda = pago, direita = pendente, nada = neutro.
No popover da sessão — linha "A receber"
- Linha em destaque amber logo abaixo do horário, com ícone $.
- Texto adapta-se ao caso:
- "A cobrar R$ X" — quando ainda não há cobrança gerada (sessão "Não cobrar").
- "A receber R$ X (cobrança pendente)" — quando o record existe mas não foi pago.
- "Cobrança ainda não gerada" — quando a sessão não tem valor definido.
- Some quando a sessão fica paga.
1 Bloqueio · sem paciente, sem cobrança
Almoço, feriado, férias ou compromisso pessoal. Aparece cinza no calendário e não gera lançamento no financeiro.
- Abra
BloqueioDialogpelo menu da agenda, escolha modo Período e crie um bloqueio de 15/05 a 17/05 com motivo "Férias curtas". - Confira que o intervalo aparece em cinza nas 3 agendas (Melissa / Rail / Clínica) e que nada foi gerado em
/financeiro. - Clique num horário dentro do bloqueio (ex: 16/05 às 10h). O
AgendaEventDialogabre normalmente, com um aviso amarelo no topo avisando que aquele slot está bloqueado. Você pode prosseguir e criar o compromisso assim mesmo — o aviso é só pra evitar acidente.
BloqueioDialog · "Período"
Financeiro · Lançamentos
AgendaEventDialog · escolha do tipo
O que acontece
Você decide. Diferente do agendador público (que veta agendamento em bloqueio), aqui o sistema só te avisa. É comum querer encaixar uma sessão sobre um almoço, ou agendar uma reunião em pleno feriado.
- Se prosseguir, o compromisso é criado normalmente e aparece por cima da faixa cinza do bloqueio.
- Se quiser cancelar, basta fechar o dialog — nenhum dado é gravado.
- O aviso usa o título do bloqueio (ex: "Férias curtas") pra você lembrar o motivo do bloqueio antes de decidir.
2 Avulsa · sem cobrança chargeMode = none
Sessão única, terapeuta decide depois se cobra (modo manual / fechamento mensal).
/financeiro.
/financeiro.
AgendaEventDialog · Ana Souza Ferreira
Você pode gerar a cobrança depois pelo /financeiro ou pelo painel da sessão.
Financeiro · Ana
3 Avulsa · cobrar ao salvar particular
Gera lançamento pendente no ato. Default da agenda em modo manual.
/financeiro com status pendente, payment_method = pix e paid_at = null.
/financeiro.
AgendaEventDialog · Henrique
Só aparece quando a forma de pagamento não é o link Asaas (que é sempre liquidado pelo gateway).
Financeiro · Henrique
4 Avulsa · "já recebi" no momento da criação
Quando o paciente paga PIX/dinheiro na hora — record já nasce pago.
/financeiro com status pago, payment_method = pix e paid_at = hoje.
Joyce · Sessão R$ 180
Quando escolhe "Já recebi", o record nasce com paid_at = agora + status = paid.
Financeiro · Joyce
5 Avulsa · convênio
Valor pago pelo plano de saúde, não pelo paciente. Lançamento vinculado ao plano.
InsurancePlanQuickCreateDialog se não existir), valor R$ 95. Salvar. Verificar record com insurance_plan_id preenchido e pill "convênio" visível.
Sándor · sessão por convênio
Cobrança vai pra fechamento mensal do convênio — não cobra o paciente.
Financeiro · Sándor
6 Recorrente · sem pacote chargeMode = none
Série semanal, mas cobrança decidida sessão a sessão (status driven ou manual depois).
agenda_eventos + 1 row em recurrence_rules; outras 3 ocorrências expandidas em runtime. Zero em /financeiro.
Anna Freud · semanal · 4 sessões
Modelo "1 real + N-1 virtual"
Só a 1ª ocorrência vira row em agenda_eventos. As demais são rec::ruleId::date expandidas em runtime.
Financeiro · Anna Freud
7 Recorrente · pacote único UPFRONT
1 cobrança do valor total no salvar. Cada sessão posterior é "consumo" do já pago.
/financeiro + 1 billing_contract com charging_style=upfront, sessions_used=0.
Donald Winnicott · 4× R$ 200 = R$ 800
Financeiro · Donald
8 Recorrente · pacote único SALDO
Sem record financeiro inicial. Cria billing_contract com sessions_total. Records nascem 1 a 1 quando sessão é realizada.
/financeiro + 1 billing_contract com charging_style=saldo, sessions_total=4, sessions_used=0.
Carl Jung · 4× R$ 40 = R$ 160
Cobra 1 record por sessão realizada. Pacote dá direito ao preço promocional + controle de saldo.
Financeiro · Carl Jung
9 Recorrente · 1 cobrança por sessão sem pacote
Cobra individualmente cada ocorrência. Diferença pro Cenário 6: aqui já materializa records pendentes pra cada ocorrência futura.
/financeiro (1 por ocorrência) com agenda_evento_id apontando pra cada uma.
Michael Balint · semanal
Financeiro · Michael
10 Status change · avulsa pendente
Sessão criada com chargeMode=session, agora chegou a hora. Dialog confirm aparece em realizado/faltou/cancelado.
Maria Magali · 15/05 16:00 · pendente
Cada um abre o AgendaStatusChangeConfirmDialog com variante diferente.
Financeiro · Maria
11 Status change · ocorrência de pacote saldo
Carl Jung tem pacote 4/4. Marca cada sessão como realizada → cria record + decrementa saldo. Faltou → vai pra config default_consume_on_miss.
Carl Jung · pacote saldo
rec::...::2026-05-15O que acontece no banco?
- Materializa a ocorrência virtual: INSERT em
agenda_eventoscomrecurrence_id + recurrence_date - UPDATE
billing_contracts.sessions_used += 1 - INSERT em
financial_recordsR$ 40 status=pending (ou paid se já houver record do antecipar)
Financeiro · Carl Jung
12 Antecipar pagamento · pacote saldo novo · 14/05
Paciente pediu pra pagar a próxima sessão antes dela acontecer. Cria record pago, MAS não decrementa saldo (só quando marcar realizada depois).
/financeiro, MAS saldo do contrato continua intacto. (b) Depois marcar a mesma sessão como Realizada: dialog NÃO deve perguntar "gerar cobrança" (detecta record paid), só atualiza status + decrementa saldo.
Popover da ocorrência virtual
Diferença pra Realizada: não decrementa sessions_used. Quando user marcar Realizada depois, handler detecta record já paid → só atualiza status.
Financeiro · Carl Jung
13 Edit de sessão já cobrada imutável
Invariante "cobrança emitida é imutável pelo dialog da agenda" (Decisão #5, padrão SimplePractice).
AgendaEventDialog. Verificar: (a) aviso amarelo no topo "esta sessão tem cobrança paga"; (b) campos de valor / modalidade / tipo travados (disabled); (c) apenas horário e observações editáveis; (d) tentar mudar valor não persiste.
AgendaEventDialog · Sessão paga
Apenas horário / observações podem ser editados.