Esquema de datos
Esta página resume los contratos principales de la integración pública de terceros.
Lectura de artículos
TipoTalleColor
export enum TipoTalleColor {
NINGUNO = 0,
TALLES = 1,
COLORES = 2,
TALLES_COLORES = 3
}
Articulo
Modelo agrupado por artículo.
export interface Articulo {
articuloId: number;
codigo: string;
descripcion: string;
descripcionWeb: string;
nombre: string;
talleColor: TipoTalleColor;
precio1: number;
precio2: number;
precio3: number;
precio4: number;
precio5: number;
stockTotal: number;
curva: ArticuloCurva[];
tags: ArticuloTag[];
}
ArticuloCurva
Stock por combinación de talle y color.
export interface ArticuloCurva {
articuloId: number;
colorId?: number;
talleId?: number;
colorNombre: string;
colorCodigo: string;
talleNombre: string;
talleCodigo: string;
unidades: number;
// solo en multidepósito informativo — ver Webhooks
stockDepositos?: StockDeposito[];
}
ArticuloConCurva
Modelo plano, útil para sincronización y procesamiento masivo.
export interface ArticuloConCurva {
articuloId: number;
codigo: string;
descripcion: string;
descripcionWeb: string;
nombre: string;
talleColor: TipoTalleColor;
precio1: number;
precio2: number;
precio3: number;
precio4: number;
precio5: number;
colorId?: number;
talleId?: number;
colorNombre: string;
colorCodigo: string;
colorHex: string;
talleNombre: string;
talleCodigo: string;
unidades: number;
// solo en multidepósito informativo — ver Webhooks
stockDepositos?: StockDeposito[];
etiquetasIds: string;
etiquetasNombres: string;
categoriasIds: string;
categoriasNombres: string;
eliminado: boolean;
}
StockDeposito
Stock desglosado por depósito. Solo viaja si la integración está en modo multidepósito informativo; ver Webhooks.
export interface StockDeposito {
depositoId: number;
unidades: number;
}
Cuando este campo viene, unidades es el stock del depósito principal, no la suma del array.
Para nuevas integraciones suele ser más simple comenzar con ArticuloConCurva, porque cada
variante queda representada como un registro independiente.
Etiquetas y categorías
TipoTag
export enum TipoTag {
TODAS = -1,
TAG = 0,
CATEGORIA,
MARCA,
TEMPORADA
}
ArticuloTag
export interface ArticuloTag {
articuloId: number;
articuloTagId: number;
tipo: TipoTag;
tagId: number;
tagNombre: string;
padreId?: number;
destacada: boolean;
}
En NinoxNet, categorías y etiquetas forman parte del mismo sistema de tags. La distinción se
hace mediante el campo tipo.
Pedidos
CondicionIva
enum CondicionIva {
SIN_CATEGORIA = 0,
CONSUMIDOR_FINAL = 1,
RESPONSABLE_INSCRIPTO = 2,
MONOTRIBUTO = 3,
EXENTO = 4,
RESPONSABLE_NO_INSCRIPTO = 5,
}
PedidoTerceros
export interface PedidoTerceros {
ordenId: number;
numero: number;
detalle: string;
direccionEnvio: DireccionTerceros;
direccionFacturacion: DireccionTerceros;
productos: ArticuloTerceros[];
// Requerido salvo que mandes entidadId: identifica o crea al cliente
// (dni → cuit → email → alta automática).
usuario?: UsuarioTerceros;
subtotal: number;
descuento: number;
envio: number;
recargo: number;
total: number;
// Vendedor del comprobante: el id de un empleado, obtenido de GET /empleados.
// Opcional. Pisa al vendedor por defecto de la integración.
empleadoId?: number;
// Cliente explícito: el id de una entidad ya existente en NinoxNet, obtenido
// de GET /entidades. Opcional. Si lo mandás, se usa esa entidad directo y
// NO se busca por documento/cuit/email ni se crea un cliente nuevo — usuario
// pasa a ser opcional. Debe ser un cliente activo; un id inválido responde 403.
entidadId?: number;
}
Tenés que mandar entidadId o usuario con al menos uno de dni, cuit o email. Sin
ninguno de los dos, la API responde 400.
DireccionTerceros
export interface DireccionTerceros {
provincia: string;
localidad: string;
direccion: string;
codigoPostal: string;
}
UsuarioTerceros
export interface UsuarioTerceros {
nombre: string;
email: string;
dni: string;
cuit: string;
telefono: string;
condicion: CondicionIva;
}
ArticuloTerceros
export interface ArticuloTerceros {
articuloId: number;
precio: number;
talleId?: number;
colorId?: number;
cantidad: number;
}
Un pedido enviado por integración queda siempre dentro de la configuración del token asociado. Hoy cada app trabaja con un solo depósito y un solo punto de venta.
Respuestas
PedidoResultado
export interface PedidoResultado {
facturaId: number;
numero: number;
pVNumero: number;
sref: string;
estado: number;
datos: { [key: string]: string };
electronica: boolean;
cae: string;
caevencimiento: string;
resultado: string;
observaciones: string;
errorFE: string;
saldo?: number;
errores: boolean;
}
NxResultado
export enum NxTipoResultado {
ERROR = 0,
OK = 1,
VALIDACION = 2
}
export class NxResultado {
tipo: NxTipoResultado;
id: number;
data: object;
valores: string[];
mensajes: string[];
errores: string[];
}
Comprobante
Lo que devuelve
GET /comprobante/{id}.
export enum ComprobanteTipo {
VENTA = 2,
NOTA_CREDITO = 4,
PREVENTA = 33,
}
export interface Comprobante {
facturaId: number;
ordenId: string; // el ordenId con el que lo creaste
comprobanteTipo: ComprobanteTipo;
estado: number;
numero: number;
pVNumero: number;
fecha?: string;
sucursalId: number;
puntoVentaId: number;
empleadoId?: number;
sref: string; // CAE, si es electrónica
cliente: ComprobanteCliente;
totales: ComprobanteTotales;
items: ComprobanteItem[];
mediosPago: ComprobanteMedioPago[];
}
export interface ComprobanteCliente {
entidadId: number;
nombre: string;
razonSocial: string; // razón social fiscal, si difiere del nombre
dni: string;
cuit: string;
email: string;
condicionIva: CondicionIva;
}
El bloque cliente se arma leyendo la ficha de la entidad en el momento de la consulta, no
una copia congelada al momento de emitir el comprobante. Si alguien corrige el CUIT o el mail
del cliente en el ERP, la próxima consulta del mismo comprobante ya devuelve el dato
corregido.
Un comprobante viejo sigue mostrando su cliente aunque después lo hayan dado de baja en el ERP.
export interface ComprobanteItem {
articuloId: number;
descripcion: string;
talleId?: number;
colorId?: number;
cantidad: number;
precio: number;
subtotal: number;
}
export interface ComprobanteTotales {
subTotal: number;
descuento: number;
recargo: number;
envio: number;
total: number;
pagado: number;
saldo: number; // pendiente del comprobante
}
export interface ComprobanteMedioPago {
tipo: TipoMedio;
importe: number;
tarjetaId?: number;
cuentaBancariaId?: number;
}
Empleado
Lo que devuelve GET /empleados.
export interface Empleado {
empleadoId: number; // id de la entidad; es el que va en empleadoId del body
nombre: string;
}
PuntoVenta
Lo que devuelve GET /puntos-venta.
export interface PuntoVenta {
puntoVentaId: number;
descripcion: string;
numero: number;
cajaId: number;
depositoId: number;
sucursalId: number;
default: boolean; // true = el configurado en tu integración
}
Recomendaciones de modelado
Si vas a construir tu propia app o middleware, lo más práctico es mapear internamente:
- una entidad de producto base
- una entidad de variante
- stock por variante
- categorías y etiquetas normalizadas
- una tabla o colección de sincronizaciones
- una tabla o colección de pedidos enviados con clave idempotente
Esto te deja preparado para la evolución del contrato a medida que se agreguen nuevos endpoints.