Saltar al contenido principal
Un asiento intercompañía (Intercompany Entry) es una operación entre dos Entidades de la misma Organización, como un préstamo de una empresa del grupo a otra. La operación registra un asiento contable (Ledger Entry) cuadrado en cada Entidad, ambos con la misma fecha y la misma glosa. Además guarda Pares (Pairs). Cada Par une una línea del primer asiento con una línea del segundo: las dos mitades de una misma posición, como la cuenta por cobrar del prestamista y la cuenta por pagar del deudor. Una vista consolidada elimina las líneas pareadas. El asiento intercompañía cambia solo como un todo. Lo creas, lo lees y lo anulas. Nada lo edita en su lugar, y sus dos asientos contables rechazan las ediciones normales de un asiento. Para corregir un error, anúlalo y créalo de nuevo. Las rutas viven bajo la Organización, no bajo una Entidad:
No existe PATCH ni PUT sobre un asiento intercompañía, ni subrutas /reverse o /unbook. Esas solicitudes devuelven 404. DELETE es el Unbook. No es un borrado definitivo: el asiento intercompañía y sus asientos contables siguen siendo legibles, y su historial se conserva.
Todos los montos son enteros en la unidad mínima de la moneda (por ejemplo, centavos). Las fechas son cadenas YYYY-MM-DD. Las marcas de tiempo son fechas y horas ISO 8601.
Open in the app. This resource has a page in the Sintropix web app at https://app.sintropix.com/organizations/{organizationId}/intercompany-entries/{intercompanyEntryId}, where each id in braces is the same UUID as in the API route or response. La lista está en /organizations/{organizationId}/intercompany-entries, bajo Intercompañía en la barra lateral de Grupo. En la app, el Unbook es la acción Eliminar operación. When you mention a record to a user, include that link. See Link to the App for the full URL grammar.

Acceso

Un asiento intercompañía contiene los libros de dos Entidades, así que cada ruta pide acceso a la Organización completa:
  • Usa una clave de API de nivel Organización. Crea la clave con Todas las empresas en el selector Empresa (consulta Obtén una clave de API). Una clave acotada a una sola Entidad recibe 403 con PERMISSION_DENIED_ERROR en todas las rutas de esta página, también al leer.
  • Escribir requiere un Rol que escriba. POST y DELETE necesitan el Rol staff o client. Un viewer puede listar y leer, y recibe 403 con PERMISSION_DENIED_ERROR al escribir. Consulta Acceso y roles.
  • Envía los encabezados de auditoría al escribir. Con una clave de API, POST y DELETE necesitan x-audit-actor y x-audit-reason, como toda mutación. Consulta Autenticación.
Un asiento intercompañía que la Organización no tiene, incluido uno de otra Organización, devuelve 404 con INTERCOMPANY_ENTRY_NOT_FOUND_ERROR.

El objeto asiento intercompañía

El asiento intercompañía no tiene fecha propia. La lista y el detalle agregan entryDate, la fecha que llevan sus dos asientos contables.

GET /api/organizations/:organizationId/intercompany-entries

Lista los asientos intercompañía de la Organización en páginas por cursor (keyset), con el entryDate más reciente primero. La lista incluye los anulados, con status en deleted.
  • Parámetro de ruta: organizationId (UUID)
  • Parámetros de consulta:
No se acepta ningún otro parámetro de consulta. Uno desconocido devuelve 400.
  • Respuesta exitosa: una página de asientos intercompañía
  • Estado: 200
Cada elemento de intercompanyEntries es el objeto asiento intercompañía más:

GET /api/organizations/:organizationId/intercompany-entries/:intercompanyEntryId

Lee un asiento intercompañía con sus dos asientos contables, sus líneas y sus Pares. Uno anulado sigue siendo legible.
  • Parámetros de ruta: organizationId (UUID), intercompanyEntryId (UUID)
  • Respuesta exitosa: el detalle del asiento intercompañía
  • Estado: 200
El detalle es el objeto asiento intercompañía más: Cada elemento de ledgerEntries: Una línea que está en un Par lleva el id del Par en intercompanyPairId. Una línea sin Par lleva null. Cada elemento de pairs:
La respuesta tiene la misma forma que la respuesta de creación.

POST /api/organizations/:organizationId/intercompany-entries

