--- name: colaboradores-folha-pdf-whatsapp description: Folha de pagamento de colaboradores (Equipe) com PDF e envio WhatsApp. Estrutura segue o mesmo padrão do envio de comissão pro professor. metadata: node_type: memory type: project originSessionId: e41195c3-9cad-46c0-aa7c-2a7fba7c3815 --- Sistema de folha de pagamento para colaboradores (Equipe — não professores), implementado em `ColaboradorController` e integrado ao Financeiro. ## Tabelas - `colaboradores` — dados próprios (CPF, cargo, salário, telefone, banco, PIX, etc). **Tem `telefone` próprio**, não usa `usuarios.telefone`. - `retiradas_colaborador` — bônus/descontos por mês (paralelo ao `retiradas_professor`) - `lancamentos_financeiros` com `referencia_tipo='salario_colaborador'` e `referencia_id=colaboradores.id` ## Fluxo (na tela Financeiro) 1. Modal **"Pagar Folha de Colaborador"** (SweetAlert2 com `allowOutsideClick: false`) 2. Preview de cálculo (salário base + bônus − descontos = líquido) 3. Gera lançamento via `POST /direcao/api/colaboradores/pagamento` 4. Modal de sucesso com 2 botões: **Baixar PDF** (`/api/colaboradores/recibo-folha-pdf/{id}`) e **Enviar via WhatsApp** 5. WhatsApp dispara `POST /api/colaboradores/enviar-folha-whatsapp/{id}` — envia mensagem texto + PDF anexo ## Why padrão simétrico ao professor O controller `ColaboradorController::enviarReciboFolhaWhatsApp` foi originalmente escrito com `checkAuth(true)` + `normalizarTelefone()` próprio. **Não funcionava** em produção (silenciava o envio). **Fix aplicado em 12/mai/2026:** reescrito copiando exatamente o padrão de `FinanceiroController::enviarReciboWhatsApp` (envio de comissão pro professor): - Sem `checkAuth` (o do professor não tem) - Sem `normalizarTelefone` — telefone direto via JOIN, `WhatsAppService::formatPhone` já normaliza - Query: `lancamentos_financeiros lf LEFT JOIN colaboradores c ON c.id = lf.referencia_id` - Logs em `[Folha WhatsApp]` **How to apply:** Se precisar mexer em qualquer envio de PDF via WhatsApp para professor OU colaborador, manter os 2 controllers simétricos. Diferenças mínimas: - Professor: JOIN com `usuarios u` (referencia_id = users.id) - Colaborador: JOIN com `colaboradores c` (referencia_id = colaboradores.id) ## Bug do `Swal.close()` (corrigido) Em 12/mai/2026 o botão "Enviar via WhatsApp" do modal de sucesso tinha `onclick="enviarFolhaWhatsApp(id); Swal.close();"`. O `Swal.close()` fechava o swal de confirmação `async` que `enviarFolhaWhatsApp` acabava de abrir → função saía com `ok.isConfirmed=false` sem enviar. Removido o `Swal.close()`. **How to apply:** ao fazer botões dentro de Swal que chamam funções `async` que abrem outros Swals — NUNCA fechar o Swal corrente manualmente antes. SweetAlert2 substitui o swal automaticamente quando outro é aberto. ## UX simplificada (12/mai/2026) Reduzido de 5 popups (preenchimento → sucesso → confirmação → loading → final) para 3 (preenchimento → sucesso → loading+final auto-fecha em 2s). Removida confirmação intermediária.