API REST para datos contables
Como todo documento de REDA Financials es un objeto personalizado de Salesforce, la API REST estándar es la puerta de entrada de tu integración: crea facturas desde tu CRM o sistema de facturación, consulta saldos hacia un data warehouse, contabiliza documentos desde middleware, todo con los endpoints que tu equipo ya conoce.
El patrón canónico: crear el borrador y luego contabilizar
Inserta el encabezado como Borrador
Envía un POST del documento (por ejemplo, refin__Sales_Invoice__c) con entidad, cliente, fechas — estado omitido (predetermina a Borrador) o explícitamente 'Draft'. Los triggers se comportan exactamente igual que en la interfaz: número de documento asignado desde la secuencia de la entidad, libro mayor y período derivados, fecha de vencimiento a partir de las condiciones de pago.
Inserta las líneas
Envía un POST de los registros de línea (refin__Sales_Invoice_Line__c) referenciando el encabezado — productos, cantidades, precios, perfiles fiscales, exactamente los campos que pide el formulario. (La API composite agrupa los pasos 1 y 2 en una sola llamada sin problema.)
Aplica un PATCH del estado a Contabilizado
Actualiza refin__Status__c a 'Posted'. Esta única actualización de campo es la acción de contabilización: el motor escribe los asientos del libro mayor, calcula el impuesto y la retención, sella los tipos de cambio — y aplica todos los controles (balanceado, período abierto, aprobación, cuentas activas). Una contabilización rechazada vuelve como un error DML estándar con el mismo mensaje textual que vería un usuario.
Los endpoints, de un vistazo
Nada de esto es específico de REDA: son los endpoints REST estándar de Salesforce, mostrados sobre los objetos refin__ (el paquete está construido en la API v65.0; funciona cualquier versión actual):
| Tarea | Método y endpoint |
|---|---|
| Crear el encabezado de un documento | POST /services/data/v65.0/sobjects/refin__Sales_Invoice__c |
| Leer un registro | GET /services/data/v65.0/sobjects/refin__Sales_Invoice__c/{id} |
| Actualizar (incluida la contabilización) | PATCH /services/data/v65.0/sobjects/refin__Sales_Invoice__c/{id} |
| Consultar | GET /services/data/v65.0/query?q=<SOQL> |
| Encabezado + líneas en un solo viaje | POST /services/data/v65.0/composite (o composite/tree) |
| Descubrir campos y listas de selección | GET /services/data/v65.0/sobjects/refin__Sales_Invoice__c/describe |
Contabilizar un borrador, en el cable
La llamada de contabilización es deliberadamente anticlimática — un solo campo:
PATCH /services/data/v65.0/sobjects/refin__Sales_Invoice__c/a0X8d000001AbCdEAV
{
"refin__Status__c": "Posted"
}
El éxito es un HTTP 204 No Content — y detrás, un documento completamente contabilizado. Un rechazo vuelve como el arreglo de errores estándar con el mensaje legible del paquete; por ejemplo, un usuario de integración sin puesto de licencia REDA ve:
[
{
"message": "Debe ser un usuario con licencia de REDA Financials para crear, editar o eliminar Transacciones contables. Contacte a su administrador.",
"errorCode": "FIELD_CUSTOM_VALIDATION_EXCEPTION",
"fields": []
}
]
Leer lo que acabas de crear es SOQL simple:
GET /services/data/v65.0/query
?q=SELECT Id, Name, refin__Status__c
FROM refin__Sales_Invoice__c
WHERE refin__Status__c = 'Draft'
Para el cuerpo de las inserciones en sí, obtén la lista de campos desde el endpoint describe o el Object Manager en lugar de este artículo — los conjuntos de campos y los campos obligatorios de tu org son la fuente de verdad, y los campos de dimensión adicionales que agregó tu administrador forman parte de ella.
Lo que la plataforma completa por ti
| Al… | Los triggers hacen… | Consecuencia para la integración |
|---|---|---|
| Insertar sin estado | El estado predetermina a 'Draft' | Puedes omitir refin__Status__c al crear |
| Insertar | Se asigna el número de documento desde la secuencia de la entidad (según el tipo — facturas y notas se numeran por separado); predefinir Name activa la numeración manual, con la unicidad validada en ambos casos | No generes tus propios números salvo que quieras hacerte cargo de ellos |
| Insertar | Se completan los valores predeterminados de la entidad: libro mayor, período contable, fecha de vencimiento a partir de la condición de pago del proveedor | Envía los campos de negocio; omite los que se pueden derivar |
| Cambiar la Entidad o el Tipo de factura en un Borrador | El documento vuelve a asignar su número | Espera un número nuevo si tu middleware "mueve" un borrador entre entidades |
| Pasar de Borrador a Contabilizado | El motor completo: asientos del libro mayor, cálculo de impuesto y retención, sellado del tipo de cambio, todos los controles | Contabilizar por API es, byte a byte, la misma contabilización que la interfaz |
Lectura de datos
- SOQL a través del endpoint de consulta — facturas abiertas, recibos sin aplicar, campos de antigüedad (son campos de fórmula en los registros), lo que tu panel necesite.
- El libro mayor en sí —
refin__Accounting_Transaction__ces la fuente de verdad de la contabilización; suma débitos y créditos por cuenta contable y habrás reconstruido cualquier saldo externamente. - Los acumulados son campos — el saldo pendiente de una factura, el importe sin aplicar de un recibo, la cifra comprometida de una línea de presupuesto: todo se puede consultar directamente, sin cálculos de tu parte.
Reglas del camino
- No existe atajo: los documentos contabilizados quedan bloqueados a ediciones por API exactamente igual que para los usuarios; las correcciones pasan por los flujos de descontabilización/anulación, programáticamente las mismas transiciones de estado.
- Las aplicaciones también son registros — crear un
refin__Cash_Receipt_Application__caplica un recibo (se ejecutan todos los controles de coincidencia); eliminarlo lo desaplica. - Respeta las fechas de cierre — las escrituras en libros cerrados son rechazadas; tu integración debe fechar los documentos en períodos abiertos, como cualquier contador.
- La idempotencia depende de ti — la clave natural es la referencia de tu sistema de origen (colócala en el campo Referencia y valida antes de insertar; la validación de referencia de proveedor duplicada ayuda del lado de cuentas por pagar).
Errores comunes que hay que evitar
| Error | Por qué perjudica | Haz esto en su lugar |
|---|---|---|
| Insertar documentos con Estado 'Posted' en una sola llamada | La contabilización está diseñada en torno a la transición Borrador → Contabilizado; una inserción directa como Contabilizado queda fuera del patrón admitido y su comportamiento no está garantizado | Inserta como Borrador y luego aplica un PATCH a Contabilizado — composite lo convierte en un solo viaje de todos modos |
| Generar tus propios números de documento sin cuidado | Predefinir Name cambia ese documento a numeración manual — ahora la unicidad es tu responsabilidad, por entidad | Deja que las secuencias numeren los documentos; reserva los números manuales para escenarios de migración deliberados |
| Ejecutar la integración con un inicio de sesión de administrador prestado | Las pistas de auditoría se difuminan, las rotaciones de contraseña rompen el feed, y los permisos son mucho más amplios que la tarea | Un usuario de integración dedicado con un puesto de licencia y el conjunto de permisos empaquetado más restringido que cumpla el trabajo |
| Reintentar contabilizaciones fallidas a ciegas | El mensaje te dijo por qué falló — un período cerrado hace que el reintento choque siempre contra la misma pared | Analiza el error, corrige los datos (o deriva a una persona) y luego reintenta |
| Omitir el campo Referencia | Pierdes tu clave de idempotencia y la mejor señal de coincidencia de la conciliación bancaria | Lleva siempre el identificador real del sistema de origen en Referencia |
Qué sigue
- Bulk API (importación y exportación de datos) — el mismo patrón a escala de migración.
- Descripción general de la API — el panorama completo.
- Saldos de apertura y migración de datos — el proyecto clásico de REST/Bulk.
Preguntas frecuentes
Usa el proceso de dos pasos (insertar como Borrador y luego actualizar a Contabilizado): es el patrón sobre el que está construido el motor, te da un límite de error claro entre "datos incorrectos" y "contabilización rechazada", y refleja el guardar-y-luego-contabilizar de la interfaz. De todos modos, las llamadas composite lo convierten en un solo viaje de ida y vuelta.
Son errores DML estándar que llevan los mensajes de validación del paquete tal cual ("Transaction Date ... is on or before the GL book closure date...", "This document requires approval before posting."). Regístralos, muéstralos, corrige los datos — los mensajes están escritos para personas.
El paquete apunta a la API v65 o superior; usa una versión actual y los objetos refin__ se comportan como cualquier objeto personalizado en esa versión.
Sí, si crea o contabiliza documentos contables — la verificación de licencia se ejecuta en las escrituras de la API exactamente igual que en la interfaz, y un usuario sin puesto es rechazado con el mismo mensaje textual mostrado arriba. Asigna al usuario de integración un puesto y el conjunto de permisos adecuado, igual que a una persona.
No — el paquete no incluye ningún recurso REST personalizado, por diseño. Los endpoints estándar de sObject, query y composite sobre los objetos refin__ son toda la superficie REST, lo que significa que cualquier cliente REST de Salesforce, herramienta ETL o conector de middleware ya sabe hablarla.
¿Te resultó útil?