FacturaApiLineaDto
Representa una línea de detalle del comprobante. Cada request debe incluir al menos una línea.
Campos
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
idProducto | number | Uno de los dos | ID del producto o servicio en el catálogo del tenant. |
codigoProducto | string | Uno de los dos | Código (SKU) del producto en el catálogo del tenant. Se utiliza cuando el sistema del integrador conoce su propio código y no los identificadores internos de LX CloudPos. |
cantidad | number | Sí | Cantidad mayor que 0. Soporta hasta 3 decimales. |
precioUnitario | number | Opcional | Precio unitario en la moneda del documento. Si se omite, se usa el del producto. |
montoDescuento | number | Opcional | Monto de descuento en la moneda del documento. Default 0. |
naturalezaDescuento | string | Opcional | Texto descriptivo del descuento (aparece en el PDF). |
montoExoneracion | number | IGNORADO | Se acepta por compatibilidad pero el servidor nunca lo usa. Ver Reglas más abajo. |
idExoneracion | number | Opcional | Id de una exoneración registrada para el cliente del documento. Es el único mecanismo real para exonerar una línea — ver Exoneraciones. |
interface FacturaApiLineaDto {
/** ID del producto/servicio en el catálogo del tenant. Alternativa: codigoProducto.
Debe venir uno de los dos. */
idProducto?: number;
/** Código (SKU) del producto en el catálogo del tenant. Se usa cuando no mandás
idProducto: tu sistema conoce su propio código, no nuestros ids. */
codigoProducto?: string | null;
/** OBLIGATORIO. Cantidad > 0. Soporta hasta 3 decimales. */
cantidad: number;
/** Opcional. Precio unitario en moneda del documento. Si se omite, usa el del producto. */
precioUnitario?: number | null;
/** Monto de descuento en moneda del documento. Default 0. */
montoDescuento: number;
/** Texto descriptivo del descuento (visible en PDF). */
naturalezaDescuento?: string | null;
/**
* IGNORADO. El monto exonerado no es un dato que se captura: lo calcula el servidor a
* partir de idExoneracion y la tarifa de IVA real del producto (tope incluido). Se
* mantiene en el contrato para no romper a los integradores que ya lo mandan, pero su
* valor nunca se usa — antes de idExoneracion este campo era la única forma de
* "exonerar" y era puramente decorativo: el comprobante salía con IVA completo sin
* error ni aviso.
*/
montoExoneracion?: number | null;
/**
* Id de una exoneración registrada para el cliente del documento (alta desde el POS;
* se consulta con GET /clientes/{identificacion}, campo `exoneraciones`). Declarativo:
* se manda SOLO el id, nunca un monto — el servidor la busca entre las exoneraciones
* del cliente, valida que esté vigente (activa y no vencida) y calcula el monto real
* topando contra la tarifa de IVA del producto. Si el id no pertenece al cliente del
* documento, o está vencido/inactivo, la emisión falla con 400 en vez de facturar con
* IVA completo en silencio.
*/
idExoneracion?: number | null;
}Reglas
- Cada línea debe traer
idProductoocodigoProducto. Si no viene ninguno,400. - El producto debe existir en el catálogo del tenant. En caso contrario se devuelve
400 Producto X no encontrado(o400 Producto con código 'X' no encontrado). Todavía no es posible facturar una línea libre que no esté en el catálogo — la funcionalidad se encuentra en el roadmap. - El IVA se aplica automáticamente según la configuración del producto.
montoDescuentose resta del subtotal de la línea (cantidad × precioUnitario).montoExoneracionno hace nada. Es un campo heredado que el servidor acepta pero nunca lee. Enviarlo sinidExoneracionno exonera la línea — sale gravada con IVA completo, sin error ni aviso. Ver Exoneraciones.idExoneraciones el mecanismo real de exoneración: solo aplica si pertenece a una exoneración vigente del cliente del documento. Ver Exoneraciones para los errores400que puede devolver (id ajeno, vencido, inactivo, o sin cliente en el documento).
Ejemplos
Línea simple
{ "idProducto": 100, "cantidad": 2 }Utiliza el precio del producto registrado en el catálogo, sin descuento y sin exoneración.
Línea por código de catálogo
{ "codigoProducto": "WM-0001", "cantidad": 2 }Equivalente a la anterior, resolviendo el producto por su SKU en vez de por el id interno.
Línea con precio override
{ "idProducto": 100, "cantidad": 2, "precioUnitario": 1500.00 }Fuerza un precio unitario de 1500 (útil cuando el producto tiene precio variable, como los servicios profesionales).
Línea con descuento
{
"idProducto": 100,
"cantidad": 5,
"montoDescuento": 1000.00,
"naturalezaDescuento": "Descuento por volumen >= 5 unidades"
}Línea con exoneración
{ "idProducto": 101, "cantidad": 1, "idExoneracion": 7 }El 7 viene del arreglo exoneraciones que devuelve GET /clientes/{identificacion} para el cliente del documento. El servidor calcula el monto exonerado — no se manda ningún monto en la línea.