# Fluxos: Modulo Finance - Incorp (Campanhas Monday.com)

---

## 14.1 Importar Campanhas do Monday.com

```
Usuario
  ↓
Finance → Incorp → Sync Monday → Botao "Importar"
  ↓
POST /finance/incorp/getCampaingsMonday
  ↓
IncorpController@getCampaingsMonday
  ↓
Fase 1 - Busca e Validacao:
  MondayApiController::getIncorpCampaings (GraphQL Monday.com)
  FormulaService (calcula valores por versao)
  Para cada campanha:
    Valida: v_total, id_project_monday, id_pulse (obrigatorios)
    CoreProject::where('monday_id') → projeto deve existir
    Projeto deve ter finance_client_id
  Se invalida: MondayApiController::updateColumn (status=2 no Monday)
  ↓
Fase 2 - Criacao (so executa se TODAS validas):
  DB::beginTransaction
  FinanceCampaign::create (para cada campanha valida)
  MondayApiController::updateColumn (status=1 no Monday)
  DB::commit
  ↓
JSON {errors[], success[]}
```

**Tela inicial:** Sync Monday (`pages/finance/incorp/syncProjectMonday`)
**Acao do usuario:** Clica importar para buscar campanhas sincronizaveis
**Requisicao:** `POST /finance/incorp/getCampaingsMonday`
**Controller:** `IncorpController@getCampaingsMonday`
**Services:** MondayApiController, FormulaService, IntegrationCredentialService
**Tabelas alteradas:** `finance_campaigns` (INSERT)
**APIs chamadas:** Monday.com GraphQL (busca campanhas + atualiza status)
**Resultado esperado:** Campanhas importadas, status atualizado no Monday
**Possiveis erros:**
- Projeto nao existe no sistema → marcado erro no Monday
- Sem cliente faturavel → marcado erro
- Campos obrigatorios ausentes → erro por campanha

---

## 14.2 Gerar Cobrancas de Campanhas

```
Usuario
  ↓
Incorp → Sync → Botao "Gerar Cobrancas"
  ↓
POST /finance/incorp/generate/charges
  ↓
IncorpController@generateCharges
  ↓
FinanceCampaign (stage 1 ou 2, com project e billableCustomer)
  ↓
DB::beginTransaction
Para cada campanha:
  Verifica duplicidade (FinanceCharge com campaign_id)
  CoreProject::find → dados do projeto
  GeneralService::ensureWorkday (se due_on_working_days_only)
  ChargeDescriptionHelper::build
  ↓
  FinanceCharge::create (bill_status='Programado')
  FinanceCampaign::update(stage=3)
DB::commit
  ↓
JSON {created_count, failed_count, created_ids}
```

**Tabelas alteradas:**
- `finance_charges` (INSERT)
- `finance_campaigns` (UPDATE stage=3)
**Resultado esperado:** Cobrancas criadas automaticamente a partir de campanhas

---

## 14.3 Atualizar Campanha

```
POST /finance/incorp/sync/update
  ↓
FinanceCampaign::update(due_date, value, stage, status)
```

---

## 14.4 Cancelar Campanha

```
POST /finance/incorp/sync/cancel
  ↓
FinanceCampaign::update(stage=0, status='Cancelada')
```
