Ventas BETA
Endpoints para crear ventas y facturar desde un sistema externo.
Estos endpoints están disponibles para uso anticipado pero pueden cambiar de contrato, comportamiento o ser retirados antes de su release definitivo. No los comprometas en producción sin confirmar disponibilidad.
Venta directa
Permite crear una FACTURA_VENTA en forma directa, sin pasar antes por preventa.
/integraciones/terceros/ventaRequest
export interface VentaTerceros extends PedidoTerceros {
medioPago: MedioPagoTerceros;
puntoVentaId?: number; // si no viene o es 0, usa el configurado en el canal
}
export interface PedidoTerceros {
ordenId: number;
numero: number;
detalle?: string;
listaPrecioId?: number; // si no viene o es 0, usa la configurada en el canal
direccionEnvio?: DireccionTerceros;
direccionFacturacion?: DireccionTerceros;
usuario: UsuarioTerceros;
productos: ArticuloExterno[];
subtotal: number;
descuento: number;
recargo: number;
envio: number;
total: number;
}
export interface MedioPagoTerceros {
tipo: TipoMedio;
cuentaBancariaId?: number; // requerido si tipo = DEPOSITO_BANCO
tarjetaId?: number; // requerido si tipo = TARJETA
externalId?: string; // requerido si tipo = VIRTUAL
}
Tipos de medio de pago
export enum TipoMedio {
EFECTIVO = 1,
TARJETA = 5,
CUENTA_CORRIENTE = 6,
DEPOSITO_BANCO = 9,
VIRTUAL = 11,
}
ventaAunque el DTO admite varios tipos, hoy POST /venta aplica el medio con el helper interno
de integraciones, que solo soporta EFECTIVO, DEPOSITO_BANCO y VIRTUAL. Si se envía
otro tipo, la operación puede fallar con "El medio de pago no es compatible".
Respuesta
ajFacturaResult
Validaciones
| Regla | Error |
|---|---|
| Body inválido o sin productos | "Los datos de venta son invalidos" |
medioPago ausente | "El medio de pago es requerido" |
Request duplicada dentro de 30 segundos para el mismo ordenId | "La solicitud ya se esta procesando" |
| Medio de pago no soportado por el helper | "El medio de pago no es compatible" |
Notas operativas
- si
puntoVentaIdno viene o es0, toma el configurado en la app/canal - si
listaPrecioIdno viene o es0, toma la configurada en la app/canal - usa una ventana anti-duplicados de 30 segundos por
ordenId - internamente asigna
numero = ordenId
Ejemplo
curl --request POST \
--url https://api.test-ninox.com.ar/integraciones/terceros/venta \
--header 'X-NX-TOKEN: {TU_TOKEN}' \
--header 'Content-Type: application/json' \
--data '{
"ordenId": 12345,
"numero": 12345,
"detalle": "Venta directa desde sistema externo",
"puntoVentaId": 1,
"listaPrecioId": 3,
"usuario": {
"nombre": "Juan Perez",
"email": "juan@example.com",
"dni": "12345678",
"telefono": "1122334455",
"condicion": 1
},
"productos": [
{ "articuloId": 100, "precio": 1500.5, "cantidad": 2 }
],
"subtotal": 3001,
"descuento": 0,
"recargo": 0,
"envio": 500,
"total": 3501,
"medioPago": { "tipo": 1 }
}'
Facturar preventa
Convierte una preventa existente en FACTURA_VENTA.
/integraciones/terceros/facturarRequest
export interface FacturarTerceros {
facturaId: number; // id de la preventa existente
puntoVentaId: number;
electronica: boolean;
medioPago: MedioPagoTerceros;
}
Respuesta
ajFacturaResult
Validaciones
| Regla | Error |
|---|---|
Body inválido o facturaId <= 0 | "El facturaId es requerido" |
medioPago ausente | "El medio de pago es requerido" |
puntoVentaId <= 0 | "El puntoVentaId es requerido" |
Request duplicada dentro de 30 segundos para la misma facturaId | "La solicitud ya se esta procesando" |
Notas operativas
- requiere que la preventa exista y esté en estado
PENDIENTE - si
electronica = true, intenta generar factura electrónica AFIP - usa una ventana anti-duplicados de 30 segundos por
facturaId - a diferencia de
venta, la facturación de preventa soporta el flujo completo de medios (EFECTIVO,TARJETA,CUENTA_CORRIENTE,DEPOSITO_BANCO,VIRTUAL)
Ejemplo
curl --request POST \
--url https://api.test-ninox.com.ar/integraciones/terceros/facturar \
--header 'X-NX-TOKEN: {TU_TOKEN}' \
--header 'Content-Type: application/json' \
--data '{
"facturaId": 456,
"puntoVentaId": 1,
"electronica": false,
"medioPago": { "tipo": 9, "cuentaBancariaId": 12 }
}'
Medios de pago
Devuelve la configuración de medios habilitados y los catálogos necesarios para obtener ids
válidos antes de llamar a venta o facturar.
/integraciones/terceros/medios-pagoRespuesta
export interface MediosPagoConfigDTO {
medios: WMedios;
tarjetas: TarjetaDTO[];
tarjetasReglas: TarjetaReglaDTO[];
cuentasBancarias: CuentaBancariaDTO[];
bancos: BancoDTO[];
tarjetaCreditoReglas: boolean;
botonesRapidos: BotonRapidoConfig[];
recargoDigitalHabilitado: boolean;
facturaElectronicaAutomatica: boolean;
recargosTipoMedio: RecargoTipoMedioConfig[];
}
export interface WMedios {
efectivo: boolean;
cuentaCorriente: boolean;
tarjeta: boolean;
cheque: boolean;
tarjetaPropia: boolean;
chequePropio: boolean;
chequeCartera: boolean;
deposito: boolean;
extraccion: boolean;
transferencia: boolean;
virtual: boolean;
}
export interface CuentaBancariaDTO {
cuentaBancariaId: number;
descripcion: string;
bancoId?: number;
alias?: string;
cbu?: string;
}
Uso recomendado
- consultar este endpoint antes de operar con
DEPOSITO_BANCOoTARJETA - tomar
tarjetas[].tarjetaIdpara pagos con tarjeta - tomar
cuentasBancarias[].cuentaBancariaIdpara pagos por depósito o transferencia - usar
medioscomo capacidad disponible del tenant antes de construir el payload
Ejemplo
curl --request GET \
--url https://api.test-ninox.com.ar/integraciones/terceros/medios-pago \
--header 'X-NX-TOKEN: {TU_TOKEN}' \
--header 'Content-Type: application/json'
Flujos recomendados
Venta directa
- Consultar
/medios-pagopara validar el tipo disponible y obtener ids de tarjetas o cuentas bancarias si hacen falta. - Construir el payload de
ventacon cliente, productos, totales ymedioPago. - Enviar a
/venta. - Verificar
ajFacturaResulty registrarfacturaId,numero,pvNumeroy errores.
Facturación de preventa
- Tomar el
facturaIdde la preventa existente. - Consultar
/medios-pagosi el medio requiere ids auxiliares. - Enviar a
/facturar. - Verificar
ajFacturaResulty el estado final de la factura.