跳到主要内容

Recálculo e Retentativa de Averbação

Fluxo de recálculo da compra de dívida do consignado militar. Quando o Exército recusa a averbação — margem insuficiente, prazo acima do permitido, consignação indeferida — a operação já assinada não precisa ser cancelada: o parceiro recalcula as condições a partir de um novo valor de parcela e reenvia a averbação, na mesma CCB e no mesmo lote.

O recálculo também é o passo que dimensiona o refinancing consolidador depois que as portabilidades do lote são averbadas — nesse caso não há recusa nenhuma envolvida, apenas o ajuste do valor final da operação mãe.

São duas rotas, usadas em conjunto:

ENDPOINT
/v2/credit_operation/CREDIT_OPERATION_KEY/recalculate
MÉTODO
PATCH
ENDPOINT
/debt/CREDIT_OPERATION_KEY/reservation/retry
MÉTODO
PATCH
Divisão de responsabilidade entre as duas rotas
  • recalculate reescreve as condições financeiras da CCB e propaga essas condições para a averbação. Não é necessária nenhuma chamada adicional para atualizar a reserva — mas o reservation_status não muda.
  • reservation/retry é o que devolve uma averbação recusada (pending_requester_action) para a fila de envio (pending_reservation), de onde a QI Tech a reenvia ao Exército.

Uma averbação recusada só volta a ser tentada com o reservation/retry. Um recálculo feito antes do envio da averbação (caso do consolidador em created / pending_reservation) não exige retry — a averbação segue o fluxo normal já com as condições novas.

Quando usar​

SituaçãoO que fazer
Webhook credit_operation.collateral com reservation_status: pending_requester_action na portabilidadeRecalcular a portabilidade com parcela que caiba na margem informada e retentar
Todas as portabilidades do lote averbadas (reserved)Recalcular o refinancing consolidador para o valor definitivo
Webhook credit_operation.collateral com reservation_status: pending_requester_action no consolidadorRecalcular o consolidador e retentar
Averbação parada por token inválido (pending_valid_token)Não é recálculo — atualizar o token do militar
Falha de comunicação com o ExércitoNada a fazer — a QI Tech retenta automaticamente
Garantia já constituída (reserved)Nada a fazer — o recálculo é recusado com COP000556
Condições novas fora do que a operação suportaCancelar e reemitir o lote (ver Cancelamento)

Por que a averbação para​

Recusas que nenhuma retentativa automática resolve deixam a averbação parada em pending_requester_action, aguardando condições novas do parceiro, em vez de cancelar a operação. O aviso chega pelo webhook credit_operation.collateral (ver Webhooks):

{
"webhook_type": "credit_operation.collateral",
"key": "8916175e-18df-4845-a238-643f52b77be4",
"data": {
"collateral_type": "military_payroll",
"collateral_constituted": false,
"operation_type": "portability_for_refinancing",
"collateral_data": {
"reservation_status": "pending_requester_action",
"cancel_reason": "consignable_margin_exceeded"
}
},
"event_datetime": "2026-09-08 14:30:00"
}

Recusas na inclusão da consignação​

cancel_reasonCódigo ZetraSignificado
consignable_margin_exceeded359Margem consignável excedida
period_quantity_exceeded347Quantidade de parcelas acima do permitido
military_payroll_period_quantity_exceeded471Quantidade de parcelas acima do permitido na verba
military_blocked352Militar com bloqueio em folha
military_not_found293Militar não localizado com CPF/matrícula informados
portability_not_found294Contrato de origem não localizado para portabilidade

Recusas na confirmação da averbação​

cancel_reasonSituação no ExércitoSignificado
rejectedIndeferidaAverbação indeferida
suspendedSuspensaConsignação suspensa
suspend_by_managerSuspensa Pelo GestorConsignação suspensa pelo gestor
closed_by_exclusionEncerrado por ExclusãoConsignação encerrada por exclusão
Nem toda parada é recálculo

pending_valid_token (token do militar inválido ou ausente) e falhas de comunicação não entram nesse fluxo: a primeira se resolve com a atualização do token, a segunda é retentada automaticamente pela QI Tech.

Ciclo completo do lote​

O lote é recalculado em duas rodadas, com a resposta do Exército no meio: primeiro as portabilidades, depois o refinanciamento consolidador.

