Skip to content

OR-145: corrige máscaras de agência e conta (Itaú, Caixa, BB)#38

Merged
FabioRolin merged 3 commits into
masterfrom
fix/OR-145-bank-branch-account-masks
Jun 17, 2026
Merged

OR-145: corrige máscaras de agência e conta (Itaú, Caixa, BB)#38
FabioRolin merged 3 commits into
masterfrom
fix/OR-145-bank-branch-account-masks

Conversation

@FabioRolin

@FabioRolin FabioRolin commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Contexto

Correção da regressão introduzida no OR-145 (#35), reportada na PRD #37: ao transferir para o Itaú (341), a máscara de agência ficava com 7 caracteres (99999-9) quando a agência do Itaú tem 4 dígitos sem DV. O backend valida a agência do Itaú com /^\d{4,4}$/, então o valor mascarado (ex.: 09229-0) era rejeitado com o erro 1503 – Agência inválida.

Causa raiz

O OR-145 criou o mapa BANK_BRANCH_MASKS (antes não existia máscara de agência) e definiu 341: '99999-9' — que é exatamente a máscara de conta do Itaú (BANK_ACCOUNT_MASKS[341]). Foi um copy/paste da conta para a agência.

Correções

  • Agência (todos os bancos): remove o override do 341; todos passam a usar DEFAULT_BANK_BRANCH_MASK = '9999' (4 dígitos). Validado contra o backend (Bank::FORMATS + BankAccountValidator::Office::Generator): para 33/341/104/399/745 a agência é /^\d{4,4}$/; para 1/237/41/213 o backend calcula o DV a partir dos 4 dígitos. O Itaú era o único banco com máscara de agência errada.
  • Conta Caixa (104): 999999999999-9 (12) → 999999999-9 (9 dígitos).
  • Conta BB (1): DV alfanumérico (99999999-S) → numérico (99999999-9), e ALPHANUMERIC_BANK_CODES = [].
  • Conta Arbi (213): 9999999-9 (7) → 99999-9 (5 dígitos), alinhado ao legado.

Paridade com o legado (PR #63 do mfe-payment-transfer)

Após estas correções, as máscaras de banco do @useblu/utils ficam idênticas ao src/utils/masks.js legado que o mfe-payment-transfer#63 removeu — agência (9999 para todos) e conta (todos os bancos) batem 1:1. As diferenças remanescentes são apenas em máscaras não-bancárias e intencionais (CNPJ alfanumérico, phone_idd).

Testes

  • Atualizados os testes que codificavam o comportamento incorreto (agência Itaú; conta Caixa 12 díg.; DV alfanumérico BB; conta Arbi 7 díg.).
  • yarn jest: 147/147 passam · ✅ yarn build limpo.

Rollout (após publicar 1.2.3)

⚠️ Em runtime, o mfe-payment-transfer consome maskBankBranch via core/blu-utils, exposto pelo mfe-core (export * from '@useblu/utils'). Corrigir produção exige:

  1. publicar @useblu/utils@1.2.3 (este PR, ao mergear no master);
  2. bumpar @useblu/utils → ^1.2.3 no mfe-core + regenerar yarn.lock + redeploy (passo que efetivamente corrige a agência em produção);
  3. bumpar @useblu/utils → ^1.2.3 no mfe-payment-transfer + regenerar yarn.lock.

Ordem de deploy: blu-utils (publish) → mfe-core (redeploy) → mfe-payment-transfer.

Refs #37

🤖 Generated with Claude Code

FabioRolin and others added 2 commits June 17, 2026 11:34
A migração do OR-145 (#35) criou BANK_BRANCH_MASKS e definiu por engano a
agência do Itaú (341) como '99999-9' — a máscara de CONTA do Itaú — em vez de
4 dígitos. A agência do Itaú tem 4 dígitos sem DV; o backend valida com
/^\d{4,4}$/, então valores como "09229-0" eram rejeitados (erro 1503).

Correções:
- Agência: remove o override do 341; todos os bancos usam o default '9999'
  (4 dígitos). Quando o banco exige DV na agência (BB, Banrisul, Bradesco,
  Arbi), o backend calcula o DV a partir dos 4 dígitos.
- Conta Caixa (104): 12 -> 9 dígitos, alinhado ao backend (/^\d{4,9}-\d/) e
  à orientação de não digitar a operação (013/023/001).
- Conta BB (1): DV alfanumérico -> numérico (e ALPHANUMERIC_BANK_CODES = []),
  alinhado ao backend (/-\d/) e ao aviso de UI "substitua X por 0".

Testes atualizados para o comportamento correto. Bump 1.2.2 -> 1.2.3.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Conta do 213 estava como '9999999-9' (7 dígitos); o legado do mfe-payment-transfer
(PR #63) usava '99999-9' (5 dígitos). Alinhado ao legado para paridade exata
da migração. Backend do Arbi aceita 4-9 dígitos, então 5 está dentro do limite.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rto)

Após as correções, ambos os mapas ficaram sempre vazios e os lookups viraram
no-op. São constantes internas (não exportadas no index), então a remoção não
é breaking change. Remover o BANK_BRANCH_MASKS também elimina o footgun que
causou esta própria regressão (entrada errada para o 341).

- masks.ts: remove os dois e mantém DEFAULT_BANK_BRANCH_MASK.
- maskBankBranch: usa sempre DEFAULT_BANK_BRANCH_MASK (param compensationCode
  mantido por compatibilidade de API).
- maskBankAccount: strip sempre numérico.
- maskValue / maskComplete: bank_branch usa o default; remove o ramo
  alfanumérico de conta (ALPHANUMERIC_MASKS do CNPJ permanece).

Comportamento e paridade com o legado inalterados. 147/147 testes passam.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@FabioRolin FabioRolin merged commit ad65c0c into master Jun 17, 2026
2 checks passed
@FabioRolin FabioRolin deleted the fix/OR-145-bank-branch-account-masks branch June 17, 2026 17:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants