> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Accounting Routes

> Valida cada transacción con las Accounting Routes y las Operation Routes. Aplica la estructura y las reglas de negocio antes de registrar cualquier movimiento.

Las Accounting Routes son el sistema de validación de dos capas de Midaz para las transacciones financieras. Las **Accounting Routes** definen el patrón completo de la transacción. Las **Operation Routes** validan cada operación dentro de ese patrón. Juntas, mantienen cada transacción estructuralmente correcta y conforme con tus reglas de negocio.

<Note>
  **Nomenclatura:** la Lerian Console y la documentación del producto llaman a este concepto **Accounting Routes**. En la API y los SDK, el recurso `transactionRoute` representa la ruta en el nivel de transacción, con los endpoints `transaction-route`. Los dos términos se refieren a lo mismo.
</Note>

* Las **Accounting Routes** definen la estructura completa de una transacción: la secuencia requerida de operaciones que forma un evento financiero válido.
* Las **Operation Routes** definen las reglas de cada operación (o "tramo") de esa transacción. Cada regla establece el tipo de cuenta esperado o la cuenta específica, la anotación contable y el lado de débito o crédito.

Cuando envías una transacción, Midaz la valida en dos capas. La capa de Accounting Routes verifica que la estructura general coincida con el patrón predefinido. La capa de Operation Routes verifica que cada componente cumpla los requisitos de cuenta y las reglas de negocio.

Si alguna parte de la transacción no supera estas verificaciones, Midaz la rechaza antes de registrarla.

<Note>
  Defines los patrones de validación mediante las Operation Routes y las Accounting Routes.
</Note>

## ¿Para qué sirven las Accounting Routes?

***

Las Accounting Routes brindan control estructurado sobre tus operaciones financieras al separar la lógica de la transacción del código de negocio. En lugar de codificar reglas de validación directamente en tu aplicación, configuras patrones reutilizables. Estos patrones hacen que cada movimiento financiero siga los requisitos de tu organización.

Estas entidades vinculan las Transacciones y las Operaciones del ledger de Midaz con abstracciones de nivel superior. Estas abstracciones te ayudan a integrar plugins especializados y sistemas externos, especialmente para **contabilidad y tesorería**. Las anotaciones y clasificaciones estructuradas crean un vocabulario estandarizado que otros componentes pueden entender y usar.

Este enfoque ofrece:

* **Consistencia**: todas las transacciones siguen estructuras predefinidas sin importar dónde se originen.
* **Flexibilidad**: adapta el diseño de tu ledger a tus necesidades de negocio sin cambios de código.
* **Integridad**: la validación automática evita que las transacciones mal formadas afecten tu ledger.
* **Facilidad de mantenimiento**: la configuración centralizada facilita actualizar las reglas financieras a medida que tu negocio evoluciona.
* **Interoperabilidad**: los campos con semántica de negocio permiten integrar plugins contables y sistemas financieros externos.

<h2 id="working-with-accounting-routes">
  Trabajar con las Accounting Routes
</h2>

***

Para usar las Accounting Routes, completas una configuración única y luego ejecutas transacciones.

### Configuración inicial

#### 1. Configura el Ledger para la validación de rutas de transacción

