*** Versión 1.01.00 del Manual ***


Las interfases desarrolladas son  las siguientes:

  • In1 : Recepción de Mercadería por Remito

  • In2 : Devolución de control de recepción de los Remitos

  • In3 : Generación de Pedidos para facturación 

  • In4 : Maestro de Artículos (Cristal-ERP)

  • in5 : Maestro de Proveedores (ERP-Cristal)

  • In6 : Maestro de Clientes (ERP-Cristal)


Las interfases utilizan un Servidor Mysql al que  CRISTAL y el ERP deben acceder para intercambiar la información. A este servidor "intermedio" lo llamaremos "Servidor de Interfaz".




Requerimientos


Para implementar la interfaz se requieren los siguientes softwares instalados:


  • Cristal Desktop - versión 02.52.00 o superior. Módulo Almacén.


  • CristalApp - versión 01.06.00 o superior. Aplicación Android para realizar las lecturas de los artículos para la Recepción y Despacho de la mercadería.


  • InterfazKavigo - aplicación - versión 01.01.00: programa especial que correrá en segundo plano en un único equipo. Su función es la de conectar el ERP de la empresa con Cristal Desktop a través de una base de datos intermedia en Mysql. El ERP deberá entregar y leer la información según lo solicitado por las diferentes interfaces (IN1 a IN6) que se describen a continuación.



InterfazKavigo - aplicación

Para realizar el proceso de sincronización entre Servidor intermedioCRISTAL se creó la aplicación InterfazKavigo que periódicamente (según programación) o manualmente sincroniza la información.


IMPORTANTE: debe tener instalado CRISTAL Desktop con la versión 02.52.00 como mínimo para que pueda funcionar la interfaz.


La misma puede ser descargada desde el siguiente Link:

InterfazKavigo


Por defecto está configurada para que funcione en la carpeta “C:\InterfazKavigo”, en caso de querer modificar dicha ruta solo hay que modificar el archivo KAVIGO.ini, cambiando el parámetro “DataDicPath” por la ruta deseada. Cree el directorio sí no existe y descomprima el ZIP en dicha carpeta.


Se debe ejecutar el archivo “InterfazKavigo.exe”

Al ejecutarlo se solicitará siempre el login de un usuario y password de CRISTAL que sea de tipo Administrador.


Nota: Sí existe algún problema de conexión con CRISTAL se alertará del mismo y se abrirá el configurador para modificar los datos en caso de ser necesario. En caso de no estar configurados correctamente los datos de Servidor intermedio alertará que no se pudo conectar y deberá ingresar a la opción de “Configuración” (ver más abajo) para corregirlo.


Sí todo está correcto se agrega al TrayIcon del Windows (parte inferior derecha) el siguiente icono que en caso de hacer click derecho abre un menú de opciones.


Estadísticas: muestra las estadísticas de la última ejecución.

El botón “Ver Log” permitirá en caso de error ver lo que sucedió.


Configuración: permite ver y configurar los datos de conexión al Servidor de Interfaz y CRISTAL, así como también configurar los días e intervalos en que se ejecutará el proceso de sincronización.


Nota: tener en cuenta que debe estar tildado “Habilitar Proceso” para que se ejecute periódicamente según la programación establecida tanto en la sección de “Programación” con en la Conexión de Mysql. Por defecto está activada.


Forzar Ejecución: fuerza la ejecución de la sincronización en el momento.


Cerrar: cierra la aplicación.




Descripción del Proceso 


1. Proceso de Recepción de Mercadería

Al hacer un pedido se ingresa la Orden de Compra en el ERP, esta viaja por Interfaz (In1) a CRISTAL, donde se genera automáticamente una Orden de Ingreso. 

Al momento de recibir la mercadería en el depósito, un operario  vía un dispositivo móvil ingresará el número de Orden de Ingreso y comienza a escanear los artículos que está recibiendo.

Al finalizar de escanear, o sea recibir todo, confirma la finalización del proceso de recepción y CRISTAL se encargará de informar si la lectura es correcta o no.  

En este punto se reportarán las siguientes incidencias

  • Faltantes

  • Sobrantes

