Skip to main content
O Bank Transfer 3.0.x cobra tarifas pelo plugin de tarifas standalone, plugin-fees. O Bank Transfer 3.1.0 e posteriores podem cobrá-las pelo Fees Engine que roda dentro do Midaz 4.1.0 e posteriores. Esta página move seus pacotes de tarifas do plugin-fees para o Midaz. Em seguida, ela passa o Bank Transfer para o Midaz em uma ordem que mantém a cobrança de cada transferência. Siga esta página quando todas estas condições forem verdadeiras:
  • Você roda o Bank Transfer 3.0.x.
  • Seus pacotes de tarifas ficam no plugin-fees.
  • Você vai atualizar para o Bank Transfer 3.1.0 ou posterior e para o Midaz 4.1.0 ou posterior.
O Bank Transfer usa apenas os pacotes de tarifas do plugin-fees. Se você também mantém pacotes de faturamento no plugin-fees, recrie-os como pacotes de faturamento do Midaz antes de desativar o plugin-fees. Esta página não faz o mapeamento deles.
O Lerian Console gerencia apenas pacotes de tarifas do Midaz. Ele não mostra os pacotes que ficam no plugin-fees. Veja Console.

Como o Bank Transfer escolhe quem cobra a tarifa


A partir da 3.1.0, a variável MIDAZ_FEE_MODE do Bank Transfer decide quem calcula e cobra a tarifa de cada transferência.
  • O Bank Transfer não inicia com nenhum outro valor.
  • Com auto, o Bank Transfer lê a versão do Midaz de novo a cada MIDAZ_FEE_MODE_REFRESH (padrão 5m). Quando não consegue ler a versão, ele mantém o modo que já tem, ou usa legacy se ainda não tem nenhum.
  • O Bank Transfer fixa o modo de uma transferência P2P ou de um TED OUT em /initiate, e o de um TED IN quando o recebe. Cada etapa seguinte dessa transferência usa o mesmo modo: novas tentativas, confirmação, cancelamento e conciliação. Uma mudança de modo vale apenas para transferências novas.
  • No modo legacy, BTF_FEE_ENABLED liga a integração com o plugin-fees. Com false, o padrão, o Bank Transfer não chama o plugin-fees, e cada transferência roda com tarifa 0.
  • Defina native apenas no Midaz 4.1.0 ou posterior. O Midaz 4.0.x cobra tarifas sem marcar os lançamentos de tarifa, então o Bank Transfer não consegue ler a tarifa que cobrou.
Não dependa de auto durante a migração. Com auto, o Bank Transfer 3.1.0 passa para native sozinho assim que lê o Midaz 4.1.0 ou posterior. As transferências novas passam então a usar os pacotes do Midaz. Se seus pacotes ainda estão apenas no plugin-fees, o Midaz não encontra nenhum pacote, e essas transferências ficam sem tarifa.No Bank Transfer 3.1.0, BTF_FEE_ENABLED não impede o Midaz de cobrar tarifas no modo native. Para parar uma tarifa, desabilite o pacote dela no Midaz com enable: false, ou exclua o pacote. O Midaz então também não cobra tarifa de uma transferência native que ele ainda não lançou.

Antes de começar


Você precisa de:
  • Midaz 4.1.0 ou posterior, ou um plano para atualizar para ele. Veja Atualizando o Midaz.
  • Bank Transfer 3.1.0 ou posterior, ou um plano para atualizar para ele.
  • Acesso à API do plugin-fees, para ler e estimar seus pacotes.
  • Acesso à API de pacotes de tarifas do Midaz, ou à página Pacotes de tarifas do Console.
  • Para cada ledger e tipo de transferência, a rota de transação do Midaz com que o Bank Transfer lança. A política de tenant routing.ledger_bindings informa essa rota. Veja Roteamento do ledger.
  • Três permissões do Midaz para as credenciais do Midaz do Bank Transfer: o recurso packages com a ação get, o recurso estimates com a ação post, e o recurso organizations com a ação get. No modo single-tenant, essas são as credenciais de MIDAZ_CLIENT_ID. No modo multi-tenant, o Bank Transfer usa as credenciais do Midaz de cada tenant, então dê as três permissões à aplicação de cada tenant.