1. PATCH /v2/credit_operation/{portability}/recalculate nova parcela da portabilidade
↓
2. PATCH /debt/{portability}/reservation/retry 204 — volta para pending_reservation
↓
3. [ Exército responde a averbação reenviada ]
├── reserved → repita 1 e 2 nas demais portabilidades, depois siga para 4
└── pending_requester_action → volta ao passo 1 com parcela menor
↓
4. PATCH /v2/credit_operation/{refinancing}/recalculate parcela definitiva do consolidador
↓
5. PATCH /debt/{refinancing}/reservation/retry 204 (só se o consolidador estiver parado)
↓
6. [ Exército averba o consolidador ] → operação segue para desembolso
Ordem obrigatória

As portabilidades são recalculadas e averbadas antes do consolidador. O recálculo do refinancing é recusado com MPR000037 enquanto qualquer portabilidade do lote não estiver em reserved — é o valor averbado das portabilidades que dimensiona o consolidador.

Num lote do cenário β (N portabilidades), todas passam pelos passos 1 a 3 antes do passo 4.


1. Recalcular a portabilidade​

Recalcula as condições financeiras da portabilidade a partir do novo valor de parcela. O valor líquido é travado: a portabilidade tem de quitar exatamente o saldo devedor do contrato de origem, então quem cede é a taxa — parcela menor ⇒ taxa menor, parcela maior ⇒ taxa maior.

ENDPOINT
/v2/credit_operation/CREDIT_OPERATION_KEY/recalculate
MÉTODO
PATCH

Path Params​

credit_operation_key string (UUID) obrigatório Chave da portabilidade — a key retornada pelo POST /debt do Passo 5 de Portabilidade + Refinanciamento.

Body Params​

installment_amountnumberobrigatórioNovo valor total da parcela, maior que 0 e com no máximo 2 casas decimais. É o valor que toda parcela do fluxo vai passar a ter.
{
"installment_amount": 95.00
}
installment_amount é o único campo aceito

Qualquer outra condição (monthly_interest_rate, number_of_installments, final_disbursement_amount) é recusada com COP000557. Campo desconhecido, corpo vazio, valor não numérico ou installmentAmount em camelCase são recusados com QIT000001; três casas decimais, com COP000564.

Pré-condições​

Só é recalculável a operação que:

CondiçãoErro quando não atendida
Tem garantia military_payrollCOP000553
Tem tipo de reserva portability ou refinancing na garantiaCOP000554 / COP000568
Está assinada e emitida (status issued)COP000555
Ainda não teve a garantia constituídaCOP000556
Tem contrato de origem com saldo devedorCOP000566
Tem opção de desembolso em ou após hojeCOP000559
Não tem parcela com valor pagoCOP000561
Não tem entrada emitidaCOP000562
Tem a averbação parada em pending_requester_actionMPR000009
A averbação só existe depois da assinatura

A averbação é solicitada depois do signature_finished, não no POST /debt. Antes disso o recálculo responde MPR000017 (não há averbação para a operação). Com a averbação já solicitada mas ainda em pending_reservation ou pending_confirmation, responde MPR000009, e a descrição do erro traz o status atual — é assim que se confere em que ponto a averbação está, além do webhook credit_operation.collateral e do GET /debt/{DEBT_KEY}/collateral.

Response​

STATUS
200

Devolve a operação recalculada inteira, com as parcelas reescritas. Campos relevantes:

Response Body
{
"credit_operation_key": "8916175e-18df-4845-a238-643f52b77be4",
"credit_operation_status": "issued",
"operation_type": "portability_for_refinancing",
"collateral_type": "military_payroll",
"collateral_constituted": false,
"disbursement_date": "2026-09-16",
"number_of_installments": 20,
"issue_amount": 1686.84,
"disbursed_issue_amount": 1680.84,
"final_disbursement_amount": 0,
"base_iof": 5.98,
"additional_iof": 0.02,
"total_iof": 6.00,
"annual_cet": 0.1495,
"interest_type": "pre_price_days",
"prefixed_interest_rate": {
"interest_base": "calendar_days",
"daily_rate": 0.00035739,
"monthly_rate": 0.01079689,
"annual_rate": 0.13756
},
"installments": [
{
"installment_key": "1b6a2c58-0f37-4f21-9c2e-2a7f0c1d4e55",
"installment_number": 1,
"due_date": "2026-10-16",
"total_amount": 95.00,
"principal_amortization_amount": 76.79,
"pre_fixed_amount": 18.21,
"installment_status": "opened"
},
{ "...": "parcelas 2 a 20" }
],
"disbursement_options": [
{ "...": "mesma estrutura, uma entrada por data de desembolso disponível" }
]
}
Opções de desembolso