El usuario podrá confirmar la recepción "con diferencias" o reiniciar el proceso de recepción

Si se confirma "con diferencias" se generará la orden de ingreso parcial y comenzará el proceso, devolviendo además lo recibido al ERP para la generación de la factura (In2)

Una vez entrada la mercadería se asignará ubicaciones. Dentro del depósito se podrá ubicar mercadería, modificar las ubicaciones y ejecutar procesos a los artículos. Este proceso se realizará con las herramientas naturales de CRISTAL sin desarrollar cambios adicionales.



2. Proceso de Despacho de Pedidos

Los pedidos de los clientes pueden llegar por varios orígenes, audios, WhatsApp, mensajes, correos electrónicos, etc.

En esta etapa del proyecto se habilitará el acceso por la página WEB, por la API de integración o por la aplicación CRISTAL,  todos los orígenes se centrarán por esos 3 accesos, o sea un cliente podrá solicitar él mismo su pedido por WEB o mandar un mail ó WhatsApp. En caso de usar mail o WhatsApp el personal que recibe el mensaje lo registra en CRISTAL (por WEB o  por la aplicación, es igual) y comienza el proceso.

Es altamente recomendable que se conteste al cliente con el número de pedido, esto dará la posibilidad de que el cliente pueda monitorear el avance de su pedido.


Una vez creado el pedido y aprobado el mismo aparecerá como "Listo para Pickear" en el informe de pedidos pendientes en los dispositivos móviles. El usuario "acepta" iniciar el picking y comienza la lectura de Ubicación+Artículo, esto le permitirá ir confirmando el armado. Una vez finalizado se confirma que esté correcto.

En caso de alguna diferencia el Pedido no puede ser cerrado.  Si existe algún cambio por ejemplo una cancelación/agregado por el cliente, simplemente se modifica el Pedido desde CRISTAL y le aparece automáticamente en el dispositivo móvil al operario para su corrección.

Una vez confirmado se emite el pedido final y se embala con el formulario de NP hacia afuera. Este pedido envía la novedad al ERP (In3) para su facturación

El resumen del proceso será:


  1. Se listan las Notas de Pedido en proceso ordenadas por Prioridad + compromiso

  2. Se elige número de Nota de Pedido

  3. Se lee la ubicación o posición de donde se toma la mercadería.

  4. Se lee bulto por bulto a enviar, se va comprometiendo articulo por articulo de esa ubicación. 

  5. Se pre-confirma la Nota de  Pedido cuando se haya completado el pedido.

  6. El cierre definitivo se hace al momento de despachar la mercadería. En ese momento no puede ser alterada. 



3. Maestros

Las interfaces In4, In5 e In6 serán utilizadas para el intercambio de los archivos maestros principales, a saber: Artículos, Proveedores y Clientes. 

Los Artículos son cargados en Cristal y enviados al ERP con su estructura básica. 

Los Proveedores y Clientes son enviados por el ERP a Cristal.



Tablas necesarias en el Servidor intermedio

La interfaz de Cristal requiere de las tablas creadas en la Base de Datos del Servidor intermedio para poder interactuar con el ERP. Algunas deberán ser alimentadas por el ERP y otras por Cristal. A continuación describimos en detalle a cada una de ellas, En el ANEXO 1 se encuentran los scripts para generar las diferentes tablas.

En todas las tablas se incluye un campo llamado ‘procesado’, el mismo en caso de estar NULL significa que está pendiente de ser procesado (es decir pendiente de ser incorporado en la base de datos destino, que puede ser la del ERP o la de Cristal según corresponda). En caso de poseer una Fecha/hora significa que el mismo ya fue procesado/incorporado y no debería ser leído más por el proceso correspondiente.

A continuación el detalle y descripción de las tablas del Servidor intermedio.


Tabla “In1” - Detalle de Artículos por Órdenes de Compra 

ERP -> Cristal 

