# Fluxos: Modulo Finance - Reembolsos

---

## 9.1 Aprovar Reembolso

```
Usuario
  ↓
Finance → Reembolsos → Lista (status Pendente) → Botao "Aprovar"
  ↓
POST /finance/refunds/approve/{id}
  ↓
RefundsController@approve
  ↓
DB::beginTransaction
  ↓
FinanceRefund::update(status='Pago', is_mail_sent=0)
  ↓
FinanceMailService::sendFinanceTemplate('collaborator_refund_paid')
  → MailService → SmtpCredentialService → SMTP
  Se sucesso: is_mail_sent=1
  ↓
DB::commit
  ↓
JSON {success}
```

**Tela inicial:** Lista de Reembolsos
**Acao do usuario:** Clica em "Aprovar" para reembolso pendente
**Requisicao:** `POST /finance/refunds/approve/{id}`
**Controller:** `RefundsController@approve`
**Services:** FinanceMailService → MailService → SmtpCredentialService
**Tabelas alteradas:** `finance_refunds` (status='Pago', is_mail_sent)
**APIs chamadas:** SMTP (envio de email de aprovacao)
**Resultado esperado:** Reembolso aprovado, email de confirmacao enviado ao colaborador
**Possiveis erros:**
- Envio de email falha → rollback (reembolso nao aprovado)
- Reembolso nao encontrado → 404

---

## 9.2 Rejeitar Reembolso

```
Usuario
  ↓
Lista Reembolsos → Botao "Rejeitar"
  ↓
POST /finance/refunds/reject/{id}
  ↓
RefundsController@reject
  ↓
Validacao: reason (required)
  ↓
DB::beginTransaction
  ↓
FinanceRefund::update(status='Reprovado', reason, is_mail_sent=0)
  ↓
FinanceMailService::sendFinanceTemplate('collaborator_refund_rejected')
  Se sucesso: is_mail_sent=1
  ↓
DB::commit
  ↓
JSON {success}
```

**Tela inicial:** Lista de Reembolsos
**Acao do usuario:** Preenche motivo e rejeita
**Requisicao:** `POST /finance/refunds/reject/{id}`
**Controller:** `RefundsController@reject`
**Services:** FinanceMailService
**Tabelas alteradas:** `finance_refunds` (status='Reprovado', reason, is_mail_sent)
**APIs chamadas:** SMTP (email de rejeicao)
**Resultado esperado:** Reembolso rejeitado com motivo, email enviado
**Possiveis erros:**
- Motivo ausente → 422
- Email falha → rollback