Havendo várias opções de desembolso, o recálculo reescreve todas as que ainda estão dentro da janela (data em ou após hoje) e aplica na operação a que corresponde à disbursement_date vigente. Opções com data passada são preservadas como estão. Leia sempre a opção cuja disbursement_date é a da operação.

O que muda e o que fica travado​

CampoComportamento na portabilidade
installments[].total_amountTodas as parcelas passam a valer exatamente o installment_amount enviado
disbursed_issue_amountTravado — igual ao saldo devedor do contrato de origem
issue_amountRecalculado — igual ao valor líquido somado ao IOF
prefixed_interest_rate.*Recalculada. Parcela menor ⇒ taxa menor; daily < monthly < annual
number_of_installmentsTravado
installments[].due_date / installment_keyPreservados — as parcelas são reescritas, não recriadas
final_disbursement_amount0 na portabilidade (sem troco)
additional_iofCobrado somente sobre dinheiro novo (issue_amount menos o saldo devedor portado)
Σ principal_amortization_amountIgual ao issue_amount
Componentes da parcelaprincipal_amortization_amount + pre_fixed_amount = total_amount
Como conferir a resposta

Em interest_type: pre_price_days, o valor presente das parcelas descontado pela daily_rate por dias corridos reconstitui o issue_amount:

Σ total_amount / (1 + daily_rate) ^ (due_date − disbursement_date) == issue_amount

Recálculo é tudo-ou-nada​

Se o resultado do cálculo violar qualquer uma das travas da tabela acima, a resposta é COP000560, com o nome da invariante violada, o valor esperado e o obtido na descrição. Se a averbação recusar as condições novas (por exemplo, MPR000036), a resposta é o próprio erro da averbação.

Nos dois casos nada é gravado: a operação continua com as condições da emissão e a averbação, com as condições anteriores. Basta corrigir o installment_amount e chamar de novo.


2. Retentar a averbação da portabilidade​

Devolve a averbação de pending_requester_action para pending_reservation, já com as condições gravadas pelo recálculo. A QI Tech a reenvia ao Exército na varredura seguinte.

ENDPOINT
/debt/CREDIT_OPERATION_KEY/reservation/retry
MÉTODO
PATCH

Body Params​

A rota não aceita nenhum campo. Qualquer propriedade enviada é recusada com QIT000001 — inclusive token, que tem rota própria.
{}
O corpo vazio é {}, não ausente

A rota não tem campo obrigatório, mas a requisição sem corpo é recusada com GDF000028. Envie {} — e calcule a assinatura sobre a string {}, não sobre a string vazia.

Response​

STATUS
204

204 sem corpo é o sucesso: a averbação voltou para pending_reservation. A rota apenas reposiciona a averbação na fila — o resultado do reenvio chega por webhook.

Erros possíveis​

HTTPCódigoQuando
400QIT000001Corpo com qualquer campo
403QIT000003Requisitante da chamada não identificado
404GDF000028Requisição sem corpo — envie {}
404MPR000017Não há averbação para essa operação, ou ela pertence a outro requisitante
409MPR000009Averbação fora de pending_requester_action — o retry só vale para a averbação parada aguardando o requisitante

3. Averbado com sucesso, ou novo recálculo​

O resultado do reenvio chega pelo webhook credit_operation.collateral:

reservation_statuscollateral_constitutedO que fazer
reservedtrueAverbado. Portabilidade fechada — repita nas demais portabilidades e siga para o passo 4
pending_confirmationfalseExército aceitou a inclusão, aguardando confirmação da averbação — espere o próximo evento
pending_requester_actionfalseRecusado de novo. Repita os passos 1 e 2 com parcela menor (ver cancel_reason)
pending_valid_tokenfalseToken do militar inválido — atualizar o token; não é caso de recálculo

O ciclo recálculo → retry pode ser repetido quantas vezes a margem exigir. Cada iteração parte do estado atual da operação: o valor líquido continua travado no saldo devedor do contrato de origem, só a taxa acompanha a parcela.

