Ciclo de vida de la orden
- Aviso. El Streaming Hub envía un aviso de ejecución al listener de webhook del executor. El aviso lleva el ID de la orden y la revisión de la orden, no la orden.
- Verificación. El executor verifica la firma HMAC de la entrega. Guarda cada aviso firmado antes de responder.
- Obtención. El executor obtiene la orden con
GET /v1/sisbajud/execution/orders/{orderId}en la API de ejecución de la Mensageria. - Verificación del dueño. Antes de su primera escritura, el executor verifica que es dueño de la institución de la orden.
- Ejecución. En su siguiente ciclo, el executor ejecuta la operación en Midaz.
- Resultado. El executor envía el resultado con
POST /v1/sisbajud/execution/orders/{orderId}/execution-results.
Respuestas del webhook
El executor acepta una entrega con un timestamp fuera de
EXECUTOR_HUB_WEBHOOK_MAX_SKEW_SEC y registra una advertencia en el log.
Respuestas de la obtención
Verificación del dueño
El executor escribe en el ledger solo para las instituciones de las que es dueño. Cuando crea una institución, registra su propio subject M2M (EXECUTOR_M2M_SUBJECT) como dueño.
- Si otra identidad es dueña de la institución, el executor no escribe nada y dispara una alarma.
- Si la institución no tiene configuración en este executor, la orden pasa a una decisión humana.
Ciclo de ejecución
El executor ejecuta un ciclo cadaEXECUTOR_TICK_EVERY. El valor predeterminado es 30s. Cada ciclo ejecuta cuatro pasos en este orden:
- Ingesta. Ejecuta los avisos aceptados.
- Verificación de huérfanas. Busca operaciones en las cuentas de bloqueo que el executor no escribió.
- Monitoreo. Envía un heartbeat por cada escritura que no tiene un resultado conocido.
- Drenaje. Envía los resultados que esperan en el outbox.
Resultados
El executor guarda cada resultado en un outbox antes de enviarlo. Cada envío lleva el headerX-Idempotency. Cuando un envío falla con un error transitorio, el executor envía el mismo resultado de nuevo en un ciclo posterior.
El
reasonCode de cada operación está en las secciones siguientes.
Operaciones
El executor ejecuta tres operaciones. El bloqueo y el desbloqueo escriben en Midaz. La solicitud de información solo lee.
Bloqueo (BLOQUEIO)
- El executor lee las cuentas activas del sujeto. Un sujeto sin cuenta activa recibe
NONEconNO_CLIENT. - Aplica la restricción de sucursal y cuenta de la orden.
- Bloquea una cuenta salario solo cuando la orden permite cuentas salario.
- Bloquea solo fondos propios. Una cuenta en sobregiro cuenta como 0.
- Envía una escritura a Midaz. La escritura tiene una pierna por cada cuenta de origen, y todas las piernas van a la cuenta de bloqueo de la orden.
Desbloqueo (DESBLOQUEIO)
El desbloqueo libera fondos de una orden de bloqueo padre, identificada porparentOrderId.
- Sin una orden padre, el resultado es
NONEconPARENT_UNRESOLVED, y el executor no escribe nada. - Cuando la orden padre todavía no tiene un efecto conocido, el executor espera. En el plazo de la orden, entrega la orden a una decisión humana.
- El executor lee la cuenta de bloqueo de la orden padre cuando ejecuta la orden. Libera el menor de tres montos: el monto que pide la orden, el saldo restante de la orden padre y el saldo de la cuenta de bloqueo.
- Cuando el monto a liberar es 0, el resultado es
NOTHING_TO_RELEASE. - El executor devuelve los fondos a cada cuenta de origen del bloqueo padre.
- Cuando una cuenta del sujeto es una cuenta salario, la orden pasa a una decisión humana.
Solicitud de información (REQUISICAO_INFORMACAO)
El executor lee los saldos del sujeto y no escribe nada en el ledger. Responde dos totales: el total bloqueable y el total bloqueable de las cuentas salario.- Un sujeto con al menos una cuenta activa recibe
FULLconINFO_FULFILLED. - Un sujeto sin cuenta activa recibe
NONEconINFO_NON_CLIENT. - Una orden que indica una sucursal pasa a una decisión humana.
- Una orden que indica una cuenta que el sujeto no tiene pasa a una decisión humana.
Semántica del ledger
Cuenta de bloqueo
Cada orden de bloqueo tiene su propia cuenta de bloqueo en Midaz. El alias de la cuenta de bloqueo tiene el prefijo@block_sisbajud_ y luego los 32 dígitos hexadecimales en minúsculas del ID de la orden de bloqueo. Un desbloqueo encuentra la cuenta por su parentOrderId.
El tipo de cuenta de una cuenta de bloqueo es sisbajud_block. Si tu ledger valida tipos de cuenta, registra sisbajud_block como tipo de cuenta.
Direcciones
- Un bloqueo disminuye las cuentas del sujeto y aumenta la cuenta de bloqueo.
- Un desbloqueo disminuye la cuenta de bloqueo. Su escritura tiene una pierna de origen: la cuenta de bloqueo.
Idempotencia
Cada escritura lleva el headerX-Idempotency y X-TTL: 604800, que son siete días. Midaz guarda la clave de idempotencia de una escritura durante ese tiempo. La clave es orderId:orderRevision. Una reentrega de la misma revisión de la orden envía la misma clave.
Escrituras inciertas
Cuando Midaz responde a una escritura sin prueba de su efecto, el resultado es
INDETERMINATE. El executor lee el ledger de nuevo antes de cada heartbeat. Envía un resultado de heartbeat a la Mensageria cada EXECUTOR_HEARTBEAT_EVERY.
La orden pasa a una decisión humana en el primero de dos límites:
EXECUTOR_HUMAN_DECISION_AFTER_BEATSheartbeats sin cambio. El valor predeterminado es 3.- El plazo de la orden menos
RESPONSE_DEADLINE_MARGIN.
humanDisposition HELD_MONEY_MOVED, y el executor no envía ninguna respuesta final. Los heartbeats continúan, con executionState y effect ambos INDETERMINATE.
Operaciones que el executor no escribió
La verificación de huérfanas lee las operaciones de cada cuenta de bloqueo duranteEXECUTOR_ORPHAN_RECONCILE_WINDOW. El valor predeterminado es 48h. El executor informa una operación como huérfana cuando su transacción no tiene metadata.code, o tiene un código que el executor no registró. Este paso solo detecta. No cambia nada en el ledger.
Rutas contables
Las rutas contables son opcionales, por organización. El executor las lee de los documentos de tenant
routing.organizations y routing.ledger_bindings en Systemplane. Con SYSTEMPLANE_ENABLED inactivo, el executor escribe sin rutas.
Cuando una escritura no puede salir por su configuración, el executor la aplaza. Midaz no aplicó nada, así que la orden espera, y una entrega posterior envía la misma escritura con la misma clave de idempotencia. Estas condiciones aplazan una escritura:
- El executor no puede resolver las rutas contables de la escritura.
- Midaz rechaza las rutas contables de la escritura:
422con código0113,0114,0116,0117,0118,0119,0152o0157, o404con código0105.
GET /v1/admin/ledger-routing/preflight verifica la configuración antes de que actives las rutas.
Llamadas a Midaz
El executor llama al ledger Midaz en el
baseUrl de cada institución, con el token de esa institución. Da a las credenciales de la institución acceso a estas operaciones:
El executor encuentra las cuentas de un sujeto por el CRM de Midaz. Con
crmMode legacy, llama a GET /v1/aliases?document= en crmBaseUrl. Con crmMode embedded, llama a GET /v2/organizations/{organizationId}/instruments?document= en baseUrl.
