Ciclo de vida da ordem
- Aviso. O Streaming Hub envia um aviso de execução ao listener de webhook do plugin. O aviso traz o ID da ordem e a revisão da ordem, não a ordem.
- Verificação. O plugin verifica a assinatura HMAC da entrega. Ele grava cada aviso assinado antes de responder.
- Busca. O plugin 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 plugin verifica que é dono da instituição da ordem.
- Execução. No seu próximo ciclo, o plugin executa a operação no Midaz.
- Resultado. O plugin envia o resultado com
POST /v1/sisbajud/execution/orders/{orderId}/execution-results.
Respostas do webhook
O plugin 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 plugin 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 plugin não escreve nada e dispara um alarme.
- Se a instituição não tem configuração neste plugin, a ordem vai para uma decisão humana.
Ciclo de execução
O plugin executa um ciclo a cadaEXECUTOR_TICK_EVERY. O padrão é 30s. Cada ciclo executa três etapas nesta ordem:
- Ingestão. Executa os avisos aceitos.
- Verificação de órfãs. Procura operações nas contas de bloqueio que o plugin não escreveu.
- Monitoramento. Envia um heartbeat para cada escrita que não tem resultado conhecido.
Resultados
O plugin 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 plugin envia o mesmo resultado de novo depois de uma espera, até EXECUTOR_RESULT_MAX_ATTEMPTS tentativas. O padrão é 12.
Depois da última tentativa, o plugin estaciona o resultado, registra uma decisão humana e dispara um alarme. Ele não envia de novo um resultado estacionado, e as versões posteriores da mesma ordem esperam atrás dele. Um administrador da plataforma rearma o resultado. Operando o Plugin SISBAJUD descreve a rota.
O
reasonCode de cada operação está nas seções abaixo.
Operações
O bloqueio e o desbloqueio escrevem no Midaz. A requisição de informação somente lê.
Bloqueio (BLOQUEIO)
- O plugin 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. Restrição de agência e conta dá as regras.
- 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.
Uma ordem de bloqueio pode trazer um valor mínimo. Quando o total que o plugin pode bloquear fica abaixo desse mínimo, ele não escreve nada e passa a ordem para uma decisão humana.
Restrição de agência e conta
O plugin lê a agência e o número de cada conta nos instrumentos do CRM do sujeito. ComcrmMode embedded, a agência é bankingDetails.branch e o número da conta é bankingDetails.account. Com crmMode legacy, o CRM não traz nenhum dos dois.
- Uma ordem que indica uma agência vai para uma decisão humana quando uma conta que pode ser a indicada tem agência desconhecida ou ambígua.
- Uma ordem que indica um número de conta bloqueia as contas cujo número coincide. Ela também bloqueia uma conta de número desconhecido ou ambíguo, até o valor da ordem, porque essa conta pode ser a que o tribunal indicou. As contas cujo número coincide vêm primeiro. Com
crmModelegacy, nenhum número é conhecido, então toda conta que passa na regra de agência pode ser bloqueada. - Uma ordem com número de conta e sem agência vai para uma decisão humana quando duas ou mais contas coincidem.
- Com um número de conta, o resultado é
NONEquando todos os números de conta são conhecidos e nenhum coincide.
Desbloqueio (DESBLOQUEIO)
O desbloqueio libera recursos de uma ordem de bloqueio pai, identificada porparentOrderId. O plugin usa a conta de origem registrada do bloqueio pai como destino da liberação. Se não consegue determinar um único destino com segurança, exige uma decisão humana em vez de adivinhar.
- Sem uma ordem pai, o resultado é
NONEcomPARENT_UNRESOLVED, e o plugin não escreve nada. - Quando a ordem pai ainda não tem efeito conhecido, o plugin espera. No prazo da ordem menos
RESPONSE_DEADLINE_MARGIN, a ordem vai para uma decisão humana. Se a ordem não tem prazo, ela vai para uma decisão humana na hora. - O plugin 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. - 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 plugin lê os saldos do sujeito e não escreve nada no ledger. Se o sujeito é cliente, mas não é titular da conta especificada, o plugin exige uma decisão humana em vez de informar que o sujeito não é cliente.- 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.
searchBalance), o resultado traz dois totais: o total bloqueável e o total bloqueável das contas salário. Um sujeito sem conta ativa recebe 0.00 nos dois.
Canal direto
No canal direto, o sistema da própria instituição envia ordens judiciais ao plugin, e a Mensageria não participa. O plugin guarda cada ordem, executa no Midaz e guarda os resultados. A instituição lê os resultados e responde ao tribunal ela mesma. O plugin serve o canal direto apenas quando roda em modo executor, com um tenant, e com
PLUGIN_AUTH_ENABLED ligado. Caso contrário, as cinco rotas diretas respondem 501.
Um administrador da plataforma passa uma instituição para o canal direto com PUT /v1/institutions/{institutionId}/channel. A troca exige tudo isto:
- O plugin é o dono da instituição.
- O código da instituição guardado é a raiz de 8 caracteres do CNPJ do agrupamento responsável.
- A instituição não tem ordem aberta, e nenhum bloqueio da instituição ainda retém dinheiro.
422 SBJ-0025 em uma ordem direta.
O feed de resultados entrega cada resultado pelo menos uma vez. Remova duplicatas por
orderId, orderRevision e executionVersion. Envie um desbloqueio ou uma transferência apenas depois do 202 do seu bloqueio pai.
O canal direto aceita BLOCK, UNBLOCK, TRANSFER, INFO e INTERRUPT. Uma transferência move recursos da conta de bloqueio da ordem pai para a conta de depósito judicial da instituição. Uma interrupção para um bloqueio permanente e mantém o que o bloqueio já retém. DIRECT_PERMANENT_BLOCK_ENABLED decide se o canal aceita um novo bloqueio permanente. Com o padrão, ele recusa um com 422 SBJ-0027.
Um bloqueio permanente continua bloqueando novos créditos do sujeito, até o valor da ordem. O plugin lê esses créditos dos eventos do ledger Midaz. Ele dura um ano a partir do recebimento, ou até a data do tribunal quando a ordem informa uma, e nunca mais que um ano. Quando o prazo termina, o bloqueio deixa de aceitar novos créditos e mantém o que já retém. Uma interrupção, uma transferência ou um desbloqueio do restante, ou um cancelamento o encerra. Quando um bloco posterior de um bloqueio permanente continua falhando, o plugin estaciona a tentativa, levanta um alarme e deixa de tomar novos créditos desse bloqueio até que um administrador da plataforma resolva a tentativa. Uma ordem direta que falha em todas as tentativas, ou que chega ao seu corte enquanto o ledger falha, também é estacionada. A leitura dela mostra parked true.
Os papéis de máquina order-submitter e result-reader chamam essas rotas. Operando o Plugin SISBAJUD descreve os papéis.
Apagar uma ordem do canal direto
Um administrador da plataforma apaga uma ordem concluída do canal direto comPOST /v1/admin/direct/orders/{orderId}/erase, por um pedido do titular dos dados sob a LGPD ou no fim da retenção. POST /v1/admin/direct/purge lista as ordens que já podem ser apagadas e não muda nada. As duas operações exigem um token de usuário sem tenant e só respondem numa instalação de um tenant só.
Depois do apagamento, ninguém lê de novo o conteúdo enviado com a ordem: o corpo da ordem e o número do documento da pessoa ou empresa que a ordem atinge. O apagamento não tem volta. O seu clientOrderId e o seu externalReference viram tokens. Uma busca pelo externalReference original ainda encontra a ordem apagada, com o conteúdo oculto.
O apagamento não remove:
- o protocolo do tribunal e os números de sequência da ordem;
- o diário de lançamentos do plugin, com os valores, e as transações no Midaz;
- os resultados que já estão no feed de resultados, e o que o seu sistema já leu dele;
- o registro de auditoria do apagamento;
- os backups feitos antes do apagamento. Depois de restaurar um backup, apague a ordem de novo.
EXECUTOR_DIRECT_PURGE_ELIGIBLE_ALARM_AFTER (padrão 168h), o plugin registra um erro no log para um administrador revisar.
Semântica do ledger
Conta de bloqueio
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.
- Uma transferência diminui a conta de bloqueio da ordem pai e aumenta a conta de depósito judicial.
- Um desbloqueio diminui a conta de bloqueio. A escrita dele tem uma perna de origem: a conta de bloqueio. Ele libera os recursos para a conta de origem registrada ou exige uma decisão humana quando não é possível determinar um único destino seguro.
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, então 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 plugin lê o ledger de novo antes de cada heartbeat. Ele envia um resultado de heartbeat à Mensageria a cada EXECUTOR_HEARTBEAT_EVERY, até que a Mensageria responda que a revisão da ordem foi substituída.
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. Os heartbeats continuam, com executionState e effect ambos INDETERMINATE.
Ledger fora do ar no corte
O corte de uma ordem é o seu prazo menosRESPONSE_DEADLINE_MARGIN. Quando o Midaz falha para uma ordem da Mensageria no corte ou depois dele, e nenhum resultado judicial dessa revisão espera no outbox, o plugin para as suas tentativas. Ele registra uma decisão humana e não envia resultado. Verifique o ledger e responda ao tribunal você mesmo antes do prazo. Caso contrário, a Mensageria registra uma não resposta.
Depois que uma pessoa responde
Considere uma revisão que foi passada a uma pessoa no seu corte, ou que uma pessoa resolveu como efeito reconhecido ou sem efeito comprovado. Quando a sua escrita chega ao Midaz depois, o plugin não envia resultadoFULL nem PARTIAL para ela. Ele registra o efeito e dispara um alarme. O tribunal recebe apenas a resposta da pessoa, então concilie você mesmo um efeito tardio no ledger.
Operações que o plugin 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 plugin informa uma operação como órfã quando a sua transação não tem metadata.code, ou tem um código que o plugin 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 plugin as lê dos documentos de tenant
routing.organizations e routing.ledger_bindings no Systemplane. Com SYSTEMPLANE_ENABLED desligado, o plugin escreve sem rotas.
Com routing.organizations em schemaVersion 2, cada organização tem as suas próprias rotas para cada fluxo e a lista de ledgers que lançam com elas. O plugin então não lê routing.ledger_bindings. Uma escrita em um ledger que não está na lista da sua organização sai sem rotas.
Quando uma escrita não pode sair por causa da sua configuração, o plugin 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 plugin 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 plugin 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 plugin 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.