Crea un asiento intercompañía. En una sola transacción, Sintropix registra un asiento contable en cada una de las dos Entidades, los vincula al asiento intercompañía y guarda los Pares. Si falla cualquier validación, no se escribe nada.
  • Parámetro de ruta: organizationId (UUID)
  • Cuerpo:
Cada elemento de newLedgerEntries: Cada línea tiene los campos de una línea de POST /api/entities/:entityId/ledger/entries: id, accountId, functionalAmount, side y, de forma opcional, partnerId, el trío de transacción (transactionCurrency, transactionAmount, transactionFxRate) y dimensionValueIds. Cada id de línea debe ser nuevo y único entre ambos asientos. Cada elemento de newIntercompanyPairs: Los Pares siguen estas reglas:
  • Un Par por línea. Una línea está en un Par como máximo. Una línea sin Par es una línea normal de su asiento, como el lado del banco en un préstamo.
  • Lados opuestos. Un Par es un debe en una Entidad y un haber en la otra, para que la eliminación lo cancele. Si no: 422 con INTERCOMPANY_PAIR_SAME_SIDE_ERROR.
  • Mismo monto. Ambas líneas llevan la misma moneda y el mismo monto. Una línea en moneda extranjera lo lleva en su trío de transacción. Cualquier otra lo lleva en su functionalAmount, en la moneda funcional de su Entidad. Si no: 422 con INTERCOMPANY_PAIR_AMOUNTS_DIFFER_ERROR.
  • Una moneda por asiento intercompañía. Su moneda es la de su primer Par. Un Par en otra moneda devuelve 422 con INTERCOMPANY_PAIR_CURRENCY_DIFFERS_ERROR.
  • Un tipo de cambio por Entidad. Cuando una Entidad recibe la moneda del asiento intercompañía como moneda extranjera, sus líneas pareadas llevan un solo tipo de cambio. "0.9" y "0.90" cuentan como el mismo. Si no: 422 con INTERCOMPANY_PAIR_RATES_DIFFER_ERROR, que nombra la Entidad.
  • Sin Partner en una línea pareada. Omite partnerId o envíalo en null. Sintropix lo fija en el Partner que representa a la otra Entidad.
Cada asiento contable además pasa todas las validaciones de un asiento normal, incluida la Fecha de bloqueo.
  • Respuesta exitosa: el detalle del asiento intercompañía, con la misma forma que la lectura
  • Estado: 201
Holding le presta 5.000.000 CLP a Operaciones. Ambas Entidades llevan sus libros en CLP, así que cada línea pareada lleva el monto en functionalAmount:
El Par une la cuenta por cobrar de Holding (debe) con la cuenta por pagar de Operaciones (haber). Las dos líneas de banco quedan sin Par.
Un asiento intercompañía con fecha igual o anterior a la Fecha de bloqueo de cualquiera de las dos Entidades se rechaza y no se escribe nada:

DELETE /api/organizations/:organizationId/intercompany-entries/:intercompanyEntryId

Hace el Unbook (anulación) del asiento intercompañía. En una sola transacción, Sintropix anula ambos asientos contables y deja el status del asiento intercompañía en deleted. Cada asiento se anula igual que lo hace DELETE /api/entities/:entityId/ledger/entries/:entryId con un asiento. Se anulan ambos asientos o ninguno. No es un borrado definitivo. El asiento intercompañía, sus dos asientos contables, sus líneas y los Pares siguen siendo legibles, con status en deleted. Su historial se mantiene en el registro de auditoría.
  • Parámetros de ruta: organizationId (UUID), intercompanyEntryId (UUID)
  • Respuesta exitosa: cada fila que cambió el Unbook
  • Estado: 200
Como un Unbook normal, también corta las Asignaciones y las conciliaciones bancarias (Matches) que saldan las líneas de los asientos. El Unbook se rechaza cuando:
  • Cualquiera de los asientos tiene fecha igual o anterior a la Fecha de bloqueo de su Entidad. La solicitud devuelve 409 con LEDGER_ENTRY_UNBOOK_FROZEN_ERROR. params nombra el asiento, su fecha y la Fecha de bloqueo de su Entidad. El asiento intercompañía y ambos asientos siguen en active.
  • El asiento intercompañía ya está anulado. La solicitud devuelve 409 con INTERCOMPANY_ENTRY_NOT_ACTIVE_ERROR.
Un Unbook rechazado, porque el asiento de Holding cae en su período bloqueado:

Corregir un asiento intercompañía

