--- tags: [ag-music, recibo, pdf, whatsapp, financeiro] created: 2026-04-20 updated: 2026-04-20 parent: "[[AG-Music]]" --- # Recibo de Pagamento de Mensalidade (Aluno) ## Fluxo 1. Dashboard -> clique "Baixa" em mensalidade pendente 2. SweetAlert pergunta forma de pagamento (PIX/Dinheiro/Cartao/Boleto/Transferencia) e data 3. `POST /direcao/baixa-mensalidade/{lancamento_id}` marca `lancamentos_financeiros.status='pago'` + insere em `pagamentos` 4. Apos sucesso, SweetAlert pergunta: **WhatsApp** / **PDF** / **Agora nao** 5. WhatsApp: `POST /api/financeiro/recibo-pagamento-whatsapp/{id}` (texto + PDF anexo) 6. PDF: abre em nova aba `GET /api/financeiro/recibo-pagamento/{id}` ## Bug corrigido no baixaMensalidade - Antes: metodo recebia o ID como `$matricula_id` mas o frontend passava `m.id` que era na verdade `lancamento_id` - Antes NAO marcava `lancamentos_financeiros.status='pago'` (so inseria em `pagamentos`) - Agora: recebe `$lancamentoId`, busca matricula via lancamento, marca status='pago' + cria pagamento ## Metodos (FinanceiroController) - `gerarReciboPagamentoPDF($lancamentoId, $returnPath = false)` - gera PDF com TCPDF - `montarHTMLReciboPagamento($lancamento)` - HTML do layout - `valorPorExtenso($valor)` - helper para escrever valor em portugues (privado) - `enviarReciboPagamentoWhatsApp($lancamentoId)` - gera + envia via WhatsAppService ## Layout do PDF - Cabecalho azul (#1e3a8a) com logo + titulo "RECIBO DE PAGAMENTO" - Box verde (#10b981) destacando valor pago + extenso - Secoes: Dados do Aluno, Dados do Servico, Declaracao, Assinatura - Rodape com data geracao + dominio sistema.agmusic.com.br ## Query do aluno ```sql lancamentos_financeiros lf LEFT JOIN matriculas m ON m.id = lf.matricula_id LEFT JOIN alunos a ON a.id = m.aluno_id LEFT JOIN usuarios u ON u.id = a.usuario_id ``` Dados do aluno em `usuarios`: `u.nome`, `u.cpf`, `u.telefone`, `u.email`. ## Rotas - `GET /api/financeiro/recibo-pagamento/{id}` - abre PDF inline - `POST /api/financeiro/recibo-pagamento-whatsapp/{id}` - envia via WhatsApp ## Arquivos alterados - `app/Controllers/FinanceiroController.php` - `app/Controllers/Direcao.php` (baixaMensalidade refatorado) - `app/Config/Routes.php` - `app/Views/direcao/dashboard.php` (darBaixaRapida + perguntarEnvioRecibo) ## Regra Se for adicionar baixa em outras telas, basta chamar `perguntarEnvioRecibo(lancamentoId)` apos o POST de baixa bem-sucedido. O `lancamento_id` vem no JSON de resposta do endpoint `/direcao/baixa-mensalidade/{id}`. ## Ver tambem - [[Financeiro - Cards e Contas]] - [[Matricula Cancelar Trancar]] - mesmo padrao `$db->table()` direto - [[AG-Music]] - visao geral