xxxx

1 Caracteristicas que debe cumplir un SGA

Entre las caracteristicas que debe implementar un sistema de SGA se encuentra:

  • El Slotting permite diseñar dinámicamente los lugares de almacenamiento en la zona de recogida, basándose en el análisis de información combinada como la rotación de productos, las frecuencias y tipos de recogida, los volúmenes y la disposición de los almacenes.
  • La triangulación aumenta la productividad de los operadores al optimizar las rutas de los almacenes.
  • Picking Cluster permite elegir varios pedidos al mismo tiempo y colocarlos en diferentes contenedores por pedido: en lugar de llevar a cabo varias misiones, puede elegir un grupo de pedidos en una sola misión.
  • El Cluster de Almacenamiento le permite almacenar múltiples SKUs durante una sola misión, basándose en lógicas de selección predeterminadas.
  • El pre-envío le permite construir un pedido virtualmente antes de recogerlo, calculando el peso y la cantidad de todas las paletas multi-SKU que contiene.
  • Trazabilidad en tiempo real mediante sistemas de alerta automática para cada fase (recepción, almacenamiento, preparación, envío), la funcionalidad permite detectar cuellos de botella y acontecimientos inesperados tan pronto como se producen, antes de que puedan repercutir en la productividad del almacén, permitiendo una gestión dinámica mediante el reajuste de las prioridades de la misión y la asignación de recursos.
  • La gestión de muelles/patios permite sincronizar las operaciones de almacenamiento con los eventos de los muelles, por ejemplo, programando los espacios de transporte en función de la planificación de la disponibilidad de los patios y los flujos de carga y descarga.

2 Conceptos básicos

   {
      "whLoc":"2000",
      "clientId":"1",       --> client_code
      "itemNo":"00067449",  --> item_code
      "variant":"00000",    --> variant
      "numBquWqu":"1.0",
      "gow":"2000",         --> Goods owner
      "ibdLine":"0",
      "baseQty":"+4.0",     --> Cantidad en unidades base
      "dualQty":"+0.0",     --> Cantidad dual en productos que lo soporten
      "luId":"600040933",
      "stoLocId":"CUBY-05-LEVEL-28-SHUTTLE-01", --> Ubicación
      "stockGroupId":"DISP",
      "availability":"STORED"
   }
   
   Inbound:
   {
   "clientId":"1",
   "ibdNo":"2220-000927",
   "systemPartner":"HOST",
   "whLoc":"2000",
   "ibdTypeId":"SUMI",
   "deliveryNoteNo":"0075904540",
   "deliveryNoteDate":"20220120",
   "priority":"5",
   "mainState":"ACTIVE",
   "laExchange":"NOT_NEEDED",
   "IBDLUACK00007":{
      "systemPartner":"HOST",
      "ibdNo":"2220-000927",
      "clientId":"1",
      "luId":"600013639",
      "loadAidId":"TUB4",
      "cubatureId":"TUB",
      "grossWeight":"3.59",
      "grossWeightUnit":"kg",
      "weightKind":"CALCULATED"
   },
   "IBDLUDETAILACK00007":{
      "ibdSystemPartner":"HOST",
      "systemPartner":"HOST",
      "ibdNo":"2220-000927",
      "ibdlvNo":"2220-000927",
      "no":"3",
      "clientId":"1",
      "itemNo":"00112178",
      "variant":"00000",
      "luId":"600013639",
      "numBquWqu":"1.0",
      "stockGroupId":"DISP",
      "gow":"2000",
      "batch":"8115591",
      "bbDate":"20230930",
      "ibdLine":"110",
      "baseQty":"5.0",
      "dualQty":"0.0",
      "grossWeight":"190.0",
      "grossWeightUnit":"g"
   }
}

    

2.1 Ubicaciones (Bins or locations)

Una ubicación es un "hueco" en donde podemos tener existencias de productos. En un sistema SGA, toda la gestión de existencias se basa en la asignación de las mismas a ubicaciones.

A las ubicaciones se les puede dar varios nombre en ingles: bins, storage locations (stoLocId) o simplemente locations.

2.1.1 Fixed Bins

2.1.2 Floating Bins

2.1.3 Content Bin

Es una subtabla (tabla hija) de la ubicación y refleja el contenido de la misma. En cuanto una ubicación flotante se queda sin contenido, los registros de esta tabla desaparecen.

Si la ubicación es fija, entonces el contenido está siempre presente e indica el articulo o articulos que puede contener la ubicación.

  • Ubicación
  • Artículo
  • Unidad de medida: Por ejemplo unidades o cajas. En una ubicació podemos tener un stock en cajas y otro en unidades
  • Cantidad. Es la cantidad en la ubicación de unidades de medida (por ejemplo cantidad de cajas o unidades)
  • Cantidad base. Siempre representa la cantidad en unidades para facilitar la gestión real del stock en unidades.
  • Cantidad disponible para picking:

2.2 Stock Status

Tambien tiene distintos nombres. En AX: "disposition codes", "Inventory Status", otros "stockGroup", podria ser tambien "stockStatus"

¿Que nombre elegimos?

Allow you to set the inventory status, what work template will be used and can be used to utilize a specific location directive.

  • Código
  • Inventory status: Indica si este estado del stock representa que el produto está disponible o bloqueado.
  • Work template: El work template permite indicar si para gestionar este estado, queremos utilizar un sistema de dos fases en las que ponemos el producto en staging y despues ya lo mandamos a una ubicacion definitiva.
  • Return disposition code

En las tablas de configuracion de la RF, podemos definir valores por defectos para cada uno de los mens de la RF. En el caso del Status de Stock, Podemos definir que para la pantalla de recepciones, si el almacen es XX o nulo para todos y/o si la ubicación es XX o nula, el valor es "Disponible".

Como ya podemos advertir, tendremos una pantalla de valores por defecto que nos permitirá elegir entre distintos campos/valores y configurar para el almacen y ubicación el valor que queremos que tenga por defecto.

InventStatusId 	      String   The ID describing the status of the inventory
Name 	              String   Name
InventStatusBlocking  Enum     Create inventory blocking of items based on the status dimension
        
DispositionCode         String The disposition code
InventStatusId 	        String  The ID describing the status of the inventory
ReturnDispositionCodeId String Identification of the disposition code. 
WorkTemplateCode 	    String	The unique code for the work template
        

2.3 Item Batch

El lote es un identificador que permite categorizar el stock. Generalmente va unido a la fecha de caducidad (best before date) aunque hay algunos tipos de negocio que solamente requieren lote, pero no tienen fecha de caducidad.

      "batch":"8115591",
      "bbDate":"20230930",
    

En la fecha de caducidad no hacemos una validación de fechas. Si la fecha de caducidad es por meses podemos poner 20230900, si la fecha es por años 20230000 y si la fecha es por dias 20230930

No admitimos nulos, porque son campos que deben registrarse siempre. Por ello, si no los usamos, deberiamos dejarlos en "", pero no podemos 'evitgarlos'

3 Slotting

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/warehouse-slotting

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/anchoring

4 Movimientos de inventario

Nos permiten mover stock de un lugar a otro del almacén, fuera de lo que son procesos de picking, inbound o replenishment.

Hay que pensar si los movimientos de inventario queremos que generen trabajos y los autocompleten (esto facilitaria estadisticas unificadas de operaciones), o si queremos que generen directamente movimientos de transferencia de stock en el almacén.

4.1 Movimientos manuales

Esta opción de menu de RF que permite escanear una ubicación, escanear un articulo o LP, confirmar cantidad y escanear la ubicación destino.

4.2 Movimientos guiados

Los movimientos guiados por plantilla. Se define una plantilla del trabajo y una directiva de localización, el operador escanea una ubicación origen y mediante la directiva de localización el sistema determina la ubicación destino a la que debe ir la mercancia y las tareas a realizar para hacerlo.

Algunos usos de esta opción podrian ser si traemos a una mesa de recuento unos determinadas cajas para realizar tareas de verificación, recuento o calidad. Una vez completada la operación podemos usar este método para devolver esta caja o paleta al almacén.

Tambien puede servir para devolver a la ubicación de almacén un pallet que ha tenido que bajarse a una playa para poder hacer picking sobre el mismo. Por ejemplo, cuando alguien baja un palet le puede poner un postit y cuando se hace el picking el postit se quita y esto es la marca para que un operario pueda usar esta función para devolver el pallet de la playa a las ubicaciones de almacenaje.

Otro uso menos ortodoxo, es que en el proceso de recepciones, al recontar el producto se pone en una ubicación de staging, pero no se crean trabajos para la ubicación final. Los operarios manualmente, puede coger un artículo o una ubicación de staging y solicitar mediante este proceso que les proponga las ubicaciones destino y realizar el movimiento/transferencia de almacén.

5 Work control

Las plantillas de tareas (work templates) determinan como se debe realizar un trabajo para cada proceso en el almacén. Enlazando una plantilla de tareas (work template) con una directiva de ubicación (location directive), puede garantizar que tipos de trabajo se ejecutan en cada area especifica del almacén.

Por ejemplo, en los almacenes con armarios de picking directo, puedes llegar a configurar que se hace picking por cubetas qye puede ser agrupado posteriormente en pickings por carros o individuales.

-

https://docs.oracle.com/cd/E18727_01/doc.121/e13433/T211976T430466.htm

5.1 Work templates

