# Fluxos: Modulo Finance - Resumo de Cobranca

---

## 8.1 Criar Resumo de Cobranca

```
Usuario
  ↓
Finance → Resumo de Cobranca → Botao "Novo"
  ↓
GET /finance/billing_summary/add
  ↓
SummaryController@add
  ↓
CoreProject (com financeClient, latestFinanceProject send_mail=false, status=1)
  ↓
View: pages/finance/billing_summary/add
  ↓
Seleciona projetos, define titulo, contato, email
  ↓
POST /finance/billing_summary/store
  ↓
SummaryController@store
  ↓
Validacao: title_summary, id_projects (array min 1), contact_name, main_email
  ↓
DB::beginTransaction
  ↓
FinanceBillingSummary::create
  title, id_projects (JSON), contact info, additional_contact
  ↓
DB::commit
  ↓
JSON {success, billing_summary, redirect}
```

**Tela inicial:** Formulario de novo resumo
**Acao do usuario:** Agrupa projetos em um resumo de cobranca com contato unico
**Requisicao:** `POST /finance/billing_summary/store`
**Controller:** `SummaryController@store`
**Tabelas alteradas:** `finance_billing_summary` (INSERT)
**Resultado esperado:** Resumo criado agrupando cobrancas de multiplos projetos
**Possiveis erros:** Validacao → 422

---

## 8.2 Sincronizar Cobrancas com Resumo

```
Usuario
  ↓
Resumo → Botao "Sincronizar"
  ↓
GET /finance/billing_summary/sync/{id}
  ↓
View: pages/finance/billing_summary/sync
  ↓
AJAX: POST /finance/billing_summary/sync/charges/{id}
  ↓
SummaryController@sync_charges_ajax
  ↓
FinanceCharge (Pendente, summary=1, nfs_status='authorized', sem billing_summary_id)
  ↓
JSON cobrancas disponiveis
  ↓
Usuario seleciona cobrancas → Salvar
  ↓
POST /finance/billing_summary/sync/save/{id}
  ↓
SummaryController@sync_save
  ↓
Validacao: charge_ids (array min 1, existem em finance_charges)
  ↓
DB::beginTransaction
  ↓
FinanceBillingSummaryBill::create
  cod (RC-XXX-XXX), stage='Gerado', contact info do summary
FinanceCharge::update (cada selecionada)
  billing_summary_id = bill.id, summary = true
  ↓
DB::commit
  ↓
JSON {success, bill, redirect}
```

**Tela inicial:** Pagina de sincronizacao do resumo
**Acao do usuario:** Seleciona cobrancas pendentes para agrupar em um bill
**Requisicao:** `POST /finance/billing_summary/sync/save/{id}`
**Controller:** `SummaryController@sync_save`
**Tabelas alteradas:**
- `finance_billing_summary_bills` (INSERT)
- `finance_charges` (UPDATE: billing_summary_id, summary=true)
**Resultado esperado:** Bill criado vinculando cobrancas ao resumo
**Possiveis erros:**
- Cobranca nao pertence aos projetos do resumo → erro
- Cobranca ja vinculada → erro
- NFS-e nao autorizada → nao aparece na lista

---

## 8.3 Editar Resumo

```
POST /finance/billing_summary/update/{id}
  ↓
SummaryController@update
  ↓
FinanceBillingSummary::update
Se projetos removidos: FinanceProject.send_mail = 1 (reativa email individual)
  ↓
JSON {success, redirect}
```

**Tabelas alteradas:**
- `finance_billing_summary` (UPDATE)
- `finance_projects` (UPDATE send_mail para projetos removidos)