O modo legacy não usa essas permissões. No modo native, sem packages, cada iniciação de P2P e de TED OUT responde 503 BTF-2000. Sem estimates, cada iniciação que corresponde a um pacote responde 503 BTF-2000. A permissão organizations é necessária porque esta página define MIDAZ_FEE_MODE=native explicitamente: o Bank Transfer então faz uma leitura da lista de organizações do Midaz, para verificar a API /v2, antes de usar um conjunto de credenciais pela primeira vez. Com auto, ele não faz essa leitura. Sem organizations, o Bank Transfer no modo single-tenant não inicia, e no modo multi-tenant cada iniciação de P2P e de TED OUT daquele tenant responde 503 BTF-2000. Os exemplos abaixo usam estas variáveis de shell. Cada UUID é um exemplo. Use os valores do seu próprio ambiente. O Bank Transfer acessa o ledger do Midaz em MIDAZ_TRANSACTION_URL, ou em MIDAZ_BASE_URL quando aquela não está definida. Ele remove um /v1 ou /v2 do fim desse endereço. Remova-o também em MIDAZ_LEDGER_URL, porque os paths abaixo já trazem a versão.

Mapear um pacote do plugin-fees para um pacote do Midaz


Migre apenas os pacotes que estão habilitados no plugin-fees. Deixe os desabilitados de fora. O Midaz recusa um pacote cuja faixa de valores se sobrepõe a outro pacote com a mesma rota e o mesmo segmento, e ele conta também os pacotes desabilitados (erro 0199). Então uma cópia desabilitada pode bloquear um pacote de que você precisa. As regras de tarifa mantêm os nomes dos campos e o formato JSON. Três coisas mudam: onde vai a organização, onde vai o ledger e o que transactionRoute contém. O Midaz rejeita um campo que não conhece. Não envie nenhum destes: ledgerId, id, createdAt, updatedAt e deletedAt. Um TED OUT cobra a tarifa por cima do valor. No modo native, o Bank Transfer recusa um TED OUT com 422 BTF-3002 quando o pacote que corresponde a ele tem uma tarifa com isDeductibleFrom: true.

Rota de transação

O plugin-fees compara transactionRoute com um nome que o Bank Transfer envia: ted_out, ted_in ou p2p. O Midaz o compara com o routeId da transação, que é o ID de uma rota de transação do Midaz. O Midaz aceita apenas um UUID nesse campo. Para cada pacote, use a rota de transação que routing.ledger_bindings informa para o ledger e o tipo de transferência do pacote.
Um pacote do Midaz cobra cada transação /v2 do ledger dele que corresponde ao escopo dele, vinda de qualquer produto, não apenas as transferências do Bank Transfer. Um pacote sem transactionRoute corresponde a todas as transações. Um pacote com rota corresponde a todas as transações lançadas com essa rota. Dê a cada pacote do Bank Transfer a rota de transação dele, e não use essas rotas de transação em outros produtos.Um ledger cujo vínculo usa mode: omit não tem pacote seguro: o único que pode corresponder às transferências dele não tem rota, então cobra cada transação /v2 do ledger. Dê a esse vínculo a rota de transação do Midaz de cada tipo de transferência na página Rotas Contábeis do Console, e confira a Prontidão para a virada nela. Isso muda a contabilização de cada lançamento do Bank Transfer nesse ledger. Faça isso depois do passo 2, quando o Midaz já rodar a 4.1.0 ou posterior, e antes da troca.

Escopo do pacote

