Esquema de datos
🏷️ Modelos de artículos
Los artículos en Ninox pueden tener diferentes tipos de variantes según su configuración:
TipoTalleColor
export enum TipoTalleColor {
NINGUNO = 0, // Artículo sin variantes
TALLES = 1, // Solo variantes de talle
COLORES = 2, // Solo variantes de color
TALLES_COLORES = 3 // Variantes de talle y color
}
Articulo (Estructura compleja)
Modelo principal con arrays anidados para variantes y etiquetas:
export interface Articulo {
articuloId: number;
codigo: string;
descripcion: string;
descripcionWeb: string;
nombre: string; // Generado automáticamente según código y descripción
talleColor: TipoTalleColor;
// Precios por nivel
precio1: number;
precio2: number;
precio3: number;
precio4: number;
precio5: number;
stockTotal: number;
// Arrays relacionados
curva: ArticuloCurva[];
tags: ArticuloTag[];
}
ArticuloCurva
Representa las variantes de stock por talle/color:
export interface ArticuloCurva {
articuloId: number;
colorId?: number;
talleId?: number;
colorNombre: string;
colorCodigo: string;
talleNombre: string;
talleCodigo: string;
unidades: number; // Stock disponible para esta variante
}
ArticuloConCurva (Estructura plana)
Modelo optimizado donde cada variante es un registro independiente, ideal para procesamiento masivo:
export interface ArticuloConCurva {
// Información básica del artículo
articuloId: number;
codigo: string;
descripcion: string;
descripcionWeb: string;
nombre: string;
talleColor: TipoTalleColor;
// Precios
precio1: number;
precio2: number;
precio3: number;
precio4: number;
precio5: number;
// Información de variante específica
colorId?: number;
talleId?: number;
colorNombre: string;
colorCodigo: string;
colorHex: string; // Código hexadecimal del color
talleNombre: string;
talleCodigo: string;
// Stock y clasificaciones
unidades: number;
etiquetasIds: string; // IDs separados por coma
etiquetasNombres: string; // Nombres separados por coma
categoriasIds: string; // IDs separados por coma
categoriasNombres: string; // Nombres separados por coma
// Estado del artículo
eliminado: boolean; // Indica si el artículo fue desactivado de la integración
}
🏪 Sistema de etiquetas y categorías
TipoTag
export enum TipoTag {
TODAS = -1,
TAG = 0, // Etiqueta libre
CATEGORIA, // Categoría de producto
MARCA, // Marca del producto
TEMPORADA // Temporada/colección
}
ArticuloTag
export interface ArticuloTag {
articuloId: number;
articuloTagId: number;
tipo: TipoTag;
tagId: number;
tagNombre: string;
padreId?: number; // Para categorías jerárquicas
destacada: boolean; // Si es una etiqueta destacada
}
En Ninox, tanto las etiquetas como las categorías se manejan mediante el sistema de Tags
, diferenciándose por el campo tipo
.
🛒 Modelos de pedidos
CondicionIva
Condiciones fiscales según AFIP:
enum CondicionIva {
SIN_CATEGORIA = 0,
CONSUMIDOR_FINAL = 1,
RESPONSABLE_INSCRIPTO = 2,
MONOTRIBUTO = 3,
EXENTO = 4,
RESPONSABLE_NO_INSCRIPTO = 5,
}
PedidoTerceros
Estructura principal para crear un pedido:
export interface PedidoTerceros {
ordenId: number; // ID único de tu sistema
numero: number; // Número de orden
detalle: string; // Descripción del pedido
// Direcciones
direccionEnvio: DireccionTerceros;
direccionFacturacion: DireccionTerceros;
// Productos y usuario
productos: ArticuloTerceros[];
usuario: UsuarioTerceros;
// Cálculos financieros
subtotal: number;
descuento: number;
envio: number;
recargo: number;
total: number; // Debe ser: subtotal + envio + recargo - descuento
}
DireccionTerceros
export interface DireccionTerceros {
provincia: string;
localidad: string;
direccion: string;
codigoPostal: string;
}
UsuarioTerceros
Información del cliente que realiza el pedido:
export interface UsuarioTerceros {
nombre: string;
email: string;
dni: string; // Documento Nacional de Identidad
cuit: string; // CUIT/CUIL (opcional según condición)
telefono: string;
condicion: CondicionIva;
}
ArticuloTerceros
Items del pedido:
export interface ArticuloTerceros {
articuloId: number;
precio: number; // Precio unitario
talleId?: number; // ID del talle (opcional)
colorId?: number; // ID del color (opcional)
cantidad: number; // Cantidad solicitada
}
Dependiendo de la configuración de tu integración, un PedidoTerceros
puede resultar en:
- Pedido de venta: Venta inmediata con facturación
- Preventa: Reserva de stock sin facturar
📋 Modelos de respuesta
PedidoResultado
Respuesta al crear un pedido exitosamente:
export interface PedidoResultado {
facturaId: number; // Si es 0, el pedido no se realizó
numero: number; // Número de factura generada
pVNumero: number; // Número de preventa (si aplica)
sref: string; // Referencia del sistema
estado: number; // Estado actual del pedido
// Metadatos adicionales
datos: { [key: string]: string };
// Facturación electrónica
electronica: boolean;
cae: string; // Código de Autorización Electrónico
caevencimiento: string; // Fecha de vencimiento del CAE
resultado: string; // Resultado de la operación
observaciones: string; // Observaciones adicionales
errorFE: string; // Error de facturación electrónica (si hay)
saldo?: number; // Saldo pendiente (opcional)
errores: boolean; // Indica si hubo errores
}
NxResultado
Respuesta estándar del sistema para operaciones generales:
export enum NxTipoResultado {
ERROR = 0, // Operación fallida
OK = 1, // Operación exitosa
VALIDACION = 2 // Error de validación
}
export class NxResultado {
tipo: NxTipoResultado;
id: number; // ID relacionado a la operación
data: object; // Datos adicionales de respuesta
valores: string[]; // Valores retornados
mensajes: string[]; // Mensajes informativos
errores: string[]; // Lista de errores (si los hay)
}
📊 Modelos adicionales
Entidad
export interface Entidad {
entidadId: number;
version: number;
nombre: string;
razonSocial: string;
contacto: string;
provinciaId?: number;
localidadId?: number;
cuit: string;
dni: string;
telefono: string;
direccion: string;
codigoPostal: string;
email: string;
}
Comprobantes
export interface Factura {
facturaId: number;
comprobanteTipo: number;
numero: number;
numeroFull: string;
detalle: string;
sucursalId?: number;
sucursalNombre: string;
puntoVentaId?: number;
depositoId: number;
depositoNombre: string;
entidadId: number;
entidadNombre: string;
entidadRazonSocial: string;
entidadContacto: string;
entidadDireccion: string;
entidadEmail: string;
subtotal: number;
descuento: number;
envio: number;
recargo: number;
iva: number;
subTotal2: number;
total: number;
items: FacturaItem[];
}
export interface FacturaItem {
facturaItemid: number;
facturaId: number;
articuloId: number;
talleId?: number;
colorId?: number;
cantidad: number;
precio: number;
subTotal: number;
descuento: number;
total: number;
}