Saltar al contenido principal

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.
Para las organizaciones que aprovechan las capacidades de Transacción avanzadas de Midaz, el sistema de doble entrada se integra perfectamente con nuestra arquitectura. Nuestra plataforma garantiza que cada débito y crédito se rastree y saldo automáticamente, simplificando sus procesos financieros.

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.

En Midaz, estas entradas se capturan automáticamente, garantizando precisión y alineación con su estrategia financiera. El diseño intuitivo de nuestra plataforma le permite ver y analizar estos movimientos sin esfuerzo, promoviendo una cultura de autonomía financiera.

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.

Ejemplos de código
(Transacción v1
  (chart-of-accounts-group-name PAG_CONTAS_CODE_1)
  (description "single source Transacción")
  (send BRL 3000|2
    (source
      (from @account1 :amount BRL 3000|2)
    )
    (distribute
      (to @destinationAccount1 :share 100)
    )
  )
)

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).
  • La cuenta de destino recibirá el 100% del monto enviado.

Figura 2. Ejemplo de una Transacción de múltiples orígenes.

Ejemplos de código
(Transacción v1
  (chart-of-accounts-group-name PAG_CONTAS_CODE_1)
  (description "multi-source Transacción")
  (send BRL 3000|2
    (source
      (from @account1 :amount BRL 1500|2)
      (from @account2 :amount BRL 1500|2)
    )
    (distribute
      (to @destinationAccount1 :share 100)
    )
  )
)

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.

Ejemplos de código
(Transacción v1
  (chart-of-accounts-group-name PAG_CONTAS_CODE_1)
  (description "single destination Transacción")
  (send BRL 3000|2
    (source
      (from @external|BRL :amount BRL 3000|2)
    )
    (distribute
      (to @destinationAccount1 :share 100)
    )
  )
)

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.

Ejemplo de código
(Transacción v1
  (chart-of-accounts-group-name PAG_CONTAS_CODE_1)
  (description "multi-destination Transacción")
  (send BRL 3000|2
    (source
      (from @account1 :amount BRL 3000|2)
    )
    (distribute
      (to @account2 :share 38)
      (to @account3 :share 50)
      (to @account4 :amount BRL 200|2)
      (to @account5 :remaining)
    )
  )
)

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).
  • 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
(Transacción v1
  (chart-of-accounts-group-name PAG_CONTAS_CODE_1)
  (description "multi-source and multi-destination Transacción")
  (send BRL 400000|2
    (source
      (from @account1 :share 25)
      (from @account2 :share 25)
      (from @account3 :share 40)
      (from @account4 :share 10)
    )
    (distribute
      (to @donation1 :share 25)
      (to @donation2 :share 25)
      (to @donation3 :share 25)
      (to @donation4 :share 25)
    )
  )
)

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).
Ejemplo: Primer depósito en el Ledger Su institución mantiene R$10.000 en un banco del mundo real y desea traerlo a Midaz. Usted crea una Transacción:
OrigenDestinoMonto
@external/BRL@accountABRL 10.000
Esto debita la cuenta externa y acredita su cuenta interna. La cuenta externa ahora mostrará un saldo negativo, lo cual es esperado y representa el monto total que su organización ha traído al Ledger.

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}}.
Ejemplo: Una transferencia PIX del Ledger a un banco externo
OrigenDestinoMonto
@accountA@external/BRLBRL 1.000
Esto debita @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.
Consejo¿Quiere profundizar en la estructura del DSL? Consulte la página DSL de Transacciones para más detalles.

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.

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

A través de la Console

Todas las acciones de gestión de Transacciones, incluyendo visualización, creación, edición y eliminación, se pueden realizar a través de la página de Organizaciones en la Midaz Console. Aprenda más en la guía Gestión de Transacciones.