agenda: C5+C6 testes OK + atalho Gerar fatura + RPC idempotência fix
DB - migration 20260519000001: create_financial_record_for_session passa a ignorar status='cancelled' na idempotência (era bug — cancelar e tentar regerar travava silencioso retornando o cancelado) Cenário 5 (convênio) — fixes pra save + visualização - Convênio: amount lia 'price' (null) → agora detecta via insurance_plan_id e usa insurance_value. payment_method forçado 'convenio' (era 'asaas') - Popover: ev.price era null em convênio → normalize expõe insurance_value e paymentLabel faz fallback. Linha mostra "A receber R$ X" corretamente - /financeiro: branch novo pra payment_method='convenio' → pill violeta com pi-id-card (antes ficava sem indicador, igual particular) Cenário 6 (recorrente sem pacote, Maria Magali) — materialização - chargeMode='none' não materializava a 1ª (todas viravam virtuais, sem badge $). Agora materializa a 1ª no fluxo de criação recorrente - Bug intermediário: usei 'paciente_id' (Portuguese) mas agendaRepository dropa esse campo. Corrigido pra 'patient_id' (English DB column) Atalho "Gerar fatura" no popover - Pill amber pequeno ao lado de "A cobrar R$ X" no popover (paymentVariant ='none' + sessão materializada) - Wire em MelissaLayout via emit gerar-cobranca + handler onGerarCobrancaQuick (chama gerarCobrancaManual, fecha popover pra impedir double-click) - Bulk-load do useMelissaAgenda e fetchRecord do AgendaEventoFinanceiroPanel agora filtram status='cancelled' (resolve badge $ residual + botão sumido) Header do popover: info de pacote/série - "Sessão · Pacote · N sessões" ou "Sessão X de Y" abaixo do tipo (computed seriesLabel lê do _raw da rule) Título do dialog "Sessão do Pacote · Sessão" - Quando commitment name é "Sessão" (default), drop pra evitar duplicação - Outros nomes (Avaliação, etc) permanecem com forma completa Excluir série inteira (popover) - Novo botão "Excluir série" no popover quando evento pertence a recorrência - Hard delete: financial_records pendentes → agenda_eventos materializados → recurrence_rules (CASCADE leva exceptions + rule_services) - Bloqueia se algum record tem status='paid' (estornar primeiro) cancel_session some da agenda - useRecurrence.expandRules agora pula occurrence com exception type= 'cancel_session' (era visível com status cancelado; doc dizia "some da agenda" mas código mantinha. Honra a promessa do diálogo) - patient_missed / therapist_canceled / holiday_block permanecem visíveis como histórico UX outros - "+ Novo convênio" toolbar em ConfiguracoesConveniosPage (botão faltava — empty state mandava clicar em botão inexistente) - InsurancePlanServiceQuickCreateDialog: cadastrar procedimento POR CIMA do AgendaEventDialog sem sair da agenda. Auto-seleciona quando nada estava selecionado antes - Hint contextual abaixo do card Sessão/Honorários: convênio = "Nº guia opcional"; gratuito = "sem cobrança". Particular sem hint - recurrence_exceptions cancel agora usa upsert com onConflict (idempotente, não quebra com unique violation em re-cancel) - goToConveniosConfig removida (dead code após quick-create inline) CSS - .aed-row-50 perdeu margin-bottom (user request) - .field-card.mb-4 ganhou margin-top: 1rem (scoped a composer wrappers) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,74 @@ Chronological, append-only record of everything that's happened in this wiki.
|
||||
|
||||
---
|
||||
|
||||
## [2026-05-19 14:00] session | C5+C6 OK + atalho gerar fatura + RPC idempotencia fix
|
||||
Touched: project_rpc_idempotency_cancelled (nova)
|
||||
Detalhes: sessao longa cobrindo C5 e C6 ate green checkmark, com varios
|
||||
fixes intermediarios:
|
||||
|
||||
CENARIO 5 (Sandor + Unimed convenio):
|
||||
- 2 bugs no save: amount lia 'price' (null em convenio) e payment_method
|
||||
caia em 'asaas' por fallback. Fix: detecta convenio via insurance_plan_id,
|
||||
amount=insurance_value, payment_method='convenio'. markPaidNow ignorado
|
||||
pra convenio (sempre nasce pending).
|
||||
- 2 bugs na visualizacao: popover so mostrava "Cobranca pendente" sem
|
||||
valor (lia ev.price) e /financeiro nao mostrava pill convenio.
|
||||
Fix: normalize expoe insurance_value; popover fallback price ?? insurance_value;
|
||||
/financeiro ganhou branch pra payment_method='convenio' (pill violeta).
|
||||
|
||||
CENARIO 6 (Maria Magali, recorrente sem pacote):
|
||||
- chargeMode='none' nao materializava 1a (todas viravam virtuais, sem badge).
|
||||
Fix: adicionado bloco no fluxo de criacao recorrente que materializa 1a
|
||||
quando chargeMode='none' && paciente_id. Package/per_session ja
|
||||
materializam nos seus helpers; package saldo intencionalmente NAO.
|
||||
- Primeira tentativa de fix usou paciente_id (Portuguese) mas
|
||||
agendaRepository dropa esse campo (legado). Corrigido pra patient_id
|
||||
(English DB column). Fallback `normalized.patient_id ?? normalized.paciente_id`.
|
||||
|
||||
ATALHO "Gerar fatura" no popover:
|
||||
- Pill amber "Gerar fatura" ao lado de "A cobrar R$ X" no popover.
|
||||
- Wire em MelissaLayout via emit gerar-cobranca + handler onGerarCobrancaQuick.
|
||||
- Fecha popover apos sucesso pra impedir click duplicado.
|
||||
- Tooltip simplificado: "Gerar fatura agora".
|
||||
|
||||
BUG RPC IDEMPOTENCIA (gravado em memoria):
|
||||
- create_financial_record_for_session checava idempotencia por
|
||||
agenda_evento_id + deleted_at IS NULL, MAS sem filtrar status='cancelled'.
|
||||
User cancelava cobranca sem querer → todo regenerar retornava cancelado
|
||||
e nada inseria. Toast verde mentindo.
|
||||
- Fix: migration 20260519000001 adiciona AND status != 'cancelled'.
|
||||
- Memoria salva em project_rpc_idempotency_cancelled.md (padrao a aplicar
|
||||
em toda RPC futura com idempotencia por chave natural).
|
||||
|
||||
INFO PACOTE NO POPOVER:
|
||||
- Header do popover agora mostra "Sessao · Pacote · N sessoes" ou similar
|
||||
(computed seriesLabel le do _raw). Visual: violeta sem caps lock.
|
||||
|
||||
TITULO DIALOG "Sessao do Pacote · Sessao":
|
||||
- Quando commitment name eh "Sessao" (default), drop pra evitar duplicacao.
|
||||
Outros nomes (Avaliacao etc) permanecem com forma completa.
|
||||
|
||||
CSS:
|
||||
- .aed-row-50 perdeu margin-bottom (user request).
|
||||
- .field-card.mb-4 ganhou margin-top: 1rem (scoped via composer wrappers).
|
||||
|
||||
OUTROS BUGS RESOLVIDOS NO CAMINHO:
|
||||
- AgendaEventoFinanceiroPanel.fetchRecord agora filtra cancelled.
|
||||
- bulk-load do useMelissaAgenda agora filtra cancelled.
|
||||
- recurrence_exceptions cancel agora usa upsert (idempotente, nao quebra
|
||||
com unique constraint quando user cancela 2x ou tem exception zumbi).
|
||||
- "Excluir serie inteira" botao novo no popover (hard delete: rule +
|
||||
materializadas + financial_records pendentes; bloqueia se paid).
|
||||
- cancel_session exception agora SOME da agenda (era visivel com status
|
||||
cancelado, doc dizia "some da agenda" mas codigo mantinha).
|
||||
- ConfiguracoesConveniosPage ganhou botao "+ Novo convenio" (faltava).
|
||||
- goToConveniosConfig removida (dead code pos quick-create inline).
|
||||
- Quick-create inline de procedimento (InsurancePlanServiceQuickCreateDialog).
|
||||
- Hint contextual abaixo do card Sessao/Honorarios (convenio = "N guia
|
||||
opcional"; gratuito = "sem cobranca").
|
||||
|
||||
PROXIMO: Cenario 7 (Donald Winnicott · pacote UPFRONT · 4 × R$ 200).
|
||||
|
||||
## [2026-05-18 23:30] session | UX de convenio refinado (3 fixes) + hint contextual
|
||||
Touched: none (sem nova wiki page; tudo em codigo + HANDOFF)
|
||||
Detalhes: tarde inteira consumida em refinar UX de convenio antes do
|
||||
|
||||
Reference in New Issue
Block a user