POST
/api/mod/productos/{espacio}/inventory/saleConfirma una venta
Descuenta del stock lo vendido, todo de una vez. Con sale_ref, repetirla no descuenta dos veces. Si declaras las promociones usadas, cuentan para sus límites.
- PERMISOescribe
- CRÉDITOSno gasta
- AUTENTICACIÓNBearer bth_…
PARÁMETROS
| CAMPO | TIPO | REQUERIDO | QUÉ ES |
|---|---|---|---|
| espacio | string | SÍ | El id del espacio (sale en GET /api/companies). Tiene que tener el módulo Productos. |
CUERPO · JSON
| CAMPO | TIPO | REQUERIDO | QUÉ ES |
|---|---|---|---|
| lines | array | SÍ | Una por producto vendido: ver lines[]. |
| sale_ref | string | no | Tu id del pedido. Con él, un reintento devuelve el resultado guardado. |
| promociones_aplicadas | [{ promotion_id, descuento }] | no | Las promociones de la cotización y lo que descontó cada una: suman un uso y gastan de su campaña. |
| session_id | string | no | Tu referencia del carrito. |
| push_contable | boolean | no | Enviar el descuento a tu software contable, en las variantes con external_id. Por defecto true. |
RESPUESTA 200
| CAMPO | TIPO | QUÉ ES |
|---|---|---|
| status | "ok" | "pending" | pending: la misma venta se está procesando ahora. |
| confirmados[] | { variant_id, bodega, cantidad, restante, external_id } | Lo descontado y cuánto quedó. Un combo sale como sus componentes. |
| no_encontrados[] | { variant_id, sku?, motivo? } | Líneas sin descontar: la variante no existe o no tiene stock cargado, o motivo: "cantidad_invalida". |
| contable | object | null | Lo que respondió tu software contable al enviarle el descuento. null si no había nada que enviar. |
| idempotent_replay | true | Solo en un reintento con el mismo sale_ref: es el resultado guardado. |
LINES[]
| CAMPO | TIPO | QUÉ ES |
|---|---|---|
| variant_id · sku | string | La variante, por id o por SKU. |
| cantidad | number | string | Cuántas. Por defecto 1. |
| bodega | string | Por defecto, la única. |
| reservation_id | string | La reserva que esta línea consume, si la hiciste. |
ERRORES DE ESTA RUTA · SIEMPRE {"detail": …}
| STATUS | CUÁNDO | DETAIL LITERAL |
|---|---|---|
| 403 | El espacio no tiene el módulo Productos | módulo no habilitado para este espacio. |
| 403 | La clave es de solo lectura | Tu cuenta es de solo lectura en este espacio. |
| 422 | Falta un campo obligatorio o uno no es de su tipo (detail es una lista) | — |
Y los de cualquier ruta —clave inválida, cuenta no al día, IP, límites—, en Errores, límites y créditos.
CONVIENE SABER
- No comprueba que haya stock: descuenta lo vendido y deja las existencias en 0 como mínimo. Comprueba antes con disponibilidad o reserva.
- Un fallo de tu software contable no hace fallar la venta: queda en
contable. - Las promociones solo cuentan usos aquí, no al cotizar. Sin
promociones_aplicadas,limite_usosy las campañas no avanzan. - Las cantidades y los importes viajan como texto decimal (
"32000","1.5") para no perder precisión. Al mandarlos vale un número o un texto.