Ciclo de vida da ordem
- Aviso. O Streaming Hub envia um aviso de execução ao listener de webhook do executor. O aviso traz o ID da ordem e a revisão da ordem, não a ordem.
- Verificação. O executor verifica a assinatura HMAC da entrega. Ele grava cada aviso assinado antes de responder.
- Busca. O executor obtém a ordem com
GET /v1/sisbajud/execution/orders/{orderId}na API de execução da Mensageria. - Verificação do dono. Antes da sua primeira escrita, o executor verifica que é dono da instituição da ordem.
- Execução. No seu próximo ciclo, o executor executa a operação no Midaz.
- Resultado. O executor envia o resultado com
POST /v1/sisbajud/execution/orders/{orderId}/execution-results.
Respostas do webhook
O executor aceita uma entrega com timestamp fora de
EXECUTOR_HUB_WEBHOOK_MAX_SKEW_SEC e registra um aviso no log.
Respostas da busca
Verificação do dono
O executor escreve no ledger somente para as instituições das quais é dono. Quando cria uma instituição, ele registra o seu próprio subject M2M (EXECUTOR_M2M_SUBJECT) como dono.
- Se outra identidade é dona da instituição, o executor não escreve nada e dispara um alarme.
- Se a instituição não tem configuração neste executor, a ordem vai para uma decisão humana.
Ciclo de execução
O executor executa um ciclo a cadaEXECUTOR_TICK_EVERY. O padrão é 30s. Cada ciclo executa quatro etapas nesta ordem:
- Ingestão. Executa os avisos aceitos.
- Verificação de órfãs. Procura operações nas contas de bloqueio que o executor não escreveu.
- Monitoramento. Envia um heartbeat para cada escrita que não tem resultado conhecido.
- Drenagem. Envia os resultados que esperam no outbox.
Resultados
O executor grava cada resultado em um outbox antes de enviá-lo. Cada envio traz o headerX-Idempotency. Quando um envio falha com um erro transitório, o executor envia o mesmo resultado de novo em um ciclo posterior.
O
reasonCode de cada operação está nas seções abaixo.
Operações
O executor executa três operações. O bloqueio e o desbloqueio escrevem no Midaz. A requisição de informação somente lê.
Bloqueio (BLOQUEIO)
- O executor lê as contas ativas do sujeito. Um sujeito sem conta ativa recebe
NONEcomNO_CLIENT. - Ele aplica a restrição de agência e conta da ordem.
- Ele bloqueia uma conta salário somente quando a ordem permite contas salário.
- Ele bloqueia somente recursos próprios. Uma conta no cheque especial conta como 0.
- Ele envia uma escrita ao Midaz. A escrita tem uma perna para cada conta de origem, e todas as pernas vão para a conta de bloqueio da ordem.
Desbloqueio (DESBLOQUEIO)
O desbloqueio libera recursos de uma ordem de bloqueio pai, identificada porparentOrderId.
- Sem uma ordem pai, o resultado é
NONEcomPARENT_UNRESOLVED, e o executor não escreve nada. - Quando a ordem pai ainda não tem efeito conhecido, o executor espera. No prazo da ordem, ele entrega a ordem a uma decisão humana.
- O executor lê a conta de bloqueio da ordem pai quando executa a ordem. Ele libera o menor de três valores: o valor que a ordem pede, o saldo restante da ordem pai e o saldo da conta de bloqueio.
- Quando o valor a liberar é 0, o resultado é
NOTHING_TO_RELEASE. - O executor devolve os recursos a cada conta de origem do bloqueio pai.
- Quando uma conta do sujeito é uma conta salário, a ordem vai para uma decisão humana.
Requisição de informação (REQUISICAO_INFORMACAO)
O executor lê os saldos do sujeito e não escreve nada no ledger. Ele responde dois totais: o total bloqueável e o total bloqueável das contas salário.- Um sujeito com pelo menos uma conta ativa recebe
FULLcomINFO_FULFILLED. - Um sujeito sem conta ativa recebe
NONEcomINFO_NON_CLIENT. - Uma ordem que indica uma agência vai para uma decisão humana.
- Uma ordem que indica uma conta que o sujeito não tem vai para uma decisão humana.
Semântica do ledger
Conta de bloqueio
Cada ordem de bloqueio tem a sua própria conta de bloqueio no Midaz. O alias da conta de bloqueio tem o prefixo@block_sisbajud_ e depois os 32 dígitos hexadecimais minúsculos do ID da ordem de bloqueio. Um desbloqueio encontra a conta pelo seu parentOrderId.
O tipo de conta de uma conta de bloqueio é sisbajud_block. Se o seu ledger valida tipos de conta, registre sisbajud_block como tipo de conta.
Direções
- Um bloqueio diminui as contas do sujeito e aumenta a conta de bloqueio.
- Um desbloqueio diminui a conta de bloqueio. A escrita dele tem uma perna de origem: a conta de bloqueio.
Idempotência
Cada escrita traz o headerX-Idempotency e X-TTL: 604800, que são sete dias. O Midaz guarda a chave de idempotência de uma escrita por esse tempo. A chave é orderId:orderRevision. Uma reentrega da mesma revisão da ordem envia a mesma chave.
Escritas incertas
Quando o Midaz responde a uma escrita sem prova do seu efeito, o resultado é
INDETERMINATE. O executor lê o ledger de novo antes de cada heartbeat. Ele envia um resultado de heartbeat à Mensageria a cada EXECUTOR_HEARTBEAT_EVERY.
A ordem vai para uma decisão humana no primeiro de dois limites:
EXECUTOR_HUMAN_DECISION_AFTER_BEATSheartbeats sem mudança. O padrão é 3.- O prazo da ordem menos
RESPONSE_DEADLINE_MARGIN.
humanDisposition HELD_MONEY_MOVED, e o executor não envia nenhuma resposta final. Os heartbeats continuam, com executionState e effect ambos INDETERMINATE.
Operações que o executor não escreveu
A verificação de órfãs lê as operações de cada conta de bloqueio ao longo deEXECUTOR_ORPHAN_RECONCILE_WINDOW. O padrão é 48h. O executor informa uma operação como órfã quando a sua transação não tem metadata.code, ou tem um código que o executor não registrou. Esta etapa somente detecta. Ela não muda nada no ledger.
Rotas contábeis
As rotas contábeis são opcionais, por organização. O executor as lê dos documentos de tenant
routing.organizations e routing.ledger_bindings no Systemplane. Com SYSTEMPLANE_ENABLED desligado, o executor escreve sem rotas.
Quando uma escrita não pode sair por causa da sua configuração, o executor a adia. O Midaz não aplicou nada, então a ordem espera, e uma entrega posterior envia a mesma escrita com a mesma chave de idempotência. Estas condições adiam uma escrita:
- O executor não consegue resolver as rotas contábeis da escrita.
- O Midaz recusa as rotas contábeis da escrita:
422com código0113,0114,0116,0117,0118,0119,0152ou0157, ou404com código0105.
GET /v1/admin/ledger-routing/preflight verifica a configuração antes de você ligar as rotas.
Chamadas ao Midaz
O executor chama o ledger Midaz no
baseUrl de cada instituição, com o token dessa instituição. Dê às credenciais da instituição acesso a estas operações:
O executor encontra as contas de um sujeito pelo CRM do Midaz. Com
crmMode legacy, ele chama GET /v1/aliases?document= em crmBaseUrl. Com crmMode embedded, ele chama GET /v2/organizations/{organizationId}/instruments?document= em baseUrl.
