# Custos do produto de empréstimo — escolha de contas contábeis (COSIF)

- **Data:** 2026-07-09
- **Autor:** Bruno + Claude
- **Status:** Aprovado (design) — implementando
- **Tela:** `/dashboard/credit/products` (`LoanProductsView.vue`), seção "Custos do Contrato → Custos Adicionais"

## 1. Problema

No cadastro de produto, cada **custo adicional** (`metadata.additional_costs`) tem hoje
`{name, calc_type, value, category, launches_in_account}` — **sem conta contábil**. O
usuário precisa poder escolher as **contas COSIF** de cada custo, **semelhante ao
cadastro dos históricos do produto** (que já usa par Débito/Crédito com seletor COSIF e
o token "Conta Corrente").

## 2. Decisões (confirmadas com o Bruno)

1. **Estrutura:** **par Débito/Crédito por custo** (igual aos históricos), cada lado
   podendo ser conta COSIF **ou** o token "Conta Corrente".
2. **Escopo agora:** **só a configuração** — a tela passa a escolher e salvar o par D/C
   por custo. A **contabilização** usando o par fica para um passo seguinte (não mexe no
   `loans.ex` agora).
3. **Onde escolher (ajuste ao vivo):** as contas são informadas **no cadastro do custo**
   (form de "Adicionar"), **não** via lápis depois. **Obrigatórias** (bloqueia o Confirmar
   do custo e o Salvar do produto).
4. **Regra "Lança em conta corrente na liberação" (ajuste ao vivo):** o checkbox fica
   **acima** das contas; quando **marcado**, o **Débito é obrigatoriamente a Conta Corrente
   do cliente** (campo travado). O Crédito é sempre livre (COSIF ou Conta Corrente).

## 3. Escopo técnico: frontend-only

- `loan_product.ex`: `field :metadata, :map` (genérico, casteado inteiro) → **qualquer
  chave nova no custo é persistida como está**. Sem migration/schema/controller.
- O tipo `AdditionalCost` é **local** à `LoanProductsView.vue` (não em `credit.ts`).
- `buildPayload` já envia `metadata: { ...additional_costs: additionalCosts.value }`;
  `openEdit` já espalha cada custo (`{ ...c }`) → os campos novos fluem sozinhos.

**Único arquivo tocado:** `core/apps/admin/src/views/credit/LoanProductsView.vue`.

## 4. Modelo de dados (interface local `AdditionalCost`)

```ts
interface AdditionalCost {
  id; name; calc_type; value; category; launches_in_account;   // (existentes)
  cosif_debit:  string | null   // código COSIF | '__conta_corrente__' | null
  cosif_credit: string | null
}
```
- `addCost()` inicia `cosif_debit`/`cosif_credit` como `null`.
- Reaproveita o token existente `CONTA_CORRENTE_TOKEN = '__conta_corrente__'`.

## 5. UI (no form de adicionar custo — estado final)

- **Form de "Adicionar" custo** (`showAddCostRow`): abaixo de Nome/Tipo/Valor/Categoria,
  o checkbox **"Lança em conta corrente na liberação"** (movido para **cima** das contas)
  e, abaixo dele, os campos **Débito (partida)** e **Crédito (contrapartida)**, ambos
  obrigatórios:
  - **Débito:** "Lança em conta corrente" **marcado** → **travado em Conta Corrente**
    (fixo, sem toggle/busca). Desmarcado → toggle **"Conta corrente"** ou **AutoComplete
    COSIF** (reusa `searchCosif`/`cosifSuggestions`).
  - **Crédito:** sempre toggle "Conta corrente" ou AutoComplete COSIF.
- **`addCost`:** deriva `cosif_debit = Conta Corrente` quando "Lança em conta corrente"
  marcado; senão o valor escolhido. Exige débito **e** crédito.
- **Tabela de custos:** coluna **"Contas (D → C)"** (leitura, exibindo "Conta Corrente",
  o código COSIF, ou "—") + lixeira. **Sem lápis** (contas só no cadastro).
- **`validateRequiredAccounts` (Salvar produto):** bloqueia se algum custo não tiver
  débito e crédito.
- **Nota discreta** na seção: as contas são **configuração**; a contabilização virá num
  passo seguinte.

## 6. Persistência

- Salvar: `buildPayload` → `metadata.additional_costs` (com `cosif_debit`/`cosif_credit`)
  → backend grava o metadata como está. Sem mudança de backend.
- Carregar: `openEdit` já espalha cada custo; os campos novos aparecem no draft.

## 7. Fora de escopo (passo seguinte)

- **Contabilização**: `loans.ex` continua lançando só o débito na conta corrente do
  cliente (`AccountEntry`) na liberação; o par D/C **não** gera lançamento COSIF ainda.
  Ligar a partida dobrada (usar o par no lançamento) é um passo separado.

## 8. Validação (local, localhost:5175)

- Rebuild do admin; Editar produto → Custos Adicionais → **Adicionar** → escolher Débito
  e Crédito no próprio form (com "Lança em conta corrente" travando o Débito em Conta
  Corrente) → Confirmar → Salvar.
- Reabrir e conferir que o par D/C do custo voltou; conferir no banco
  (`loan_products.metadata->'additional_costs'`) que `cosif_debit`/`cosif_credit`
  persistiram (com `cosif_debit` = Conta Corrente quando "Lança" marcado).

## 9. Arquivo tocado

| Arquivo | Mudança |
|---|---|
| `core/apps/admin/src/views/credit/LoanProductsView.vue` | interface `AdditionalCost` (+2 campos), `addCost` init, subtela de contas do custo, colunas Débito/Crédito + lápis, nota de escopo |

Sem mudança de backend, schema, migration ou tipo compartilhado.
