Contabilidad de doble entrada
El sistema de doble entrada opera bajo un principio simple pero transformador: para cada Transacción, hay dos entradas correspondientes—un débito y un crédito. Este marco garantiza que todas las actividades financieras se registren de manera holística, proporcionando una vista completa y balanceada de sus cuentas. Cada Transacción impacta dos cuentas, manteniendo el equilibrio en el ecosistema financiero:- Débitos reflejan el valor recibido o los recursos consumidos.
- Créditos indican el valor dado o los recursos proporcionados.
Ejemplo
Considere este ejemplo (Figura 1): realiza una Transacción para transferir R$1000 de una cuenta a otra. Este proceso tendrá dos operaciones:- Una operación para debitar R$ 1.000,00 de la cuenta de origen.
- Una operación para acreditar R$ 1.000,00 a la cuenta de destino.

Figura 1. Ejemplo de las Operaciones en una Transacción para transferir BRL 1.000,00.
Transacciones N:N (Muchos a Muchos)
A diferencia de los sistemas financieros tradicionales que limitan las transacciones a relaciones uno a uno o uno a muchos, Midaz habilita Transacciones N:N, permitiendo múltiples cuentas de origen y destino dentro de una sola Transacción. Considere un pago de marketplace donde múltiples vendedores (varias cuentas de origen) son pagados desde una sola cuenta de depósito en garantía, y cada vendedor también podría pagar una tarifa a la plataforma. Esto podría modelarse como una Transacción que involucra a muchas partes en ambos lados. Midaz puede manejar tal escenario en una Transacción atómica, acreditando y debitando todas las cuentas relevantes. Otro ejemplo es un pago peer-to-peer con tarifas: una Transacción puede debitar la cuenta del pagador y acreditar tanto la cuenta del beneficiario como una cuenta de tarifas en un solo paso. Esta capacidad simplifica flujos financieros que de otro modo requerirían múltiples pasos.Atomicidad e integridad
Las Transacciones son operaciones atómicas – ya sea que todas las operaciones constituyentes tengan éxito, o ninguna lo haga. Esto garantiza que no ocurran eventos financieros parciales. Si alguna parte de una Transacción falla la validación (digamos, fondos insuficientes en una cuenta), la Transacción completa no se aplicará, preservando la integridad del Ledger.Origen de Transacción
Las Transacciones en Midaz pueden realizarse desde un origen único o múltiples orígenes.ImportanteLa suma de los valores en el
source siempre debe ser igual al valor especificado justo después del send e igual a la suma de los valores en el distribute.Origen único
En una Transacción de origen único, el monto especificado se toma directamente de una cuenta de origen.Ejemplo
En este ejemplo (figura 1):- Se toman BRL 30.00 de una cuenta (
@account1). - El 100% se envía a una cuenta de destino (
@destinationAccount1).