Las plantillas de tareas permiten definir las operaciones que deben realizarse en el almacén. Generalmente, las operaciones consisten en un movimiento de stock en el almacén recogiendo un stock disponible "on-hand" en una ubicación y depositandolo en otra ubicación.

Las plantillas de tareas, consisten en una cabecera y sus lineas asociadas. Cada plantilla tiene asociada un tipo de orden de trabajo

Many work order types are associated with source documents, such as purchase or sales orders. However, other work order types represent separate warehouse processes, such as cycle counting The work pool ID lets you organize work into groups.

Use la configuración en la definición de la cabecera para determinar cuándo se debe crear un nuevo trabajo. Por ejemplo, puede configurar un número máximo de lineas y un tiempo máximo esperado para el picking. Entonces, si la tarea de un pedido de venta excede cualquiera de estos valores, el trabajo/tarea se romple en dos o más elementos.

Use la definición de roturas en la cabecera del trabajo para definir las condiciones en las que el sistema debe crear nuevas cabeceras de trabajo. Por ejemplo, para crear una cabecera de trabajo para cada número de pedido, añada el campo de "Número de pedido" a las condiciones de rotura.

Las lineas de la plantilla representan las tareas físicas que se requieren para ejecutar el trabajo. Por ejemplo, en un proceso de salida, podemos tener una linea para recoger los articulos del almacén y otra linea para depositarlos en una zona de trabajo (staging area) . Además podemos tener una linea adicional para recoger los elementos de la zona de trabajo y ponerlos en el camión como parte del proceso de carga. Puede configurar una directiva en las lineas de la plantilla, El código de la directiva se vincula con una directiva de ubicación y de esta forma ayuda a segurarnos que el trabajo en el almacén es realizado en las ubicaciones correctas del almacén.

Puede configurar unas condiciones de consulta para controlar cuando se usa una determinada plantilla de tareas. Por ejemplo, puede configurar limites a que una determinada plantilla pueda ser usada exclusivamente en un determinado almacén. O tambien, puede teener muchas plantillas que creen tareas para realizar los procesos de expedición de pedidos de venta, dependiendo del origen o tipo de los pedidos. El sistema usa un número de secuencia para deteminar el orden en el que las plantillas de tareas disponibles son evaluadas.Por lo tanto, si tiene una consulta muy específica para una plantilla de trabajo en particular, debe darle un número de secuencia bajo. Luego, esa consulta se evaluará antes que las otras consultas más generales.

A continuación un mecanismo de rotura de una tarea compleja en subtareas:
To stop or pause a work process, you can use the Stop work setting on the work line. In that case, the worker who is performing the work won't be asked to perform the next work line step. To move on to the next step, that worker or another worker must select the work again. You can also separate the tasks within a piece of work by using a different work class ID on the work template lines.

Desde mi punto de vista es mas adecuado, agrupar cada subtarea con un identificador secuencial en lugar de usar un campo de rotura. Tambien hay que pensar como agrupamos tareas globales (movber un pallet o una cubeta) con tareas individuales. Aunque hemos encontrado un modelo operativo, hay que pensarlo más para hacerlo más simple si cabe.

5.2 Work pool

El work Pool es un categorizador de tareas a nivel macro. Por ejemplo, si queremps categorizar las tareas de almacen, separando las entregas normales de las entregas de pedidos recibidos en la tienda online,

Otra posible categorización es agrupar todas las tareas correspondientes a productos peligrosos, las taras pueden ser multiples, pero las agrupamos en un único Pool

Por lo tanto, el work pool es un mecanismo de categorización de tareas.

Otro ejemplo:

I’m particularly interested in the Outbound workload visualization feature, because I’m currently involved in a warehouse implementation project, where we are about to discuss how to monitor daily work progress in the warehouse. So the hope is that this new feature will close a couple of gaps.

In my project we plan to use the work pool to group pick work per receiving country. Work is grouped per country because there’s different cut-off times for different countries. The workers therefore knows that e.g. UK work pool has to be picked before e.g. US and other work pools.

So I tried setting up a visualization combining work pool id and work status (open, closed or in process). You can see the result below.

5.3 Dependent Work

A lo largo de la planificación de una oleada, podemos encontrar que tenemos tareas que requieren de otras tareas para que se puedan ejecutar. Poe wjwmplo, para hacer un picking de un pallet que se encuentra en una ubicación que no permite picking directo (por ejmplo un pallet en altura), necesitamos que un operador de transpaleta nos baje el pallet para poder realizar el picking.

Otro caso que podemos tener es la creación de una tarea de picking sobre una zona que no hay suficiente stock pero sobre la que creamos una tarea de reposición que nos traerá stock desde la zona de reposición a la zona de picking para que la podamos pickear.

La primera premisa es que las taras deben poder ejecutarse sin tener que mirar cada vez si tenemos tareas dependientes o no, por lo que en lugar de tener la problematica en cada ejecución de cada linea de tarea "task_id", la trasladamos de forma centralizada en la creación de la oleada o a nivel de "work_id"

Por eso, tanto una tarea de bajada/subida de pallet, como un picking en una zona donde no hay stock y requiere de la ejecución de un reaprovisionamiento, podemos tratarlo de forma similar como si se tratara de tareas dependientes. En el primer caso, dependemos de la bajada del pallet y en el segundo, dependemos de que se realice el aprovisionamiento.

Si un operario intenta ejecutar una tarea y no tiene stock suficiente (por ejemplo, todavía no le han bajado el pallet, o no se ha reaplizado o planificado una reposición), marcaremos el campo work_repldemand (Petición de reaprovisionamiento) para indicar que tenemos lineas pendientes de que alguien realice el reaprovisionamiento. y que el gestor del almacen pueda priorizar las tareas de reaprovisionamiento que tienen otras tareas pendientes.

Supongamos que tenemos una orden de trabajo que tiene dos tareas de picking de productos que están en dos pallets en altura.

Caso 1: Por oleada:

Creamos un trabajo con dos tareas que requieren bajar el pallet a una zona de playa que permita picking

Copy
Id WorkID Wave Tipo Zon.Origen Ubic.Origen HU.Origen Contenedor.Ori Zona.Dest Ubic,Dest HU.Dest Conten.Dest Articulo Canbt 
 1    7    19  PICK  PLAYA-1                            PAL-1                            CUB-1                A-01     1
 2    7    19  PICK  PLAYA-1                            PAL-2                            CUB-2                A-07     1
 
 Y tenemos otros trabajo con dos tareas para bajar los pallets:
 3    8    19  BAJAR RESERVA                            PAL-1       PLAYA-1                       PAL-1
 4    9    19  BAJAR RESERVA                            PAL-2       PLAYA-1                       PAL-2
 
 Y por ultimo otro trabajo para devolver los pallets a la zona de reserva:
 5   10    19  SUBIR PLAYA-1                            PAL-1       RESERVA                       PAL-1
 6   11    19  SUBIR PLAYA-1                            PAL-2       RESERVA                       PAL-2

Cuando lancemos la oleada, los operarios que bajan pallets, se deberán encargar de bajar todos los pallets necesarios en la oleada.

El terminal de RF tendrá una opción de menú para ejecutar consecutivamente tareas de tipo "BAJAR" e iran bajando los pallets

Supongamos que los operarios solamente ejecutan la tareas de bajar el palet PAL-1 y el PAL-2 se queda arriba, entonces cuando un operador vaya a ejecutar el trabajo 7, odrá hacer la primera linea del PAL-1 pero la segunda linea no podrá porque el pallet no está en su sitio y se le pondrá la marca de que está pendiente de reposición.

Caso 2: Por tarea:

En el mismo caso anterior, cuando un operario intente ejecutar el trabajo 7, el sistema verificará la existencia de stock suficiente para ejecutar todas las tareas del trabajo. Si hay alguna falta de stock, entonces marcará las lineas pendientes y notificará al operario que no puede ejecutar ese trabajo porque no hay stock suficiente

Necesitaremos una configuración que nos indique que si no hay suficente stock para una tarea, que queremos hacer:

  • Anular toda la linea y continuar con la siguiente.
  • Ejecutar con la cantida que haya y anular el resto
  • Posponer la ejecución de la linea para despues
  • No permitir empezar el trabajo si hay lineas con falta de stock

