# Fluxos: Modulo Finance - Recorrencia

---

## 7.1 Criar Recorrencia

```
Usuario
  ↓
Finance → Recorrencia → Botao "Nova"
  ↓
GET /finance/recurrence/add/{projectId?}
  ↓
RecurrenceController@add
  ↓
CoreProject (ativos, com financeClient e latestFinanceProject)
  ↓
View: pages/finance/recurrence/add
  ↓
Seleciona projeto, dia emissao, vencimento, valor, ciclo (opcional)
  ↓
POST /finance/recurrence/store
  ↓
RecurrenceController@store
  ↓
Validacao: project_id, issue_day (1-31), due_date (1-31), value
  ↓
DB::beginTransaction
  ↓
FinanceRecurrence::create
  project_id, finance_client_id, issue_day, due_date, value
  cycle (0 se sem limite, N se definido)
  past_cycle=0, active=true, stage=1
  log (action: created)
  ↓
DB::commit
  ↓
JSON {success, redirect}
```

**Tela inicial:** Formulario de nova recorrencia
**Acao do usuario:** Define projeto, dias e valor da recorrencia
**Requisicao:** `POST /finance/recurrence/store`
**Controller:** `RecurrenceController@store`
**Services:** FormatHelper
**Tabelas alteradas:** `finance_recurrence` (INSERT)
**Tabelas consultadas:** `core_projects`, `finance_clients`
**Resultado esperado:** Regra de recorrencia criada, pronta para gerar cobrancas no proximo sync
**Possiveis erros:**
- Projeto sem cliente faturavel → erro
- Validacao → 422

---

## 7.2 Editar Recorrencia

```
POST /finance/recurrence/update/{id}
  ↓
RecurrenceController@update
  ↓
FinanceRecurrence::update(issue_day, due_date, value, cycle)
log (action: updated, changes diff)
  ↓
JSON {success, redirect}
```

**Tabelas alteradas:** `finance_recurrence` (UPDATE + log append)

---

## 7.3 Ativar/Desativar Recorrencia

```
POST /finance/recurrence/toggle-status/{id}
  ↓
RecurrenceController@toggleStatus
  ↓
FinanceRecurrence::update(active toggle)
log (action: activated/deactivated)
  ↓
JSON {success}
```

**Tabelas alteradas:** `finance_recurrence` (active, log)

---

## 7.4 Resetar Ciclos

```
POST /finance/recurrence/reset-cycles/{id}
  ↓
RecurrenceController@resetCycles
  ↓
FinanceRecurrence::update(past_cycle=0)
log (action: cycles_reset, previous value)
  ↓
JSON {success}
```

**Tabelas alteradas:** `finance_recurrence` (past_cycle=0, log)
**Resultado esperado:** Contador de ciclos zerado, recorrencia gera cobrancas novamente
