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)
- Cada novo arquivo IPL no mesmo mês aloca o próximo número de lote (
MAX(lote)+1). - O IPL pode trazer sempre
000001no layout; no banco vira 1, 2, 3 no mês. arquivo_ipl: rastreio do ficheiro (003AA_20260504.IPL); reimportação localiza por este campo.diareferencia: dia do movimento no lote/documento/lançamentos (não entra na UK).
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
- Localiza lote por
(empresa, filial, ano, mes, lote_ipl, diareferencia). - Aplica matriz
loteencerra/lanencerra(ver regras_import_ipl_flags.md).
3.2 Novo arquivo, mesmo lote IPL, outro dia
- Não encontra lote com aquele dia → aloca próximo
lotenumérico no mês. - Operador vê na tela Lote 000002, 000003, etc., cada um com
diareferenciadistinto.
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:
003AA_20260501.IPL.REPORT.csv— linhas OK/ERROR por validação003AA_202605_report.csv— três linhas de resumo (append)
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 (indicador ≠ 1) |
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)
- Lista de lotes passa a mostrar 000001, 000002, 000003 no mesmo mês (não um único lote sobrescrito).
- Filtro por competência
05/2026lista os três. - Campo
arquivo_iplno lote (futuro) pode aparecer na grid como “Origem IPL”.
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