Estructura de las respuestas
Toda petición devuelve el envoltorio JSON-RPC estándar (jsonrpc, id,
result) con estado HTTP 200. La forma de result no es uniforme:
cada endpoint tiene su propio formato de éxito, y las validaciones básicas
(credenciales, campos vacíos o con palabras no permitidas) devuelven
directamente el texto de la excepción en lugar de un objeto — ver guía
Autenticación.
/partner-info
Es el único endpoint que no usa el patrón status_code/novelty. Si el
tercero existe, result es directamente el objeto con sus datos:
{
"jsonrpc": "2.0",
"id": null,
"result": {
"partner_ref": "900123456",
"partner_name": "Proveedor de ejemplo S.A.S"
}
}
Si no existe, result es el texto de un error 404:
{
"jsonrpc": "2.0",
"id": null,
"result": "404 Not Found: partner 900123456 not found"
}
/supplier-create y /reserve
Estos sí siguen el patrón {status_code, novelty, ...}: aquí solo
existen los estados "00" (éxito) y "99" (rechazado), no existe un
estado intermedio de "éxito con novedad".
{
"jsonrpc": "2.0",
"id": null,
"result": {
"supplier_ref": "900123456",
"supplier_name": "Proveedor de ejemplo S.A.S",
"status_code": "00",
"novelty": {}
}
}
En /supplier-create, algunas validaciones son independientes entre sí y
pueden acumularse en un mismo novelty (por ejemplo, tercero ya
existente junto con ciudad no encontrada):
{
"jsonrpc": "2.0",
"id": null,
"result": {
"supplier_ref": "900123456",
"supplier_name": "Proveedor de ejemplo S.A.S",
"status_code": "99",
"novelty": {
"E04": "error on creation supplier 900123456 already on ERP",
"N05": "city code not found res.country.city()"
}
}
}
Nótese el texto de N05 en el ejemplo: por una particularidad del código,
al construir ese mensaje la variable ya fue reemplazada por el resultado
(vacío) de la búsqueda de la ciudad, así que el mensaje real no repite
el código de ciudad enviado — muestra la representación de un recordset
vacío en su lugar.
Códigos de novedad
Los códigos de novedad se agrupan por prefijo (fuente:
controllers/utils.py, NOVELTY_CODES):
| Código |
Descripción |
| N01 |
Solicitud de viaje (travel) no encontrada |
| N02 |
Concepto (travel.concept) no encontrado |
| N03 |
Tercero proveedor no encontrado (por VAT) |
| N04 |
Tercero pasajero no encontrado (por VAT) |
| N05 |
Código de ciudad DANE no encontrado |
| N06 |
Código de aeropuerto no encontrado |
| N07 |
Centro de costo/analítica no encontrado |
| V01 |
La solicitud de viaje no está disponible para procesar reservas |
| V02 |
El responsable del viaje (travel_user_ref) no coincide con el de la solicitud |
| V03 |
Tipo de reserva (reservation_type) no válido |
| V04 |
Código de moneda no válido (solo se admite COP) |
| V05 |
Tipo de alojamiento (accommodation_type) no válido |
| V06 |
Porcentaje de impuesto no válido (solo 0, 5 o 19) |
| C01 |
Más de una coincidencia para el criterio de búsqueda (código reservado en /reserve: para el campo travel la propia búsqueda de estado falla antes de llegar a reportarlo; solo es alcanzable para analytic_code) |
| E01 / E02 |
No se permiten valores negativos (impuesto / subtotal-total) |
| E03 |
El total no corresponde al subtotal más el impuesto indicado |
| E04 |
Se usa en dos sentidos distintos según el endpoint: en /supplier-create, bloquea la creación antes de intentarla (proveedor ya existente, o los 5 campos de datos vacíos a la vez); en /reserve y como fallback general, es el error genérico que envuelve cualquier excepción no controlada durante el proceso (incluidas las causadas por búsquedas sin límite de coincidencias, ver concept/supplier_ref/passenger_ref en /reserve) |
| E05 |
Nombre de línea de reserva repetido dentro de la misma petición |
| E06 |
El número de factura ya existe: en una reserva previa de cualquier viaje, o en una factura contable ya emitida para el viaje actual |
| E07 |
Error al procesar el archivo (XML/PDF) en base64 |
| P01 |
Código reservado, prácticamente inalcanzable: el chequeo que lo produce (/reserve) no verifica ningún campo real de la compañía, solo que exista el registro de compañía con id 1, lo cual es casi siempre cierto |