roadmap #14: recibo profissional PDF — gerador + quick path da agenda

ROADMAP item #1.4 #14. Fecha Fase 1.4 Fiscal minimo (parcial — #15
NFS-e fica pra depois).

DocumentGenerate.service estendido:
- loadTherapistData puxa registro profissional (#5 migration) e
  expoe terapeuta_registro auto-formatado ("CRP 12345/SP", "CRM
  98765/RJ"). terapeuta_crp legacy mantido por compat — preenche
  somente quando tipo=CRP.
- loadClinicData formata tenants.cpf_cnpj (11 ou 14 digitos) em
  CPF (XXX.XXX.XXX-XX) ou CNPJ (XX.XXX.XXX/XXXX-XX).
- loadAllVariables aceita {extras} (valor, formaPagamento) e
  computa valor_extenso via novo helper utils/valorExtenso.js
  (pt-BR completo ate 999 milhoes).
- saveGeneratedDocument ganha templateTipo + usa
  TEMPLATE_TYPE_TO_DOC_TYPE mapping (recibo_pagamento -> 'recibo',
  laudo -> 'laudo', atestado -> 'atestado' etc) em vez de
  hardcoded 'laudo'.
- emitirReciboParaSessao(eventoId, opts) — quick path one-call:
  busca template recibo_pagamento global, carrega variaveis,
  gera PDF blob, salva no Storage + documents + document_generated,
  dispara download.

Migration 20260521000008 substitui no template recibo_pagamento
"Psicologo(a) - CRP {{terapeuta_crp}}" por "{{terapeuta_registro}}"
e atualiza variaveis[]. Universal — funciona com qualquer conselho
(CRP/CRM/CRFa/CREFITO/CRESS/CRN).

DocumentTemplates.service.TEMPLATE_VARIABLES ganha terapeuta_
registro + _tipo + _numero + _uf (terapeuta_crp marcado legacy).

useDocumentGenerate.generateAndSave passa templateTipo no save.

AgendaEventoFinanceiroPanel ganha botao "Emitir recibo" (icon
pi-file-pdf, outlined, full width) que aparece SOMENTE quando
record.status === 'paid'. Toast de sucesso/erro. Loading state.

Fluxo end-to-end: terapeuta marca sessao como paga -> botao
"Emitir recibo" aparece -> click -> PDF baixado + aparece em
/clinic/documents/templates do paciente como tipo 'recibo'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-21 05:05:17 -03:00
parent 114d755f84
commit 6ae651a8ae
6 changed files with 344 additions and 13 deletions
@@ -0,0 +1,35 @@
-- ============================================================================
-- ROADMAP #1.4 #14 — Recibo profissional usa terapeuta_registro genérico
-- ----------------------------------------------------------------------------
-- O template recibo_pagamento (seed_015) usa "Psicólogo(a) — CRP {{terapeuta_crp}}".
-- Como agora suportamos múltiplos conselhos (CRP/CRM/CRFa/CREFITO/CRESS/CRN/RMS)
-- via #5 (migration 20260521000003), o recibo precisa ser CFP-agnóstico.
--
-- Esta migration substitui no recibo_pagamento:
-- "Psicólogo(a) — CRP {{terapeuta_crp}}" → "{{terapeuta_registro}}"
-- e atualiza variaveis[] removendo terapeuta_crp + adicionando terapeuta_registro.
--
-- {{terapeuta_registro}} é auto-formatado server-side como "CRP 12345/SP",
-- "CRM 12345/SP" etc, então não precisa de "Psicólogo(a) —" hardcoded.
-- ============================================================================
BEGIN;
UPDATE public.document_templates
SET corpo_html = REPLACE(
corpo_html,
'Psicólogo(a) — CRP {{terapeuta_crp}}',
'{{terapeuta_registro}}'
),
variaveis = ARRAY(
SELECT DISTINCT v FROM (
SELECT unnest(variaveis) v
UNION ALL
SELECT 'terapeuta_registro'
) sub
WHERE v <> 'terapeuta_crp'
),
updated_at = now()
WHERE tipo = 'recibo_pagamento' AND is_global = true;
COMMIT;