# CADOC/SCR 3044 — Fase 1 (destravar + diário + JSON real)

- **Data:** 2026-07-10
- **Autor:** Bruno + Claude
- **Status:** Aprovado (design) — implementando
- **Ref layout:** `C:\Users\Bruno\Desktop\VULCI\3044\SCR_InstrucoesDePreenchimento_Doc3044.pdf`

## 1. Objetivo

Corrigir a geração do Documento SCR **3044 – Dados de Eventos em Operações de Crédito** na tela
`/dashboard/regulatory/cadoc`: (a) tirar o erro, (b) tornar a geração **diária** (hoje o diálogo
é mensal), (c) produzir o **JSON** conforme o layout BACEN, com os eventos que a Monetarie tem.

## 2. Diagnóstico (confirmado)

- **Erro:** o controller chama `Generator3044.generate(reference_date)` (aridade 1), mas o módulo
  só tem `generate_event/2` → `UndefinedFunctionError` → submission vira `status:"error"`.
- **Cadência:** catálogo do backend já é `:event` e o badge diz "Evento", mas o **diálogo** oferece
  Mês+Ano (só o 4111 usa data diária) → gera como mensal. O layout (§4) é por evento (até 5º dia
  útil) → operacionalmente **diário**.
- **Gerador é stub:** não lê dados reais (recebe `operation_data` por parâmetro, IPOC fake).

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

1. **envia3050 = "N"** → `class3050` é **vedado** (não vai no JSON).
2. **Eventos:** **concessão** (desembolso) + **pagamento** — únicos com dado no sistema. Cessão/
   aquisição **não têm modelo** → arrays presentes mas **vazios** (estrutura pronta; captura é
   feature à parte, Fase 2).
3. **Cadência diária:** gera o arquivo dos eventos de **uma data** (data picker).

## 4. Layout (interpretado do PDF)

Arquivo JSON:
```json
{"cnpjIF":"46026562","dataHoraRemessa":"AAAA-MM-DD HH:mm:ss","envia3050":"N",
 "operacoes":[ Operacao... ]}
```
- **Operacao:** `acao`(1), `ipoc`, `saldoDevedor`, `dataSaldoDevedor`, `atraso`(S/N),
  `pagamentos[]`, `concessoes[]`, `cessoes[]`, `aquisicoes[]`. **Sem `class3050`** (envia3050=N).
- **Evento (Concessao/Pagamento):** `acao`(1), `data`, `valor`. `tpMotivo` é **opcional** → omitido
  na Fase 1 (desembolso/pagamento regulares).
- `atraso` = "S" se `overdue_days >= 15`, senão "N".
- `saldoDevedor` = `outstanding_balance`/100 (reais); `dataSaldoDevedor` = a data-base.

## 5. Backend

### 5.1 `Generator3044.generate(reference_date)` (novo — substitui o stub como entrypoint da tela)
- `find_or_create_submission("3044", date, "event")` + status "generating" (padrão do 3040).
- **Concessões:** loans com `disbursement_date = date` e `ipoc` não nulo → evento concessão
  `{acao:1, data: disbursement_date, valor: disbursed_amount/100}`.
- **Pagamentos:** `loan_payments` com `payment_date = date` e `status='confirmed'`, join loans →
  evento pagamento `{acao:1, data: payment_date, valor: amount/100}`.
- **Agrega por `ipoc`** (uma Operacao por operação com seus eventos); `saldoDevedor`/`atraso` do loan.
- Header (`cnpjIF` = 8 primeiros dígitos do CNPJ institucional; `dataHoraRemessa` = agora;
  `envia3050`="N"). `cessoes`/`aquisicoes` = `[]`.
- `Jason.encode` → salva arquivo `CADOC3044_<AAAAMMDD>.json` → `Orchestrator.mark_generated`.
- Sem operações no dia → gera JSON com `operacoes: []` (arquivo válido "sem eventos"), **não** erro.
- Mantém `generate_event/2` (legado, usado por 1 teste) — nota de dívida técnica.

### 5.2 Controller `cadoc_controller.ex`
- `build_reference_date/2`: adicionar cláusula diária para `"3044"` (casar `date` do payload,
  como o 4111 já faz). `dispatch_generator` já chama `generate(reference_date)` — ok.

### 5.3 Orchestrator
- `@cadoc_schedule` do 3044 fica `:event` (correto pelo layout). **Não** viramos `:monthly`; a
  "diária" é só no diálogo/data. (Se quiser `:daily` no catálogo p/ agendamento automático, é
  decisão à parte — Fase 1 mantém `:event`, geração manual pela tela.)

## 6. Frontend (`CadocReportsView.vue`)

- `DAILY_CADOC_TIPOS`: adicionar `'3044'` (data-base como DD/MM/AAAA).
- Diálogo de geração: incluir `'3044'` no guard do DatePicker diário e no envio de `payload.date`
  (hoje só `'4111'`).
- Badge do 3044: `periodicidade` → `'Diário'` (ou "Evento (diário)").

## 7. Fora de escopo (Fase 2+)

- Captura de **cessão/aquisição** (modelo + tela) que popularia os arrays.
- `tpMotivo`, `acao:2` (cancelamento/estorno), fidelidade fina do `saldoDevedor` (valor contratual
  vs outstanding), validações NR do §6 do layout, o 2º gerador CSV `Scr.Generators.Cadoc3044`
  (fluxo separado, fora da tela — não tocar agora).

## 8. Validação (local)

- Rebuild core-api + admin. Gerar 3044 pela tela para uma data COM desembolso/pagamento → sem
  erro; conferir o JSON: header correto, `envia3050:"N"`, `operacoes[]` com a concessão/pagamento
  do dia, `ipoc` do loan, `saldoDevedor`, `atraso`. Data sem eventos → `operacoes: []`.
