Skip to Content
v1.5Documentación oficial de la API LX CloudPos · estable en producción

FacturaApiLineaDto

Representa una línea de detalle del comprobante. Cada request debe incluir al menos una línea.

Campos

CampoTipoRequeridoDescripción
idProductonumberUno de los dosID del producto o servicio en el catálogo del tenant.
codigoProductostringUno de los dosCó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.
cantidadnumberSíCantidad mayor que 0. Soporta hasta 3 decimales.
precioUnitarionumberOpcionalPrecio unitario en la moneda del documento. Si se omite, se usa el del producto.
montoDescuentonumberOpcionalMonto de descuento en la moneda del documento. Default 0.
naturalezaDescuentostringOpcionalTexto descriptivo del descuento (aparece en el PDF).
montoExoneracionnumberIGNORADOSe acepta por compatibilidad pero el servidor nunca lo usa. Ver Reglas más abajo.
idExoneracionnumberOpcionalId 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 idProducto o codigoProducto. 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 (o 400 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.
  • montoDescuento se resta del subtotal de la línea (cantidad × precioUnitario).
  • montoExoneracion no hace nada. Es un campo heredado que el servidor acepta pero nunca lee. Enviarlo sin idExoneracion no exonera la línea — sale gravada con IVA completo, sin error ni aviso. Ver Exoneraciones.
  • idExoneracion es el mecanismo real de exoneración: solo aplica si pertenece a una exoneración vigente del cliente del documento. Ver Exoneraciones para los errores 400 que 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.

{ "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.