Processo de importação — lote por dia e rastreio do arquivo IPL

Relacionado: regras_import_ipl_flags.md · ../legacy/old-docs/docs-legacy/docs-tree/old-docs/TASKS-IMPORT-IPL.md


1. Problema que motivou a mudança

Cenário: três IPL do mesmo fundo, mesmo código de lote no arquivo (000001), datas diferentes:

Arquivo Data movimento Lote no IPL
003AA_20260501.IPL 01/05/2026 000001
003AA_20260504.IPL 04/05/2026 000001
003AA_20260505.IPL 05/05/2026 000001

Comportamento antigo (incorreto): um único ct_lote por (empresa, filial, ano, mes, lote) — o segundo arquivo substituía lançamentos do primeiro.

Comportamento desejado:

Arquivo Resultado
1 Importa sem erro → lote 000001 (dia 01)
2 Novo lote 000002 (dia 04) — não reutiliza o do dia 01
3 Novo lote 000003 (dia 05)

Regra de negócio: o dia de movimento faz parte da chave lógica do lote, mesmo quando o IPL repete 000001.


2. Modelo de dados (Flyway V0.7.00.5)

UK do lote: (lote, empresa, filial, ano, mes)const_ct_lote_loemfianme

Empresa 1 / Filial 1 / 2026 / mês 05  →  lote 000001, 000002, 000003 …
Empresa 1 / Filial 1 / 2026 / mês 06  →  lote 000001, 000002, 000003 … (nova sequência)

3. Fluxo de resolução do lote (implementado em entries_service)

flowchart TD
  A[IPL: lote 000001, dia DD] --> B{Existe ct_lote com mesmo lote IPL + diareferencia DD?}
  B -->|Sim| C[Reutilizar lote_id — flags loteencerra/lanencerra]
  B -->|Nao| D{Existe outro ct_lote com mesmo codigo IPL e outro dia?}
  D -->|Sim| E[Alocar proximo numero: 000002, 000003...]
  D -->|Nao| F[Criar ct_lote com codigo do IPL 000001]
  E --> G[INSERT ct_lote + documento com texto Import:arquivo.IPL]
  F --> G
  C --> H[Processar linhas + validacoes]
  G --> H

3.1 Reimportação do mesmo arquivo / mesmo dia

3.2 Novo arquivo, mesmo lote IPL, outro dia

3.3 Onde fica o nome do arquivo

Onde Formato Exemplo
ct_documentos.texto Import:003AA_20260504.IPL Por documento 000001 do lote
{IPL}.REPORT.csv coluna FileName Relatório por linha
{FUNDO}_{YYYYMM}_report.csv coluna FileName Histórico mensal

Evolução recomendada (médio prazo): migration Flyway em ecosif-database:

ALTER TABLE ct_lote ADD COLUMN IF NOT EXISTS arquivo_ipl VARCHAR(80);

-- Substituir UK antiga por chave natural dia + lote IPL
-- UNIQUE (empresa, filial, ano, mes, lote, diareferencia)

Com isso, três registros podem usar o mesmo lote = 000001 com diareferencia 01, 04 e 05, e arquivo_ipl distinto — alinhado à frase “todos podem ter lote 1, a data diz se existe”.


4. Resultado esperado nos 3 arquivos de teste

Pré-requisitos: ct_controle com flags desejadas (ex. loteencerra=N, lanencerra=N para apenas criar).

Passo Upload ct_lote.lote diareferencia ct_lote.arquivo_ipl
1 003AA_20260501.IPL 000001 01 003AA_20260501.IPL
2 003AA_20260504.IPL 000002 04 003AA_20260504.IPL
3 003AA_20260505.IPL 000003 05 003AA_20260505.IPL

Relatórios S3:


5. Validações por linha (refletidas no .REPORT.csv)

Antes de gravar cada lançamento, o pipeline valida:

Coluna relatório Validação
Account Conta existe em ct_plano (cdreduzido, empresa, filial)
History Código existe em ct_historico (se preenchido no IPL)
Calendar Registro em ct_calendario para ano/mês; dia não bloqueado (indicador1)
EntryStatus Resultado do insert / regra de flags
Message Texto operacional em caso de erro

Se qualquer validação falhar → linha Status=ERROR, mensagem explícita; arquivo pode ser PARTIAL ou falha total conforme política.


6. Como testar (sem deploy stack — local ou após deploy Lambda)

cd ecosif-automations
export AWS_REGION=us-west-1

# Ordem obrigatória
./scripts/watch-import-pipeline.sh upload ../.internal_docs/automation-test/full-test-20260522/003AA_20260501.IPL
# aguardar pipeline
./scripts/watch-import-pipeline.sh upload ../.internal_docs/automation-test/full-test-20260522/003AA_20260504.IPL
./scripts/watch-import-pipeline.sh upload ../.internal_docs/automation-test/full-test-20260522/003AA_20260505.IPL

./scripts/watch-import-pipeline.sh status
./scripts/diagnose-entries-screen.sh   # LOTE=000001 — repetir para 000002, 000003

Verificar no PostgreSQL (opcional):

SELECT lote_id, lote, diareferencia, ano, mes
FROM ct_lote
WHERE empresa = '000000001' AND filial = '000000001' AND ano = '2026' AND mes = '05'
ORDER BY lote;

7. Impacto na UI (ecosif-angular / moviments)

Paridade Java: fora de escopo imediato; moviments continua com UK antiga na entidade JPA até migration alinhada.


8. Decisões em aberto

# Decisão Opções
D1 Exibir na UI o código do IPL (000001) além do lote alocado (000002)? Coluna derivada / tooltip
D2 Migration arquivo_ipl + UK com diareferencia? Recomendado médio prazo
D3 Reimport mesmo arquivo: flags loteencerra/lanencerra regras_import_ipl_flags.md

Versão: 2026-05-22