Como además del pallet podemos tambien estar a la espera de una reposición, pero al igual que el pallet, no sabemos si la reposición esta planificada previamente o no, podriamos hacer split de la linea por la parte faltante, marcarla como pendiente de reposición y priorizarla al final (sumandole 100000 al orden. Un proceso independiente que se ejecuta automaticamente cada 5 minutos se encargará de verificar las tareas pendientes de ejecución con el campo work_repldemand activado, para planificar las tareas de reposición o bajadas de pallet o ver si ya existen y priorizarlas respecto a otras tareas o poner una incidencia para que el gestor del almacen pueda verlo y priorizar/ejecutar manualmente estas tareas de reposición.

5.4 Work Split y Work Detach

Work Split es el procedimiento por el que una tarea (linea), puede romperse en dos con las mismas características. Este procedimento mantiene a la linea separada en la misma oleada, la carga y el trabajo.

Por ejemplo, una tarea de picking que no podemos completar por que no hay suficiente stock pero que no queremos perder la cantidad que nos falta por completar y que rompemos en dos: una tarea para completarla en este momento y otra que completaremos más tarde. Por ejemplo, haciendo picking desde otra ubicación.

El Work Split mantiene todas las caracteristicas de la linea original y mantiene el codigo de oleada, el codigo de carga, etc. etc.

El proceso de split puede realizarse de forma automática porque en la configuración hemos indicado que si no podemos completar la cantidad de una tarea se haga split automático o manualmente.

Por las caracteristicas del split, este se puede realizar en cualquier momento, aunque la tarea este a medias. E incluso si la tarea esta completada podriamos hacer un split por la cantidad pendiente.

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/work-split

Work detach

Work detach romple una linea de tarea en dos, pero "separa" (detach) la parte separada y permite que se vincule con otra oleada, carga e incluso tarea independiente.

El botón de Detach no estaría disponible si se producen alguna de las siguientes condiciones:

  • El trabajo tiene un estado distinto a "Abierto" o "En proceso".
  • El trabajo esta asociado a un contenedor (container_id) (Vamos a pensar que un contenedor no se puede separar parcialmente. al porque requiere acciones manuales).
  • El trabajo está vinculado a un Cluster (cluster_id).
  • El trabajo ya se está rompiendo por otro usuario.

A new work blocking reason, Split work, indicates when the work ID is in the process of being split. It's shown both on the Split work page and in the Warehouse Management mobile app if a user tries to run the work. When blocking reasons are used, the name of the Blocked wave field from the work ID is changed to Blocked.

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/work-split

6 Containerization

https://cloudblogs.microsoft.com/dynamics365/no-audience/2014/07/26/introduction-to-containerization-automated-packing-process-in-microsoft-dynamics-ax-2012-r3/

https://www.sikich.com/insight/how-to-set-up-dynamics-365-containerization/

https://gfeaxblog.wordpress.com/2019/08/17/msdyn365fo-containerization/

In addition to the manual packing functionality that was introduced in my previous post, the new Warehouse management system also provides a feature, Containerization, which supports an automated or guided packing process. In this process, containerization assists the user by:

Automatically calculating required containers for the outbound shipment based on product and container physical dimensions. Optimizing packing structure according to a set of rules configured by the user. Generating picking work based on the calculated container structure. By using this feature, you will not only have an overview of the quantity and types of containers that are going to be used for packing prior to the picking of goods, but you’ll also have work created in a way that the work lines are split into quantities that fit the containers. This allows and guides the warehouse workers to pick the items directly into the chosen container. Compared to the manual packing process, tasks such as creating containers, assigning items, closing containers are automated by the system.

The containerization logic is integrated into waves as an optional process and when enabled, it is executed as part of the processing of the wave. During the processing of a wave, containerization is performed prior to the creation of work. This allows the system to utilize the generated container structure information to guide the work creation process. You can also configure wave templates to automate the wave process so that containerization is executed upon release of the source orders.

Currently, this feature is primarily aimed at assisting the user with the planning of container structure and work in the packing process. We do not support any manual packing operations on the containers created by the system or modification of the container structure, which you are able to do in the manual packing flow on the containers created by the user. For example, you cannot delete, re-open or change item quantity inside the container. Right now, there is also no support on the Mobile device implemented for the warehouse workers to validate things such as item quantity, product configuration, or physical dimensions as they actually pack goods into containers.

7 Métodos de picking

Generalmente el picking se hace por orden (pedido) Order picking El picking de fede (por cubetas y carros) se denomina "Cluster Picking" Cluster picking allows the user to specify which orders they will pick. The users generate a cluster and then pick everything in their cluster in one efficient picking route. Cluster picking is a great way to improve efficiency in the warehouse. En el menu de RF, tendremos 2 opciones: "Cluster Pick create" y "Cluster picking"

7.1 Cluster picking

Generalmente picking a un contenedor (bin) o a un carro (cart), normalmente conteniendo cubetas (totes) más pequeñas.

Útil para producción en lotes (batches)

Cada workId tiene su propio número de identificacion de destino (License Plate o Handing Unit)

Cada workID destina su picking a un contenedor independiente

Permite a los trabajadores hacer picking de multipes articulos de una ubicacion para multiples ordenes de trabajo al mismo tiempo.

.

Cluster picking example: https://cloudblogs.microsoft.com/dynamics365/no-audience/2014/08/27/combining-wave-containerization-work-break-and-cluster-picking-to-support-a-piece-picking-operation-ax2012r3/?source=dynamicsaxscm

https://blog.mazars.us/increased-warehouse-efficiency-for-small-order-operations-via-system-directed-cluster-picking/

https://www.linkedin.com/pulse/system-directed-cluster-picking-dynamics-365-finance-supply-nolting

Two order lines means two shipment lines, and each shipment line will have separate Work lines; it's not possible to consolidate these on to one Work line.

However, if you use Cluster picking, the work lines with the same item/location will be combined into a single instruction on the hand held. Since you are not really wanting to use the Cluster picking function for it's true purpose, you should try configuring it as simply as possible; a cluster of a single work header, automatic Cluster Ids, don't utilise different cluster picking positions. It's not a brilliant solution, but it can be done in standard... perhaps test it and see what you think.

https://community.dynamics.com/ax/f/microsoft-dynamics-ax-forum/251276/consolidate-identical-order-lines-when-work-is-created/701170

7.1.1 Cluster template

Tendremos lo que se denominan cluster templates, que nos dirá el número maximo de "posiciones" (cubetas - totes) que podemos agrupar para hacer picking

Por ejemplo, podemos tener dos tipos de carros: Uno para cubetas de plastico retornables con 9 posiciones y otros para cajas de carton con 4 posiciones. Podemos tener dos plantillas de picking en cluster: carros de cubetas y carros de cajas y dependiendo del "profile" elegido, el sistema nos tiene que pedir fabricar un carro de un tipo u otro y obtener workd_id s correspondientes a cajas de carton o los correspondientes a cubetas de plastico.

Como en el caso de Fede, a veces el concepto de carro ya incluye un codigo de barras en cada posición, por lo que a la hora de construir el cluster picking, simplemente tendriamos que indicar el carro y este ya nos generaria un cluster picking con las posiciones y matriculas (Codigos de barras o LPNs) correspondientes

Vease: Generally cluster picking is performed in sectioned trolleys, which could have each slot bar-coded with a License plate. My proposal is that the concept of a trolley is introduced. The trolley will have a number of slots, each of which is associated with the relevant license plate. System directed cluster picking could then prompt the user the scan a Trolley ID and then automatically associate the license plate for the relevant slot to the Target license plate for the slot. Hence the picker would need to perform one scan instead of up to 30 prior to starting the pick.

.

https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/set-up-cluster-picking

7.1.2 Trolley - Carro

Otro mecanismo para generar un cluster es utilizar un "carro" (Trolley) que nos indicará automáticamente el número de posiciones, y el alias de cada una de las posiciones.

En el caso de fede, la asignación de las matriculas de verificación puede ser manual, pero en otros casos, por usar un concepto de carro nos puede asignar automáticamente las matriculas e incluso podria asignar automáticamente los trabajos a asignar a cada posición.

7.1.3 Manual Cluster Picking Workflow

On the Outbound menu, select SD Cluster to initiate the pick. A cluster is created, and the two work IDs that you created earlier are attached. If you created more than two work IDs, only the first two are added to the cluster. Notice that the work IDs are added to the cluster in ascending order, as you specified in the query setup. Note The new cluster is automatically created only if enough additional work IDs were previously created. Otherwise, the following message is shown: "Not enough work can be found for cluster." After you select the menu, the first pick screen appears. The system aggregates all matching pick lines from the two work IDs and directs you to visit the pick location one time, so that you can satisfy both orders by using one pick. This process is done in the same way as the process for user-directed cluster picking. Confirm the first picking location and item by selecting OK. The quantity of the pick will be the total of the item displayed on the sales orders in the cluster. Enter the position name (Numeric or Alphabetical) to confirm that the item quantity picked for the position were put in the correct position. Repeat this process until all item quantities have been picked and put in the correct position. The last step on the mobile device is to Put the cluster in the final location. Select OK When the put operation is confirmed, the cluster is closed and broken, based on the value that you set for the Break cluster at field in the cluster profile. Work IDs are also closed.

Una vez ya no hay tareas pendientes de realizar el en cluster, aparecerá el mensaje: "No hay más tareas"

El operador, deberá ejecutar el último paso en el dispositivo RF que es poner el cluster en la ubicación final.

Una vez confirmada la operación, el cluster se romple

7.2 Consolidated (Grouped) Wave picking

Tradicionalmente denominado por nosotros picking en dos fases.

Tipicamente usado para operaciones con un gran numero de pedidos de venta o SKUs para ser pickeadas

Multiples pedidos de distintos clientes y artículos pueden ser combinados en una única "picking list"

El mismo numero de destino (License Plate o Handing Unit) para todas las workID

El picking se coloca en un unico contenedor para todos los pedidos y posteriormente se hace un proceso de separación por cliente

(Wave picking with Group pick) Permite a los operarios (workers) recoger un producto de una vez en una misma ubicación (location) y en una misma operación, para las distintas lineas de picking individuales que encajen/cumplan con las mismas condiciones.

8 Shipment consolidation

https://axscm.wordpress.com/2019/10/17/reduce-warehouse-costs-using-shipment-consolidation/

https://axscm.wordpress.com/tag/warehouse/

https://axscm.wordpress.com/2019/10/17/reduce-warehouse-costs-using-shipment-consolidation/

I have a situation where the customers has 1 sales order, with multiple lines. Let's say there are 10 order lines, 
all different items.

Line 1-5 are in stock, line 6-10 will be bought with a purchase order.

Sales order is created on monday, the items of the purchase order will arrive on wednesday, delivery is for friday.

The customer would like to start picking the items on stock on tuesday (work ID 001) and 
after picking put them on a temporary location.

On wednesday the items of the purchase order are received and stalled in a special warehouse zone for 
reserved items (Location directive build with help of query: Order line reference number = !"")
On thursday a new work ID is created (work id 002), this is for picking the items which have been received
from the purchase order, those items will be Put at the packing location.

Finally at the packing location, the warehouse employee needs to pack the items form work ID 001 and
work ID 002 into a single container.

What would be the best way of handling this situation, with the least amount of manual input?
I know it would be possible to manual consolidate the 2 shipments into 1 and based upon the new shipment ID
start the packing process, but I am looking for a method which doesn't need interference of an user.
    

9 Estructuras de datos (work in progress)

9.1 Tareas

La unidad mínima tarea es el trabajo (work_id), que representa una operación de picking como por ejemplo:

Para un determinado cliente, toma una caja de aspirinas y dos cajas de paracetamol.

Que se traduce en un registro en wmx_worktask_head y dos registros en wmx_worktask_line (uno para cada producto).

El numero de tareas que se vinculan a un único trabajo depende de las plantillas de configuración vinculadas con el tipo de tarea a realizar.

Copy
Son las tablas de RF que permiten realizar las operaciones de picking, putting, etc.

Lista de tablas WHS

https://docs.microsoft.com/en-us/previous-versions/dynamics/ax-2012/reference/hh272172(v=ax.60)

For more details on Cluster picking, go to https://docs.microsoft.com/en-us/dynamics365/unified-operations/supply-chain/warehousing/set-up-cluster-picking.
For more details on Wave picking, go to https://docs.microsoft.com/en-us/dynamics365/unified-operations/supply-chain/warehousing/tasks/configure-wave-processing.
More about wave picking: https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/create-a-wave-template

Otros documentos teoricos:
https://docs.microsoft.com/en-us/previous-versions/dynamicsnav-2013r2/hh997397(v=nav.71)

Cluster picking profile
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/set-up-cluster-picking
https://ellipsesolutions.com/dynamics-365-thing-called-cluster-picking/
https://dynamics-tips.com/location-directives-and-work-templates-explained/

Work Pools:
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/change-work-pool-on-work

<table name="wmx_worktask_head">
    <column name="work_id"   type="serial"    default="0" required="y" /> <!-- bulkid: The work identification number  -->
    
    <column name="shipment_id"  type="serialref"                          /> <!-- The shipment identification number (Albaran de venta)-    -->
    <column name="order_id"     type="serialref"                          /> <!-- The order number  (Orden de picking o pedido)    -->
    <column name="wave_id"      type="serialref"                          /> <!-- The unique identifier for the wave  -->
    <column name="load_id"      type="serialref"                          /> <!-- The identification number for the load. Contents of a vehicle. En FF, seria el contenido de una ruta (similar a gtra_envunidh)  -->
    <column name="container_id" type="serialref"                          /> <!-- Container identification number (determines container structure) (Nuestro handling unit) -->
    <column name="workpool_id"  type="serialref"                          /> <!-- The unique identifier for the work pool -->
    
    <!-- El site está vinculado con el almacen. Por lo tanto necesitamos solo el almacen -->
    <!--<column name='wh_site'           type='char'     size='10'       required='y' />--><!-- Identify the site -->
    <column name='wh_code'           type='char'     size='10'       required='y' /><!-- Identify the warehouse -->
    
    <column name="work_priority"    type="integer"                       /> <!-- The work priority number    -->
    <column name="work_status"      type="smallint"                      /> <!-- The status of work          -->
    <column name="estimated_time"   type="integer"                       /> <!-- Estimated time (seconds) to complete the task   -->
    <column name="actual_time"      type="integer"                       /> <!-- The actual (seconds) time it took the task to complete    -->
    

    <column name="user_assigned"    type="varchar" size='15'              /> <!-- LockedUser - The user who locked this record (responsible to execute the work)  -->
    <column name="block_reason"     type="char"    size='1'               /> <!-- VSC: -->
                                                                             <!-- Split work: An Split work process has been started,    -->
                                                                             <!-- Blocked wave: The wave this work pertains has been blocked -->
                                                                             <!-- Stock still not available: for dependant works -->
    <column name='work_inprocess'   type='datetime' size='year to second' /> <!-- The date and time the work was in process   -->
    <column name='work_closed'      type='datetime' size='year to second' /> <!-- The date and time the work was closed   -->
    <column name='user_canceled'    type='varchar'  size='20'             /> <!-- The user who cancelled the work -->
    <column name='date_canceled'    type='datetime' size='year to second' /> <!-- The date and time the work was cancelled  -->
    
    <column name='user_created'     type='varchar'  size='20'             default='user'    required='y' />
    <column name='date_created'     type='datetime' size='year to second' default='current' required='y' />

    <!-- INDEXES -->
    <primary name='p_wmx_worktask_head' columns='work_id' />
</table>

If the Work is Locked by a user, but the first work line still has the Work status = In progress, then there is 
a function that you can access from the Load which you can use to change who the Work is assigned to. The function
is actually designed for changing the Put locations of the Work, but it can be used to change the User the Work is Locked by.
Note that it might change the User of any Work attached to the Load (which is not Complete), so I would really only suggest
to use this function as a last resort. From the Work form, you can do Related information > Load > Change work location.



AutoExecute Enum Automatically process the work created with this template 
CombinedWorkId 	String The work ID this work was combined with 
	
CycleCountPlanOverview 	Int64 Reference field in a different table 
	
Frozen 	Enum Indicate whether the specified wave has been processed but not released 
InventJournalId  String Identification of the journal. 
 
TargetLicensePlateId String The target license plate ID for the work 
TransTxt             String Text describing the transaction. 
UserManuallyAssigned Enum   Specify whether the user was manually assigned to this work 
WorkBuildId 	     String The work build identification number 

WorkCountError 	String The work error message 
WorkIsMultiSKU 	Enum	Indicate whether the specified work has multiple SKUs 
WorkManuallyCompletedBy String	The AX user who manually completed the work 

WorkTemplateCode 	 String The unique code for the work template 
WorkTransType 	Enumeration	The type of work order for which a location directive is defined 

<table name="wmx_worktask_line">
						   <!-- Podemos crear tablas alternativas para guardar las tareas históricas -->
						   <!-- ya procesadas para quitarlas de las tablas de trabajo-->
						   <!-- Datos historicos de tareas ya realizadas: p.e. wmx_workdone_line -->
						   <!-- Una tarea se encargará de ir moviendo los trabajos ya terminadas -->
						   <!-- de esta tabla a la tabla historica -->

	<column name="task_id"      type="serial"    default="0" required="y" /> <!-- seqno -->
	<column name="work_id"      type="serialref"             required="y" /> <!-- bulkid:  -->
	<column name="order_id"     type="serialref"                          /> <!-- The order number  (Orden de picking o pedido)    -->
	<column name="shipment_id"  type="serialref"                          /> <!-- The shipment identification number (Albaran de venta)-    -->
	<column name="cluster_id"   type="serialref"                          /> <!-- proid:  Serialref al proceso  -->
	<column name="wave_id"      type="serialref"                          /> <!-- The unique identifier for the wave  -->
	<column name="load_id"      type="serialref"                          /> <!-- The identification number for the load. Contents of a vehicle. En FF, seria el contenido de una ruta (similar a gtra_envunidh)  -->
	<column name="container_id" type="serialref"                          /> <!-- Container structure (Nuestro handling unit) -->

	<column name="work_type"      type="varchar"   size="15" required="y"   /> <!-- tipo: The type of work -->
	<column name="linenum"        type="smallint"                           /> <!-- orden: Identification of line -->
	<column name="sortcode"       type="smallint"                           /> <!-- antiguo priori ???? Es el orden con el que debemos hacer -->

    <column name="client_code"    type="varchar"   size="10" /> <!-- Client WMS. Diferent clients can hace items with same code being distinct products -->
    <column name="item_code"      type="varchar"   size="16" /> <!-- codart: Identify item -->
	<!-- Debemos reintroducir la dimension en los articulos o dejarlo unicamente en item_code ???? -->
	<column name="item_dimid"     type="varchar"   size="15" /> <!-- Identification of dimensions for the item.  -->	

	<column name="qtywork"        type="decimal"   size="14,4" /> <!-- The work quantity  -->
	<column name="qtyremain"      type="decimal"   size="14,4" /> <!-- The quantity remaining  -->

	<column name="src_zoneid"     type="varchar"   size="10" /> <!-- zonori: The ID for the source zone -->
	<column name="src_locationid" type="varchar"   size="15" /> <!-- ubiori: Location in a warehouse. -->
	<column name="src_handlingid" type="serialref"           /> <!-- huori:  Serialref al HU o src_containerid -->
	<column name="src_gow"        type="varchar"   size="15" /> <!-- Source Inventory Goods Owner -->
	<column name="src_batchid"    type="varchar"   size="15" /> <!-- Identification of the source item lot -->
	<column name="dst_zoneid"     type="varchar"   size="10" /> <!-- zonori: The ID for the destination zone -->
	<column name="dst_locationid" type="varchar"   size="15" /> <!-- ubiori: Location in a warehouse. -->
	<column name="dst_handlingid" type="serialref"           /> <!-- huori:  Serialref al HU o src_containerid -->
	<column name="dst_gow"        type="varchar"   size="15" /> <!-- Destination Inventory Goods Owner -->
	<column name="dst_batchid"    type="varchar"   size="15" /> <!-- Identification of the destination item lot -->


<!-- Los handing units son siempre virtuales ya que tienen solamente la vida del picking, en cuanto acaba el picking -->
<!-- ya nos da igual lo que ha pasado con ellos, en cambio los containers_ids son contenedores persistemtes (storage units) -->
<!-- que perduran en el almacén, como por ejemplo un palet con un código de barras o una caja de plastico con codigo de barras -->
<!-- en la que podemos poner items -->
<!-- El hecho de que usemos un numero de contenedor y no  directamente una ubicación, es que el numero de contenedor nos -->
<!-- permite hacer estructuras dependientes más complejas: P.E. la caja 0912 que está dentro de el contenedor 1234 que está en el pallet PA45 -->

	<column name="avail_physical"   type="decimal" size="14,6" /> <!-- Physical quantity available  -->

	<column name="estimated_time"   type="integer"             /> <!-- Estimated time (seconds) to complete the task -->
	<column name="actual_time"      type="integer"             /> <!-- The actual time (seconds) it took the task to complete -->
	<column name='work_start_dt'     type='datetime' size='year to second' /> <!-- horini: The date and time of work started-->
	<column name='work_inprocess_dt' type='datetime' size='year to second' /> <!-- horope: The date and time of work in process-->
	<column name='work_closed_dt'    type='datetime' size='year to second' /> <!-- Horfin: The date and time of closed work -->
	<column name="work_status"      type="smallint"            /> <!-- estado: The status of work -->

	<column name="work_repldemand"  type="char"     size='1'   /> <!-- Y/N The allocation line failed to find a location and is eligible for replenishment -->

	<column name='date_created'     type='datetime' size='year to second' default='current' required='y' />
	
    <!-- INDEXES -->
    <primary name='p_wmx_worktask_line'  columns='task_id' />

    <foreign name='f_wmx_worktask_line1' columns='work_id'       references='wmx_worktask_head'      refcols='work_id' />
</table>


<!-- 


Tenemos que hacer un circuito con operaciones de reposición de las que dependen  pickings.

	Otros conceptos por si los necesitamos
IsAnchored 	        Enum Specify whether the object is anchored to a location
LoadLineRefRecId Int64 Reference field in a different table
LocatedLPId String The license plate ID that is located for the work
Mandatory  Enum Make the work line mandatory
Skipped  Enum This was skipped.
UnitId 	String Unit symbol 
UserId  String The user for processing work 
WorkClassId 	 String The unique identifier for the work class
WorkStop 	Stop the transaction for the specified work line
WorkTemplateLineRecId 	 Int64 Reference field in a different table
-->

9.2 Oleadas - Waves

https://docs.oracle.com/cd/E26401_01/doc.122/e48830/T211976T536591.htm

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/wave-processing

.

Create, process, and release a wave to create picking work for a load, shipment, or production order.

Use shipping waves to include lines from sales orders. When a sales order is released to the warehouse, the sales order lines can be included in the wave.

For sales orders and kanban orders, inventory must be reserved before the order is released to the warehouse. Otherwise, the items or allocation lines can't be processed in a wave.

Create and process a wave

The following diagram shows the flow for how shipping waves are created, processed, and released. The numbers correspond to the sections later in this section.

Wave Processing

Loading...

After a wave has been created and contains all of its required lines, you are ready to process it to create the corresponding picking work.

Release the wave to the warehouse to start picking and packing

You must process a wave before you can release it. When you release the wave, the picking work is available in the warehouse. You can cancel a wave after it is released, and add more lines, but you can't change the lines.

Copy
<table name="wmx_wave_head">
        <column name="wave_id"           type="serial"    default="0" required="y"    /><!-- The unique identifier for the wave -->
        <column name='description'       type='varchar'  size='60'                    /><!-- Brief description of transaction -->
        <column name='wave_status'       type='char'     size='1'                     /><!-- The status of the wave -->
        <column name='wave_execute'      type='char'     size='1'                     /><!-- Specify whether the wave should be processed -->
        <column name='wave_date'         type='date'                                  /><!-- Date when wave is created or should be processed -->

        <column name='wh_code'           type='char'     size='10'       required='y' /><!-- Identify the warehouse -->

        <column name='date_executing'    type='datetime' size='year to second' /> <!-- The processing date and time   -->
        <column name='date_released'     type='datetime' size='year to second' /> <!-- The date and time it was released    -->
        <column name='date_completed'    type='datetime' size='year to second' /> <!-- The completion date and time   -->
        <column name='date_held'         type='datetime' size='year to second' /> <!-- The date and time held   -->
	
        <column name='numwork_created'   type='integer'             />       <!-- The number of work headers that have been created -->
        <column name='numwork_remaining' type='integer'             />       <!-- The number of work headers remaining. -->

        <column name='wave_attrib_1'     type='varchar'  size='30'  />       <!-- The wave attribute 1-->
        <column name='wave_attrib_2'     type='varchar'  size='30'  />       <!-- The wave attribute 2 -->
        <column name='wave_attrib_3'     type='varchar'  size='30'  />       <!-- The wave attribute 3 -->
        <column name='wave_attrib_4'     type='varchar'  size='30'  />       <!-- The wave attribute 4 -->

        <column name='wave_template'     type='varchar'  size='15'  />       <!-- The name of the wave template used to create this wave -->
        
        <column name='user_created' type='varchar'  size='20'             default='user'    required='y' />
        <column name='date_created' type='datetime' size='year to second' default='current' required='y' />
        <column name='user_updated' type='varchar'  size='20'             default='user'    required='y' />
        <column name='date_updated' type='datetime' size='year to second' default='current' required='y' />

        <!-- INDEXES -->
        <primary name='p_wmx_workpool' columns='workpool_id' />
    </table>

DemandWaveId        String The source wave of the demand

    <table name="wmx_wave_line">
        <column name="wave_lineid"       type="serial"    default="0" required="y"    /><!-- The unique identifier for the line-->
        <column name="wave_id"           type="serialref"             required="y"    /><!-- The unique identifier for the wave -->
        
        <column name="order_id"     type="serialref"                          /> <!-- The order number  (Orden de picking o pedido)    -->
        <column name="shipment_id"  type="serialref"                          /> <!-- The shipment identification number (Albaran de venta)-    -->
        <column name="load_id"      type="serialref"                          /> <!-- The identification number for the load. Contents of a vehicle. En FF, seria el contenido de una ruta (similar a gtra_envunidh)  -->
        
        <column name='user_created' type='varchar'  size='20'             default='user'    required='y' />
        <column name='date_created' type='datetime' size='year to second' default='current' required='y' />
        <column name='user_updated' type='varchar'  size='20'             default='user'    required='y' />
        <column name='date_updated' type='datetime' size='year to second' default='current' required='y' />

        <!-- INDEXES -->
        <primary name='p_wmx_wave_line'   columns='wave_lineid' />
        <foreign name='f_wmx_wave_line1'  columns='wave_id'       references='wmx_wave_head'      refcols='wave_id' />
    </table>
    

WWorkTransType 	Enume The type of work order for which a location directive is defined

    <table name="wms_wavetemplate_head">
        <column name='wave_template'     type='varchar'  size='15' required='y' />       <!-- The name of the wave template used to create this wave -->

        <column name='user_created' type='varchar'  size='20'             default='user'    required='y' />
        <column name='date_created' type='datetime' size='year to second' default='current' required='y' />
        <column name='user_updated' type='varchar'  size='20'             default='user'    required='y' />
        <column name='date_updated' type='datetime' size='year to second' default='current' required='y' />
        
        <!-- INDEXES -->
        <primary name='p_wms_wavetemplate_head' columns='wave_template' />
    </table>

9.3 Cluster Picking

Una plantilla para la generación de picking en modo cluster, permite la generación automática o manual de pickings de trabajos de forma agrupada.

Los clusters de trabajos se pueden crear automaticamente o manualmente siguiendo una de las plantillas existentes

El campo position_verify permite indicar el método por el que se verificará la posición dentro del cluster en el que pondremos el producto.

Para explicar este campo pongamos como ejemplo un carro en el que ponemos cubetas o cajas de cartón y que tambien disponen de un código de barras en el frontal de cada posición para una mejor verificación.

Si el campo position_verify indica el valor "Position Scan" (Verifica posición), entonces quiere decir que el operador obligatoriamente deberá hacer una equivalencia entre el numero de cubeta y la posición en el carro. Para que de esta forma pueda verificar mediante el escaneo de la posición. En este caso, tanto el codigo de barras de la posición como el codigo de barras de la cubeta nos valdrian.

Si se pone "LPN Scan"(Verificar caja), lo que se indica es que no nos importan las posiciones en las que hemos puesto las cajas ya que pediremos que nos verifiquen el codigo de barras de la cubeta directamente

Copy
<table name="wms_cluster_template_head">
        <column name="cluster_id"        type="serial"    default="0" required="y"    /><!-- A unique identifier for the cluster template -->

        <column name='cluster_code'     type='varchar'  size='15' required='y' />       <!-- Short template description -->
        <column name='cluster_name'     type='varchar'  size='80'              />       <!-- The name of the cluster profile -->
        
        <column name='generate_cluster' type='char'     size='1' required='y' default='N' /><!-- Generate a unique identifier for the cluster automatically -->
        <column name='positions_active' type='char'     size='1' required='y' default='N' /><!-- Assign work units to specific positions during cluster picking or use LPN -->
        <column name='num_positions'    type='smallint'          required='y' default='1' /><!-- The maximum number of positions or work units that can be assigned to the cluster -->
        <column name='position_name'    type='char'     size='1' required='y' default='N' /><!-- The naming convention for cluster positions: Numeric / Alfanumneric / Others-->
        <column name='position_verify'   type='char'     size='1' required='y' default='N' /><!-- The type of verification that is performed when clustered work is sorted -->

        <column name='user_created' type='varchar'  size='20'             default='user'    required='y' />
        <column name='date_created' type='datetime' size='year to second' default='current' required='y' />
        <column name='user_updated' type='varchar'  size='20'             default='user'    required='y' />
        <column name='date_updated' type='datetime' size='year to second' default='current' required='y' />
        
        <!-- INDEXES -->
        <primary name='p_wms_cluster_template' columns='cluster_id' />
    </table>


    Generate cluster ID - Y/N. This option determines whether the cluster ID is automatically created by the system, or whether the user will create it at the start of picking.
    Activate positions - Y/N This option determines whether the position names are automatically generated based on the position name setup. If this option is set to No, the license plate Number for the position is used.
    Number of positions - This field determines the maximum number of positions that the cluster can have (that is, the maximum number of boxes, totes, and so on).
    Position name - If you Select Numeric positions are named by using continuous numbers. If you select Alphabetical, the positions are named in alphabetical order.
    position_verifycation method - Select Position scan. This field determines whether the put-to-position step is verified.
    
    Break cluster at - Select Put. This field determines when the cluster is broken.


BreakCluster 	        Enume    The stage in the work flow at which you want the cluster broken into work units

9.4 Otras tablas

Otras estructuras auxiliares que tenemos que confrontar con las estructuras actuales en Version 1:

Copy
--------------------------------------
WORK ORDER POOL
--------------------------------------
Puede usar "work order pool" para agrupar tareas que tienen algo en común. A continuacion se muestran algunos ejemplos de uso;<p>
Puede crear un "work pool" para clasificar tareas que ocurren en una determinada localización, o para clasificar tareas por la hora del dia en que se tienen que ejecutar: mañana, tarde, noche,
Puede asignar un work pool en una plantilla de tareas

Warehouse management > Setup > Work > Work pools.

<table name='wms_workpool'>
	<column name="workpool_id"        type="serial"   default="0"     required="y" /> <!-- bulkid: The work pool id  -->

    <column name='workpool_code'      type='char'     size='15'       required='y' />
    <column name='workpool_name'      type='varchar'  size='40'       required='y' />

    <column name='user_created' type='varchar'  size='20'             default='user'    required='y' />
    <column name='date_created' type='datetime' size='year to second' default='current' required='y' />
    <column name='user_updated' type='varchar'  size='20'             default='user'    required='y' />
    <column name='date_updated' type='datetime' size='year to second' default='current' required='y' />

    <!-- INDEXES -->
    <primary name='p_wms_workpool' columns='workpool_id' />
</table>


--------------------------------------
CARGAS - UNIDADES DE ENVIO
--------------------------------------
devsga_oleadas - Pasa a ser un "load" no un "wave"

<table name="wms_worktask_line">
	<column name="load_id"     type="serial"    default="0" required="y" /> <!-- The identification number for the load. Contents of a vehicle. En FF, seria el contenido de una ruta (similar a gtra_envunidh)  -->
</table>

CREATE TABLE devsga_oleadas (
    seqno       SERIAL,
    fecha       DATE,
    ruta        CHAR(15),
    estado      SMALLINT,

  PRIMARY KEY (seqno)
);




--------------------------------------
ALMACENES
--------------------------------------
Original: wms_warehouse

Nuestro concepto de recinto, en otras instalaciones se les denomina "location" o "site", aunque otros
WMs eluden directamente la abstraccion y les denominan "warehouse" para que sea más fácil de entender

Location - A location is a physical structure or place where inventory is received, stored, and shipped, potentially organized in bins.
           A location can be a warehouse, service car, showroom, plant, or an area in a plant.

Bin/Location - A bin is a storage device designed to contain discrete parts. It is the smallest container unit

Zone     - bins can be grouped in zones to manage how the workflow of warehouse activities is directed.
           A zone could be a receiving zone or a stocking zone, and each zone can consist of one or several bins.
Class    - you can assign warehouse class codes to items, bins, and zones to control where different item classes
           are stored, such as frozen goods. You can divide a zone into several warehouse classes. For example,
           items in the receiving zone can be stored as frozen, hazardous, or other class.

Client   - Representa un "cliente" del almacen. Cada cliente puede tener sus propios articulos, pero tambien
           puede tener zonas o ubicaciones reservadas, aunque pueden haber otras comunes o compartidas
           ¿Debemos separar la clasificacion de zonas o ubicaciones reservadas del concepto general de zona de almacen? (Analicemoslo)


<table name='wms_warehouse'>
    <column name='wh_code'           type='char'     size='10'       required='y' />
    <column name='wh_name'           type='varchar'  size='40'       required='y' />
    <column name='wh_alias'          type='varchar'  size='15' /><!-- Used for printing alias code for warehouses -->
<!-- -->
    <column name='wh_site'           type='char'     size='10'       required='y' />
    <column name='empcode'           type='char'     size='4'        required='y' />
    <column name='enc_code'          type='char'     size='12'       required='y' />
    <column name='wh_stkneg'         type='smallint' default='0'     required='y' />
    <column name='wh_complete_order' type='smallint' default='0'     required='y' />
    <column name='wh_register_date'  type='date'     default='today' required='y' />
    <column name='wh_expire_date'    type='date' />
    <column name='img_logo'          type='blob' />
    <column name='grp_print_code'    type='char'     size='10' />
    <column name='wh_status'         type='char'     size='1'        required='y' />
<!-- -->
    <column name='wh_adress'         type='nvarchar' size='60' />
    <column name='wh_town'           type='nvarchar' size='60' />
    <column name='wh_country'        type='varchar'  size='60' required='y'/>
    <column name='wh_postcode'       type='char'     size='10' />
    <column name='wh_region'         type='varchar'  size='60' />
    <column name='wh_business_phone' type='varchar'  size='15' />
    <column name='wh_business_fax'   type='varchar'  size='15' />
    <column name='wh_business_email' type='varchar'  size='40' />
<!-- -->
    <column name='user_created' type='varchar'  size='20'             default='user'    required='y' />
    <column name='date_created' type='datetime' size='year to second' default='current' required='y' />
    <column name='user_updated' type='varchar'  size='20'             default='user'    required='y' />
    <column name='date_updated' type='datetime' size='year to second' default='current' required='y' />
<!-- -->
    <!-- INDEXES -->
    <primary name='p_wms_warehouse' columns='wh_code' />
	<!-- FOREIGN KEYS -->
	<foreign name='f_wms_warehouse1'  columns='enc_code'       references='wms_enclosure'      refcols='enc_code' />
</table>


<table name="wms_storezone">
	<column name='storezone_whcode' type='varchar'  size='12' required='y' />
    <column name='storezone_code'   type='varchar'  size='10' required='y' />
    <column name='storezone_name'   type='varchar'  size='40' />
<!-- -->
	<column name='user_created'     type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'     type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'     type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'     type='datetime' size='year to second' default='current' required='y' />
</table>

<table name="wms_storearea">

<table name="wms_storezonearea">
storeAreaId  String Groups of locations in the inventory.
storeZoneId  String Zone (area) in the inventory.
</table>


--------------------------------------
ZONAS DE ALMACEN
--------------------------------------
Original: wms_wh_zonlog y wms_wh_subzon

Realmente, la nomenclatura correcta sería "Zone group" y "Zone" (wms_zonegroup y wms_zone)
Estas tablas no deberian tener parametrización de tipos de ubicación, orden de picking, etc ya que
esto tiene que estar en otras tablas que hagan referencia a zonas u a otros elementos del almacen como pasillos, etc.

<table name="wms_zonegroup">
    <column name='zg_whcode' type='varchar'  size='12' required='y' />
    <column name='zg_id'     type='varchar'  size='10' required='y' />
    <column name='zg_name'   type='varchar'  size='40' />
    
	<column name='user_created'     type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'     type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'     type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'     type='datetime' size='year to second' default='current' required='y' />
</table>

<table name="wms_zone">
    <column name='zone_whcode'     type='varchar'  size='12' required='y' />
    <column name='zone_code'       type='varchar'  size='10' required='y' />
    <column name='zone_name'       type='varchar'  size='40' />
    <column name='zone_groupid'    type='varchar'  size='10' required='y' />
	<column name='zone_dataarea'   type='smallint' />

	<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'    type='datetime' size='year to second' default='current' required='y' />
</table>

--------------------------------------
PASILLO
--------------------------------------
<table name="wmx_aisle">
    <column name='aisle_warehouse' type='varchar'  size='12' required='y' />
	<column name='aisle_no'        type='smallint' required='y' />
	<column name='aisle_name'      type='varchar'  size='200'  />
	<column name='aisle_dataarea'  type='smallint' required='y' />
	<column name='sortcode'        type='smallint' />
	<column name='sortdescending'  type='smallint'                       default='1'       required='y' />
	<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'    type='datetime' size='year to second' default='current' required='y' />
</table>

--------------------------------------
UBICACIONES
--------------------------------------

<table name="wmx_bin"> o wmx_location
    <column name='bin_code'        type='varchar'  size='15' required='y' /><!-- LocationId - Location in a warehouse. -->
    <column name='wh_code'         type='varchar'  size='12' required='y' />
    <column name='zone_code'       type='varchar'  size='10' required='y' />
    <column name='bin_check_txt'   type='varchar'  size='10' />             <!-- Check text for location: for voice picking or easy alias -->

	<column name='bin_aisle_no'    type='smallint' required='y' />          <!-- Aisle in a warehouse -->
	<column name='bin_rack'        type='smallint' required='y' />          <!-- Rack in an aisle in a warehouse -->
	<column name='bin_level'       type='smallint' required='y' />          <!-- Shelf in a rack in a warehouse. -->
	<column name='bin_position'    type='smallint' required='y' />          <!-- Bin position for location in a shelf. -->

	<column name='bin_volume'      type='decimal' size='12,2'  />          <!-- Volume of the location -->
	<column name='bin_depth'       type='decimal' size='12,2'  />          <!-- Depth of the location -->
	<column name='bin_width'       type='decimal' size='12,2'  />          <!-- Width of the location -->
	<column name='bin_height'      type='decimal' size='12,2'  />          <!-- Height of the location. -->
	<column name='bin_abs_height'  type='decimal' size='12,2'  />          <!-- Height above ground level. -->

	<column name='bin_max_volume'  type='decimal' size='12,2'  />          <!-- Maximum volume that can be stored on the location -->
	<column name='bin_max_weight'  type='decimal' size='12,2'  />          <!-- Maximum weight that can be stored on the location -->
	<column name='bin_max_pallets' type='smallint'  />                     <!-- Maximum number of pallets possible on the location -->
    <column name='bin_pallettype_group' type='varchar'  size='10'  />      <!-- Name for group of pallet types allowed in location -->

	<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'    type='datetime' size='year to second' default='current' required='y' />
</table>

inputBlockingCauseId String Reason why a location has been blocked.
inputLocation 	Destination location, normally the location itself.
                Este campo se usa para vincular dos ubicaciones como si dueran
                la misma. Por ejemplo, cuando un pallet mas grande de lo normal
                se pone en una ubicacion, está bloqueando tambien la ubicación
                colindante, en este caso, la ubicación colindante, tiene que actuar
                como si fuera la ubicación del pallet y ya no tiene que dejar poner
                otro pallet. O sea, momentaneamente, mientras el pallet esté alli,
                la ubicación colindante no existe y actua como la ubicación principal
                (Analizar esto y si el mecanismo propuesto tiene sentido o no)
sortdescending 
LastCounted_dt 	    DateTime The date and time when the location was last counted
locationType 	    Enumeration Use of the location
LocProfileId 	    String  The unique identifier for the location profile

manualName 	        NoYes   Manual update of location name.
manualSortCode 	    NoYes   Manual update of sort code.

MCRReservationPriorityInteger Locations of a higher reservation priority will be utilized first.
outputBlockingCauseId 	String Reason why a location has been blocked.
pickingAreaId 	String  Picking area ID in the location system.
storeAreaId 	String  Groups of locations in the inventory.
sortCode    	Integer Sort order of locations.



--------------------------------------
PALLET TYPES
--------------------------------------
<table name="wmx_pallet_type">
    <column name='pt_code'         type='varchar'  size='15' required='y' /><!-- Code of the pallet type -->
    <column name='pt_name'         type='varchar'  size='40' />             <!-- Description of the pallet type -->

	<column name='pt_volume'       type='decimal' size='12,2'  />          <!-- Volume of the pallet excl. items -->
	<column name='pt_weight'       type='decimal' size='12,2'  />          <!-- Weight of the pallet excl. items -->

	<column name='pt_depth'        type='decimal' size='12,2'  />          <!-- Depth of the pallet -->
	<column name='pt_width'        type='decimal' size='12,2'  />          <!-- Width of the pallet -->
	<column name='pt_height'       type='decimal' size='12,2'  />          <!-- Height of the pallet. -->

	<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'    type='datetime' size='year to second' default='current' required='y' />
	
    <primary name='p_wmx_pallet_type' columns='pt_code' />
</table>

--------------------------------------
PALLET TYPE GROUPS
--------------------------------------
<table name="wmx_pallettype_group">
    <column name='ptg_code'     type='varchar'  size='10' required='y' /><!-- Name for group of pallet -->
    <column name='ptg_name'     type='varchar'  size='40' />        <!-- Description of the pallet type group->

	<column name='user_created' type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created' type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated' type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated' type='datetime' size='year to second' default='current' required='y' />
	
    <primary name='p_wmx_pallettype_group' columns='ptg_code' />
</table>

--------------------------------------
PALLET TYPE MEMBERS
--------------------------------------
<table name="wmx_pallettype_group_line">
    <column name='ptg_code'     type='varchar'  size='10' required='y' /><!-- Name for group of pallet -->
    <column name='pt_code'      type='varchar'  size='15' required='y' /><!-- Code of the pallet type -->

	<column name='user_created' type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created' type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated' type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated' type='datetime' size='year to second' default='current' required='y' />
	
    <primary name='p_wmx_pallettype_group_line' columns='ptg_code, pt_code' />

    <foreign name='f_wmx_pallettype_group1'      columns='ptg_code'      references='wmx_pallettype_group'   refcols='ptg_code' />
    <foreign name='f_wmx_pallettype_group_line2' columns='pt_code'       references='wmx_pallet_type'        refcols='pt_code' />
</table>

--------------------------------------
PALLET
--------------------------------------
<table name="wmx_pallet">

    <column name='pal_code'        type='varchar'  size='15' required='y' /><!-- Id of the pallet -->
    <column name='pt_code'         type='varchar'  size='15' required='y' /><!-- Code of the pallet type -->

    <column name='wh_code'         type='varchar'  size='12'  /><!-- Identify the warehouse. -->
    <column name='bin_code'        type='varchar'  size='15'  /><!-- Bin/Location in a warehouse. -->

	<column name='pal_height'      type='decimal' size='12,2'  />          <!-- Height of the pallet incl. items -->
    <column name='pal_tag'         type='varchar'  size='20'  /><!-- FID tag ID or Pallet Alias -->

	<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'    type='datetime' size='year to second' default='current' required='y' />
	
    <primary name='p_wmx_pallet' columns='pal_code' />
    
    <foreign name='f_wmx_pallet1' columns='pt_code'       references='wmx_pallet_type'        refcols='pt_code' />
</table>

--------------------------------------
LICENSE PLATE / TOTE / HANDLING UNIT
--------------------------------------

LicensePlateId 	String The license plate identification number
LicensePlateLevel Integer The license plate level in the license plate hierarchy where zero is the lowest level
LicensePlateParent 	StringThe unique identifier for the parent license plate 
AgingDate 	Date The aging date for the license plate 
ContainerTypeCode String	The unique identifier for the container type

<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />


--------------------------------------
INTENVORY STATUS (Cuentas de stock)
--------------------------------------
InventStatusId 	String The ID describing the status of the inventory
Name 	        String Name
InventStatusBlocking Enum Create inventory blocking of items based on the status

	<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'    type='datetime' size='year to second' default='current' required='y' />
</table>


--------------------------------------
INTENVOTY ITEMS
--------------------------------------
The InventItem table contains information about items.


ABCContributionMargin 	ABC Item's ABC-code for contribution margin
ABCRevenue 	            ABC Item's ABC-code for sales
ABCTieUp                ABC Item's ABC-code for inventory carrying cost
ABCValue 	            ABC Item's ABC-code for inventory value
AlcoholManufacturerId_RU    String Alcohol manufacturer
AlcoholProductionTypeId_RU 	String The alcohol production type
AlcoholStrength_RU 	        Real   The alcohol concentration as a percentage
AltConfigId 	            String Alternative configuration is used in order entry.
AltInventColorId            String Identification of alternative item color
AltInventSizeId             String Identification of alternative item size
AltInventStyleId            String Identification of alternative item style
AltItemId 	                String Alternative inventory number is used for order entry.
ApproxTaxValue_BR 	        Real   The tax rate that is used to calculate the approximate tax amount for the product
AssetGroupId_RU 	        String identifier of FA group.
AssetId_RU 	                String Unique key for identification of fixed asset.
BatchMergeDateCalculationMethod 	Enumeration Date calculation method to use when merging batches.
BatchNumGroupId 	        String Group for automatic batch number allocation
BOMCalcGroupId 	            String Identification of the calculation group
BOMLevel 	                Integer Calculated BOM level on latest requirement calculation
BOMManualReceipt 	        Enum   Manually enter material profit for this item for a production?
BOMUnitId 	                String BOM consumption unit
CommissionGroupId 	        String Commission group the item is attached to.
CostGroupId 	            String Cost group the item is included in on BOM calculations.
CostModel 	                Enum   Update the item automatically with latest cost price?

CustomsExportTariffCodeTable_IN  Int64 Select the export tariff code for the item. 
CustomsImportTariffCodeTable_IN Int64 Select the import tariff code for the item. 
dataAreaId 	String None 	
DefaultDimension 	Int64 Default dimensions
dEL_CreatedTime 	Integer None 	
dEL_ModifiedTime 	 Integer None 	
Density 	Real Measurement conversion factor for the density dimension.
Depth 	Real Measurement conversion factor for the depth dimension.
EPCManager Real The EPC manager of the item.
ExceptionCode_BR String Fiscal classification exception code
ExciseTariffCodes_IN 	Int64 Excise tariff code for the item.
EximProductGroupTable_IN  Int64 Select the product group for the item.
FiscalLIFOAvoidCalc 	Enum Exclude items from fiscal LIFO calculation.
FiscalLIFONormalValue 	Real Normal value for the group or item
FiscalLIFONormalValueCalc 	Enumeration Should normal value be calculated
ForecastDMPInclude 	Enum Include in demand planning.
grossDepth 	Real Unit depth incl. packing
grossHeight Real Unit height incl. packing
grossWidth  Real Unit width incl. packing
Height 	Real Measurement conversion factor for the height dimension.
ICMSOnService_BR 	Enum ICMS tax applied on service item
Intracode 	String Item commodity code
IntrastatExclude 	NoYes If this check box is selected, the item is excluded from the Intrastat report
IntrastatProcId_CZ 	String Code for the current statistical procedure.
IntraUnit 	 Real  Quantity of additional units per inventory unit, used for Intrastat.
InventFiscalLIFOGroup 	Int64 Assign a group if this item must be included in a group average calculation.
InventProductType_BR 	String Product type classification.
ItemBuyerGroupId 	String Identification of the buyer group.
ItemDimCostPrice 	Enum Activate, use, and maintain cost prices for product variants.
ItemId 	String Identify item.
ItemPriceToleranceGroupId String Identification of item price tolerance group for accounts payable invoice matching
ItemTaggingLevel 	Enumeration Is item tagging mandatory?
ItemType 	Enumeration Type determining how the item is administered.
MarkupCode_RU 	String Identification of the charges
MatchingPolicy 	Enumeration Default policy for PO lines. Three-way: PO, product receipt, and invoice. Two-way: PO and invoice.
MinimumPalletQuantity 	Real Minimum quantity for pallets used for output transports
modifiedBy 	String None 	
modifiedDateTime 	UtcDateTime None 	
NameAlias 	String Find fast name applying to the item
NetWeight 	Real Net weight of inventory item for one inventory unit
NGPCodesTable_FR Int64 French national item code
NRTaxGroup_LV 	String Group identifier.
OrigCountryRegionId String Country/region of origin of the current inventory item
OrigCountyId 	String County of origin of the current inventory item
OrigStateId 	String State of origin for the current item
PackagingGroupId 	String Identification of the packing group
Packing_RU 	String Type of packing in a packing slip.
PalletTagging Enum Is pallet tagging mandatory?
Partition 	Int64 None 	
PBAAutoStart 	Enum Autostart of configuration dialog when entering a modeling enabled item
PBAHideApproval Enum Hide approval dialog after acknowledgement of configuration details
PBAHideDialog 	Enum Hide dialog for automatic configuration based on default values
PBAInventItemGroupId String Identification of the item product model group.
PBAItemAutoGenerated 	Enum Generated item
PBAItemConfigurable 	NoYes	Can this item be modeled in the Product Builder?
PBAMandatoryConfig 	Enum Check item lines for complete configuration details
PDSBaseAttributeId 	String Define the base attributes for the item
PdsBestBefore 	Integer Number of days before expiration date. 
PdsCWWMSMinimumPalletQty Real Minimum CW quantity for pallets used for output transports. 
PdsCWWMSQtyPerLayer 	Real CW quantity per layer on a standard pallet. 
PdsCWWMSStandardPalletQty 	Real Standard CW order quantity on a pallet. 
PdsFreightAllocationGroupId String Freight allocation unique ID. 
PdsItemRebateGroupId  String Group of item for which a rebate is applicable. 
PDSPotencyAttribRecording 	Enumeration Indicates whether the attribute value can be recorded from an RAF journal or entered using a quality order
PdsShelfAdvice 	Integer Shelf advice for number of days. 
PdsShelfLife 	Integer Lead time life. 
PDSTargetFactor Real Target value for the batch attribute selected as the potency base attribute
PdsVendorCheckItem 	Enum The type of validation that is done against the approved vendor list at the item level. 
Phantom 	Enum Propose item as phantom item in bills of materials?
PKWiUCode_PL String PKWiU code.
PmfPlanningItemId String Default planning formula. 
PmfProductType 	Enum Define production type of an item. 
PmfYieldPct Real Yield percentage of formula lines.
PrimaryVendorId String Primary vendor for planned purchase order
ProdFlushingPrincip 	Enum Indicates when automatic BOM consumption is reported.
ProdGroupId 	String Production group proposed when creating productions for the item
ProdPoolId 	String  Pool proposed when creating productions for the item
Product 	Int64   Identification of the product
projCategoryId 	String Category that is used as a default.
PropertyId 	String Necessary property when producing the item
PurchModel Enum Update the item automatically with latest purchase price?
qtyPerLayer Real Quantity per layer on standard pallet

ReqGroupId 	String Group that determines how a requirement is calculated for the item.
SADRateCode_PL 	String Code of item group.
SalesContributionRatio 	Real Contribution ratio to be used when calculating sales price
SalesModel 	Enum Calculate sales price of the item by which model?
SalesPercentMarkup 	Real Charges percentage to be used when calculating sales price
SalesPriceModelBasic  Enumeration Base price to be used when calculating sales price
ScrapConst 	Real Constant scrap in BOM unit (used as default when inserting the item in BOMs)
ScrapVar 	Real Variable scrap in percent (used as default when inserting the item in BOMs)
SerialNumGroupId 	String Group for automatic serial number allocation
ServiceCodeTable_IN 	Int64 Service code for the service item. 
SkipIntraCompanySync_RU 	Enum Disable intracompany synchronization for agreement line. 
sortCode 	Integer Sort order of items
StandardConfigId 	     String Product dimension proposal for variants on order and transaction entries
StandardInventColorId 	 String Product dimension proposal for variants on order and transaction entries
StandardInventSizeId 	 String Product dimension proposal for variants on order and transaction entries
StandardInventStyleId 	 String Product dimension proposal for variants on order and transaction entries
standardPalletQuantity 	 Real   Standard order quantity on a pallet
StatisticsFactor 	     Real   Portion of the amount in hundredths
TaraWeight 	             Real   The tare weight of the item for an inventory unit
TaxationOrigin_BR 	     None 	Specifies the item's origin.
TaxFiscalClassification_BR String Fiscal classification code of the item
TaxPackagingQty         Real    Quantity of which packing duty is to be calculated. The quantity is stated per inventory unit.
TaxServiceCode_BR      String   Fiscal classification applied for services
UnitVolume 	           Real    Volume in cubic meters of an inventory unit
UseAltItemId           Enum    When should alternative item number be used?
Width 	               Real    Factor for the measurement dimension width.
WMSArrivalHandlingTime Integer Time used to arrival update per inventory standard order quantity
WMSPalletTypeId        String  Standard pallet type for the item
WMSPickingQtyTime      Integer Time for pick of 1 package



<!-------- RF Additional Data -->
dataAreaId 	String None 	
FilterChanged 	Enum Specify whether an item filter changed since the last time a price update was run 
FilterCode[1] 	String Filter codes that are used to associate groups of records 
FilterCode[2] 	String Filter codes that are used to associate groups of records 
FilterCode[3] 	String Filter codes that are used to associate groups of records 
FilterCode[4] 	String Filter codes that are used to associate groups of records 
FilterGroup[1] 	String Grouping of filter codes 
FilterGroup[2] 	String Grouping of filter codes 
ItemId 	String Identify item. 
MaxPickQty 	Real The maximum quantity that can be picked for the specified unit sequence 

PackageClassId 	String The unique identifier for the package class 
PackSizeCateogryId 	String The pack size quantity identification 
Partition   Int64 None 	
PhysDimId 	String The ID of the physical dimension group 
PickWCNeg   Enum Determines if this item will be picked negative against the work center when used in a production order. 
ProdQty 	Real The default production or receiving quantity 
RFDescription1 	String The first line of the description displayed on the handheld device 
RFDescription2 	String The second line of the description displayed on the handheld device 
UOMSeqGroupId 	String The ID of the unit sequence group 



	<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'    type='datetime' size='year to second' default='current' required='y' />
</table>


--------------------------------------
OPERARIO
--------------------------------------
<table name="wms_workuser">
UserId 	              String  The user for processing work
UserName 	          String  The full name of the user
UserPasswordHash 	  String  The user password hash for encryption.
UserPasswordIterations Integer The number of iterations used by the key derivation function to generate user password hash 

Disabled 	          Enum    This is not available
dataAreaId 	          String
MenuName 	          String  The name of the menu 
Partition 	          Int64
UserDefaultWarehouse  String  The default warehouse for the user
WorkCountIsSupervisor Enum   Indicate whether the user is a cycle count supervisor
WorkCountMaxPercent   Real   The maximum percentage limit
WorkCountMaxQty 	  Real   The maximum quantity limit 
WorkCountMaxValue 	  Real   The maximum value limit 
Worker 	              Int64  The warehouse worker
AllowLocOverridePick  Enum	  Allow the user to override the pick location during the work
AllowLocOverridePut   Enum    Allow the user to override the put location during the work

	<column name='user_created'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_created'    type='datetime' size='year to second' default='current' required='y' />
	<column name='user_updated'    type='varchar'  size='20'             default='user'    required='y' />
	<column name='date_updated'    type='datetime' size='year to second' default='current' required='y' />
</table>



WHSJourLoadTable - Unidades de envio