# Fluxos: Modulo Core - Clientes Institucionais

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

---

## 3.1 Listar Clientes Institucionais

```
Usuario
  ↓
Menu Core ou Finance → Clientes Institucionais
  ↓
GET /{module}/institutional_client/
  ↓
InstitutionalClientController@index_view
  ↓
View: pages/{module}/clients/institutional/index
  ↓
AJAX: POST /{module}/institutional_client/list
  ↓
InstitutionalClientController@index_list_ajax
  ↓
CoreClient::orderBy('id', 'desc')
  ↓
JSON DataTables
```

**Tela inicial:** Lista de Clientes (`pages/{module}/clients/institutional/index`)
**Acao do usuario:** Acessa pagina
**Requisicao:** `GET /{module}/institutional_client/` + `POST .../list`
**Controller:** `InstitutionalClientController@index_view` + `@index_list_ajax`
**Tabelas consultadas:** `core_clients`
**Resultado esperado:** Tabela com nome, tipo, status, acoes

---

## 3.2 Criar Cliente Institucional

```
Usuario
  ↓
Lista Clientes → Botao "Novo"
  ↓
GET /{module}/institutional_client/add/
  ↓
InstitutionalClientController@add_view
  ↓
FinanceConfig::first() (client_type)
MondayApiController::getClients()
  ↓
View: pages/{module}/clients/institutional/add
  ↓
Preenche formulario → Salvar
  ↓
POST /{module}/institutional_client/store
  ↓
InstitutionalClientController@store
  ↓
Validacao: name, client_type (in config), contact_name, contact_mail
  ↓
DB::beginTransaction
  ↓
CoreClient::create
CoreClientContact::create (principal)
CoreClientContact::create (adicionais, loop)
  ↓
DB::commit
  ↓
JSON {success, redirect}
```

**Tela inicial:** Formulario de adicao
**Acao do usuario:** Preenche dados do cliente e contatos, salva
**Requisicao:** `POST /{module}/institutional_client/store`
**Controller:** `InstitutionalClientController@store`
**Services:** FormatHelper
**Tabelas alteradas:**
- `core_clients` (INSERT)
- `core_client_contacts` (INSERT, 1 principal + N adicionais)
**APIs chamadas:** Monday.com (ao abrir formulario, lista de clientes)
**Resultado esperado:** Cliente criado com contatos, redirect para detalhes
**Possiveis erros:**
- Validacao falha → 422
- DB exception → rollback

---

## 3.3 Editar Cliente Institucional

```
Usuario
  ↓
Lista → Editar
  ↓
GET /{module}/institutional_client/edit/{id}/
  ↓
CoreClient::with('contacts')->find($id)
FinanceConfig, MondayApiController::getClients()
  ↓
View: pages/{module}/clients/institutional/edit
  ↓
Altera dados → Salvar
  ↓
POST /{module}/institutional_client/update/{id}/
  ↓
InstitutionalClientController@update
  ↓
DB::beginTransaction
  ↓
CoreClient::update
CoreClientContact::update (principal)
CoreClientContact::delete (removidos)
CoreClientContact::update/create (adicionais)
  ↓
DB::commit
  ↓
JSON {success, redirect}
```

**Tela inicial:** Formulario de edicao
**Acao do usuario:** Altera dados e salva
**Requisicao:** `POST /{module}/institutional_client/update/{id}/`
**Controller:** `InstitutionalClientController@update`
**Tabelas alteradas:**
- `core_clients` (UPDATE)
- `core_client_contacts` (UPDATE, DELETE, INSERT)
**Resultado esperado:** Cliente e contatos atualizados
**Possiveis erros:**
- Cliente nao encontrado → redirect com erro
- Validacao → 422
- DB → rollback

---

## 3.4 Ativar/Desativar Cliente

```
Usuario
  ↓
Detalhes Cliente → Toggle Status
  ↓
POST /{module}/institutional_client/toggle-status/{id}/
  ↓
InstitutionalClientController@toggle_status
  ↓
CoreClient::update(status, deleted_at)
  ↓
JSON {success, status}
```

**Tela inicial:** Detalhes do Cliente
**Acao do usuario:** Toggle ativo/inativo
**Requisicao:** `POST /{module}/institutional_client/toggle-status/{id}/`
**Controller:** `InstitutionalClientController@toggle_status`
**Tabelas alteradas:** `core_clients` (status, deleted_at)
**Resultado esperado:** Status invertido
**Possiveis erros:** Cliente nao encontrado → 404