O plugin-fees e o Midaz selecionam o pacote de uma transferência de jeitos diferentes, então uma cópia exata pode cobrar uma tarifa diferente. Aplique estas regras aos pacotes habilitados de cada ledger:
  • O ledger tem um pacote habilitado. O plugin-fees o aplica a cada transferência dentro da faixa de valores dele, seja P2P, TED OUT ou TED IN. Ele ignora o transactionRoute e o segmentId desse pacote. No Midaz, crie uma cópia para cada tipo de transferência que ele cobrava, cada uma com a rota de transação desse tipo, e sem segmentId.
  • Uma rota tem um pacote. Quando o ledger tem mais de um pacote habilitado, o plugin-fees aplica o único pacote de uma rota a cada transferência dessa rota, dentro da faixa de valores dele. Ele ignora o segmentId desse pacote. Crie o pacote do Midaz sem segmentId.
  • Uma rota tem vários pacotes. O plugin-fees então escolhe pelo segmento do remetente. Um remetente com segmento recebe apenas um pacote com esse segmento. Um remetente sem segmento recebe apenas um pacote sem segmento. Mantenha cada segmentId. O Midaz também aplica um pacote sem segmento a um remetente que tem segmento, quando nenhum pacote desse segmento cobre o valor. Se a rota tem um pacote sem segmento, decida qual comportamento você quer. Quando cada tarifa desse pacote é cobrada por cima do valor (isDeductibleFrom: false), você pode manter o comportamento do plugin-fees. Adicione segment:<segment-uuid> ao waivedAccounts desse pacote para cada segmento do ledger, e para cada segmento que você criar depois. O Midaz então não cobra nenhuma das tarifas dele de um remetente nesses segmentos. Em uma tarifa descontada do valor, a isenção também isenta um destinatário nesses segmentos, então não a use nesse caso. Para um pacote assim, os mecanismos não podem coincidir. Decida se um remetente cujo segmento não tem pacote próprio para esse valor paga esse pacote no Midaz, ou se você o deixa de fora, e então um remetente sem segmento não paga nenhuma das tarifas dele.
  • TED IN. Para um TED IN, o Bank Transfer enviava ao plugin-fees o segmento da conta do destinatário. O Midaz lê o segmento das contas de origem e ignora a conta externa, que é a única origem de um TED IN. Então um pacote do Midaz com segmentId nunca corresponde a um TED IN. Crie cada pacote de TED IN sem segmentId. Se o ledger tem mais de um pacote de TED IN no plugin-fees, o plugin-fees cobrava de um destinatário com segmento apenas um pacote com esse segmento, e de um destinatário sem segmento apenas um pacote sem segmento. O Midaz não vê o segmento do destinatário, e aplica os pacotes sem segmento a cada destinatário. Decida o preço de TED IN que vale para cada destinatário.
  • Um pacote sem rota. Quando o ledger tem mais de um pacote habilitado, o plugin-fees nunca aplicava um pacote sem rota a uma transferência do Bank Transfer, porque o Bank Transfer sempre envia uma rota. Deixe-o de fora.
  • Dois pacotes que correspondem. O Midaz seleciona o pacote que atende ao maior número de restrições. Quando dois pacotes correspondem igualmente, o Midaz recusa a transação com o erro 0198. Na iniciação, o Bank Transfer responde 422 BTF-2005.

Migrar passo a passo


1

Fixe o modo legacy

Defina MIDAZ_FEE_MODE=legacy no ambiente do Bank Transfer. No Helm chart, a chave é bankTransfer.configmap.MIDAZ_FEE_MODE, e o chart usa auto quando a chave não está definida. O Bank Transfer 3.0.x ignora a variável, então você pode defini-la antes da atualização.Confira o valor que o seu deploy gera antes de atualizar, por exemplo com helm template ou helm diff. Uma atualização gradual não para depois do primeiro pod, a menos que você a pause.Mantenha BTF_FEE_ENABLED=true e as variáveis FEES_* como estão.
2

Atualize o Bank Transfer e depois o Midaz