Para activar la validación de rutas de transacción en un Ledger específico, habilita la configuración de validación mediante la [API de configuración del Ledger](/es/products/midaz/ledgers#ledger-settings). Esto controla si las transacciones de ese Ledger deben cumplir con tus rutas configuradas.

<CodeGroup>
  ```json PATCH /v1/organizations/{org_id}/ledgers/{ledger_id}/settings theme={null}
  {
    "accounting": {
      "validateRoutes": true,
      "validateAccountType": true
    }
  }
  ```
</CodeGroup>

* **`validateRoutes`**: cuando está habilitado, cada transacción debe hacer referencia a una ruta de transacción válida.
* **`validateAccountType`**: cuando está habilitado, Midaz rechaza una cuenta cuyo `type` no sea un Account Type registrado. Esto controla la **creación de cuentas**, no las transacciones. `validateRoutes` aplica la regla `account_type` en una Operation Route, independientemente de este indicador.

<Tip>
  Los cambios de configuración no necesitan un nuevo despliegue: los actualizas en cualquier momento mediante la API. La escritura invalida la caché de configuración, pero las lecturas se almacenan en caché durante **5 minutos**. Cada réplica puede tardar ese tiempo en ver un cambio.
</Tip>

<h4 id="2-create-operation-routes">
  2. Crea Operation Routes
</h4>

Crea Operation Routes que definan las reglas de validación y el comportamiento de los componentes individuales de la transacción.

**Campos clave:**

* **title**: etiqueta breve que identifica la ruta de operación.

* **code** (en desuso): una referencia externa heredada que se mantiene por compatibilidad con versiones anteriores. El motor **no** la escribe en las operaciones. En su lugar, registra el `code` de la rúbrica resuelta (de `accountingEntries`) como `routeCode` en cada operación.

* **description**: explicación detallada opcional.

* **metadata**: pares clave-valor para el contexto de negocio y la categorización personalizada.

* **operationType**: la dirección contable de esta ruta (`source`, `destination` o `bidirectional`).
  * `source`: identifica las cuentas donde se originan los fondos (lado de débito).
  * `destination`: identifica las cuentas que reciben los fondos (lado de crédito).
  * `bidirectional`: se aplica a ambos lados de la transacción, como origen y destino a la vez.

* **account**: reglas de validación opcionales que establecen un tipo de cuenta requerido o una cuenta específica.
  * **ruleType**: el tipo de regla de validación de cuenta (`account_type`, `alias`).
  * **validIf**: el valor esperado que debe coincidir para que la validación se apruebe.

* **accountingEntries**: asientos contables opcionales para cada tipo de acción. Consulta [Asientos contables](#4-configure-accounting-entries-actions) más abajo.

Configura las reglas de cuenta según tus necesidades:

**Opción A: sin regla de cuenta**

Si no necesitas validación de cuenta para la ruta de operación, omite el objeto account:

<CodeGroup>
  ```json JSON theme={null}
   {
      "title": "Fee Collection",
      "description": "Operation route for collecting service fees from user transactions",
      "metadata": {
          "businessUnit": "payments",
          "category": "revenue"
      },
      "operationType": "source"
  }
  ```
</CodeGroup>

**Opción B: regla de validación de cuenta**

Si necesitas validación de cuenta para la operación, configura las reglas de cuenta según la configuración de tu ledger:

* **Apuntar a una cuenta específica**

Valida contra una cuenta específica usando su alias.

<CodeGroup>
  ```json JSON theme={null}
  {
      "title": "Fee Revenue Collection",
      "description": "Operation route for crediting collected fees to revenue account",
      "metadata": {
          "businessUnit": "payments",
          "category": "revenue"
      },
      "operationType": "destination",
      "account": {
          "ruleType": "alias",
          "validIf": "@external/BRL"
      }
  }
  ```
</CodeGroup>

* **Apuntar a un tipo de cuenta**

Valida contra tipos de cuenta específicos.

<CodeGroup>
  ```json JSON theme={null}
  {
      "title": "User Cashout Fee",
      "description": "Operation route for collecting fees from user cashout transactions",
      "metadata": {
          "businessUnit": "payments",
          "category": "fee"
      },
      "operationType": "source",
      "account": {
          "ruleType": "account_type",
          "validIf": ["user_wallet", "asset"]
      }
  }
  ```
</CodeGroup>

**Opción C: con asientos contables**

Adjunta asientos contables directamente a la ruta de operación mediante el campo `accountingEntries`. Este campo asigna cada etapa del ciclo de vida de la transacción a los códigos contables de partida doble correctos. Consulta [Configura los asientos contables (acciones)](#4-configure-accounting-entries-actions) más abajo para conocer el modelo completo de tipos de acción, los requisitos de débito/crédito y la matriz de validación.

Una ruta con asientos contables configurados:

<CodeGroup>
  ```json JSON theme={null}
  {
      "title": "Pix Cash-in - Current Account",
      "description": "Operation route for receiving Pix payments into current account",
      "operationType": "source",
      "accountingEntries": {
          "direct": {
              "debit": {
                  "code": "1.1.001",
                  "description": "Cash - Available funds"
              },
              "credit": {
                  "code": "3.1.001",
                  "description": "Service Revenue"
              }
          },
          "hold": {
              "debit": {
                  "code": "1.1.002",
                  "description": "Clearing Values"
              },
              "credit": {
                  "code": "2.1.001",
                  "description": "Pending Obligations"
              }
          },
          "commit": {
              "debit": {
                  "code": "2.1.001",
                  "description": "Pending Obligations"
              },
              "credit": {
                  "code": "3.1.001",
                  "description": "Service Revenue"
              }
          },
          "cancel": {
              "debit": {
                  "code": "2.1.001",
                  "description": "Pending Obligations"
              },
              "credit": {
                  "code": "1.1.002",
                  "description": "Clearing Values"
              }
          }
      },
      "account": {
          "ruleType": "alias",
          "validIf": "@current_account"
      },
      "metadata": {
          "channel": "pix"
      }
  }
  ```
</CodeGroup>

<Note>
  El campo `operationType` también admite `bidirectional`. Una ruta bidireccional opera en ambas direcciones. Úsala para rutas que envían y reciben a la vez, o para operaciones que quizás necesites revertir.
</Note>

#### 3. Crea las Accounting Routes

Completa tu configuración combinando Operation Routes en Accounting Routes (el recurso `transactionRoute` en la API). Estas definen tus patrones completos de transacción. Cada patrón describe cómo las operaciones trabajan juntas para formar eventos financieros balanceados que coinciden con tus procesos de negocio.

<Warning>
  El campo `operationRoutes` usa un arreglo de objetos con `operationRouteId`, en lugar de un arreglo simple de cadenas UUID.
</Warning>

<CodeGroup>
  ```json JSON theme={null}
  {
      "title": "Fee Transaction",
      "description": "Complete transaction for collecting fees from user cashout operations",
      "metadata": {
          "transactionType": "cashout_fee",
          "businessFlow": "withdrawal_processing"
      },
      "operationRoutes": [
          {
              "operationRouteId": "0197e6aa-1695-734a-a8c3-8c79e0ad32c2"
          },
          {
              "operationRouteId": "0197e675-37cc-71d7-96c2-f58000f33aa0"
          }
      ]
  }
  ```
</CodeGroup>

<h4 id="4-configure-accounting-entries-actions">
  4. Configura los asientos contables (acciones)
</h4>

Cada Operation Route puede incluir **asientos contables**. Estas rúbricas estructuradas definen cómo Midaz registra los asientos de débito y crédito para cada evento transaccional: `direct`, `hold`, `commit`, `cancel` y `revert`. Tres claves complementarias (`overdraft`, `block` y `unblock`) describen el impacto contable, pero **no** son acciones válidas de ruta de transacción. El motor las usa para resolver qué cuentas debita y acredita en cada acción. También determinan las anotaciones `routeCode` y `routeDescription` de cada operación.

La configuración `accounting.validateRoutes` en la [configuración del Ledger](/es/products/midaz/ledgers#ledger-settings) controla este comportamiento. Cuando la habilitas, Midaz rechaza una ruta de operación faltante o que no coincide, y devuelve `0117 ErrAccountingRouteNotFound`. Cuando la deshabilitas, la resolución de la ruta se hace en modo best-effort. Una rúbrica faltante deja `routeCode` vacío y no detiene la transacción.

<Note>
  La página **[Asientos contables](/es/products/midaz/accounting-entries)** documenta el modelo completo en detalle. Esto incluye las acciones de asiento contable, los requisitos de débito/crédito por tipo de operación, los modos de validación tolerante y estricto, y ejemplos de configuración. Esta sección cubre solo cómo se adjuntan las rúbricas a las Operation Routes.
</Note>

En el nivel de la ruta, proporcionas los asientos contables mediante el bloque `accountingEntries`. Consulta la **Opción C** en [Crea Operation Routes](#2-create-operation-routes) más arriba. Cada acción toma una entrada con una rúbrica de `debit`, una rúbrica de `credit`, o ambas, según el `operationType` de la ruta:

* Las rutas **source** requieren la rúbrica de **débito**.
* Las rutas **destination** requieren la rúbrica de **crédito**.
* Las rutas **bidirectional** requieren **ambas** rúbricas: de débito y de crédito.

##### Matriz de validación de asientos contables

No toda combinación de `operationType` y acción es válida. Midaz aplica una matriz de validación estricta cuando creas o actualizas una Operation Route. Si las reglas no coinciden, Midaz rechaza la solicitud antes de persistir la ruta.

Una combinación inválida devuelve el error `0166` (campo requerido) o `0162`/`0165` (escenario no permitido para esa dirección).

**source**

| Acción   | Débito      | Crédito     | Notas                                                        |
| :------- | :---------- | :---------- | :----------------------------------------------------------- |
| `direct` | Obligatorio | Opcional    | Transacción estándar de un paso en el origen                 |
| `hold`   | Obligatorio | Obligatorio | Reserva fondos: mueve disponible → on\_hold                  |
| `commit` | Obligatorio | Opcional    | Finaliza una transacción de dos fases                        |
| `cancel` | Obligatorio | Obligatorio | Libera fondos reservados: mueve on\_hold → disponible        |
| `revert` | —           | —           | No permitido (error `0165`). Usa `bidirectional` en su lugar |

**destination**

| Acción   | Débito   | Crédito     | Notas                                                        |
| :------- | :------- | :---------- | :----------------------------------------------------------- |
| `direct` | Opcional | Obligatorio | Transacción estándar de un paso en el destino                |
| `hold`   | —        | —           | No permitido (error `0162`)                                  |
| `commit` | Opcional | Obligatorio | Finaliza una transacción de dos fases                        |
| `cancel` | —        | —           | No permitido (error `0162`)                                  |
| `revert` | —        | —           | No permitido (error `0165`). Usa `bidirectional` en su lugar |

**bidirectional**

| Acción   | Débito      | Crédito     | Notas                             |
| :------- | :---------- | :---------- | :-------------------------------- |
| `direct` | Obligatorio | Obligatorio | Ambos lados de la partida doble   |
| `hold`   | Obligatorio | Obligatorio | Ambos lados de la partida doble   |
| `commit` | Obligatorio | Obligatorio | Ambos lados de la partida doble   |
| `cancel` | Obligatorio | Obligatorio | Ambos lados de la partida doble   |
| `revert` | Obligatorio | Obligatorio | Única dirección que admite revert |

<Danger>
  Si una entrada no tiene ni `debit` ni `credit`, Midaz la rechaza, sin importar el tipo de operación o la acción.
</Danger>

**Reglas adicionales:**

* **Atomicidad del grupo de reserva**: en las rutas `source` y `bidirectional`, si defines `hold`, también debes definir `commit` y `cancel` (y viceversa). En esas rutas, estas tres acciones forman un grupo atómico. No puedes configurar una sin las otras. En las rutas `destination`, `hold` y `cancel` no están permitidas (error `0162`), así que `commit` se puede configurar sin ellas. Aun así requiere `direct`, según la regla siguiente.
* **Direct es obligatoria**: si defines cualquier otra acción (`hold`, `commit`, `cancel`, `revert`, `overdraft`, `block`, `unblock`), también debes definir `direct`. Sirve como la entrada base de la ruta de operación.
* **`overdraft` requiere ambas rúbricas** en todo `operationType`, incluidos `source` y `destination`.
* **`block` y `unblock` reflejan `direct`**: débito en una ruta `source`, crédito en una ruta `destination`, ambas en `bidirectional`.
* Cualquier clave fuera de estas ocho se rechaza con el error `0053` (Unexpected Fields).

<Tip>
  Cuando diseñes tus rutas de operación, empieza con la acción `direct`. Agrega `hold`/`commit`/`cancel` solo si necesitas soporte de transacciones de dos fases. Agrega `revert` solo en rutas `bidirectional`.
</Tip>

### Operaciones continuas

#### 5. Ejecuta transacciones validadas

Con tu configuración de enrutamiento lista, ya puedes enviar transacciones. En la solicitud de transacción, **incluye el ID de la Accounting Route que creaste**. Midaz valida entonces la transacción contra tus patrones de enrutamiento.

Para la Accounting Route y las Operation Routes configuradas arriba, Midaz compone la siguiente estructura de validación:

<CodeGroup>
  ```bash text theme={null}
  Transaction Route: "Fee Transaction" (ID: 5656daa5-5b2a-4637-955f-e43bafceaf5d)

  ├── Operation Route 1: "User Cashout Fee" (ID: 0197e6aa-1695-734a-a8c3-8c79e0ad32c2)
  │   ├── Type: source
  │   ├── Account Rule: account_type ["user\_wallet", "asset"]
  │   └── Validates: source operations in transactions
  └── Operation Route 2: "Fee Revenue Collection" (ID: 0197e675-37cc-71d7-96c2-f58000f33aa0)
      ├── Type: destination
      ├── Account Rule: alias "@external/BRL"
      └── Validates: destination operations in transactions
  ```
</CodeGroup>

Para las propiedades de ruta en las transacciones de Midaz, una solicitud de payload adecuada:

<CodeGroup>
  ```json JSON expandable theme={null}
  {
      "routeId": "5656daa5-5b2a-4637-955f-e43bafceaf5d",
      "description": "Cashout fee collection transaction",
      "send": {
          "asset": "BRL",
          "value": "10",
          "source": {
              "from": [
                  {
                      "accountAlias": "@user/wallet_123",
                      "amount": {
                          "asset": "BRL",
                          "value": "10"
                      },
                      "description": "Fee debit from user wallet",
                      "routeId": "0197e6aa-1695-734a-a8c3-8c79e0ad32c2"
                  }
              ]
          },
          "distribute": {
              "to": [
                  {
                      "accountAlias": "@external/BRL",
                      "amount": {
                          "asset": "BRL",
                          "value": "10"
                      },
                      "description": "Fee credit to revenue account",
                      "routeId": "0197e675-37cc-71d7-96c2-f58000f33aa0"
                  }
              ]
          }
      }
  }
  ```
</CodeGroup>

Cuando envías esta transacción, Midaz valida dos cosas. La cuenta `@user/wallet_123` debe coincidir con la regla de tipo de cuenta `user_wallet`. La cuenta `@external/BRL` debe coincidir exactamente con el alias. Ambas verificaciones confirman que la transacción sigue tus patrones de enrutamiento.

##### Campos de ruta en las operaciones

Cuando habilitas la validación de rutas y configuras asientos contables, cada operación procesada incluye dos campos adicionales. Midaz completa estos campos a partir de la rúbrica coincidente:

* **routeCode**: el `code` de la `AccountingRubric` resuelta para la acción y la dirección de esa operación.
* **routeDescription**: la descripción de la rúbrica contable resuelta. Midaz la completa junto con `routeCode`.

Estos campos vinculan cada operación con su clasificación contable. Sistemas posteriores como [Reporter](/es/products/reporter/what-is-reporter) pueden entonces producir informes financieros precisos sin búsquedas adicionales.

## Gestionar las Operation Routes y las Accounting Routes

***

Para **configurar tus Operation Routes**, usa los siguientes endpoints:

* [Crear una Operation Route](/es/reference/products/midaz/v2/create-operation-route): define una nueva regla contable para tus operaciones.
* [Listar las Operation Routes](/es/reference/products/midaz/v2/list-operation-routes): consulta todas las Operation Routes configuradas.
* [Consultar una Operation Route](/es/reference/products/midaz/v2/get-operation-route-by-id): obtén información detallada de una Operation Route específica.
* [Actualizar una Operation Route](/es/reference/products/midaz/v2/update-operation-route): modifica reglas contables existentes.
* [Eliminar una Operation Route](/es/reference/products/midaz/v2/delete-operation-route): elimina una Operation Route obsoleta o sin uso.

Para **configurar tus Accounting Routes** (el recurso `transactionRoute` en la API), usa los siguientes endpoints:

* [Crear una Transaction Route](/es/reference/products/midaz/v2/create-transaction-route): define una nueva lógica de enrutamiento para conectar transacciones con operaciones contables.
* [Listar las Transaction Routes](/es/reference/products/midaz/v2/list-transaction-routes): consulta todas las Transaction Routes configuradas.
* [Consultar una Transaction Route](/es/reference/products/midaz/v2/get-transaction-route-by-id): obtén los detalles de una Transaction Route específica.
* [Actualizar una Transaction Route](/es/reference/products/midaz/v2/update-transaction-route): modifica los criterios de enrutamiento existentes.
* [Eliminar una Transaction Route](/es/reference/products/midaz/v2/delete-transaction-route): elimina rutas que ya no sean aplicables.