Tabla debe ser alimentada por el ERP, allí deberán cargarse el detalle de los artículos incluidos en las Órdenes de Compra emitidas por el mismo.  Es un registro por cada artículo.

  1. id - bigint - id autonumérico del registro

  2. ordencompra - varchar(20) - Orden de Compra 

  3. remito - varchar(20) - nro de Remito

  4. sku - varchar(25) -  Código SKU - el mismo del maestro de artículos de Cristal

  5. cantidad - decimal(13,3) - cantidad de unidades del articulo

  6. procesado  - datetime - Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)


Tabla “In2” - Detalle de Artículos que no se pudieron cargar desde  la Recepción de los Remitos

Cristal -> ERP

Esta tabla será alimentada por CRISTAL, para que el ERP pueda obtener las diferencias registradas desde la Recepción de los bultos. Es un registro por cada artículo.

  1. id - bigint - id autonumérico del registro

  2. ordencompra - varchar(20) - Orden de Compra 

  3. sku - varchar(25) -  Código SKU - el mismo del maestro de artículos de Cristal

  4. cantfaltante - decimal(13,3) - cantidad de unidades faltantes 

  5. cantsobrante  - decimal(13,3) - cantidad de unidades sobrantes

  6. procesado  - datetime - Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)


Tabla “In3” -  Artículos confirmados por cada Nota de Pedido

Cristal -> ERP

Esta tabla será alimentada por CRISTAL, para que el ERP pueda obtener el detalle de artículos confirmados para su despacho y facturación. Es un registro por cada artículo, que puede agruparse por el dato “Nro Nota pedido”.

  1. id - bigint - id autonumérico del registro

  2. notapedido (bigint 12) - Nro de Nota de Pedido

  3. idcliente  - int 6 - ID del cliente destino

  4. sku - varchar(25) - Código SKU

  5. cantidad -  decimal(13,3) - cantidad de unidades

  6. procesado  - datetime - Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)


Tabla “In4” -   Maestro de Artículos cargados en Cristal

Cristal -> ERP

Tabla alimentada por CRISTAL, aquí se dan de alta, se editan o se dan de baja los artículos para que puedan ser informados al ERP

  1. id - bigint - id automático 

  2. sku - varchar(25) - Código SKU  

  3. descripcion -  varchar(60) - Descripción del artículo

  4. obs - text - observaciones del artículo

  5. um - varchar(25) - unidad de medida - abreviatura de acuerdo a lo cargado en Unidades de Medida de Cristal (Ej UN = unidad, KG = Kilos, LT - litros, etc)

  6. mt2 decimal 8,3 - Superficie ocupada en mt2 - opcional

  7. mt3 decimal 8,3 - Volumen ocupado en mt3 - opcional

  8. kilos - decimal 10,3 - Peso en kilos por unidad - opcional

  9. baja - tinyint - marca de dado de baja (0=activo, 1=dado de baja)

  10. procesado  - datetime - Marca de Procesado (NULL = sin procesar / fecha/hora = procesado) . 


Tabla “In5” -   Maestro de Proveedores

ERP -> Cristal

Tabla alimentada por el ERP, aquí deberían informarse todos los cambios que se realicen en el Maestro de Proveedores del ERP: es decir cuando se dan de alta, se editan o se dan de baja. Cristal actualizará esos  datos  desde aquí.

  1. * id - bigint - id automático 

  2. * idprov bigint - Id Proveedor  

  3. * razonsocial - varchar(40) - Razón Social

  4. alias - varchar(20) - Aliais (Razón Social Abreviada)

  5. * tipo_cont - int - código de tipo de contribuyente.  Puede venir 1=Responsable Inscripto, 4=Exento, 5=Consumidor Final, 6=Exento Internacional, 7 = Responsable Monotributo, 8 = No Categorizados

  6. * cuit varchar 13 con guiones (ej: 99-99999999-9)

  7. * domicilio - varchar(60) - domicilio

  8. * codpostal - varchar(10) - código postal

  9. * nombrelocalidad - varchar(30) - nombre de la localidad (por si no tenemos el cod postal) 

  10. telefono - varchar(40) - telefono

  11. email - varchar(100) - direccion de mail

  12. contacto  - varchar(40) - Nombre del contacto principal

  13. *baja - tinyint - marca de dado de baja (0=activo, 1=dado de baja)

  14. procesado  - datetime - Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)

Los que tiene (*) son obligatorios