Atualize o Bank Transfer para 3.1.0 ou posterior. Espere até que cada pod do Bank Transfer rode a 3.1.0 ou posterior. Uma versão anterior não consegue liquidar uma transferência que o Bank Transfer criou no modo native.Confira no log de cada pod a linha midaz: fee mode resolved com feeMode=legacy e source=config. No modo single-tenant, um pod a registra no boot. No modo multi-tenant, ele a registra para cada tenant na primeira transferência desse tenant. source=config prova que a fixação funciona. Confira isso enquanto o Midaz ainda roda uma versão anterior à 4.1.0. Nela, auto também resolve para legacy, então uma transferência que paga a tarifa do plugin-fees não prova a fixação.Atualize o Midaz para 4.1.0 ou posterior.Faça uma transferência pequena. Confirme que o plugin-fees ainda cobra a tarifa dele.
3

Recrie cada pacote habilitado no Midaz

Liste os pacotes habilitados de cada ledger no plugin-fees. Cada resposta traz uma página, e o total dela conta apenas os itens dessa página. Leia a próxima página até que uma página traga menos itens do que limit. A lista deixa de fora os pacotes excluídos.
Crie cada pacote no Midaz com o mapeamento e as regras de escopo acima. Defina enable como false. Guarde a lista dos pacotes que você cria: você habilita exatamente esses na troca. Este exemplo recria uma tarifa fixa de TED OUT. O transactionRoute dele é a rota de transação de TED OUT do vínculo do ledger.
Você também pode criar os pacotes na página Pacotes de tarifas do Console.
4

Compare as tarifas dos dois mecanismos

Para cada pacote, estime a mesma transação no plugin-fees e no Midaz. Compare os valores das tarifas. Eles devem ser iguais. Use valores nas duas pontas da faixa do pacote, e um valor no meio. Para um pacote que tem as isenções de segmento de Escopo do pacote, use um remetente fora desses segmentos. O Midaz isenta um remetente neles por definição, e o plugin-fees não.
Na resposta do Midaz, cada lançamento de tarifa tem "feeLeg": "true" no seu metadata. Você também pode usar a Calculadora de tarifas do Console.Uma estimativa calcula o único pacote que você informa. Ela não confere transactionRoute nem segmentId, então não mostra qual pacote uma transferência recebe. O próximo passo testa isso.
5

Ensaie a seleção em homologação

Rode os passos 1 a 4 em homologação primeiro, com os mesmos pacotes. Depois teste qual pacote cada transferência recebe, antes de fazer a troca em produção:
  1. Com legacy, chame POST /v1/transfers/initiate para cada caso: P2P e TED OUT, de um remetente em cada segmento do ledger e de um remetente sem segmento, com valores nas duas pontas da faixa de cada pacote. Registre feeAmount e packageAppliedId de cada resposta. Não processe essas iniciações. Uma iniciação não lança nada no Midaz. Ela grava uma linha em payment_initiations que expira em expiresAt, guarda um fingerprint de duplicidade por 300 segundos por padrão, e envia um evento payment_initiation.created aos seus consumidores de webhook e de eventos. Uma iniciação de TED OUT fora do horário de funcionamento responde 422 BTF-0010.
  2. Passe a homologação para native, como no próximo passo.
  3. Repita as mesmas iniciações. Compare cada feeAmount. packageAppliedId agora indica o pacote do Midaz. Confira que é o pacote que substitui o do plugin-fees. Uma iniciação idêntica dentro dessa janela de duplicidade responde 409 BTF-0012, então espere a janela passar.
  4. O TED IN não tem iniciação. Em cada modo, receba um TED IN pequeno para um destinatário em cada segmento e para um destinatário sem segmento. Compare as tarifas.
Espere uma diferença apenas onde Escopo do pacote diz que os mecanismos não podem coincidir, e apenas a que você escolheu ali. Corrija cada outra diferença nos pacotes do Midaz, e repita os casos.
6

Passe o Bank Transfer para native

Antes da troca, rode em produção os casos de iniciação de P2P e TED OUT do passo 5, com legacy. Use contas de teste próprias, uma em cada segmento e uma sem segmento. Registre cada feeAmount. O passo 5 diz o que uma iniciação grava.
  1. Dê às credenciais do Midaz do Bank Transfer as permissões packages (get), estimates (post) e organizations (get).
  2. Habilite cada pacote do Midaz que você criou no passo 3. Envie "enable": true com Atualizar um Pacote. Nenhuma iniciação testa um TED IN, então antes compare o transactionRoute de cada pacote de TED IN com a Rota de Transação do vínculo TED_IN do ledger dele, na página Rotas Contábeis do Console.
  3. Defina MIDAZ_FEE_MODE=native.
  4. Reinicie cada pod do Bank Transfer.
