Nos integramos con tu ERP para almacenes que usan Aplin OS
La integración con ERPs se lleva por medio de un intercambio de APIs, algunos endpoints deben ser provistos por el ERP, y otros leídos por el ERP. APLIN OS es un sistema de gestión de almacén y es la fuente de verdad de dónde están los productos y cuánto inventario hay.
¿Quién lleva las ubicaciones?
Esta función sólo está disponible con uso in-house de APLIN OS.
Nuestra sugerencia es que el ERP no lleve las posiciones dentro del almacén (eg, A-1-1-1), únicamente la cantidad de piezas disponibles, bloqueadas, en cuarentena... por almacén.
La estrategia de sincronización descrita en este documento es vía polling. Es decir, el ERP abrirá endpoints para que preguntemos cada cierto tiempo qué recursos son nuevos para crearlos, o han cambiado para actualizarlos. Y APLIN OS hará lo mismo. APLIN OS integrará los endpoints del ERP para traer esta información, y el ERP integrará los endpoints de APLIN OS respectivamente.
La comunicación se deberá llevar por medio de una API en formato JSON.
La integración pretende sincronizar:
Artículos: Catálogo de productos, con descripción, medidas, etc.
Inventarios: Cuánto hay de cada producto y en cada estado.
Ingresos: Artículos y cantidades de cada uno a recibir.
Ordenes: Artículos y cantidades de cada uno por enviar.
Devoluciones: Artículos y cantidades retornadas a almacén, la orden y guía de retorno.
⚠️ No recomendado - Piezas: (Solo disponible en uso in-house) En donde está y qué estado tiene cada pieza del inventario.
Quién crea, o captura del otro sistema Artículos, Ingresos y Órdenes depende, no hay una respuesta correcta o incorrecta.
Es decir, permite una integración flexible donde podemos sincronizar, por ejemplo, el ERP para que capture de APLIN OS las órdenes, que APLIN OS capture del ERP los ingresos, y los artículos se creen por separado en ambos sistemas.
¿Qué pasa si hay responsabilidades cruzadas?
No deberá haber responsabilidades cruzadas de creación de recursos en Artículos. Los artículos deberán crearse en APLIN OS, en el ERP, o en ambos por separado. Aunque deberán estar relacionados por un SKU compartido y único entre productos.
Sin embargo, existen escenarios en donde APLIN OS crea ciertas ordenes, e ingresos, y el ERP crea otras. En ese caso es importante que el ERP exponga claramente un parámetro de qué ordenes, o ingresos crear e idealmente en los endpoints solo comparta los que si deban crearse.
Intercambio de información
Pull (Lectura) de información del ERP hacia APLIN OS
Para que APLIN OS cree la información del ERP de Ingresos, Ordenes y Artículos; el ERP debe tener endpoints que permitan obtener la información filtrando por fecha de creación:
GET /inbounds
GET /orders
GET /articles
Los endpoints podrán tener cualquier URL pero deberán tener un cuerpo que pueda relacionarse con los campos que se detallan a continuación.
Para que APLIN pueda actualizar información ya creada usando la información del ERP necesita además proveer la capacidad de filtrar por fecha de actualización a la información.
¡No toda la información se actualizará!
No siempre podrá actualizarse información ya creada en APLIN OS.
Es responsabilidad del ERP consultar la API de APLIN OS de los recursos para saber cuándo se pueden cambiar y cuándo no. Si un recurso no puede cambiarse por integración deberá ser modificado directamente en la plataforma.
Pull de información de APLIN OS hacia el ERP
Para que el ERP pueda mantener sincronizada la información en base al avance de los procesos de almacén APLIN OS provee los siguientes endpoints:
GET /inventory
GET /inbounds
GET /orders
GET /articles
GET /items
Los endpoints que APLIN OS provee pueden filtrarse por fecha de creación, actualización y estatus.
¿Tu operación tiene múltiples almacenes y debe tener estados de tránsito?
Para ello, estableceremos un parámetro en las órdenes e ingresos que hará lo siguiente:
Al enviar una orden, no se descontará el stock si no que se cambiara a una ubicación de tránsito.
Al recibir un ingreso, no se creará nuevo inventario si no que se descontará de la ubicación de tránsito.
Sincronización de órdenes
Proceso funcional
El ERP tiene un endpoint con las órdenes por surtir.
El endpoint indica el tipo de orden (eg, dropship o mayoreo) y el canal (eg, amazon).
APLIN OS crea esas órdenes y las libera automáticamente * si hay stock, de lo contrario permanecen abiertas y se liberan en cuanto tengan stock disponible.
Desde el Dashboard de APLIN OS, un Supervisor realiza la asignación para surtido.
Un Operador surte las piezas de las órdenes y las órdenes cambian a Surtido una vez que estén concluidas de surtir.
El ERP nos pregunta por el estado de las órdenes y las marca enviadas cuando se envíen en APLIN OS.
* APLIN OS también podrá apartar el inventario de las órdenes, mantenerlas abiertas, hasta que el ERP indique que deben ser procesadas - por ejemplo al ser pagadas -.
Modificaciones en las salidas:
Preguntaremos constántemente al ERP sobre las ventas.
Si una de las líneas cambia o la orden se cancela, antes de que se se inicie el surtido se refleja en el sistema. En caso de que se modifique posterior al surtido solo podrá haber cambios negativos (quitar piezas, líneas o cancelación completa).
Las piezas retiradas de las órdenes serán marcadas para retorno a almacén por un operador.
El ERP deberá bloquear la modificación positivo (eg, agregar líneas o piezas) en órdenes que ya hayan iniciado su asignación.
Endpoint GET Órdenes del ERP
Filtros
APLIN OS necesitará filtrar órdenes por:
Número de orden.
Estatus.
Fecha de última actualización.
Campos
Campo | Descripción |
order.orderNumber | Cadena de texto que servirá como identificador de la orden |
order.type | Identificador del tipo de orden necesario para su correcto procesamiento (Dropship, retail, etc.) |
order.buyer | Objeto que debe contar con los siguientes campos:
|
order.lines | Array de objetos. Cada uno de los objetos debe contener la siguiente información respecto a los artículos que forman parte de la orden:
|
order.address | Objeto que debe contar con los siguientes campos:
|
order.created | Fecha y hora de creación de la orden |
order.updated | Fecha y hora de la última actualización de la orden. Es útil para saber si se debe reflejar alguna actualización en las órdenes registradas |
order.skip | Bool que servirá para identificar si la creación de una orden debe omitirse. Al tener este valor en true, la orden no será creada ni verá sus actualizaciones reflejadas en sistema |
Sincronización de ingresos
Proceso funcional
Vamos a leer un endpoint que nos dice los ingresos por arribar.
El endpoint indica el tipo de ingreso.
En el dashboard de APLIN OS un supervisor va a marcarlos como Arribados.
Esto cambia el estado de Pendiente a En proceso: Arribado y disponibiliza el ingreso para seleccionar en la handheld.
Un operador selecciona el ingreso en la handheld y inicia a contar las piezas.
Cada cierto tiempo, el ERP pregunta a APLIN OS los ingresos por estado para actualizar el estado del ingreso.
Si el ingreso se concluyó de contar con faltantes, el estado cambia a Diferencia y esta es aprobada en el Dashboard por un supervisor.
Si el ingreso terminó de contar sin faltantes, o se aprobó la diferencia este cambia a un estado de Ingresado.
Modificaciones al ingreso:
Preguntaremos constántemente al ERP los cambios de los ingresos no finalizados, y en caso de que se agregue o elimine una línea, o se cancele el ingreso editaremos la cantidad esperada de cada linea del ingreso en APLIN OS para reflejar el movimiento.
Endpoint GET Ingresos del ERP
Filtros
APLIN OS necesitará filtrar ingresos por:
Número de orden.
Estatus.
Fecha de última actualización.
Campos
Campo | Descripción |
inbound.inboundNumber | Cadena de texto que servirá como identificador del ingreso |
inbound.type | Identificador del tipo de ingreso (Nuevo ingreso, Logística inversa, material de empaque, fiscal, etc.) |
inbound.lines | Array de objetos. Cada uno de los objetos debe contener la siguiente información respecto a los artículos que forman parte del ingreso:
|
inbound.warehouse | Objeto que incluye el nombre del almacén en donde se recibirá el ingreso. |
inbound.supplier | Campo opcional que consiste en una cadena de texto que servirá como identificador del proveedor relacionado al ingreso |
inbound.created | Fecha y hora de creación del ingreso |
inbound.updated | Fecha y hora de la última actualización del ingreso. Es útil para saber si se debe reflejar alguna actualización en los ingresos registrados |
inbound.skip | Bool que servirá para identificar si la creación de un ingreso debe omitirse. Al tener este valor en true, el ingreso no será creado ni verá sus actualizaciones reflejadas en sistema |
Sincronización de artículos
Proceso funcional
El ERP como catálogo maestro de productos tiene un endpoint en el cual consultar los productos, sus contenidos por caja, códigos de barras...
APLIN OS preguntará cada cierto tiempo al ERP por su catálogo y validará que no falte ningún producto, actualizará los productos cambiados y creará los nuevos.
Los únicos datos acerca del catálogo que se crearán en APLIN OS son las estructuras de los Kits, que al igual que las ubicaciones, zonas... son datos de configuración que cambian poco.
Un artículo se compone de
Identificación: Como lo reconocemos con una handeld → SKU y Código de Barras.
Tipo: Si el producto es un kit, un bundle, o un producto de stock.
Unidad de Inventario: En qué unidad se lleva el inventaro de ese producto → Presentación, Contenido, y Unidad.
Descripción: Qué producto es → Familia, Descripción y Variante.
Nombre. El nombre del producto se forma automáticamente en APLIN OS concatenando la Unidad de Inventario y la Descripción.
Empaque Maestro: Si el producto viene en un empaque maestro, podemos usar este campo.
Cuando estamos integrados con el ERP, idealmente el ERP nos proporciona estos campos y APLIN OS crea el Nombre. Sin embargo, existe una modalidad no sugerida de uso, en el que el ERP nos da únicamente el Nombre y excluye la Unidad de Inventario, la Descripción y otros campos del producto.
Endpoint GET Articulos
Filtros
Sku
Última fecha de modificación
Campos
Campo | Descripción |
article.sku | Cadena de texto que sirve como identificador del artículo para su creación en sistema. Si el artículo tiene variantes no se considerará este campo y se tomará el SKU de la variación. |
Cadena de texto que incluye el nombre del artículo, este será el nombre que aparecerá en los procesos del FSA. En caso de que este campo se encuentre vacío, el nombre del artículo se construirá concatenando los valores ingresados en los campos de unidad de inventario y descripción del artículo | |
article.category | Cadena de texto describiendo la familia o tipo de artículo que servirá para agruparlo dentro del sistema. Esta categoría deberá ser dada de alta con anticipación en el sistema |
article.barcode | Cadena de texto opcional representando el código de barras relacionado al producto, este será el valor que servirá para identificar el artículo dentro del flujo de procesamiento de pedido en almacén. Este valor puede encontrarse vacío, pero será necesario tener activada la política “Conteo de piezas por foto” para la categoría logística del producto, de lo contrario los procesos del FSA que involucren este producto se encontrarán bloqueados. |
article.inventoryUnit | Objeto que servirá como descripción de la unidad de inventario, la cual es la presentación del artículo que se contabilizará al recibir y será la unidad de venta:
En caso de que el nombre del artículo no se incluya en la response del endpoint, el nombre será creado concatenando los valores de los campos inventoryUnit y description. |
article.type | Indica si el producto es un kit, un bundle, o un producto de stock. |
article.piecesPerBox | Cantidad de piezas por caja. |
article.description | Objeto que describe el modelo y la línea de producto a la que pertenece el artículo, debe contener los siguientes campos:
En caso de que el nombre del artículo no se incluya en la response del endpoint, el nombre será creado concatenando los valores de los campos inventoryUnit y description. El campo articleFamily |
variations[] | Objeto opcional con información de la variación del producto (ej. talla, color)
|
article.created | Fecha y hora de creación del artículo |
article.updated | Fecha y hora de la última actualización del artículo. Es útil para saber si se debe reflejar alguna actualización en los artículos registrados |
article.skip | Bool que servirá para identificar si la creación de un artículo debe omitirse. Al tener este valor en true, el artículo no será creado ni verá sus actualizaciones reflejadas en sistema |
Endpoints ofrecidos por APLIN OS
APLIN OS cuenta con su propia API que permite a los usuarios consultar la información relacionada a sus órdenes, artículos e ingresos. Esta información puede ser utilizada como consulta general o para hacer integraciones a ERPs.
A continuación se describen a detalle algunos de los campos disponibles en la respuesta del API de APLIN OS.
Nuestra documentación completa está en Postman
→ Link a nuestra documentación API.
GET Ordenes - /orders
Campo | Descripción |
id | Identificador de la orden dentro del sistema |
source | Identificador del origen de la orden, en caso de que la orden se haya obtenido desde un marketplace, el nombre de la plataforma aparecerá en este campo. |
buyer | Información del comprador de la orden incluyendo:
|
created | Fecha de creación de la orden |
organization | Objeto con los siguientes campos:
|
address | Información de la dirección de entrega incluyendo:
|
courier | Información de la paquetería asociada a la orden incluyendo:
|
shipments | Array de objetos que permite consultar la información de los envios relacionadas a la orden incluyendo:
|
lines | Array de objetos que contiene el desglose de los productos y cantidades que forman parte de la orden incluyendo:
|
isFulfillable | Indica si se cuenta con suficiente stock asignado para que la orden pueda ser procesada |
status | Estatus en el que se encuentra la orden dentro del flujo de surtido |
parcels | Array de objetos con la información de las cajas enviadas
|
logs | Array de objetos con información de los eventos que suceden durante el proceso de fulfillment
|
GET Inbounds - /inbounds
Campo | Descripción |
inboundNumber | Identificador del ingreso dentro del sistema |
supplier | Nombre del proveedor |
source | Origen de la creación del ingreso, puede ser tanto “dashboard” como “api” |
created | Fecha de creación del ingreso |
organization | Objeto con información del cliente:
|
type | Identificador del tipo de ingreso (Nuevo ingreso, Logística inversa, material de empaque, etc.) |
status | Estatus operativo en el que se encuentra el ingreso |
logs | Desglose de la fecha y hora del momento en el que el ingreso fue actualizando su estatus. Cada estatus incluye:
Los diferentes estatus que se encuentran en este campo son:
|
lines | Array de objetos que contiene el desglose de los productos y cantidades reportadas que forman parte del ingreso incluyendo:
|
GET Artículos - /articles
Campo | Descripción |
sku | Identificador del producto dentro de sistema (Opcional, si el producto tiene variaciones el valor será null) |
barcodes | Array de códigos de barras relacionados al producto, este valor es opcional
|
levels | Array de objetos con información de los niveles de inventario
|
boxes (hay que borrar) | Cantidad de empaques en los que el producto se encuentra actualmente |
supplier | Proovedor del producto |
tags | Array de strings de las etiquetas del producto |
brand | Marca del producto |
description | Cadena de texto que describe el modelo y la línea de producto a la que pertenece el artículo |
presentation | Contenedor, empaque o envase del producto en la que se cuenta el inventario. |
content | Contenido (en numero) de la presentación con la que se cuenta el inventario. |
unit | Unidad de medida del contenido de la presentación |
category | Qué tipo de producto o familia es. Objeto
|
variations[] | Objeto con información de la variación del producto (ej. talla, color)
|
name | Nombre del producto. En caso de no ser proporcionado por el cliente, se formará al concatenar los valores registrados en los campos inventoryUnit y description |