Figura 1. Ejemplo de una Transacción de origen único.
Múltiples orígenes
En una Transacción de múltiples orígenes, el monto o proporción se toma de diferentes cuentas. El monto total retirado de cada cuenta debe ser igual al monto transferido para evitar errores.Ejemplo
En este ejemplo (figura 2):- BRL 30.00 se enviarán a la cuenta de destino (
@destinationAccount1).- BRL 15.00 se tomarán de una cuenta (
@account1). - BRL 15.00 se tomarán de otra cuenta (
@account2).
- BRL 15.00 se tomarán de una cuenta (
- La cuenta de destino recibirá el 100% del monto enviado.

Figura 2. Ejemplo de una Transacción de múltiples orígenes.
Destino de Transacción
Similar a los orígenes, los destinos pueden ser únicos o múltiples.Destino único
En una Transacción de destino único, el monto se envía a solo una cuenta de destino.Ejemplo
En este ejemplo (figura 3):- BRL 30.00 se toman de una cuenta externa (
@external|BRL). - El 100% se envía a la cuenta de destino (
@destinationAccount1).

Figura 3. Ejemplo de una Transacción de destino único.
Múltiples destinos
En Transacciones de múltiples destinos, el monto de la Transacción se divide entre múltiples cuentas de destino. Los valores pueden distribuirse por porcentajes, montos fijos o saldo restante.Ejemplo
En este ejemplo (figura 4):- BRL 100 se toman de la cuenta de origen (
@account1). - El 38% del monto va a la cuenta 2 (
@account2). - El 50% va a la cuenta 3 (
@account3). - Un monto fijo de BRL 2.00 va a la cuenta 4 (
@account4). - El monto restante va a la cuenta 5 (
@account5).

Figura 4. Ejemplo de una Transacción de múltiples destinos.
Múltiples orígenes y múltiples destinos
Estas Transacciones complejas involucran múltiples orígenes y múltiples destinos. Esto es útil para escenarios como una campaña de crowdfunding donde las contribuciones se agrupan y distribuyen entre múltiples destinatarios.Ejemplo
En este ejemplo (figura 5):- BRL 4.000,00 serán donados y el monto se tomará de cuatro cuentas diferentes.
- El 25% se tomará de la cuenta 1 (
@account1). - El 25% se tomará de la cuenta 2 (
@account2). - El 40% se tomará de la cuenta 3 (
@account3) - El 10% se tomará de la cuenta 4 (
@account4).
- El 25% se tomará de la cuenta 1 (
- Las donaciones se distribuirán a cuatro cuentas de donación separadas, y cada una recibirá una parte del 25% del total.

Figura 5. Ejemplo de una Transacción de múltiples orígenes y múltiples destinos.
Ejemplos de código
Flujo de Transacción
Cuando se inicia una Transacción, el sistema verifica si la cuenta de origen tiene un saldo suficiente del Activo especificado. Si se cumple esta condición, el monto especificado se transfiere del saldo disponible de la cuenta de origen a la cuenta de destino. Este proceso es sincrónico y, en caso de éxito, el estado de la Transacción será APPROVED. En consecuencia, los usuarios deben iniciar la Transacción solo si tienen la intención de comprometerla en el Ledger.Entradas, salidas y cuentas externas
Midaz utiliza un sistema de Ledger de doble entrada en el que todo valor que entra o sale del sistema debe pasar por una cuenta especial: la Cuenta Externa. Esta cuenta—representada como@external/{{assetCode}}—actúa como el puente entre Midaz y el mundo financiero externo (bancos, PSPs, rieles de pago, etc.).
Por qué esto importa
Cuando el Ledger se inicializa por primera vez, todas las cuentas—incluyendo@external—comienzan con un saldo cero. Para reflejar saldos del mundo real (p.ej., fondos institucionales mantenidos externamente), debe iniciar una Transacción que inyecta fondos en las cuentas de Midaz debitando la cuenta externa.
Esta es la única forma de traer fondos a Midaz.
Entradas – Agregar valor al Ledger
Para acreditar una cuenta interna desde fuera del Ledger:- Origen:
@external/{{assetCode}}(p.ej.,@external/BRL). - Destino: Una o más cuentas internas (p.ej.,
@organization.main).
| Origen | Destino | Monto |
|---|---|---|
| @external/BRL | @accountA | BRL 10.000 |
Salidas – Mover valor fuera del Ledger
Para simular el valor saliendo del Ledger a un destino externo:- Origen: Una o más cuentas de Midaz.
- Destino:
@external/{{assetCode}}.
| Origen | Destino | Monto |
|---|---|---|
| @accountA | @external/BRL | BRL 1.000 |
@accountA y acredita la cuenta externa. En la vida real, su sistema (a través de SPI u otras integraciones) luego transferirá los fondos al destinatario previsto.
Comportamiento y reglas de saldo
@external/{{assetCode}}puede tener un saldo cero o negativo, pero nunca positivo.- Su saldo es siempre el inverso del saldo combinado de todas las cuentas de Midaz que mantienen ese Activo.
- Cada entrada aumenta la liquidez interna y reduce el saldo de la cuenta externa (es decir, simula un depósito).
- Cada salida hace lo contrario.
NotaTodos los movimientos de valor entre el mundo exterior y el Ledger de Midaz deben pasar por la cuenta externa.Nada entra o sale del sistema sin una Transacción formal—garantizando trazabilidad completa, integridad del saldo y cumplimiento con los principios de doble entrada.
Iniciar una Transacción
Hay dos formas principales de iniciar una Transacción:Usando DSL
Un Lenguaje Específico de Dominio (DSL) simplifica la interacción del usuario al enfocarse en conceptos específicos del dominio, permitiendo a los no desarrolladores realizar tareas complejas sin habilidades técnicas. Los DSL reducen el código repetitivo e incorporan restricciones en su sintaxis, aplicando reglas de negocio y minimizando errores. Sin embargo, sus patrones predefinidos pueden limitar la flexibilidad, dificultando la creación de analizadores personalizados o la adaptación a nuevos requisitos. El DSL de Transacciones en Midaz, llamado Gold, simplifica el procesamiento de transacciones con una sintaxis contable intuitiva. Almacena información de transacciones en archivos.gold, permitiendo a los equipos de negocio definir transacciones fácilmente y fomentando la colaboración entre flujos de trabajo técnicos y de negocio.
Para usar el DSL, siga estos pasos:
1
Cree el archivo
.gold según la estructura del DSL de Transacciones.2
Envíe el archivo usando el endpoint Crear una Transacción usando DSL.
Usando el endpoint JSON
Los endpoints JSON proporcionan un estándar flexible y amigable para desarrolladores para el intercambio de datos, permitiendo un control preciso sobre las estructuras de solicitud adaptadas para flujos de trabajo personalizados y casos de uso específicos. Su amplia compatibilidad con varios lenguajes de programación facilita la integración y depuración. Sin embargo, esta flexibilidad puede resultar en verbosidad y errores del usuario, ya que los desarrolladores deben manejar la validación manualmente. Para no desarrolladores, la complejidad de JSON puede presentar desafíos, haciéndolo menos intuitivo que un Lenguaje Específico de Dominio (DSL) para tareas cotidianas.- Para crear una Transacción usando JSON, use el endpoint Crear una Transacción usando JSON.
Gestión de Transacciones
Puede gestionar sus Transacciones ya sea a través de la API o mediante la Console.A través de la API
- Crear una Transacción usando DSL — Enviar un archivo de Transacción usando el DSL de Midaz.
- Crear una Transacción usando JSON — Enviar una Transacción directamente usando un payload JSON.
- Crear una Transacción de entrada — Registrar fondos entrantes de fuentes externas en el Ledger.
- Crear una Transacción de salida — Mover fondos de cuentas internas al mundo externo.
- Listar Transacciones — Ver todas las Transacciones en su espacio de trabajo.
- Recuperar una Transacción — Obtener detalles de una Transacción específica.
- Actualizar una Transacción — Editar los metadatos de una Transacción existente.