Um recálculo por ciclo de averbação

Faça um recalculate, então o reservation/retry, e espere a resposta do Exército antes de recalcular de novo. Recalcular duas vezes seguidas, sem o retry no meio, sobrescreve as condições que ainda não foram enviadas.

Consulta de status

Além do webhook, o estado atual da averbação pode ser lido em GET /debt/{DEBT_KEY}/collateral (last_response + reservation_status). Respeite um intervalo de no mínimo 25 segundos entre consultas — a atualização do estado é assíncrona e leituras mais frequentes não refletem mudança.


4. Recalcular o refinanciamento consolidador​

Com todas as portabilidades do lote averbadas, recalcule o refinancing consolidador — a CCB mãe que carrega seguro e troco. Mesma rota, mesmo corpo, com duas diferenças de comportamento.

ENDPOINT
/v2/credit_operation/CREDIT_OPERATION_KEY/recalculate
MÉTODO
PATCH
{
"installment_amount": 9500.00
}

Use a key do refinancing retornada no Passo 6 de Portabilidade + Refinanciamento.

Diferenças em relação à portabilidade​

ComportamentoPortabilidadeRefinanciamento consolidador
Taxa (prefixed_interest_rate)Recalculada, acompanha a parcelaPreservada — a da emissão
issue_amount / disbursed_issue_amountLíquido travado no saldo devedorAcompanham a parcela — parcela menor ⇒ emissão menor
final_disbursement_amountSempre 0≠ 0 — é o troco, recalculado junto com a parcela
IOFSó sobre dinheiro novoIdem — sobre o issue_amount líquido do saldo portado
Averbação exigida em pending_requester_actionSimNão — aceita também created e pending_reservation
Portabilidades do lote averbadasNão se aplicaObrigatório — todas em reserved (MPR000037)
Por que o consolidador aceita recálculo sem recusa

O valor do consolidador só fica conhecido depois que as portabilidades de origem são averbadas. Por isso o recálculo do refinancing é aceito nos estados created, pending_reservation e pending_requester_action — nos dois primeiros é o ajuste normal do lote, sem retry: a averbação é enviada já com as condições novas.

Response Body
{
"credit_operation_key": "50b950be-e7ec-484c-8c59-e7a1bbae020b",
"credit_operation_status": "issued",
"operation_type": "refinancing",
"collateral_type": "military_payroll",
"collateral_constituted": false,
"disbursement_date": "2026-09-16",
"number_of_installments": 20,
"issue_amount": 157000.00,
"disbursed_issue_amount": 155000.00,
"final_disbursement_amount": 55000.00,
"base_iof": 1783.40,
"additional_iof": 216.60,
"total_iof": 2000.00,
"prefixed_interest_rate": {
"interest_base": "calendar_days",
"daily_rate": 0.00056214,
"monthly_rate": 0.01700000,
"annual_rate": 0.22421
},
"installments": [
{
"installment_key": "7c3d9e11-52a8-4b0e-9f41-b0a6d2c9e733",
"installment_number": 1,
"due_date": "2026-10-16",
"total_amount": 9500.00,
"principal_amortization_amount": 6832.14,
"pre_fixed_amount": 2667.86,
"installment_status": "opened"
},
{ "...": "parcelas 2 a 20" }
]
}

Limite de redução do valor líquido​

O valor líquido do consolidador não pode cair mais de 15% em relação ao valor da emissão original. Parcela que produza um líquido abaixo desse piso é recusada com MPR000036, e a descrição do erro traz o valor original, o novo e o mínimo permitido. Aumento não tem teto.

Reduções maiores que 15% exigem cancelamento e reemissão do lote (ver Cancelamento).

As demais pré-condições, travas de resposta e códigos de erro são os do passo 1.


5. Retentar a averbação do refinanciamento​

Necessário apenas se a averbação do consolidador estiver parada em pending_requester_action. Nos estados created e pending_reservation a averbação segue sozinha com as condições novas.

ENDPOINT
/debt/CREDIT_OPERATION_KEY/reservation/retry
MÉTODO
PATCH

Corpo {} · Resposta 204. Comportamento e erros idênticos ao passo 2.


6. Refinanciamento averbado​

Webhook credit_operation.collateral com reservation_status: reserved e collateral_constituted: true no consolidador fecha o ciclo: com a garantia constituída, a operação segue para o desembolso normal (waiting_disbursement → disbursed), conforme Mapa de Status.

