# Fluxos: Modulo Core - Projetos

> Rotas compartilhadas entre Core e Finance via prefixo `{core|finance}/projects/`

---

## 4.1 Criar Projeto

```
Usuario
  ↓
Lista Projetos → Botao "Novo"
  ↓
GET /{module}/projects/add/
  ↓
ProjectController@add_view
  ↓
FinanceClient (ativos), FinanceConfig (project_type)
MondayApiController::allProjects()
  ↓
View: pages/{module}/projects/add
  ↓
Preenche formulario → Salvar
  ↓
POST /{module}/projects/store
  ↓
ProjectController@store
  ↓
Validacao: name, project_type, finance_client_id (exists), tipoProjeto (Avulso|Recorrente|Monday), description
  Se Recorrente: month_value required
  Se Monday: monday_id required
  ↓
DB::beginTransaction
  ↓
CoreProject::create
CoreProjectContract::create
FinanceProject::create
CoreProject::update (vincula IDs)
CoreProjectContract::update (vincula finance ID)
  ↓
DB::commit
  ↓
JSON {success, project_id, redirect}
```

**Tela inicial:** Formulario de adicao de projeto
**Acao do usuario:** Preenche dados, seleciona cliente faturavel e tipo, salva
**Requisicao:** `POST /{module}/projects/store`
**Controller:** `ProjectController@store`
**Services:** FormatHelper
**Tabelas alteradas:**
- `core_projects` (INSERT)
- `core_project_contracts` (INSERT)
- `finance_projects` (INSERT)
**APIs chamadas:** Monday.com (lista projetos ao abrir formulario)
**Resultado esperado:** Projeto criado com contrato e config financeira
**Possiveis erros:**
- Validacao → 422
- Cliente faturavel inexistente → 422
- DB → rollback

---

## 4.2 Editar Projeto

```
Usuario
  ↓
Lista → Editar
  ↓
GET /{module}/projects/edit/{id}/
  ↓
ProjectController@edit_view
  ↓
CoreProject (com relacoes), FinanceProject, FinanceClient, CoreClient
CoreCollaborator (ativos), FinanceBillingSummary (vinculo)
MondayApiController::allProjects()
  ↓
View: pages/{module}/projects/edit
  ↓
Altera dados → Salvar
  ↓
POST /{module}/projects/update/{id}/
  ↓
ProjectController@update
  ↓
DB::beginTransaction
  ↓
CoreProject::update
CoreProjectContract::update ou create
FinanceProject::update ou create
FinanceRecurrence::update (se existe, atualiza finance_client_id)
FinanceBillingSummary::update (remove projeto de resumos se email habilitado)
  ↓
DB::commit
  ↓
JSON {success, project_id, redirect}
```

**Tela inicial:** Formulario de edicao
**Acao do usuario:** Altera dados do projeto e salva
**Requisicao:** `POST /{module}/projects/update/{id}/`
**Controller:** `ProjectController@update`
**Tabelas alteradas:**
- `core_projects` (UPDATE)
- `core_project_contracts` (UPDATE ou INSERT)
- `finance_projects` (UPDATE ou INSERT)
- `finance_recurrence` (UPDATE, se existir)
- `finance_billing_summary` (UPDATE, remove projeto de resumos)
**Resultado esperado:** Projeto atualizado com cascata em contratos e recorrencias
**Possiveis erros:**
- Projeto nao encontrado → redirect com erro
- Validacao → 422

---

## 4.3 Desativar Projeto

```
Usuario
  ↓
Detalhes Projeto → Botao Desativar
  ↓
POST /{module}/projects/disable/{id}/
  ↓
ProjectController@disable
  ↓
DB::beginTransaction
  ↓
CoreProject::update(status=0, end_date)
CoreProjectContract::where(project_id, status=1)::update(status=0, end_date)
FinanceProject::where(project_id, status=1)::update(status=0)
  ↓
DB::commit
  ↓
JSON {success, mensagem com contagem}
```

**Tela inicial:** Detalhes do Projeto
**Acao do usuario:** Clica em desativar
**Requisicao:** `POST /{module}/projects/disable/{id}/`
**Controller:** `ProjectController@disable`
**Tabelas alteradas:**
- `core_projects` (status=0, end_date)
- `core_project_contracts` (status=0, end_date para ativos)
- `finance_projects` (status=0 para ativos)
**Resultado esperado:** Projeto e todos os contratos/configs financeiras desativados
**Possiveis erros:** DB → rollback