Tabla “In6” -   Maestro de Clientes/Destinatarios

ERP -> Cristal

Tabla alimentada por el ERP, aquí deberían informarse todos los cambios que se realicen en el maestro de Clientes del ERP: es decir cuando se dan de alta, se editan o se dan de baja. Cristal actualizará esos  datos  desde aquí.

  1. * id - bigint - id automático 

  2. * idcliente bigint - Id Cliente  

  3. * razonsocial - varchar(40) - Razón Social

  4. alias - varchar(20) - Aliais (Razón Social Abreviada)

  5. * tipo_cont - int - código de tipo de contribuyente.  Puede venir 1=Responsable Inscripto, 4=Exento, 5=Consumidor Final, 6=Exento Internacional, 7 = Responsable Monotributo, 8 = No Categorizados

  6. * cuit varchar 13 con guiones (ej: 99-99999999-9)

  7. * domicilio - varchar(60) - domicilio

  8. * codpostal - varchar(10) - código postal

  9. * nombrelocalidad - varchar(30) - nombre de la localidad (por si no tenemos el cod postal) 

  10. telefono - varchar(40) - telefono

  11. email - varchar(100) - direccion de mail

  12. contacto  - varchar(40) - Nombre del contacto principal

  13. *baja - tinyint - marca de dado de baja (0=activo, 1=dado de baja)

  14. procesado  - datetime - Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)

Los que tiene (*) son obligatorios



ANEXO 1

Sentencias Mysql para crear tablas en el Servidor intermedio

En los scripts a continuación primero se crea una DB con el nombre “db_interfaz” y luego se trabaja sobre ella. En caso de querer cambiar el nombre de la base de datos se debe reemplazar el texto “db_interfaz” en todos los scripts por lo que se necesite.


CREATE DATABASE `db_interfaz`; 


USE `db_interfaz`; 



/*IN1*/