Logo depois do reinício, rode os mesmos casos de novo, com as mesmas contas. Compare cada feeAmount, e confira cada packageAppliedId. Espere uma diferença apenas onde Escopo do pacote diz que os mecanismos não podem coincidir, e apenas a que você escolheu ali. Uma iniciação idêntica dentro da janela de duplicidade responde 409 BTF-0012, então espere a janela passar entre as duas rodadas. Uma iniciação não lança nada no Midaz, então esses casos mostram uma rota ou um ID de segmento errado sem mover dinheiro.Se aparecer outra diferença, faça o rollback. Corrija as tarifas ou a faixa de valores de um pacote com Atualizar um Pacote. Atualizar um Pacote não muda transactionRoute nem segmentId, então, para uma rota ou um segmento errado, crie um pacote corrigido com enable: false, e exclua o errado apenas depois que as transferências native que o usaram terminarem. Esta consulta lista as transferências criadas no modo native desde o início do reinício. Confira a tarifa de cada uma manualmente.
As transferências novas agora usam as tarifas do Midaz. Uma transferência P2P ou um TED OUT iniciados antes do reinício, e um TED IN recebido antes dele, mantêm o modo legacy até terminarem.
7

Confira transferências reais

Faça uma transferência P2P ou um TED OUT pequenos. Confira a tarifa que o Bank Transfer mostra na iniciação. Confira a tarifa que ele registra na transferência. As duas devem bater com a tarifa que o plugin-fees cobrava antes, exceto por uma diferença que você escolheu em Escopo do pacote.Confira do mesmo jeito o primeiro TED IN que chegar depois da troca.No Midaz, o metadata de cada transação tem packageAppliedID. Ele é o ID do pacote do Midaz que cobrou a tarifa.
8

Desative o plugin-fees

Mantenha o plugin-fees rodando enquanto esta consulta retornar linhas. No modo multi-tenant, rode-a no banco do Bank Transfer de cada tenant.
Esses são os TED INs recebidos antes da troca. Quando o Bank Transfer retoma um deles, ele pede a tarifa dele ao plugin-fees. Se o plugin-fees estiver parado, o Bank Transfer credita o destinatário sem tarifa. Quando fees.fail_closed_default é true, ele devolve a TED ao remetente, a menos que o Bank Transfer não consiga ler essa política.Depois, faça o backup do banco MongoDB do plugin-fees e pare o plugin-fees. A partir daí, você não pode fazer o rollback.Mantenha MIDAZ_FEE_MODE=native. Com auto, um pod que não consegue ler a versão do Midaz inicia no modo legacy, e o legacy precisa do plugin-fees.

Rollback


Você pode voltar para o plugin-fees enquanto o plugin-fees ainda roda com os pacotes dele sem mudanças:
  1. Defina MIDAZ_FEE_MODE=legacy.
  2. Reinicie cada pod do Bank Transfer.
As transferências novas voltam então a usar o plugin-fees. Isso exige BTF_FEE_ENABLED=true e as variáveis FEES_* ainda no lugar. As transferências criadas no modo native mantêm esse modo. O Bank Transfer as termina na API /v2 do Midaz, e o Midaz cobra as tarifas delas quando as lança. Mantenha os pacotes do Midaz habilitados até que cada transferência native termine. Mantenha o Bank Transfer na 3.1.0 ou posterior enquanto alguma transferência criada no modo native ainda estiver aberta. Uma versão anterior liquida essa transferência em /v1, então a tarifa dela não é cobrada ou não é registrada.

Console


As páginas do Fees Engine no Console, Pacotes de tarifas e Calculadora de tarifas, trabalham apenas com pacotes de tarifas do Midaz. Elas não leem o plugin-fees.

Veja também