OR-145: corrige máscaras de agência e conta (Itaú, Caixa, BB)#38
Merged
Conversation
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>
leonardodouradol
approved these changes
Jun 17, 2026
danimuller20
approved these changes
Jun 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 definiu341: '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
341; todos passam a usarDEFAULT_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.999999999999-9(12) →999999999-9(9 dígitos).99999999-S) → numérico (99999999-9), eALPHANUMERIC_BANK_CODES = [].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/utilsficam idênticas aosrc/utils/masks.jslegado que o mfe-payment-transfer#63 removeu — agência (9999para 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
yarn jest: 147/147 passam · ✅yarn buildlimpo.Rollout (após publicar 1.2.3)
Refs #37
🤖 Generated with Claude Code