CREATE TABLE `db_interfaz`.`in1` (


 `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Id', 


`ordencompra` VARCHAR(20) COMMENT 'Orden de Compra', 


`remito` BIGINT COMMENT 'nro de Remito', 


`sku` VARCHAR(25) COMMENT 'codigo SKU', 


`cantidad` DECIMAL(13,3) COMMENT 'cantidad de unidades', 


`procesado` DATETIME COMMENT 'Marca de Procesado (NULL = sin procesar / fecha/har = procesado)', 


PRIMARY KEY (`id`), INDEX `ordensku` (`ordencompra`, `sku`) ) ENGINE=INNODB; 




/*IN2*/


CREATE TABLE `db_interfaz`.`in2` ( 


`id` BIGINT(12) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id automático', `ordencompra` VARCHAR(20) COMMENT 'Orden de Compra',


 `sku` VARCHAR(25) COMMENT 'Código SKU   (viene de sk166.sku166)',


 `cantfaltante` DECIMAL(13,3) COMMENT 'cantidad de unidades faltantes', 


`cantsobrante` DECIMAL(13,3) COMMENT 'cantidad de unidades sobrantes', 


`procesado` DATETIME COMMENT 'Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)', 


PRIMARY KEY (`id`), INDEX `ordensku` (`ordencompra`, `sku`) ) ENGINE=INNODB; 




/*IN3*/


CREATE TABLE `db_interfaz`.`in3` ( 


`id` BIGINT(12) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id automático', `notapedido` BIGINT(12) COMMENT 'Nro de Nota de Pedido', 


`idcliente` INT(6) COMMENT 'D del cliente (usar cli348)', 


`sku` VARCHAR(25) COMMENT 'Código SKU   (viene de sk166.sku166)', 


`cantidad` DECIMAL(13,3)  COMMENT 'cantidad de unidades', 


`procesado` DATETIME COMMENT 'Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)', 


PRIMARY KEY (`id`) ) ENGINE=INNODB; 




/*IN4*/


CREATE TABLE `db_interfaz`.`in4` (


 `id` BIGINT(12) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id automático', `sku` VARCHAR(25) COMMENT 'Código SKU   (sk166.sku166)', 


`descripcion` VARCHAR(60) COMMENT 'Descripción del artículo (des166)', 


`obs` TEXT COMMENT 'observaciones del artículo (obs166)', 


`um` VARCHAR(25) COMMENT 'unidad de medida - abreviatura de la sk169.abr169 según uni166', 


`mt2` DECIMAL(8,3) COMMENT 'Superficie ocupada en mt2 (mt2166)', 


`mt3` DECIMAL(8,3) COMMENT 'Superficie ocupada en mt3 (mt3166)', 


`kilos` DECIMAL(10,3) COMMENT 'Peso en kilos por unidad (kgr166)', 


`baja` TINYINT(1) DEFAULT 0  COMMENT 'marca de dado de baja (0=activo, 1=dado de baja)', `procesado` DATETIME COMMENT 'Marca de Procesado (NULL = sin procesar / fecha/hora = procesado', 


PRIMARY KEY (`id`) ) ENGINE=INNODB; 




/*IN5*/


CREATE TABLE `db_interfaz`.`in5` (


 `id` BIGINT(12) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id automático', `idprov` BIGINT(12) NOT NULL COMMENT 'Id Proveedor', 


`razonsocial` VARCHAR(40) NOT NULL COMMENT 'Razón Social', 


`alias` VARCHAR(20) COMMENT 'Alias (Razón Social Abreviada)', 


`tipo_cont` INT NOT NULL COMMENT 'código de tipo de contribuyente.  Puede venir 1=Responsable Inscripto, 4=Exento, 5=Consumidor Final, 6=Exento Internacional, 7 = Responsable Monotributo, 8 = No Categorizados', 


`cuit` VARCHAR(13) NOT NULL COMMENT 'con guiones (ej: 99-99999999-9)', 


`domicilio` VARCHAR(60) NOT NULL COMMENT 'domicilio', 


`codpostal` VARCHAR(10) NOT NULL COMMENT 'código postal', 


`nombrelocalidad` VARCHAR(30) NOT NULL COMMENT 'nombre de la localidad (por si no tenemos el cod postal)', 


`telefono` VARCHAR(40) COMMENT 'telefono', 


`email` VARCHAR(100) COMMENT 'direccion de mail', 


`contacto` VARCHAR(40) COMMENT 'Nombre del contacto principal', 


`baja` TINYINT(1) DEFAULT 0  COMMENT 'marca de dado de baja (0=activo, 1=dado de baja)', `procesado` DATETIME COMMENT 'Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)', 


PRIMARY KEY (`id`) ) ENGINE=INNODB; 




/*IN6*/


CREATE TABLE `db_interfaz`.`in6` ( 


`id` BIGINT(12) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id automático', `idcliente` BIGINT NOT NULL COMMENT 'Id Cliente', 


`razonsocial` VARCHAR(40) NOT NULL COMMENT 'Razón Social', 


`alias` VARCHAR(20) COMMENT 'Alias (Razón Social Abreviada)', 


`tipo_cont` INT NOT NULL COMMENT 'código de tipo de contribuyente.  Puede venir 1=Responsable Inscripto, 4=Exento, 5=Consumidor Final, 6=Exento Internacional, 7 = Responsable Monotributo, 8 = No Categorizados', 


`cuit` VARCHAR(13) NOT NULL COMMENT 'cuit con guiones (ej: 99-99999999-9)', `domicilio` VARCHAR(60) NOT NULL COMMENT 'domicilio', 


`codpostal` VARCHAR(10) NOT NULL COMMENT 'código postal', 


`nombrelocalidad` VARCHAR(30) NOT NULL COMMENT 'nombre de la localidad (por si no tenemos el cod postal)', 


`telefono` VARCHAR(40) COMMENT 'telefono', 


`email` VARCHAR(100) COMMENT 'direccion de mail', 


`contacto` VARCHAR(40) COMMENT 'Nombre del contacto principal', 


`baja` TINYINT(1) DEFAULT 0  COMMENT 'marca de dado de baja (0=activo, 1=dado de baja)', `procesado` DATETIME COMMENT 'Marca de Procesado (NULL = sin procesar / fecha/hora = procesado)', 


PRIMARY KEY (`id`) ) ENGINE=INNODB;