A partir daí a operação não é mais recalculável — recalculate passa a responder COP000556 (garantia já constituída).


Erros possíveis no recálculo​

HTTPCódigoQuando
400QIT000001Corpo fora do schema — vazio, campo desconhecido, tipo errado
403QIT000403Requisitante da chamada não identificado
403QIT000005Requisitante não é dono da operação
404COP000027credit_operation_key não encontrada
400COP000553Tipo de garantia não recalculável
400COP000554Operação sem tipo de reserva na garantia
400COP000568Tipo de reserva sem recálculo disponível (ex.: new_credit, margem livre)
400COP000555Status ≠ issued — a operação ainda não foi assinada e emitida
400COP000556Garantia já constituída — a averbação passou, não há o que recalcular
400COP000557Condição não aceita — só installment_amount
400COP000558installment_amount ausente
400COP000559Nenhuma opção de desembolso em ou após hoje
400COP000560O resultado do cálculo violou uma trava da operação — nada é gravado
400COP000561Existe parcela com valor pago
400COP000562Operação com entrada emitida
400COP000564Condição com mais de 2 casas decimais
400COP000566Sem contrato portado/refinanciado com saldo devedor
400COP000567Operação sem taxa pré-fixada de referência
400COP000339Parcela insuficiente para o valor da operação — resultaria em troco negativo
400MPR000036Valor líquido abaixo de 85% do valor da emissão original
404MPR000017Não há averbação para essa operação
409MPR000009Averbação em status que não permite recálculo — a descrição traz o status atual
409MPR000037Consolidador com portabilidade do lote fora de reserved

Simulação em Sandbox​

Os cenários de recusa são selecionados pelos dois últimos dígitos do CPF do tomador (são os dígitos verificadores — escolha uma base de 9 dígitos cujos verificadores resultem no sufixo desejado):

Sufixo do CPFCenárioOnde para
40Inclusão recusada com código 359 (margem consignável excedida)pending_requester_action com cancel_reason: consignable_margin_exceeded
41Averbação indeferida na confirmação (Indeferida)pending_requester_action com cancel_reason: rejected

Roteiro de teste:

  1. Emita e assine o lote com um CPF de cenário (ver Portabilidade + Refinanciamento e Formalização).
  2. Aguarde o webhook credit_operation.collateral com reservation_status: pending_requester_action.
  3. PATCH /v2/credit_operation/{portability}/recalculate com a parcela nova → 200.
  4. PATCH /debt/{portability}/reservation/retry → 204.
O cenário de recusa não "cura" em sandbox

O CPF de cenário recusa toda tentativa de inclusão ou averbação. Para exercitar o caminho completo até reserved, use no reenvio um tomador sem sufixo de cenário. Ver Mocks (Sandbox) para os demais dados de teste.


Resumo do ciclo​

PassoChamadaSucessoPróximo gatilho
1PATCH /v2/credit_operation/{portability}/recalculate200 com parcelas reescritas—
2PATCH /debt/{portability}/reservation/retry204Webhook credit_operation.collateral
3—reserved → passo 4Recusa → volta ao passo 1
4PATCH /v2/credit_operation/{refinancing}/recalculate200 (troco ≠ 0)—
5PATCH /debt/{refinancing}/reservation/retry204 (só se parado)Webhook credit_operation.collateral
6—reserved + collateral_constituted: trueDesembolso

Glossário​

TermoSignificado
installment_amountNovo valor total da parcela enviado ao recálculo — único campo aceito
pending_requester_actionAverbação recusada por motivo que exige condições novas do parceiro. Único estado em que o recálculo da portabilidade é aceito, e único em que o retry funciona
pending_reservationAverbação aguardando envio ao Exército — onde o reservation/retry a coloca
pending_confirmationInclusão aceita, aguardando a confirmação da averbação
pending_valid_tokenAverbação parada por token do militar inválido — resolve-se pela atualização do token, não por recálculo
reservedMargem averbada, garantia constituída — a operação deixa de ser recalculável
valor líquidodisbursed_issue_amount — travado no saldo devedor portado na portabilidade; acompanha a parcela no consolidador
trocofinal_disbursement_amount — só existe no refinancing consolidador; na portabilidade é sempre 0