No puedes editar un asiento intercompañía ni ninguno de sus dos asientos contables. Para cambiar su fecha, glosa, montos, cuentas, Entidades o Pares, anúlalo y créalo de nuevo:
1

Lee el asiento intercompañía

GET /api/organizations/:organizationId/intercompany-entries/:intercompanyEntryId devuelve lo que necesitas para rehacerlo: la fecha, la glosa, ambos asientos con sus líneas y los Pares.
2

Guarda las Asignaciones de sus asientos

El Unbook elimina las Asignaciones que saldan las líneas del asiento intercompañía. Para conservarlas, léelas antes con GET /api/entities/:entityId/ledger/allocations?entryId=:entryId para cada asiento. Esta lectura solo acepta un asiento vigente, así que hazla antes del Unbook.
3

Anúlalo con DELETE

DELETE /api/organizations/:organizationId/intercompany-entries/:intercompanyEntryId anula ambos asientos en una sola transacción. No es un borrado definitivo. El asiento intercompañía y sus asientos siguen siendo legibles con status en deleted, y el registro de auditoría conserva su historial.
4

Crea el asiento corregido con POST

Envía POST /api/organizations/:organizationId/intercompany-entries con el cuerpo corregido. Usa ids nuevos para el asiento intercompañía, para ambos asientos y para cada línea. El asiento anulado conserva sus ids, así que reutilizar su id devuelve 409 con INTERCOMPANY_ENTRY_ALREADY_EXISTS_ERROR, reutilizar el id de un asiento devuelve 409 con LEDGER_ENTRY_ALREADY_EXISTS_ERROR, y reutilizar un id de línea devuelve 409 con LEDGER_ENTRY_LINE_ALREADY_EXISTS_ERROR.Las líneas nuevas no heredan los valores de Dimensión de las líneas antiguas. Para conservar las etiquetas de una línea, envía el dimensionValueId de cada elemento de su lineDimensionValues en el dimensionValueIds de la línea nueva. Una línea enviada sin dimensionValueIds se crea sin etiquetas.
5

Restaura las Asignaciones

Por cada Asignación guardada, envía POST /api/entities/:entityId/ledger/allocations con un id nuevo, la línea nueva en lugar de la antigua, la misma otra línea y el mismo amount. Si la corrección cambió un monto y una Asignación ya no cabe en el monto abierto de la línea, la solicitud devuelve 409 con RECONCILIATION_ALLOCATION_AMOUNT_EXCEEDS_OPEN_AMOUNT_ERROR.
Si cualquiera de los asientos tiene fecha igual o anterior a la Fecha de bloqueo de su Entidad, el Unbook devuelve 409 con LEDGER_ENTRY_UNBOOK_FROZEN_ERROR y no puedes corregirlo así. Registra un asiento intercompañía de ajuste con fecha en un período abierto, o pide a quien administra los libros que mueva la Fecha de bloqueo. Estas solicitudes no existen y devuelven 404:
  • PATCH o PUT /api/organizations/:organizationId/intercompany-entries/:intercompanyEntryId
  • POST /api/organizations/:organizationId/intercompany-entries/:intercompanyEntryId/reverse
  • POST /api/organizations/:organizationId/intercompany-entries/:intercompanyEntryId/unbook
Las rutas de asientos contables rechazan editar, anular, reversar, reclasificar o cambiar el Partner de un asiento de un asiento intercompañía por sí solo. Devuelven 409 con LEDGER_ENTRY_IN_INTERCOMPANY_ENTRY_ERROR, y params.intercompanyEntryId nombra el asiento intercompañía que debes anular. Todavía puedes etiquetar sus líneas con valores de Dimensión sin tocar el asiento intercompañía.

Encontrar el asiento intercompañía de un asiento contable

Un asiento contable que pertenece a un asiento intercompañía lo indica dondequiera que lo encuentres:

Historial

Cada creación y cada Unbook quedan en el registro de auditoría. Lee el historial de un asiento intercompañía a través de cualquiera de sus dos Entidades:
Sus cambios también aparecen en el Log de la Organización. El historial propio de cada asiento contable está bajo tableName=ledger_entry y el id del asiento.

Códigos de error de dominio

Al crear, cada asiento contable también puede devolver cualquier error de asiento contable de una creación normal, como LEDGER_ACCOUNT_NOT_FOUND_ERROR.

Códigos de estado