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

Menus:
Setup > Inventory > Inventory Status
Setup > Inventory > Item Groups
Setup > Inventory > Physical dimension groups

Setup > Work > Work Templates
Setup > Work > Custom work types
Setup > Work > Work policies
Setup > Work > Work exceptions
Setup > Work > Location directive failures
Setup > Work > Work classes
Setup > Work > Work pools
Setup > Work > Work audit template

Setup > Warehouse > Sites
Setup > Warehouse > Warehouses
Setup > Warehouse > Locations
Setup > Warehouse > Location setup wizard
Setup > Warehouse > Location Formats
Setup > Warehouse > Location Profiles
Setup > Warehouse > Location Types

Setup > Warehouse > Zone Groups
Setup > Warehouse > Zones
Setup > Warehosue > Unit Sequence Groups
Setup > Warehosue > Pack size categories
Setup > Warehosue > License plates
Setup > Warehosue > Fixed locations

Setup > Replenishment > Replenishment types
Setup > Replenishment > Replenishment Templates

Setup > Cycle Counting > Cycle Count Thresholds
Setup > Cycle Counting > Cycle Count Plans


Setup > Dimension Groups – Storage Dimensions
Setup > Dimension Groups – Tracking Dimensions


Setup > Mobile Device > Disposition Code
Setup > Mobile Device > Cluster Profiles

Setup > Location Directives.
Setup > Work User > Worker

Outbound Waves > Work details

Work > All work
Work > Work inventory transactions
Work > Work report
Work > Closed work report

Packing and containerization > Containers
Packing and containerization > Packing

Cycle counting > Open cyclecount work

Replenishment > Replenishments
Replenishment > Load demand replenishment

    
   {
      "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"
   }
}

    

Estructura de almacenes

Loading...

2.1 Almacén

Por tradición, en Axional ERP el concepto de almacén es un concepto virtual que clasifica el stock pero no determina la estructura física de un edificio donde almacenar mercancía. Por ello, en el ERP se tuvo que construir una superestructura para poder agrupar las particiones lógicas y poder definir a qué almacén físico correspondía. A esto se le llamó "recinto".

En una estructura más moderna como la de WMS, esta diferenciación no debe copiarse ya que tenemos muchos métodos alternativos para separar el stock de forma lógica.

Por ello, el concepto "almacén" en WMS corresponderá al edificio o localización física en donde podemos guardar mercancía.

Tradicionalmente se le denomina de distintas formas:

  • Warehouse Location (whLoc o whLocId): It refers to the identifier of the warehouse location
  • Simplemente Location

En nuestro caso lo referiremos simplemente como almacén y dispondrá de un código: wh_code.

Cada almacén debe tener una ubicación de recepción por defecto (Default receipt location) y una ubicación de salida por defecto (Default issue location). Estas son las ubicaciones a las que irá el stock cuando se recuenta un producto en entradas (aparece el stock) y a partir de ahi, todo son movimientos de entrada-salida

2.2 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.

  • Aisles: The space between two racks is referred to as an aisle
  • Rack: A rack consists of various shelves. The shelves correspond to storage compartments.
  • Storage Compartments: A storage compartment is the next smallest unit within a rack and is located between two vertical rack up-rights. Storage compartments can be further divided into individual storage locations,
  • Storage Locations: A storage location is a space where a loading unit (LU)
    • Single Storage Locations: A single storage location is defined in a compartment. The storage location volume is equal to the compartment volume. The storage location is considered occupied if one loading unit is posted to it.
    • Multiple Storage Locations: At a multiple storage location two or more loading units can be stored. Usually capacity is meassured in occupied width in the storage location.

Documentacion sobre el esquema de ubicaciones dentro del almacen:

https://innovation-product-documentation.azurewebsites.net/AWHS-WarehouseSetup.html

Notas:

The algorithm will calculated summary for only one of dimension-width. If our profile will have width 900mm and we will make a grouping for slot, for 3, we have 2700mm to use, and we will do a simple math only for units that have width more than 900mm. We do a division the unit width by usable width of location from location profile with roundup. If we have unit-width 2000mm, 2000/900=2,22 round up to 3. We need all three non-occupied locations in group. If we have unit-width 1700mm, 1700/900=1,88 round up to 2. We need non-occupied locations in group which are neighbors. One of them must have another as before or after.

In case of pallets stacking, algorithm also checks Usable location height but only for occupied location with exactly the same Item and unit. Not aloud putting on different items.

2.2.1 Fixed Bins

2.2.2 Floating Bins

2.2.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.4 User locations

each warehouse user becomes a location with a location profile that is taken from the warehousing parameters. This location is created behind the scenes when you create warehouses workers.

Why do we need such a location? When the warehouse worker is between a PICK and a PUT, the inventory is located in this user location. (You may consider the user location to be the forklift the user drives.) A little surprising maybe, but it makes sense and it normally works fine. See below for a few of those user locations, created automatically. The location ID is the worker ID. Notice the field “Location profile” with the value “Use.” This came from the warehouse parameters.

What can go wrong with this? One could easily make a mistake in timing. When we want to be proactive and enthusiastically create warehouse users before we have entered a user default location profile in the warehousing parameters, we have created an unworkable situation. The warehouse worker will not be able to do anything. The user logs into the mobile client, goes through the steps of scanning data and clicking OK, and everything looks fine; but when the mobile step gets to the point of the PICK, the system will send the error:

License Plate Specified on a non-license plate controlled location. Update has been cancelled.

Most of us have seen this error before, and normally, this is easy to fix. We take the message literally and correct that checkbox on the location profile. But we can’t take any action now. The physical warehouse location I am using for the pick is license plate controlled.

What the system is really complaining about is that secret user location – and that user location has no location profile! The system is really saying the following:

I can’t find the location profile for the user location of the user that is currently logged in on the mobile client, so I have no idea whether that location is license plate controlled or not.

NOTE: The profile of the user location in this parameter has to have ‘yes’ specified for license plate tracking.

Now that we know what caused the error, we can easily fix the problem by going to Location profiles, as pictured above. We can easily find the location associated with our warehouse worker and update his location profile. Now we are back in business, we can ship and receive again.

What the system should do to prevent the problem is to warn the user when warehouse workers are created while there is no location profile set up yet in the parameters for the user location. This would be consistent with the functionality when creating locations interactively. The location profile is then a mandatory field.

Las ubicaciones de usuario, podrian autogestionarse (sin ser creadas en wmx_bin). Podriamos pensar que podriamos identificar la ubicación con el codigo de usuario y con el id del trabajo, pero esto puede crear algunos inconvenientes ya que en operaciones agrupadas como los cluster, podriamos tener operaciones agrupadas de put de todos los articulos del cluster. Esto no está razonado, asi que hay que pensar si la ubicación intermedia del trabajo es simplemente el código de usuario (USER1) o la suma del código de usuario + id de trabajo (USER1-8736382223). Otro inconveiente de usar esta ultima ubicación es que si el codigo de usuario es grande, puede que no tengamos un tamaño suficiente en el codigo de ubicación para poner el stock correctamente. De momento, nos podemos quedar con poner simplemente en el stock el codigo de usuario como ubicación y la matricula del trabajo y del stock nos determinará el trabajo al que pertenece un determinado stock.

2.3 Stock Status

  • 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 defecto para cada uno de los menus 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.

Copy
<table name="wmx_invent_status">
    <column name='invstat_code'       type='varchar'  size='15'                         required='y' info='The ID describing the status of the inventory' />
    <column name='invstat_name'       type='varchar'  size='60'                                          info='Name of inventory status' />
    
    <column name='invstat_available'  type='char'     size='1'        default='Y'       required='y' info='Inventory in this status is available?' />

    <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_invent_status' columns='invstat_code' />
</table>

2.4 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'

Copy
<table name="wmx_item_batch">
    <column name="batch_id"       type="serial"             required="y" />
    
    <column name="client_code"    type="varchar"  size="10" required='y' /> 
    <column name="item_code"      type="varchar"  size="16" required='y' info='Identify item'/> 

    <column name='batch_code'     type='varchar'  size='20' required='y' info='Batch Code' />
    <column name='batch_name'     type='varchar'  size='60'              info='Description of the batch' />
    
    <column name='batch_expdate'  type='date'                            info='Expiration date' />
    <column name='batch_bbdate'   type='date'                            info='Best Before date' />
    <column name='batch_proddate' type='date'                            info='Production date' />
    <column name='batch_country'  type='varchar'  size='20'              info='Country of origine' />

    <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_item_batch' columns='batch_id' />
    <unique name='u1_wmx_item_batch' columns='item_code, client_code, batch_code' />
</table>
	
Field 	Type 	Configuration key 	Description
DispositionCode 	String  Identifying batch disposition code

2.5 Handling Unit

Tambien se las conoce como LPN (License Plate Number) o como cubeta (Tote)

En Axional WMS se trata de unidades temporales que agrupan el destino de tareas de almacén. Aunque generalmente todas las operaciones de un trabajo tienen como destino la misma HU (handling Unit) Se registra a nivel de tarea, para permitir realizar operaciones anidadas.

Se trata de un contenedor virtual, que en un momento determinado se convertirá o se trasladará su contenido a un Packaging o unidad de transporte.

https://www.avantiico.com/license-plates-and-warehouse-management-in-dynamics-ax-2012r3-series-2/

https://www.sonata-software.com/blog/dynamics/inventory-movement-using-advance-warehouse-dynamics-365

2.6 Clasificacion de ordenes de almacén

Las ordenes son el punto de origen de cualquier tarea del almacén. Aunque puede haber tareas o trabajos de almacen relacionados que provengan de otros trabajos/tareas, por lo general, el inicio de cualquier operación de almacén viene dado por las ordenes, que podemos clasificar en:

  • Ordenes de entrada (Inbound)
  • Ordenes de salida (Outbound)
  • Ordenes de movimiento (Transfer Orders)

2.6.1 Ordenes de entrada

Las ordenes de entrada o "Inbound" están relacionadas con pedidos, albaranes o previsión de entrada de producto que nos puede venir de un ERP o interface externo.

La recepción de abonos o devoluciones de clientes, podría tambien pasar por aquí aunque tenemos pendiente de analizar si lo hacemos por aquí o implementamos un circuito específico de RMA

2.6.2 Ordenes de salida

Las ordenes de salida o "Outbound" están relacionadas con pedidos, albaranes o ordenes de envio de terceros que nos puede venir de un ERP o interface externo.

Las abonos o devoluciones a proveedores podría ser tambien un tipo de orden de salida de producto (Analizar)

Combinar multiples ordenes en un único envio

https://www.youtube.com/watch?v=U03h9ygAwaw

2.6.3 Ordenes de movimiento

Las ordenes de movimiento o transfer orders son operaciones que ordenan la generación de tareas para mover stock de un lugar a otro en al almacén. Un ejemplo de uso de este tipo de ordenes son las operaciones de reposición del almacén.

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.

4.3 Reposición / Replenishment

In our warehouse we use the warehouse app for order picking. When starting the work on the device, it states a replenishment is needed on Product A. Needed for the order are 12 on hand in location X1 are 9 so a replenishment for 3 is needed. After the replenishment is done. the warehouse employee is asked to visit the same location twice. once for the 9 of product A that were on hand and once for the 3 replenished. We would prefer that after replenishment the work lines for product A are consolidated, making the work line stating pick 12 of product 9 at location X1? How can we accomplish this?

Sounds like you are hitting a problem related to wave demand replenishment (I think). I have noticed that, when work is linked to a replenishment, you can get one Work line for the quantity in the location, and a second line for the quantity that is to be replenished, even though that quantity will be picked from the same location.

I do not know a way to get a single work line in this scenario, but I think this idea describes your problem; no harm in voting it up. Replenishment - unexpected work splitting by the System

It is possible, with wave demand replenishment, to configure the replenishment to go to a different location than the picking location. For example, you could configure it to create a replenishment to the loading bay. In your example, the warehouse worker would pick 6 from location X1, and then the remaining 3 could be found in the loading bay, ready to go.

However, I can see that this idea might not suit many organisations, so another idea is to get the warehouse app to group the two pick lines in to one pick instruction for the worker. The only way to do this in standard is to use Cluster Picking. You could create a cluster with a single work header. Cluster Picking would automatically merge any work lines on the Work Id (which have the same item/location) in to one instruction.

Unfortunately, in standard, 'Clusters' have to be created manually, so this too is not a perfect solution.

https://www.youtube.com/watch?v=70xtjW6tNLY

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.

Copy
table name="wmx_work_template">
    <column name='wtem_transtype'  type='smallint'           required='y'            info='The type of work order for which a location directive is defined' />
    <column name='wtem_seqnum'     type='smallint'           required='y'            info='Position of the rule'/>
    <column name='wtem_code'       type='varchar'  size='15' required='y'            info='The unique code for the work template' />
    <column name='wtem_name'       type='varchar'  size='60'                         info='A description of what the work template is used for' />
                                                                                            
    <column name='wtem_site'       type='varchar'  size='10' required='y'            info='Site code'/>
    <column name='wtem_wh'         type='varchar'  size='10'                         info='Identify the warehouse'/>

    <column name='wtem_priority'    type='smallint'          required='y'            info='The generated work priority number' />
    <column name="wtem_workpool_id" type="serialref"                                 info='The unique identifier for the work pool' />
                                                            
    <column name='wtem_enabled'    type='char'     size='1'  required='y' default='Y' info='Is the work template valid?' />
    <column name='wtem_filter_adv' type='varchar'  size='255'                         info='Filter used for the qualification of work template' />
    
    <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_work_template' columns='wtem_code' />
    <unique name='u1_wmx_work_template' columns='wtem_transtype, wtem_seqnum' />
</table>

Field 	                Type 	 	Description
WorkTemplateErrorText 	String  Brief description of transaction 
AutoExecute 	        Enum    Automatically process the work created with this template
BatchAllocationStrategy Enum    How batches will be allocated.

Filtra el trabajo si no cumple estos limites
=================================================================
MaxQty 	                Real    The maximum quantity
MaxUnitId               String	The maximum unit.
MaxVolume               Real	The maximum volume
MaxWeight               Real    The maximum weight that the location can hold
UsePackingQty 	        Enum    Specify whether the packing quantity should be used

Rompe el trabajo siguiendo estos limites
=================================================================
Maximum estimated pick time
Enter the maximum estimated pick time. The work header will be split when the total estimated time for the initial work pick line has reached the specified value.
Labor standard lines with a Labor standards measurement type set to Work unit will not be accounted for when calculating the pick time.

Maximum number of pick lines
Enter the maximum number of pick lines. The work header will be split when the number of initial work pick lines reaches the specified value.

Maximum total inventory quantity
Enter the maximum total inventory quantity. The work header will be split when the inventory work quantity has reached the specified quantity.

Maximum total volume
Enter the maximum total volume. The work header will be split when the total volume of the work header has reached the specified value.

Maximum total weight
Enter the maximum total weight. The work header will be split when the total weight of the work header has reached the specified value.

Template lines

Copy
<table name="wmx_work_template_line">
    <column name='wteml_transtype'   type='smallint'                            required='y' info='The type of work order for which a location directive is defined' />
    <column name='wteml_code'        type='varchar'  size='15'                  required='y' info='The unique code for the work template' />
    <column name='wteml_linenum'     type='smallint'                            required='y' info='Identification of line' />
    <column name='wteml_workclass'   type='varchar'  size='15'                  required='y' info='The unique identifier for the work class' />

    <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_work_template_line' columns='wteml_code, wteml_transtype, wteml_linenum' />
</table>

Field 	Type 		Description
Freeze 	            Enum    Specify whether this should be frozen
LocDirHintCode 	    String	The unique identifier for the directive code
Mandatory 	        Enum    Make the work line mandatory
WorkStop 	        Enum    Stop the transaction for the specified work line
WorkType 	        Enum    The type of work
WorkTypeCustomCode 	String  The code for the custom work type

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.

https://www.youtube.com/watch?v=0vYIbl8HgbU

You can use work pools to organize work into groups. For example, you can create a work pool to classify work that occurs in a particular warehouse location. For all work types except counting, you can assign a work pool to a work template. For cycle counting, you can assign a work pool to the following:

  • Cycle count plans
  • Cycle count threshold
  • Cycle count work by location
  • Cycle count work by item

When you use work templates to create work, the work pool is automatically assigned to the work. You can also manually assign work pools to work using the Location directives form. After a warehouse worker defines the menu items that will be used to perform work on a mobile device, the worker can scan the work pool ID. The work that is related to the work pool ID is then automatically assigned to the work user on the mobile device until all work is completed.

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 Task Split

Task 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 Task 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 split

Un caso de uso es cuando un operario tiene un trabajo muy grande o con muchos articulos, o el trabajo no le va a caber en el palet o en la cubeta asignada y necesita otro palet o cubeta. En definitiva, si las tareas de picking del trabajo no le caben en la LPN a las que se han asignado y debe ejecutar parte de las tareas, llevar los produtos a su destino final y volver a empezar con el resto de productos (tareas)

Work split o 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

https://community.dynamics.com/ax/b/microsoftoperationsscmguide/posts/d365-warehouse-management-more-about-work-split-work

Ejemplo de uso en aplicación móvil

https://www.youtube.com/watch?v=YFw-dBIEzN8

6 Outbound Packing

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

Put to Wall

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/put-to-wall-put-to-store

https://blog.bhsolutions.com/d365-wave-2-sorting-and-pallet-building

7 Containerization

License plates and containers. Good reading:

https://cloudblogs.microsoft.com/dynamics365/no-audience/2016/06/20/use-of-license-plates-associated-with-a-container-type-to-drive-warehouse-management-processes/

Other documents focused in containers only:

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.

8 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"

Documentación auxiliar:

http://help.sap.com/saphelp_45b/helpdata/en/37/1939516e36d1118b3f0060b03ca329/content.htm

https://docs.oracle.com/cd/E16582_01/doc.91/e15119/setup_inv_mgmnt_system.htm#EOAIM00207

https://www.consolut.com/en/s/sap-ides-access/d/s/doc/F-$SCWM$TO_CREATE_MOVE_HU/

https://www.tutorialspoint.com/sap_ewm/sap_ewm_quick_guide.htm

https://help.sap.com/viewer/57574d15fa1d414792d74047b66c3e41/7.0.4/en-US/6fcbcb53ad377114e10000000a174cb4.html

https://www.linkedin.com/pulse/d365-warehouse-management-outbound-operations-picking-ali-danish

Ejemplo AX de picking FF:

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/

Different ways to pick to a box:

https://blog.bhsolutions.com/picking-into-a-box-in-microsoft-ax

8.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) que corresponde al contenedor (cubeta) de destino. Pero además en cada cluster, se designa un identificador auxiliar con la posición de la cubeta en el carro.

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. Por ejemplo, si nos encontramos con 2 tareas de tipo "Pick" de dos trabajos distintos que van a la misma ubicación y ogen el mismo artículo, el interfase del terminal, puede solicitarnos una operación de recogida con las cantidades sumadas y despues que pontamos cada unidad en la posición del cluster que corresponda. Esto debería ser configurable, ya qye en entornos de alta productividad, puede interesarnos no agrupar la recogida de producto y hacer que coja y ponga en la cubeta y coja otra vez el mismo y lo ponga en la otra cubeta.

.

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.

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

.

https://www.youtube.com/watch?v=0rJdewByQX0

8.1.1 Simply Picking

https://www.youtube.com/watch?v=3-tNQKk1SuE

8.1.2 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

8.1.3 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.

Podemos considerar un cluster picking por carro, cuando las posiciones e identificación del carro están siempre preestablecidas. Por ejemplo, un carro que ya tiene cajas de plastico que siempre son las mismas y que tienen un código de barras que es siempre el mismo.

Otro ejemplo real de carro en el caso de fede son los carros de recepciones que son carros que tienen unas cubetas preestablecidas, aunque tambien se pueden considerar ubicaciones agrupadas. En este caso, seria algo similar, tal y como vamos recepcionando mercancia, vamos generando trabajos de ubicación(putaway) y asignandolos a posiciones de un cluster que corresponden a cada una de las cubetas disponibles. Despues ejecutaremos un "picking" en cluster que realmente lo que hace es vaciar la cubeta y poner la mercancia en la ubicación final. En este caso el cluster finaliza al terminar el trabajo, mientras que generalmente los cluster picking de ventas finalizan en la operación pick (o sea al alcanzar un put en cada trabajo).

Como el caso de cluster picking lo tenemos resuelto, antes de implementar los carros, debemos pensarlo bien y estar seguros.

8.1.4 Manual Cluster Picking Workflow

A continuación una secuencia de creación de un cluster manual:

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

8.1.5 Break cluster

El proceso de romper un cluster, separa un trabajo del cluster para liberarlo y dejarlo disponible para que pueda continuarse con las tareas que ya no deben realizarse a nivel e cluster.

Para romper un cluster, borramos el cluster_id del trabajo y las tareas, una vez un trabajo ha llegado a la condición de "rotura de cluster" se desacoplará automaticamente del cluster y si no ha finalizado se podrá continuar operando con el de forma convencional.

Otra posibilidad, es que como tenemos el cluster_id a nivel de tarea, en el momento de vincular un trabajo a un cluster, solamente incorporemos al cluster las operaciones que deben realizarse en modo cluster y el resto de tareas se dejen conel cluster_id a nulo. De esta forma no debemos realizar ningún proceso ni mecanismo para desvincular un trabajo del cluster. Como mucho, si ya no quedan tareas por procesar para el cluster, podriamos quitar el cluster_id del trabajo para saber que ya está completado. No perderiamos trazabilidad porque el trabajo siempre queda enganchado con el cluster original a través de las lineas de cluster: wmx_workcluster_line

Los cierres pueden hacerse al llegar al primer put, al llegar a un segundo pick, o al completar el trabajo. Un trabajo con tareas pick, pick, put, pick, put con cierre en el primer put, integraria las primeras dos lineas de picking en el cluster, con cierre en el segundo pick integraria los dos pickings y el put en el cluster y al completar trabajo, integraria todas las tareas en el cluster.

Select the action that will break up the cluster. You can break a cluster when either the picking or put away work is completed.

8.2 Batch or Consolidated Picking

AKA Consolidated or 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". O sea , tareas de distintas ordenes se agrupan en un único trabajo.

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.

A la hora de agrupar las lineas de las ordenes en trabajos, el criterio de agrupación es simplemente el de ubicación y no se tiene en cuenta la orden de salida, por lo que se pueden mezclar en un mismo trabajo lineas de distintas ordenes.

Por ejemplo, en FF se generaría un trabajo por cada cubeta juntando distintas ordenes de distntos clientes. Con el group picking, aunque tengamos 8 trabajos con el mismo artículo y ubicación, el picking se realiza de forma conjunta por el total como si realmente solamente tuvieramos un único trabajo. Una vez completado el trabajo, se llevan los productos a una ubicación de Procesamiento "Dispatch". Un proceso posterior permite hacer el packing de las unidades según la orden individual de cada cliente.

https://www.sikich.com/insight/consolidated-picking-for-warehouse-management-in-dynamics-365/

https://www.youtube.com/watch?v=jZYyiOeDdIA

8.3 Put to Wall Picking

En el caso de fedefarma, es el picking de multizonas en 2 fases.

The Put to wall - put to store functionality lets you handle scenarios where you must consolidate a product to a prepack staging area, based on configurable criteria. Because this functionality allows for picking to a single target license plate and can use more put positions than cluster picking, companies that ship to stores or handle small items will benefit from decreased picking time.

The workflow for this functionality directs picked product to a sorting location for distribution into various types of containers. Generally, each sorting location includes multiple sort positions. Each sort position is assigned according to the criteria that are set by the business process. Typical criteria are the final destination, shipment, or load. After a product arrives, it's distributed to each sort position, based on the quantity that is associated with the order, destination, shipment, or load. When a container is full or complete, it's moved to a staging location or a shipping location for further handling, depending on the business process.

This warehousing functionality is also referred to by other names, such as put-to-light and break opens.

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/put-to-wall-put-to-store

8.4 Zone Picking

Cada zona tiene un operario o grupo de operarios asignados.

El picking se hace por pedido, pero puede agrupar productos de distintas zonas.

Por ejemplo, La lista de picking va primero a la zona 1 (por ejemplo robot) y de ahi pasa a la zona 2 que es un picking de pequeño producto, por lo que el trabajo se desasigna del operario "robot" y queda libre para que el operario de la zona 2 pueda continuar con el picking y así sucesivamente puede ir saltando entre distintas zonas hasta completar el trabajo.

En fede esto se complica un poco más, ya que el trabajo no se nunca de una orden completa, sino de una cubeta o de producto etiquetas. Y una vez la cubeta formada, puede tener lineas de distintas zonas (por ejemplo, robot y manual). O sea, una vez formado el trabajo, se comporta de la forma explicada, pero siempre hay una "rotura" previa de trabajos por volumen y numero de lineas para formar las cubetas.

8.5 Order Picking

Un operario realiza el picking de una orden de salida completa.

Consideraciones: La orden de salida, no debe haber sido lanzada previamente, por lo que se genera automaticamente un trabajo con todas las tareas de picking de las lineas de la orden y se asigna el trabajo al operario.

Como pueden haber tareas de picking que el prier operario no pueda completar (por requerir equipos o estar en zonas no accesibles para él), un trabajo se puede dejar a mitad de realizar y "desapuntarse" dejando el trabajo libre para que otro operario lo pueda recoger y completarlo.

8.6 short Picking

Short picking se denomina al evento en el cual, cuando se nos ordena el picking de una cantidad, no encontramos dicha cantidad en la ubicación. En este caso debemos introducir un motivo por el que no se ha podido hacer el picking de la cantidad faltante y dependiendo del motivo elegido se producirá una busqueda automatica de más stock o simplemente se cancelará la cantidad faltante.

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/tasks/set-up-short-picking-item-reallocation

http://kashperuk.blogspot.com/2015/07/tutorial-short-pick-goods-on-mobile.html

https://www.youtube.com/watch?v=eEpZC0xE80Y

https://www.youtube.com/watch?v=sZM7d0GOrlI

Copy
<table name="wmx_workexception">
    <column name='workexcep_code'    type='varchar'  size='15'                             required='y' info='The unique code for the work exception' />
    <column name='workexcep_name'    type='varchar'  size='60'                                          info='Brief description of exception' />
    <column name='workexcep_type'    type='smallint'                 default='0'           required='y' info='The type of exception:  Receiving, Work, Short Pick' />
    <!--
0 	Work
1 	Receiving
2 	Short pick
-->
    <column name='create_cyclecount' type='char'     size='1'        default='N'           required='y' info='Automatically create a cycle count for the location' />
    <column name='adjust_inventory'  type='char'     size='1'        default='Y'           required='y' info='Adjust the inventory' />
    <column name='adjust_type_code'  type='char'     size='10'                                          info='	The default adjustment type code: Adjust Out, Remove Res Adj. Out' />
    <column name='item_reallocation' type='char'     size='1'        default='N'           required='y' info='None, Automatic, Automatic and Manual, Manual' />

    <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_workexception' columns='workexcep_code' />
</table>

AutoDecrementShipment 	Y/N	Automatically decrement the associated shipment or load line

En la siguiente tabla se almacenará la información de todas las excepciones de ejecución de tareas:

Copy
<tabe name="wmx_workexception_log">     
    <column name="work_id"      type="serialref"            required="y" info='The work identification number'/>
    <column name="task_id"      type="serialref"            required="y" info='Identification of task line'/> 
    <column name="order_id"     type="serialref"                         info='The order number' />
    <column name="orderline_id" type="serialref"                         info='The line number from the order' />
    <column name="shipment_id"  type="serialref"                         info='The shipment identification number (Expedición o en ERP: Albaran de venta)' />
    <column name="load_id"      type="serialref"                         info='The identification number for the load' />
    <column name="work_transtype" type="smallint"                        info='The type of work order for which a location directive is defined'   />
    <column name="work_lpn"       type="varchar" size='20'               info='The target license plate Number for the work' />
    
    <column name='workexcep_code' type='varchar'  size='15'  required='y' info='The unique code for the work exception' />
    <column name='workexcep_type' type='smallint'            required='y' info='The type of exception:  Receiving, Work, Short Pick' />

    <column name="message"        type="varchar" size='80'               info='A detailed message' />

    <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_workexception_log' columns='wel_id' />
</table>

Field 	        Type 	Description
Committed 	    Enum    Specify whether the record has been committed into the system
UserId 	        String	The user for processing work

9 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.
    

This business case, should be treated by ERP and WMS functionality.

Axional WMS allows to create tasks based on WMS Orders and create the Delivery Notes afterwards.

Or prelink an WMS Order to a Delivery (Expedición) and later being able to add other orders to the same delivery.

10 Inbound

10.1 Receive sortation

Receive sortation functionality extends the put-away cluster functionality by sorting the inventory at the receiving dock. The sorted inventory is added to the put-away cluster profile prior to creating put-away clusters. Using this functionality, received items can be sorted by the destination location zone, handling equipment, or any other configurable criteria, and workers can move multiple license plates to different locations at the same time. It therefore provides enhanced efficiency to the put-away clusters functionality on the inbound side of warehouse processes.

Outbound sortation: https://dynamicsimpact.com/2020/05/10/dynamics-365-warehouse-sorting/

I have a client who sorts there items at receiving based off of the location the item is in. Locations are grouped to zones and that is how the items are sorted for efficient put away.

Goods are packed onto pallets sorted per zone. Each pallet has a license number assigned. Once sorted, it is put away on this palled id.

10.2 Cluster putaway

Los clusteres de ubicación o "Put-away clusters" es una funcionalidad que permite usar loa mecanismos de consolidación (clustering) tambien para los procesos de ubicación. Permite a los operarios arupar trabajos de ubicación en un cluster y tomar existencias de distintas matriculsa (cubetas) simultáneamente, de forma que se pueden ir ubicando multiples ordenes de trabajo a la vez. Esta característica es especialmente útil para almacenes de retail o en cualquier otro escenario donde se reciban unidades sueltas en lugar de cajas de origen o paletas completas.

Ofrece una gran eficiencia en el proceso de entrada de mercancias de un almacen ya que podemos montar carros con producto que debe se ubicado y despues podemos irlo ubicando todo el carro al avez, siendo esta una alternativa mucho más eficaz y rápida que la ubicación de una sola matrícula, donde el operario debería repetir el proceso para cada matrícula individualmente.

https://www.microsoft.com/videoplayer/embed/RE4f5aB

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

https://github.com/MicrosoftDocs/Dynamics-365-Unified-Operations-Public/blob/main/articles/supply-chain/warehousing/putaway-clusters.md

Recuento de entrada:

1- La terminal nos pregunta orden articulo + cantidad
adicionalmente podemos tener datos del articulo como el lote y caducidad, etc.

2. Generamos la entrada de existencias directamente en el almacen en una ubicación especial de recepciones. Por lo que el stock ya "está dentro" Podriamos hacer que esta ubicación dependiera del usuario que está realizando el recuento o fuera una ubicación de usuario ya que esto nos daria algunas facilidades adicionales

3. El sistema mira el stock que hay en en la ubicación de usuario y mira si se tiene que ubicar directamente o se tiene que hacer mediante carro. Una vez decidido que va a ser mediante carro, generamos las tareas de ubicación (putaway) correspondientes y las vinculamos a posiciones de cluster que corresponden a cada una de las cubetas en las que el operador debe dejar la marcancia. Notese que nos pueden recontar una cantidad que necesite dos posiciones en el carro o que al ir a poner el articulo no quepa y el operador debe hacer un split del trabajo en dos para poner parte del producto en otra ubicación. Podemos poner en el trabajo, una matricula igual al identificador de la posición del cluster o una "auto-matricula" ya que el cluster ya tiene la posición del carro.

4. Una vez sabemos las posiciones en el carro de ubicación, le indicamos al operador que deposite las cantidades en la cubeta

5. Es verdad que en este momento no sabemos que cantidades estan pendientes de ubicar porque estan en posiciones de un carro, pero Analizandos los cluster "open" con posiciones generadas, podemos identificar las ordenes pendientes de ejecutar de tipo "putaway"

6. Una vez queremos empezar a hacer el putaway, simplemente ejecutamos el cluster con las correspondientes tareas. La unica consideración es que en este caso el cluster no termina con el put sino con la finalización del trabajo. O sea, el operador irá ejecutando los trabajos y completandolos, pero en orden de ubicación destino. Por ello, en cada vez se ejecutarán todas las tareas del trabajo:

Copy
Tipo  Art,    Ubic   Cant.
Pick  A       RECEP   8
Put   A       0801005 8

La única cosa un poco extraña es el mecanismo para saber que un carro (que es algo que no existe como tal) a no ser que creemos una entidad para ello, no se puede utilizar más de una vez. O sea como decir que una plantilla de cluster solamente se puede usar una vez simultáneamente. Esto que no está previsto, podemos empezar haciendolo a mano en la RF. Posteriormente un mecanismo podría ser crear un maestro de carros y vincular la plantilla de cluster al carro. De esta forma sabemos que esta plantilla de cluster solamente es para un determinado carro y que no se puede reusar dos veces.

No me parece adecuado de momento, bloquear el carro cuando ya hemos empezado a usarlo ya que esto puede llevar a inconsistencias. Por lo tanto, centremonos en el procediminento y que funcione rápida y fácilmente y después ya lo expandiremos.

Otra posibilidad es hacer un trabajo más complejo que mueva el stock de recepción o de la ubicación de usuario a una ubiación que corresponda a la cubeta del carro, y que ahi pare y una segúnda fase que es la que ejecutará el cluster picking similar al procedimiento que hemos descrito anteriormente:

Copy
Tipo  Art,    Ubic   Cant.
Pick  A       RECEP   8
Put   A       7211    8
Pick  A       7211    8 -> STOP
Put   A       0801005 8

Esto nos da la ventaja de que si tenemos un segundo registro de ubicación del mismo producto podemos saber el volumen ocupado en la ubicación y por lo tanto saber la cantidad adicional que nos cabría. Por lo tanto me quedo con este segúndo mecanismo que tendremos que verificar

10.3 Disposition codes

Disposition codes applies to the inbound receiving process. Disposition codes are a collection of rules that are used when damaged items are received. For example, when a work user uses a mobile device to receive items that were damaged, the user must scan a disposition code for damaged items. This disposition code is used to generate an inventory status and a work template, and then searches for the location directive with the same disposition code to determine where to put away the returned items.

Disposition codes only applies to the receiving process

Copy
<table name="wmx_disposition">
    <column name='disp_code'       type='varchar'  size='15'                         required='y' info='The disposition code' />

    <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_disposition_code' columns='disp_code' />
</table>


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

11 Cargas y rutas predefinidas

El termino load o carga (load_id) corresponde a los productos que van a ser transportadas en un camión, un contenedor o una empresa externa. Generalmente agrupa productos de varios pedidos hasta completar los límites de volumen, anchura o altura que cabe en el profile o esquema de carga vinculado.

Por ejemplo, si tenemos un pedido de 1000 unidades y tenemos que servirlo en contenedores de 5 metros en los que solo caben 500 unidades, la linea de pedido, deberá romperse en dos lineas distintas de 500 unidades cada una en una "carga" distinta. (las 500 unidades puede corresponder a 10 pallets distintos)

Del mismo modo, pedidos distintos de varios clientes que van en el mismo camión, pueden ir a la misma carga.

A la hora de crear las cargas automaticamente,el profile puede tener en cuenta separar las cargas por rutas predefinidas. Las rutas predefinidas pueden definir los distintos destinos que serán asignados a la ruta predefinida y a la vez esta ruta puede ser un criterio de rotura a la hora de generar las cargas.

Caso especial: en el caso de FF, la ruta puede venir como un campo auxiliar en la orden y simplemente ser un criterio de rotura a la hora de generar las cargas. No haría falta que volvieramos a definir los criterios de rutas predefinidas tambien en el WMS.

https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/create-or-modify-an-outbound-load

We can group sales orders which will be delivered with one vehicle in a Load. That is, per delivery vehicle, we generate a Load which consists of the orders the vehicle will deliver.

Per load we can have useful info like total weight and volume (not to exceed vehicle's capacity), millage (haven't used this feature yet), etc.

Therefore, Load planning workbench gives good visibility on sales order lines so we can decide how to group them in Loads. Also it provides visibility of the status of the loads.

We have a Load template for each delivery vehicle. That's how we assign Loads to vehicles.

Load template - load template contains information about equipment and measures such as height, width, depth, and volume of the load. It use to define the capacity of a container that carry goods. System also update if defined template capacity less than the carrying goods.

Load Planning workbench - Load planning workbench basically provide a platform where we can create a load for inbound and outbound process.

we can use Load for inbound process when we use our own transportation services for pick the goods from a vendor in that case we use our own load template / vehicle and load planning process for complete inbound execution of process.

.

https://www.youtube.com/watch?v=XIzP6UUP2fs

12 Cycle Counting (Recuentos)

https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/perform-cycle-counting-in-a-warehouse-location

Se genera un registro de recuento que está vinculado a un trabajo. O sea los recuentos van vinculados a trabajos igual que las tareas. De hecho, a partir de una tarea en un trabajo, se puede generar un proceso de recuento debido a un faltante.

Una tarea de recuento est´s viculada a una tarea y es de ahi de donde coge la ubicación, Pero hay que analizarlo...

Copy
<table name="wmx_workcyclecount_line">
    <column name="work_id"      type="serialref"            required="y" info='The work identification number'/>
    <column name="task_id"      type="serialref"            required="y" info='Identification of task line'/> 
    <column name="client_code"  type="varchar"   size="10" required='y' /> <!-- Client WMS. Diferent clients can hace items with same code being distinct products -->
    
    <column name="item_code"    type="varchar"   size="16" required='y' /> <!-- codart: Identify item -->
    <column name="item_dimid"   type="varchar"   size="15" /> <!-- Identification of dimensions for the item.  -->	


Field 	Type 	Configuration key 	Description

QtyCounted 	Real	The quantity counted
QtyExpected Real	The quantity expected

AcceptReject 	    Enum	Specify whether this was accepted or rejected
AdjustmentWorkId    String	The adjustment work ID
CycleCountCounted   Enum	Confirm whether cycle counting was completed
CycleCountReconcile Enum	Reconcile the discrepancy in the inventory count
</table>

12.1 Cycle count thresholds

Permite introducir las condiciones que deben cumplir los articulos y/o ubicaciones determinadas para que se inicie un recuento en la ubicación

Por ejemplo, cuando una ubicación se quede con stock 0, queremos que se realice un recuento confirmando que hay 0.

https://www.youtube.com/watch?v=4s5uqx6XVz4

Copy
<table name="wmx_cyclecount_thres">
    <column name="cct_code"        type="varchar"   size="15"   required="y"             info="The unique identifier for the cycle counting threshold" />
    <column name="cct_name"        type="varchar"   size="50"   required="y"             info="Brief description of transaction" />
    <column name="cct_daysbetween" type="smallint"              required="y" default="0" info="The number of days before counting a location again" />
    <column name="cct_immediate"   type="char"      size="1"    required="y" default="Y" info="Process the cycle counting work as soon as the threshold is reached" />

    <column name='cct_uom_code'    type='varchar'   size='10'                            info='Unit symbol'/>
    <column name="cct_workpool_id" type="serialref"                                      info="The unique identifier for the work pool"/>
    <column name="cct_qty"         type="decimal"   size="14,4"                          info="The threshold quantity used to determine when cycle count work should be created " />
    <column name="cct_percent"     type="decimal"   size="14,4"                          info="The threshold percentage for items in a location for which cycle counting work is created" />

    <column name='location_filter' type='varchar'   size='255'                           info='Filter used in the qualification with location data' />
    <column name='item_filter'     type='varchar'   size='255'                           info='Filter used in the qualification with item data' />
    
    <column name='user_created'    type='varchar'   size='20'             required='y' default='user'    />
    <column name='date_created'    type='datetime'  size='year to second' required='y' default='current' />
    <column name='user_updated'    type='varchar'   size='20'             required='y' default='user'    />
    <column name='date_updated'    type='datetime'  size='year to second' required='y' default='current' />
</table>

13 Ajustements (Ajustes de inventario

Permite generar DPOS y DNEG (Incrementos o Decrementos de stock)

https://organicax.com/2016/02/15/wms-parameters-default-adjustment-type-code/

14 Move inventory with associated work

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/move-inventory-associated-work

inventory Reservation and pick work creation.

I have warehouse setup with two Zones and one zone is blocked for pick work creation and the other Zone is our Picking and work creation zone.

now i am getting work created with no Pick location.

additionally could use the inquiries 1 Work exceptions log 2 Work creation history log 3 Temporary work history along with location directive and directive code

Are you expecting work creation to fail in this scenario? Or are you expecting that you cannot reserve if there is not enough stock in the picking zone?

https://community.dynamics.com/ax/f/microsoft-dynamics-ax-forum/270688/put-locations-is-blank-in-work-line?pifragment-96834=1#responses

15 Locations

Blocking locations for inbound or outbound operations:

https://community.dynamics.com/365/financeandoperations/b/howtodynamics365/posts/how-to-block-inventory-location-for-transaction-in-dynamics-365

15.1 Location directives

Remember reservation is the first step to warehousing and there can be no work started in AX till you have reservation done however having reservation done and finding the pick location are two different things.

Check your sales order and you will find in the transactions as reserved physical. The reason why you are not getting a pick locations is issue with you location directive setup and that too for the pick one.

Another thing is that you have allowed th algoritm to create work despite location directive failing to find a pick location as you have kept the "stop work on location directives failures" unchecked for sales orders and this tells AX to go ahead and create a work if pick and put locations are not determined and AX creates a work with blank locations.

Worker has to determine the location manually and input in the mobile device.

Check you location directive setup again and the location where the stock is there should have its profile added in the query. Do share screenshots for allowing us to dig deeper.

https://sumitnarayanpotbhare.wordpress.com/2020/06/15/different-type-of-staging-locations-retail-warehouse-blueprint-approach-to-d365-for-commerce-with-adv-wh-mgmt/

15.1.1 Location directive picking aging

This topic explains how to use first in, first out (FIFO) and last in, first out (LIFO) location directive strategies during picking. These strategies work in conjunction with the aging dates that are recorded for locations to track when inventory first entered the warehouse. The Location directive inventory picking aging feature uses the date on the location to determine aging. The Warehouse location status feature updates the date on the location, based on the date from the license plate.

You can use FIFO and LIFO strategies to ship both batch-tracked items and non-batch-tracked items, based on the date when the inventory entered the warehouse. This capability can be especially useful for non-batch-tracked inventory, where an expiration date isn't available to use for sorting.

When inventory is first received or created in the warehouse, the system updates the relevant license plate so that the current date is shown as the aging date. This date is then used by the location directive strategies to identify the oldest or newest inventory in the warehouse. If inventory is moved to a location that isn't tracked by license plate, the location itself is updated with aging information, and this information will then be used by the strategies.

We need to add aging date to inventory location wmx_bin:

Aging date – The date when the inventory in the location was brought into the warehouse. This value is calculated based on the aging date of the license plate. It's accurate for locations that are license plate–tracked, but it might not be accurate for locations that aren't license plate–tracked.

16 Docking profiles

http://kashperuk.blogspot.com/2016/08/tutorial-anchoring-and-dock-management.html

Dock Management

https://community.dynamics.com/ax/f/microsoft-dynamics-ax-forum/229336/wms-dock-management-not-working

17 Trabajos y Tareas

En SGA 1 se trataria de las tablas wms_inhouse_stkmov_head y wms_inhouse_stkmov_line.

https://www.avantiico.com/ax-2012-r3-warehouse-work-template-configuration-and-purpose/

https://ellipsesolutions.com/dynamics-365-quick-observations-warehouse-work-templates/

17.1 Tareas pendientes de reaprovisionamiento

https://cloudblogs.microsoft.com/dynamics365/no-audience/2016/11/04/processing-work-that-is-awaiting-demand-replenishment/

17.2 Saltarse una tarea

Saltarse una tarea puede ser un caso individual de saltarse muchas tareas. Un caso general es cuando un operario, tiene que hacer picking en un pasillo al que no puede acceder en este momento y decide continuar en el siguiente, saltandose las tareas de picking de ese pasillo.

Técnicamente es una operación sencilla, pero debemos pensar en el detalle de la implementación en el interface de RF. Se nos ocurren distintos casos que debemos cumplir:

  • Saltarse una/s tarea/s y poder decidir cuando reemprenderlas.
  • Saltrase una/s tarea/s y ejecutarlas al final
  • Saltrase una/s tarea/s y solamente ejecutarlas si lo indicamos explicitamente (aunque sea respondiendo a una pregunta o con una opción del menú).

Además, si la tarea es opcional (una marca que deberiamos poner a nivel de tarea, tambien deberiamos poder anular una tarea y no volverla a ejecutar más

Si anulamos la tarea, la aplicación deberia marcar la tarea como "terminada" y además activar el indicador de "tarea no realizada" (skipped flag) para las estadísticas. La cantidad pendiente de realizar se quedará con la cantidad original, indicando que realmente la tarea no se ha realizado, pero como tenemos el indicador (skipped flag) sabremos que es porque el operario no ha querido.

17.3 Suspender y Resumir un trabajo

Un operario puede suspender un trabajo si es necesario. Si el trabajo es interrumpido, puede ser completado más tarde por otro operario, a menos que todo el trabajo haya sido asignado a un operario concreto. En este caso, solo este operario va a poder resumir el trabajo más tarde.

Para poder cumplir con este requerimiento, tenemos el campo: user_assigned_lock que indica si al suspender un trabajo, podemos quitar el usser_assigned y dejarlo a nulo otra vez para que otro operario pueda completar el trabajo, o si debemos mantener el usuario ya que ha sido forzado manualmente y solamente este operario puede resumir el trabajo.

Por este mismo motivo, debemos guardar a nivel de tarea el operario que ha ejecutado la tarea, ya que en un mismo trabajo mediante la suspensión y resumén, un mismo trabajo podría ser realizado por varios operarios.

Implementación:

Cuando asignamos un trabajo a un opeerario, ponemos el código del operario en el trabajo, campo user_assigned y (si nos interesa a nivel de SQL en las tareas en el campo user_id). Asumimos que un trabajo puede cambiar de operario y por lo tanto, en el trabajo siempre tenemeos el operario activo en este momento, mientras que en las tareas tenemos el usuario que efectivamente ha realizado la operación.

En el momento de suspender una tarea:

  • Si user_assigned_lock = 'Y' la marcamos como suspendida, pero no tocamos nada de los usuarios
  • Si user_assigned_lock = 'N' la marcamos como suspendida, ponemos el usuario del trabajo (user_assigned) a nulo, y ponemos a nulo todos los user_id de las tareas que no se hayan completado. Cuando un operario resuma la tarea, o un administrador la asigne a otro, pondremos los campos que hemos pasado a nulo con el código del nuevo operario, pero a nivel estadístico, en las tareas tendremos realmente los dos operarios, cada uno con las tareas que ha ejecutado físicamente.

No podemos permitir suspender un trabajo a mitad de una tarea. Se puede suspender un trabajo, pero no una tarea.

17.4 Work / LPN Consolidation

http://kashperuk.blogspot.com/2016/11/tutorial-license-plate-consolidation-in_71.html

17.5 Reverse Work

Reverse work o “Reverse license plate” es un proceso por el cual, un trabajo que esta "in process", lo cancelamos y ejecutamos las tareas correspondientes para devolver a las ubicaciones origen el stock que tenemos activo en el trabajo (Ubiación-usuario + LPN) y lo devolvemos a las ubicaciones de almacén origen o a otras en caso de que ya no pueda ir alli.

La idea, además de devolver el producto que tenemos en la cubeta, es que no conste en la orden ni en la expedición ni en la carga como producido. O sea se devuelve la cantidad coo pendiente ya que el trabajo original se cancela.

17.6 Cancel Work

Solamente se puede cancelar un trabajo que está pendiente de empezar, básicamente se anula el trabajo y se modifica la orden o expedición origen para que no conste como que ya tenemos trabajos pendientes de picking.

Además debemos implementar un proceso especial de cancelación física del trabajo para resolver circunstancias excepcionales. Vease: https://docs.microsoft.com/es-es/dynamics365/supply-chain/warehousing/cancel-warehouse-work

17.7 Asignación de matrícula a trabajos

Cuando vamos a empezar a realizar un trabajo, si el trabajo no tiene matrícula hay que asignarle una. Si la matrícula se entra manualmente o se genera automaticamente es algo que deberia ser configurable.

Supongamos que tenemos tres posibilidades de asignar una matrícula: automática, manual, referencia

En el método automático, simplemente tenemos en el almacen una secuencia de numeros para las matrícula que genera un numerador y lo asigna al trabajo

En el método manual, tenemos que poner un código de matrícula manualmente. En este momento, tenemos que verificar que no hay ningún otro trabajo abierto que tenga la misma matrícula ya que no podemos repetir la matrícula en dos trabajos abiertos. Si el otro trabajo está cerrado no pasa nada ya que puede tratarse de cubetas de picking que estamos reutilizando.

En el método referencia es exactamente igual que el método manual, pero permitimos dejar la matrícula en blanco y que el sistema nos genere una nueva automáticamente como si fuera un metodo automático.

.

Siempre que se asigna una matricula a un trabajo hay que verificar que no hay otro trabajo "no cerrado" que tenga esta misma matricula

Queda pendiente pensar la implementación de cómo indicamos que la generación de una nueva matricula por el secuenciador debe generar o no una etiqueta con el codigo de barras de la matricula o incluso con datos ya del destino.

17.8 Cálculo de tiempos en trabajos y tareas

Tanto a nivel de trabajos como de tareas tenemos dos campos de tiempo previsto y tiempo real que nos ofrecerán estadisticas de productividad a nivel de operario.

17.8.1 Tiempo estimado

El calculo del tiempo estimado, requiere un analisis y estudio de las operaciones del almacén y la introducción de los estandares de tiempo para cada tipo de operación según el tipo de producto, zona de almacen, etc. etc.

Cuanto más exhaustivo sea el analisis de tiempos estadisticos de las operaciones, más ajustado podrá ser el cálculo del tiempo estimado.

Sin embargo, el cálculo para cada trabajo y tarea del tiempo estimado puede requerir un coste en tiempo de operación del sistema. Y por lo tanto, debemos tener un método para activar o desactivar dicho cálculo. Pondremos en el maestro de almacenes un campo que nos indique si tenemos que realizar cálculos de tiempo estimado o no.

A labor standard is a formula used to calculate the estimated time it should take to perform a given class of work. Labor standards are derived from timestudies of associates actually performing the work. A timestudy is used to calculate statistically valid estimates for each element of a given class of work. An “element” is a step a worker performs when doing a job. For example, in picking there is an element for “Scan location” to confirm that the picker picked from the right location.

Once the timestudy is complete, as a result, we are getting out estimated times for executing a task, for example, 13.29 seconds for every line the user picks and 3.57 seconds for every unit he picks.

We can support two variables per standard (One for the Pick and one for the Put).

Case study:

The warehouse worker based on our timestudy needs 36 seconds in total to drive to a selected location (about 20 sec) and then, after picking, to the dock to deliver the goods (about 16 sec). At the picking location, he needs about 9 seconds per case to pick it up from the location and put it on the pallet on the forklift.

The shipping clerk, who does the loading, needs about 7.5 minutes per pallet that he needs to load on the truck.That is based on the volume of the pallet stacked with cases.

http://kashperuk.blogspot.com/2015/03/tutorial-using-labor-standards-in-new.html

https://www.linkedin.com/pulse/manage-labour-standards-using-warehouse-management-d365-sagar-suman/

Copy
<table name="wmx_labor_standard">
    <column name='laborstd_code'     type='varchar'  size='15'                          required='y' info='The unique code for the labor standard definition' />
    <column name='laborstd_name'     type='varchar'  size='60'                                       info='A description of the labor standard' />
    <column name='laborstd_type'     type='smallint'                                    required='y' info='The type of work order' />
    
    <column name='item_query'        type='varchar'  size='255'                                      info='The item query filter' />
    <column name='location_query'    type='varchar'  size='255'                                      info='The location query filter' />

    <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_labor_standard' columns='laborstd_code' />
</table>

<table name="wmx_labor_standard_line">
    <column name='laborstd_code'        type='varchar'  size='15'                          required='y' info='The unique code for the labor standard definition' />
    <column name='laborstd_ordnum'      type='smallint'                                    required='y' info='The sequence number for labor standards' />
    <column name='laborstd_workclass'   type='varchar'  size='15'                          required='y' info='The unique identifier for the work class ' />
    <column name='laborstd_worktype'    type='varchar'  size='15'                          required='y' info='The work type of the specified work line: pick, put, ...' />
<!--
0 	Pick
1 	Put
2 	Pick and put
-->
    <column name='laborstd_measurement' type='smallint'                                    required='y' info='The type of measurement to use for calculating the estimated time for completing the specified work line ' />
<!--
0 	Unit
1 	Work units
2 	Transactions
3 	Volume
4 	Weight
-->
    <column name='laborstd_workperhour' type='decimal'  size='14, 2'                       required='y' info='The estimated amount of work that can be completed per hour' />
    <column name='laborstd_uom'         type='varchar'  size='15'                          required='y' info='The unit to use for calculating the completion time of estimated 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' />

    <primary name='p_wmx_labor_standard_line'  columns='laborstd_code, laborstd_ordnum' />
    <foreign name='f_wmx_labor_standard_line1' columns='laborstd_code' references='wmx_labor_standard' refcols='laborstd_code' />
</table>

item_query y location_query son expresiones JavaScript en las que se sustituyen valores seleccionados: P.E. "'${codfam}'.match(/(FAM1|FAM2|FAM3/) || '${tipart}' == 'ESTUPE'". Debemos documentar los "metacampos" que podemos usar en la expresiones de filtrado y documentar ejemplos de expresiones para que cualquier implantador pueda configurar un filtro.

17.8.2 Tiempo real

Tareas

A nivel de tarea disponemos de tres campos que nos permitiran calcular el tiempo real de ejecución de cada tarea: task_start_dt, task_finish_dt y actual_time

Cuando el terminal empieza una tarea y muestra al opeario la ubicación a ir, marca la hora en el campo task_start_dt, una vez el operario ha completado la ejecución de la tarea se marca la hora en el campo task_finish_dt y se calcula el tiempo transcurrido entre el inicio y el final de la tarea y se guarda en segundos en el campo actual_time. (El tiempo minimo de ejecución es de 1 segundo (independientemente de task_start_dt y task_finish_dt) a no ser que la tarea se haya completado de forma automática o se cumplan algunos casos especiales que indicaremos a continuación.

No podemos distinguir el tiempo de trabajo del tiempo de viaje. El tiempo de viaje o traslado es el tiempo que a un opeario le lleva moverse de la posición en la que está en el momento de empezar una tarea a la ubicación en la que tiene que ejecutar dicha tarea. Si hiciera falta, esto sería tan sencillo como añadi otro campo timestamp en el que pudieramos guardar la hora en la que el opeario nos ha confirmado la ubicación. si no nos la requieren podemos continuar sin esta estadistica.

Caso especial: picking agrupado

Si agrupamos varias tareas en una única operacion del terminal (porque la ubicación, articulo, lote, etc. son iguales), los campos de hora inicio y fin, se actualizan como si se tratara de tareas individuales pero a la hora de calcular el campo actual_time, solamente se calcula para la primera de las tareas, dejando a 0 el resto de tareas agrupadas.

Caso especial: ejecución automática

Si una tarea se ejecuta automáticamente, se introduce en los campos de hora inicio y hora fin la hora en la que se ejecutado la tareas, y el campo de tiempo de ejecución queda a 0.

Trabajos

El cálculo del tiempo real de ejecución de un trabajo es un poco más complejo de calcular, ya que pueden haber bloques pick-put en los que se detenga el trabajo y despues se continue por otro operario. Por ejemplo, cuando tenemos un picking y despues la carga de los articulos en el camión en el mismo trabajo, pero que se ejecutan en momentos del tiempo distintos.

Por lo tanto, el tiempo real calculado a nivel de trabajo no es exactamente la suma de los tiempos calculados a nivel de tarea.

El tiempo a nivel de trabajo, analiza los bloques pick-put y para cada bloque toma el tiempo de inicio (que debe coincidir con el tiempo de inicio mas antiguo de la tarea pick) y el tiempo de finalización de la tarea put. La diferencia en segundos se acumula en el tiempo real del trabajo. Despues se hace lo mismo para otros bloques pick-put. Los tiempos transcurridos entre la tarea put y la siguiente tarea pick no se computan.

Supongamos que tenemos un trabajo que no tiene operaciones pick-put sino que solamente tiene tareas de recuento o de cambio de estado (fuera de un bucle pick-put). Para este tipo de tareas, el tiempo real del trabajo acumula directamente el tiempo real usado en la tarea.

Si tenemos un recuento en medio de un bucle, pick-put se sigue el algoritmo inicial ya que el tiempo entre la primera tarea pick y la tarea put enblobaria la ejecución de la tarea de recuento.

18 Estructuras de datos (work in progress)

18.1 Trabajos y 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, las pones en una caja de cartón y cuando hayas acabado, pones la caja en el muelle de transporte.

Que se traduce en un registro en wmx_worktask_head, dos registros de picking en wmx_worktask_line (uno para cada producto) y otro registro de "put" ara poner la caja de cartón en el muelle.

El número 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/XXhh272172(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/XXhh997397(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"                   required="y" /> <!-- bulkid: The work identification number  -->
    
    <column name="order_id"     type="serialref"                          /> <!-- The order number  (Orden de picking o pedido)    -->
    <column name="shipment_id"  type="serialref"                          /> <!-- The shipment identification number (Expedición o en ERP: Albaran de venta)-    -->
    <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 -->
    
    <column name='wh_code'           type='char'     size='10'       required='y' /><!-- Identify the warehouse -->

    <column name="work_transtype"      type="smallint"                  info='The type of work order for which a location directive is defined'   />
<!--
Name 	    Value 	Description
None 	        0 	None
Purch 	        1 	Purchase orders
Sales 	        2 	Sales orders
Invent 	        3 	Inventory movement

CycleCount 	    4 	Cycle counting
Replenishment 	5 	Replenishment

TransferIssue 	6 	Transfer issue
TransferReceipt 7 	Transfer receipt

WorkCancel 	    8 	Canceled work

ReturnOrder 	10 	Return orders
-->

    <column name="work_priority"    type="integer"                       /> <!-- The work priority number    -->
    <column name="work_status"      type="smallint" default='0' required='y'     /> <!-- The status of work          -->
<!--
Value 	Description
0 	Open
1 	In process
2 	Pending review
3 	Skipped
4 	Closed
5 	Canceled
6 	Combined
-->
    <column name="work_lpn"         type="varchar" size='20'             /> <!-- The target license plate Number for the 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="user_assigned_lock" type="char"    size='1' default='N' required='y' /> <!-- Y/N User is manually assigned/forced to execute this work (see suspend/resume analysis) -->

    <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='work_text'        type='varchar'  size='60'                    info='Text describing the transaction' />

    <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 
Frozen 	Enum Indicate whether the specified wave has been processed but not released 
InventJournalId  String Identification of the journal. 
 
WorkBuildId 	     String The work build identification number 
WorkCountError 	String The work error message 
WorkManuallyCompletedBy String	The AX user who manually completed the work 

WorkTemplateCode 	 String The unique code for the work template 
CycleCountPlanOverview 	Int64 Reference field in a different table 

<!-- =========================================================== -->
<!-- TASKS                                                       -->
<!-- =========================================================== -->
<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 o wmx_workhist_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"                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="orderline_id" type="serialref"                         info='The line number from the order' />
    <column name="shipment_id"  type="serialref"                          /> <!-- The shipment identification number (Expedición o en ERP: 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_class"     type="varchar"   size="15" /> <!-- The unique identifier for the work class  -->

	<column name="task_type"      type="smallint"  default="0" required="y"   /> <!-- tipo: The type of work -->
	<!--
0 	None
1 	Pick
2 	Put
3 	Counting
4 	Print

5 	Adjustments
6 	Quarantine
7 	License plate building
8 	Status change
9 	Custom
-->

	<column name="linenum"        type="integer"                           /> <!-- orden: Identification of line -->
	<column name="sortcode"       type="integer"                           /> <!-- antiguo priori ???? Es el orden con el que debemos hacer -->

    <column name="client_code"    type="varchar"   size="10" required='y' /> <!-- Client WMS. Diferent clients can hace items with same code being distinct products -->
    <column name="item_code"      type="varchar"   size="16" required='y' /> <!-- codart: Identify item -->
    
	<!-- Debemos reintroducir la dimension en los articulos o dejarlo unicamente en item_code ???? -->
	<!-- Puede la dimension, incluir tambien lote y caducidad ?? o lo ponemos en batchid como hasta ahora -->
	<column name="item_dimid"     type="varchar"   size="15" /> <!-- Identification of dimensions for the item.  -->	
    <column name="batchid"        type="serialref"           /> <!-- Identification of the source item lot -->

    <column name="gow"            type="varchar"   size="15" /> <!-- Source Inventory Goods Owner -->
	<column name="item_uom"       type="varchar"   size="15" /> <!-- Unit of meassure -->

    <!-- La unidad de medida, permite el tratamiento de cajas de origen o blisters -->
    <!-- Internamente, la tarea siempre va en unidades base, pero si el picking se hace en cajas de 25 y tenemos 50 unidades en qtywork -->
    <!-- En el interface de usuario podemos mostrar tanto "2 CAJAS" como "25 Unidades (Caja)" -->
    <!-- El factor de conversión para el primer caso lo obtenemos de las tablas de definición de unidades de medida de articulos -->
    <!-- Podriamos pensar que para no tener que ir haciendo cálculos cada vez que mostramos una tarea, podriamos almacenar tambien en esta tabla -->
    <!-- La relación entre la cantidad base y la cantidad en el almacen (de la unidad de medida). Por ejemplo, para mostrar las cajas no haria -->
    <!-- falta ir a la tabla de unidades de medida para dividir, sino simplemente coger este valor y dividir la cantidad base -->
	<column name="relbquwqu"        type="decimal"   size="14,4" default='1' required='y' /> <!-- Relation Base Quantity vs Warehouse Quantity  -->
	                                                                <!--  It defines the number of base quantity units for the warehouse quantity as a factor. -->

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

	<column name="task_zone"      type="varchar"   size="10" /> <!-- The ID for the source zone -->
	<column name="tssk_bin"       type="varchar"   size="20" /> <!-- Location in a warehouse. -->
	<column name="task_lpn"       type="varchar"   size="20" /> <!-- The license plate ID that is located for the work -->

<!-- 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 Used in Counting tasks -->

    <column name="user_id"           type="varchar" size='15'              /> <!-- The user for processing work / or has processed the work -->
	<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='task_start_dt'     type='datetime' size='year to second' /> <!-- horini: The date and time of work started-->
	<column name='task_finish_dt'    type='datetime' size='year to second' /> <!-- Horfin: The date and time of closed work -->
	<column name="task_status"       type="smallint" default='0' required='y' /> <!-- estado: The status of work -->
	<!--
0 	Open
1 	In process
2 	Pending review
3 	Skipped
4 	Closed
5 	Canceled
6 	Combined
	-->
	<column name="task_skipped"      type="char" size='1' default='N' required='y'            /> <!-- Y/N This task was skipped -->

	<column name="task_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

Por ejemplo isanchored solamente seria util para evitar el coste de tener que mirar si tengo que ir
a mirar ubicaciones alternativas o no en caso de no poder poner/sacar el producto de la ubicación indicada en la tarea.

is_anchored 	        Enum Specify whether the object is anchored to a location

Por ejemplo, podemos tener un trabajo con una tarea que baje un pallet y otra tarea que haga el picking sobre el pallet.
Podriamos hacer que la rotura se estableceria por work_type Pero supongamos que tenemos 3 lineas

1. Work class: PAL Task: Bajar Palet
2. Work class: OPE Task: picking
3. Work class: PAL Task: Subir palet
Podriamos asumir que al cambiar de work_class paramos, pero tambien podriamos usar un indicador para decir cuando un operario termina su parte de la
tarea y tiene que pasar a otro operario, dejando libre el usuario asignado de la tarea mediante este indicador. El hecho de asumir que los tipos de tarea
siempre fuerzan una parada, es algo "incorrecto" ya que nos restringe, por lo que acabaremos poniendo el indicador para definir cuando queremos parar.

work_stop 	                    Stop the transaction for the specified work line

LoadLineRefRecId       Int64    Reference field in a different table
AskForNewLicensePlate  Enum	    The work line requires a new license plate. 
Mandatory              Enum     Make the work line mandatory
WorkTemplateLineRecId  Int64    Reference field in a different table

Otra cosa a considera, si necesitamos poder buscar trabajos cuya primera tarea a ejecutar sea de una clase determinada, igual necesitamosguardarnos en el
trabajo el ID de la proxima tarea a ejecutar, lo que nos permitirá hacer este calculo fácilmente. Por contra, nos obliga a modificar el trabajo siempre
que completemos una tarea (Analizar)
-->

18.1.1 Work Pools

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

Setup > Work > Work pools

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

    <column name='workpool_code'      type='varchar'  size='15'       required='y' /><!-- Realmente no hace falta porque vamos siempre por ID, pero es como una descripción corta -->
    <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_wmx_workpool' columns='workpool_id' />
</table>

18.1.2 Work Class

Copy
<table name='wmx_workclass'>
    <column name='workclass_code' type='varchar'  size='15'       required='y' />
    <column name='workclass_name' type='varchar'  size='40'       required='y' info='Brief description of transaction'/>

<!-- Ponemos este campo para filtrar las clases de tareas dependiendo de si son para pedidos de compra, venta, recuentos, reposición, etc. -->
<!-- Correpondería con el campo work_transtype de la tabla de trabajos -->

    <column name='workclass_transtype' type='smallint' default='0' 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_wmx_workclass' columns='workclass_code' />
</table>



Name 	    Value 	Description
None 	        0 	None
Purch 	        1 	Purchase orders
Sales 	        2 	Sales orders
Invent 	        3 	Inventory movement

CycleCount 	    4 	Cycle counting
Replenishment 	5 	Replenishment

TransferIssue 	6 	Transfer issue
TransferReceipt 7 	Transfer receipt

WorkCancel 	    8 	Canceled work

ReturnOrder 	10 	Return orders

Work Class Valid Location Types: Permite definir los tipos de ubicación en los que la clase de tarea puede ejecutarse. De este modo una clase de tarea de tipo, mover palet, solamente puede ejecutarse en ubicaciones de palets.

Copy
<table name='wmx_workclass_loctype'>
    <column name='wcl_workclass_code' type='varchar'  size='15'       required='y' info='The work class'/>
    <column name='wcl_location_type'  type='varchar'  size='15'       required='y' info='The type of 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' />

    <!-- INDEXES -->
    <primary name='p_wmx_workclass_loctype' columns='wcl_workclass_code, wcl_location_type' />
    <foreign name='f1_wmx_workclass_loctype' columns='wcl_workclass_code' references='wmx_workclass' refcols='workclass_code'/>
</table>
Copy
<table name='wmx_location_type'>
    <column name='wlt_code'  type='varchar'  size='15'       required='y' info='Location/Bin type'/>
    <column name='wlt_name'  type='varchar'  size='60'       required='y' info='Description of 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_location_type' columns='wlt_code' />
</table>

18.1.3 Usuarios / Operarios

Debemos crear esta tabla que es la de operarios.

Copy
--------------------------------------
OPERARIOS
--------------------------------------
<table name="wmx_workuser">
    <column name="user_code"         type="varchar"  size='15' required='y' info='User idenrification'/>
    <column name="user_name"         type="varchar"  size='60' required='y' info='Full name of the user'/>
    <column name="user_passwd"       type="varchar"  size='25' required='y' info='User password'/>
    <column name="user_disabled"     type="char"     size='1'  required='y' default='N' info='Disabled user?'/>
    
    <column name="user_menuname"     type="varchar"  size='20'                          info='name of the RF menu'/>
    <column name="user_defaultwh"    type="varchar"  size='10'                          info='default warehouse for the user'/>

    <column name="loc_override_pick" type="char"     size='1' required='y' default='N' info='Allow the user to override the pick location during the work'/>
    <column name="loc_override_put"  type="char"     size='1' required='y' default='N' info='Allow the user to override the put location during the work'/>
    <column name="can_move_reserved" type="char"     size='1' required='y' default='N' info='Allow the user to move reserved inventory'/>
    <column name="workcount_isadmin" type="char"     size='1' required='y' default='N' info='Indicate whether the user is a cycle count supervisor'/>

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


WorkCountMaxPercent 	Real	The maximum percentage limit
WorkCountMaxQty 		Real	The maximum quantity limit
WorkCountMaxValue 	 	Real	The maximum value limit
Worker 	 Int64	The warehouse worker

<table name="wmx_workuser_warehouse">
    <column name='user_id'         type='varchar' size='15' required='y' info='User idenrification'/>
    <column name='user_wh'         type='varchar' size='10' required='y' info='Identify the warehouse'/>

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

    <primary name='p_wmx_workuser_warehouse'  columns='user_id, user_wh' />
    <foreign name='f1_wmx_workuser_warehouse' columns='user_id' references='wmx_workuser' refcols='user_id'/>
</table>

18.1.4 Gestion de existencias

Las tareas de tipi pick o put (al menos estas dos), siempre mueven las existencias entre dos posiciones

La tarea pick, mueve de las posiciones en la tarea a una ubicación automática (denominada "ubicación de usuario") correspondiente al usuario que está ejecutando la tarea y la matricula (LPN) correspondiente al trabajo.

La tarea put, mueve de la ubicación automática del usuario. Las existencias origen están en esta ubicación y a partir de ahi podemos filtrar LPNs, artículos, etc. para llevarlos a la ubicación destino de la tarea.

Las tareas, pueden congelar stock correspondiente al movimiento de la propia tarea y las tareas de pick y put moveran el stock a través de una tabla de "movimiento de existencias" que se detalla a continuación.

Una buena explicqción de como gestionar el inventario o existencias "on-hand", puede leerse aqui

http://kashperuk.blogspot.com/2018/10/tutorial-reading-on-hand-information.html

Copy
wmx_work_invent_trans
==================================================

Field 	Type 	Configuration key 	Description
WorkId 	 		String		The work identification number
LineNum 			Real	Identification of line.

InventTransIdFrom 	String		El ID de la transacción de inventario que reduce el inventario
InventTransIdTo 	String		El ID de la transacción de inventario que establece el inventario
InventTransDateTime	DateTime	Time when the transaction was processed.


ItemId 				String	Identify item.
InventTransIdParent	String	Identification of the item origin. (InventTransOrigin)

/*********
The InventTransOrigin table contains information about the inventory transaction originators. When the order lines,
such as sales order lines or purchase order lines, are created, they generate related records in the InventTransOrigin
and InventTrans tables. The records in these tables represent the flow of material that goes in and out of the inventory.
**********/

InventDimIdFrom		String	The dimension ID of the removing transaction
InventDimIdTo		String	The dimension ID of the replacing transaction

InventQty 			Real	Number of units 
InventQtyRemain		Real	Quantity not marked
WorkHasReservation 	Enum	Allow reservation for work 

    <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' />

    
No no **** wmx_work_trans *** No No



wmx_invent_trans - Inventory Transaction
===================================================


The inventTrans table is what I like to call the parent table of all transactions. 
NO matter what is performed a record will be written to this table when posting occurs. 
The wmx_invent_trans table represents a flow of inventory transactions as data leaves and enters a company for example.
If a product is ordered a status field will be set to ordered. If a item is transferred from one warehouse to another warehouse 
the status will then be set to transfer. The inventory transactions table is typically used for very detailed inventory reports.

InventSum classes are used to find the on-hand information of a certain item at a certain date. 
The InventOnHand class is used to find the current on-hand information.

InventMovement class validates and prepares data that will be used to generate inventory transactions.
All the classes related to the inventMovement class will be prefixed with InvMov

For instance the InvMove_Transfer preps data for inventory transfer journals

The InventUpdate classes are used to insert and update inventory transactions. Whenever a transaction should be posted, 
the updateNow() method in the correct InventUpdate subclass will execute. The super class in the hierarchy is the InventUpdate class,
and the other classes in the hierarchy are prefixed ‘InventUpd_’. For example, InventUpd_Estimated is used whenever an item line
is entered in the system that will most likely generate a physical transaction in the future. A good example can be a sales order line
that has the on-order sales status. When a line like this is entered or generated in AX, the InventUpd_Estimated is triggered
so that the inventory transactions will reflect that the item is on-order can is taken into consideration when the same item is ordered.



<table name='wmx_invent_trans'>

    <column name='trans_id'      type='serial'  required='y' />
    
    <!-- La mayoría de movimientos provienen de una tarea -->
    <!-- Registramos los enlaces con la tarea origen      -->
    <column name='work_id'       type='serialref'    /> 
    <column name='task_id'       type='serialref'    />
    
    <!-- Podemos obtener el usuario directamente desde la tarea
        --------------------------------------------------------
    <column name="user_code"     type="varchar"   size='15'              info='The user for processing work (IS this field required??)'/>
    -->
    <column name='trans_origin'  type='serialref' /><!-- Join with source document - line -->
    <column name='trans_date'    type='date'                required='y' default='today' info='Date when the transaction was processed'/>

    <column name='trans_client'  type='char'      size='10' required='y' />
    <column name="trans_item"    type="varchar"   size="16" required='y' />
    <column name='trans_itemdim' type='serialref'           required='y' default='0' />
    <column name='trans_batchid' type='serialref'           required='y' default='0' />
    <column name='trans_owner'   type='varchar'   size='12' required='y' />

    <!-- El lote y fecha caducidad, deberian ir en la tabla de itemdim ?? -->
    <!-- Si hacemos esto el problema es el GUI como permitiremos buscar un lote concreto ??-->
    <!--
    <column name='trans_batch'   type='char'     size='12'   />
    <column name='trans_bbdate'  type='date'                />
    -->
    
    <column name='trans_wh'      type='varchar'  size='10'   required='y' />
    <column name='trans_bin'     type='varchar'  size='16'   required='y' />
    <column name='trans_lpn'     type='varchar'  size='20'                info='LPN for the work'/>
   
    <column name='trans_qty'     type='decimal'  size='14,3' required='y' default='0' />
    <column name='trans_uom'     type='char'     size='6'    required='y' />
    <column name='trans_dualqty' type='char'     size='6'    required='y' default='0' />

    <column name='trans_status'  type='char'     size='4'    required='y' info='status of the inventory'/>
   
    <column name='row_disabled'  type='char'     size='1'    required='y' default='N' />

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

    <primary name='p_wmx_invent_trans' columns='trans_id' />
</table>

Field 	                Type 	Description
ParentLicensePlateId 	String	The parent license plate ID for the transaction

Inventario o stocks

Todas las existencias se obtienen a partir de la tabla de existencias (inventory onhand)

Una explicación interesante de como las ordenes y los trabajos utilizan las reservas de stocks la podemos ver aqui: https://axscm.wordpress.com/2016/05/10/understanding-on-hand-and-reservations-for-wms-controlled-items/

Un blog bueno sobre transfer orders y gestion del inventario puede encontrarse aqui: https://daxwhse.wordpress.com/category/microsoft-dynamics-ax/warehouse-management/page/2/

Big Larsen Blog:

https://axscm.wordpress.com/

Los conceptos que debemos terminar obteniendo en cualquier informe sobre existencias son los siguientes:

Column Description
Physical inventory The physical quantity that is available in inventory.
Physical reserved The total quantity that was physically reserved.
Available physical The available (not reserved) quantity that is available in physical inventory.
Available physical is a calculated field. The value equals the Physical inventory value minus the Physical reserved value.
Available physical on extra dimensions The available physical quantity for all the dimensions that are shown in the grid.
Ordered in total The total quantity that is included on inbound orders or that has a positive quantity in various inventory journals.
On order The total quantity that is included on outbound orders or that has a negative quantity in various inventory journals.
Ordered reserved The total quantity that is reserved on ordered receipts. The value in this field represents the total quantity of items in outbound transactions that have a status of Ordered reserved. Items that are reserved as ordered aren't physically available in inventory. Therefore, they can't be directly picked and delivered.
Available for reservation The total quantity of on-hand inventory that can be reserved.
Note: If the Reserve ordered items check box is selected on the Inventory and warehouse management parameters page, the value in this field includes expected receipts. If the check box is cleared, the value excludes expected receipts.
Total available The total available quantity.
Total available is a calculated field. The value equals the Available physical value plus the Ordered in total value minus the On order value.
Quantity on Order  - how many units are currently listed on purchase orders, but haven't been received and added to inventory. Basically, units that are on the way.
Quantity Available - how many units remain to be sold.
Quantity Allocated - how many units are currently listed on work orders as allocated work order products.
Quantity on Hand   - sum of quantity available and quantity allocated. Basically, unsold units.
Copy
wmx_inventory - Inventory Onhand (InventOnhandTmp)
===================================================
<table name='wmx_inventory'>
    <column name='invent_wh'      type='varchar'  size='10'   required='y' />
    <column name='invent_bin'     type='varchar'  size='16'   required='y' info='Location in a warehouse'/>
    
    <column name='invent_client'  type='varchar'   size='10' required='y' />
    <column name="invent_item"    type="varchar"   size="16" required='y' />
    <column name='invent_itemdim' type='serialref'           required='y' default='0' info='Identification of dimensions for the item'/>
    <column name='invent_batchid' type='serialref'           required='y' default='0' info='Batch dimension'/>
    <column name='invent_owner'   type='varchar'   size='12' required='y' info='Inventory owner'/>

    <column name='invent_serial'  type='varchar'   size='20'  required='y' default='-' info='Serial Number'/>
    <column name='invent_lpn'     type='varchar'   size='20'  required='y' default='-' info='The license plate identification number'/>
    <column name='invent_status'  type='char'      size='4'   required='y'  info='status of the inventory'/>

    <column name='ordered'         type='decimal'  size='14,3' required='y' default='0' info='Units currently listed on inbound orders, but haven't been received'/>
    <column name='physical'  type='decimal'  size='14,3' required='y' default='0' info='Physical quantity available'/>
    <column name='reserv_ordered'  type='decimal'  size='14,3' required='y' default='0' info='Quantity reserved on quantity ordered'/>
    <column name='reserv_physical' type='decimal'  size='14,3' required='y' default='0' info='Quantity reserved of the physical quantity'/>
    <column name='physical_dual'  type='decimal'  size='14,3' required='y' default='0' info='Physical quantity dual available'/>

<!-- Atencion: Queda pendientes la unidad de medida -->

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

    <primary name='p_wmx_inventory' columns='invent_wh, invent_bin, invent_client, invent_item, invent_itemdim, invent_batchid, invent_owner, invent_serial, invent_lpn, invent_status' />
</table>

Field 	Type 	Description

InventSiteId 	  String   Identify the site
WMSPalletId 	  String  Unique ID for the pallet (Serial Shipping Container Code)
ConfigId 	    String   Descriptive name of configuration

Received 	    Real    Physical quantity received, but not posted
Deducted 	    Real     Quantity that has been physically deducted, but not posted.

InventColorId 	String   Descriptive name of color
InventSizeId 	String   Descriptive name of size
InventStyleId 	String   Descriptive name of style




ORIGENES DE DOCUMENTOS/TRANSACCIONES (trans_origin)
==================================================

origin_id	serialref	Summary number ID for transactions attached to the same inventory transaction.

Ref_category 		smallint	Specify the module that generated the transaction. (Invent_transtype)
Ref_code			String		docser del documento adjunto (Para facilitar busquedas y mejorar visualización
ref_cabid			serialref	Reference field in a different (transtype) table
ref_linid			serialref	Reference field in a different (transtype) table


Party 	 	Int64		Reference field (tercero - no es realmente necesario, solo para facilitar busquedas y mejorar visualización)
ItemId 		String		Identify item.
ItemDimId 	serialref	Identification of dimensions for the item.

El itemid e itemdimid no son necesarios, hay que evaluar si realmente vale la pena ponerlo como referencia o no hacen falta


Ref_category: Posibles tablas origen del documento. Puede ser smallint o simplemente un varchar
Name 	Value 	Description
Sales 	0 	Sales order
Production 	2 	Production
Purch 	3 	Purchase order
WHSWork 	201 	Work
WHSQuarantine 	202 	Quarantine
WHSContainer 	203 	Container

Dimensiones de inventario
==================================================


Field 	Type 	Configuration key 	Description
inventDimId 		String	Identification of dimensions for the item.
configId 	 		String	Descriptive name of configuration

inventBatchId 		String 	Batch dimension.
InventColorId 		String	Descriptive name of color

InventSiteId		String	Identify the site
InventLocationId 	String 	Identify the warehouse.
LocationId 			String	Location in a warehouse.

inventSerialId		String	Serial number dimension.
InventSizeId		String	Descriptive name of size
InventStyleId 		String	Descriptive name of style

wMSPalletId 	    String	Unique ID for the pallet (Serial Shipping Container Code)

MD5Hash o SHA1 		String	Hash code uniquely identifying this subset of inventory dimensions

18.1.5 Cambio de estado del inventario

Mediante las tareas tambien debemos de poder mover o cambiar el estado del inventario

Este modelo está pendiente de analizar en detalle, pero la primera aproximación es tener en cada tarea un estado origen y un estado destino. Dependiendo de la plantilla del trbajo, podriamos tener un tipo de linea de plantilla "Cambio de estado" y en este caso que preguntara el estado destino y reasignara en el stock el estado.

Esta operación podria realizarse tanto al mismo tiempo que se mueve el stock o sin mover el stock y cambiando simplemente el estado.

La linea de la plantilla del trabajo, es la que nos determinará qué es lo que preguntará el interface de RF y lo que será imprescindible confirmar y los campos que se podrán saltar o no conrirmar.

Como explica el ejemplo externo, el problema es cuando debemos de permitir que el operario nos diga a que estado quiere pasar el inventario.

En el ejemplo mostrado a continuación, se definen unas operaciones de cambio de estado que indirectamente determinan para un estado origen que estado destino se va a quedar.

Esta es otra aproximación al algoritmo: Definimos un único campo que nos indique el tipo de operacion de cambio de estado y este tipo de operación nos moverá el stock.

Por ejemplo, supongamos que tenemos una ubicación con 40 unidades: 10 disponibles y 30 en cuarentena. Y se derrama liquido por encima y queremos bloquear las 40 unidades, podriamos hacer un trabajo que para 40 unidades de la ubicación XX, ejecutara el cambio de estado de tipo "Bloquear", esto pasaría las disponbiles a "bloqueadas" y las de cuarentena a "cuarentena bloqueada", aunque la acción elegida por el usuario es siempre la misma inpendientemente del estado original del stock ¿Se entiende?

WHS Work status change code

You'd need to have at least 2 Pick/Put pairs on the work template.

  • Pick
  • Put with directive code = QMS (for example)
  • Status change
  • Pick, Stop work = true, probably also a different work class ID here and next line
  • Put

Then you'd define the Work status change codes, and tie them to a specific inventory status - let's say, "Blocked".

Then on the work template line you'd link that to that status. There's no lookup, but the description will get populated if you typed in the value right :)

Then you'd define a corresponding location directive with Directive code = QMS, so items are moved to an inspection area.

With that setup, when you execute the first Pick/Put pair for the purchase order putaway, the status of the line will be automatically changed to Blocked.

However, this functionality does not work well, and with a high likelihood will be removed in future releases, so I wouldn't put my money on it :)

18.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

.

Generalmente, el origen de cualquier operación de almacén son las ordenes o las notas de entrega (shipments). La generación del lanzamiento por oleadas, nos permite la asignación de las operaciones a una oleada, y la posibilidad de generar tablas temporales y agrupación de operaciones sin temor a que haya otro proceso que simultaneamente nos este cogiendo las misma ordenes o notas de entrega y las esté procesando en paralelo. O sea nos permite asegurarnos que no habrá concurrencia y que se generararán trabasjos en paralelo para una misma orden.

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_wave_head' columns='wave_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>


------------------------
EN ANALISIS
------------------------
    <table name="wms_wavetemplate_line">
        <column name='wave_template'    type='varchar'  size='15' required='y' />       <!-- The name of the wave template used to create this wave -->
        <column name='wave_step'        type='integer'            required='y' />       <!-- The sequence number in which the method is called -->

        <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_line' columns='wave_template' />
    </table>
Field 	Type 	Configuration key 	Description
PostMethodName 	String  The name of the method to be called 
WaveStepCode 	String	The code to determine how wave step will be treated
WaveTemplateName 	String	The name of the wave template


    <table name="wms_wave_postmethod">
        <column name='wpm_name'    type='varchar'  size='15'     />       <!-- The name of the method to be called  -->

        <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_wave_postmethod' columns='wave_template' />
    </table>

Field 	Type 	Configuration key 	Description
OptionalMethod 	Enum    Specify whether the method is optional
PostMethodName 	String  
PostMethodPos 	Integer The position in which the method will be called 
RepeatableStep 	Enume   Make the method repeatable for the wave template 
WaveTemplateType 	Enum    The type of wave template

18.3 Cargas - Unidades de envio y Rutas (Loads & Routes)

ANALISIS EN CURSO - NO IMPLEMENTAR

Copy
<table name="wms_load_head">
        <column name="load_id"    type="serial"   default="0" required="y" info="The identification number for the load "   />

        <column name='load_reference' type='varchar' size='20'                info='The external reference number on the load ' />
        <column name='route_code' type='varchar'     size='20'                info='The unique identifier for the planned freight route' />

        <column name='load_sched_ship_dt'   type='datetime' size='year to second' info='The scheduled shipping date and time for the load' />
        <column name='load_ship_confirm_dt' type='datetime' size='year to second' info='The date and time the load was ship confirmed' />
        <column name='load_arrival_dt'      type='datetime' size='year to second' info='The arrival date and time of the load' />
        <column name='reauired_sail_dt'     type='datetime' size='year to second' info='The date and time the vessel is required to sail' />

        <column name='load_status'      type='char'    size='1'                        info='The status of the load' />
        <column name='late_ship_reason' type='char'    size='1'                        info='The reason the shipment is late' />
        <column name='loader'           type='varchar' size='20'                       info='Person responsible for loading' />
        <column name='car_number'       type='varchar' size='20'                       info='The identifier for a car' />
        <column name='tractor_number'   type='varchar' size='20'                       info='The unique identifier for the tractor' />
        <column name='trailer_number'   type='varchar' size='20'                       info='The unique identifier for the trailer' />
        <column name='vessel_name'      type='varchar' size='20'                       info='The name of the vessel' />
        <column name='voyage_number'    type='varchar' size='20'                       info='The unique identifier for a voyage' />

        <column name='inspection_seal'  type='varchar' size='20'                       info='The unique seal for the inspection' />

        <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' info='The date and time the record was last updated' />
    </table>
    
    
Field 	Type 	Configuration key 	Description

AccountNum 	            String  The vendor account number for the purchase order, or the customer account number for the sales order
BillOfLadingId 	        String	The bill of lading identification number
BookingNum 	            String  The unique booking number for a load
BrokerCode 	            String	The unique identifier for the broker who booked the transportation
CarrierCode 	        String  The unique identifier for the shipping carrier
CarrierGroupCode 	    String	The unique identifier for the carrier group
CarrierServiceCode 	    String  The unique identifier for the carrier service
CustVendRef 	        String	Either a customer reference or vendor reference number
CutOffUTCDateTime 	    UtcDateTime The cut off date and time
DestinationHubCode      String  The unique identifier for the hub master
DestinationName 	    String  The description of the object
DestinationPostalAddress  Int64 Reference field in a different table
ETA 	                UtcDateTime The items estimated time of arrival
ETD 	                UtcDateTime	The estimated time of departure for the item
FinalDestination 	    Enum    The final destination for the load.
HouseBill 	            String	The unique identifier for the house bill 
Invalid 	            Enum	Indicates if the load is invalid.

InventLocationId 	    String	Identify the warehouse.
InventSiteId 	        String  Identify the site 

LastUpdateUTCDateTime 	UtcDateTime	The date and time the record was last updated 
LateShipReasonCode 	    String  The reason the shipment is late 
LoadArrivalUTCDateTime 	UtcDateTime The arrival date and time of the load
LoadDirection 	        Enum	The direction of the record for the load 
LoadFloorStack 	        Enum	Specify if the load floor is stacked 
LoadPaysFreight         Enum   Specify whether the load will write off freight charges 
LoadReferenceNum 	    String	The external reference number on the load 
LoadSchedShipUTCDateTime 	UtcDateTime	The scheduled shipping date and time for the load 
LoadShipConfirmUTCDateTime 	UtcDateTime 	The date and time the load was ship confirmed 
LoadStatus 	            Enum   The status of the load 
LoadTemplateId 	        String  The load template ID

LoadTipVolume 	        Real	The load tip volume
LoadTipWeight           Real	The load tip weight 
LoadTypeId 	            String	The load type
LoadUserDef1 	        String	User defined field 1.
LoadUserDef2 	        String	User defined field 2.
LoadUserDef3 	        String	User defined field 3.

ActualGrossWeight 	    Real	The actual gross weight
ActualNetWeight 	    Real    The final weight of an object
ActualTareWeight 	    Real	The actual tare weight
LoadNetWeight 	        Real    The net weight of the load 
LoadWeight 	            Real    The weight of the load
LoadWidth               Real    The width of the load
LoadHeight 	            Real    The height of the load 
LoadDepth 	            Real    The depth of the load 

MaxFreightPieces        Integer The maximum number of freight pieces allowed 
ModeCode 	            String  The unique identifier for the mode 
OrderNum 	            String	The order number 
OriginHubCode 	        String  The unique identifier for the hub master
OriginName 	            String  The description of the object
OriginPostalAddress 	Int64   Reference field in a different table
ProNum 	                String  The pro number 
SailUTCDateTime 	    UtcDateTime	The Sail UTCdate time for the route.
SealNum                 String  The seal number 
SystemTareWeight 	    Real    The system generated tare weight 

TransportationTemplateId String The unique identifier for the transportation template
	
    <table name="wms_load_line">

        <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>
    
Field 	Type       	Description
LoadId 	            String  The identification number for the load 
Invalid             Enum    Indicates if the load line is invalid
ItemId 	            String  Identify item. 
InventDimId         String	Identification of dimensions for the item.
InventQty 	        Real    The quantity in the lowest unit
InventTransId 	    String	Identification of the item lot.
InventTransType     Enum    Specify the module that generated the transaction. 
LoadClosedUTCDateTime 	UtcDateTime The date and time the load was closed 
LoadDirection 	    Enum    The direction of the record for the load 
LoadInProcessUTCDateTime    UtcDateTime	The date and time the load was in process
LoadOpenUTCDateTime         UtcDateTime The date and time the load was opened 
LoadReadyToShipUTCDateTime 	UtcDateTime    The date and time the load was ready to ship 

OrderNum 	            String  The order number
OverDeliveryPct         Real	The percentage by which the product receipt quantity is allowed to exceed the order quantity
PackingQty              Real	Number of units 
ParentInventTransType 	Enum    Specify the module that generated the transaction.
ParentOrderNum 	        String	The order number 

PickedQty 	            Real	Quantity that has been picked 
QCQty 	                Real	The quantity in the inventory unit, currently in quality control location 
Qty 	                Real   Number of units
QtyLeftToStructure 	    Real    The inventory quantity remaining to be structured
ReleaseToWarehouseId 	String The unique identifier for the release to warehouse table
ShipmentId 	            String	The shipment identification number
TransportRequest 	    Enum   The load line is a transport request line
UnderDeliveryPct 	    Real   The percentage by which the product receipt quantity is allowed to be less than the order quantity
UOM 	                String      The unit or measure
WorkCreatedQty 	        Real    The quantity that already has work created for it
Copy
<table name="wms_routes">
        <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>
    
Field 	Type 	Configuration key 	Description
RouteCode 	        String	The unique identifier for the planned freight route
Name 	            String      The description of the object
ApptUTCDateTime     UtcDateTime	The appointment date and time
CurrencyCode        String      Current currency code 
DeliveryUTCDateTime UtcDateTime The delivery date and time
Description         String      Brief description of transaction
InventLocationId    String	    Identify the warehouse.
InventSiteId 	    String      Identify the site
Manual 	            Enum        Specify whether this is a manually created object
RouteConfigCode     String The unique identifier for the route configuration 
RouteGuideRecId     Int64 The record ID for the route guide
RoutePlanName 	    String	The description of the object 
RouteStatus         WHSandTMS 	
ShipUTCDateTime  UtcDateTime	The date and time the object was shipped
TransportationOrderNum 	 String The transportation order number

18.4 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

A la hora de hacer asignación automatica de trabajos a un cluster ya existente (System driven) el criterio puede ser que la orden mueva elementos de la misma zona

Esto en la version anterior era plausible, pero hora los trabajos pueden contener tareas que afectan a multiples zonas, por lo que no podemos hacer filtrado por zonas. Por lo tanto, tendremos que usar mecanismo más inteligentes como la primera y ultima ubicación de cada trabajo. Cuando generamos un cluster y obtenemos un trabajo aleatoriamente (el primero, mas prioritario, etc.), cuando el sistema deba adjudicar otro trabajo, buscará trabajos con la primara y ultima ubicación lo más cercana posible a la primera y ultima utibicación del cluster.

Otro método podria continuar vinculado a las zonas, pero esto nos obligaria a romper las zonas en elementos má pequeños y a partir de ahi, evaluar otros trabajos que tengan tareas en las mismas zonas que el cluster al que va a ser asignado. Hay que analizarlo, pero es posible que la busqueda por ubicaciones lo más "cercanas" posible a la ubicación minima del cluster pueda ser un buen algoritmo.

Copy
<table name="wmx_workcluster_head">
        <column name="cluster_id"           type="serial"    default="0" required="y" info='A unique identifier for the cluster'  />

        <column name='clus_type'            type='char'     size='1'      required='y' /><!-- [I]nbound/[O]utbound clusters -->
        <column name='clus_template'        type='varchar'  size='15'                  info='Code for the cluster template' /> 
        <column name='clus_user_assigned'   type='varchar'  size='15'                  info='The user who locked this record' /> 
        <column name='clus_status'          type='smallint'   default='0' required='y' info='The status of the work cluster'/>
                                                                                   <!-- 0 	Open, 1	In process, 2 Passed, 3	Closed -->

        <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_workcluster_head' columns='cluster_id' />
    </table>

    <table name="wmx_workcluster_line">
        <column name="cluster_id"           type="serialref"    required="y" info='The cluster identification number'  />
        <column name="work_id"              type="serialref"    required="y" info='The work identification number'  />

        <column name='clus_position'        type='varchar'  size='15'  required='y'   info='The position within the work cluster' />
        <!-- Se copia de wmx_cluster_template_line.ctl_position, se pide manualmente o se genera con una secuencia numerica -->
        <!-- dependiendo de la plantilla usada -->
        <!-- Es el identificador de la posición: String porque puede ser un código de barras prefijado en el carro -->
        <!-- En el momento de la creación, se vincula a un trabajo y por lo tanto ya tenemos, el codigo de barras de la
             posicion en el carro + el codigo de barras de la cubeta (LPN del trabajo) -->
        
        <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_workcluster_head' columns='cluster_id, clus_position' />
        
        <!-- No sé si tiene sentido un trabajo que acabe en varios clusters, pero lo que no puede ser
             es que el mismo trabajo se asigne dos veces al mismo cluster -->
        <unique name='u1_wmx_workcluster_head' columns='work_id, cluster_id' />
    </table>
Copy
<table name="wmx_cluster_template_head">
        <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='cluster_type'     type='char'     size='1'  required='y' />       <!-- [I]nbound/[O]utbound clusters -->
        
        <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-->
        <!-- Select Position scan. This field determines whether the put-to-position step is verified. -->
        <column name='position_verify'   type='char'     size='1' required='y' default='N' /><!-- The type of verification that is performed when clustered work is sorted -->

        <!-- Select the action that will break up the cluster. You can break a cluster when either the picking or put away work is completed. -->
        <column name='break_cluster_at'  type='char'     size='1'  /><!-- Put, Work Close -->
        <column name='assignment_timing' type='char'     size='1'  /><!--  -->
        <column name='assignment_rule'   type='char'     size='1'  /><!--  -->
        <!-- Regla de asignación de clústeres: Manual, Sistema, Otros??

        Este campo define si la asignación de clúster se debería determinar automáticamente por el sistema
        o hacer manualmente por el usuario.
        -->
        
        <column name='putaway_locate'    type='char'     size='1'  /><!-- Receipt, Cluster close, User directed -->

        <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_cluster_template' columns='cluster_code' />
    </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.

    
    Gracias a poder especificar individualmente los nombres de las posiciones, nos permite asimilar una plantilla de cluster
    como si fuera un carro (trolley). Cada carro tiene su plantilla, y cada posicion tiene su identificador unico (ctl_position)
    A la hora de validar la posicion, se puede hacer tanto por el numero de cubeta o LPN de la orden, como por el codigo de la
    posición indicado en esta tabla.
    <table name="wmx_cluster_template_line">
        <column name='cluster_code'     type='varchar'  size='15' required='y' />       <!-- Template code -->
        
        <column name='ctl_sortnum'       type='smallint'           required='y' />       <!-- Sort order of position -->
        <column name='ctl_position'      type='varchar'  size='15' required='y' />       <!-- Position identification barcode-->
        
        <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_cluster_template_line' columns='cluster_code, ctl_sortnum' />
    </table>

18.5 Diseño de almacén

18.5.1 Almacenes

Copy
--------------------------------------
RECINTOS
--------------------------------------
Original: InventSite

<table name='wmx_site'>
    <column name='site_code'         type='char'     size='10'       required='y' />
    <column name='site_name'         type='varchar'  size='40'       required='y' />

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

    <primary name='p_wmx_site' columns='site_code' />
</table>

DefaultInventStatusId 	    String  The default inventory status ID on inventory transactions
OrderEntryDeadlineGroupId 	String  Order entry deadline group used for transfer orders
TaxBranchRefRecId 	        Int64   The identification number of the tax branch. 
Timezone 	                Enum    Time zone for the site
	

--------------------------------------
ALMACENES
--------------------------------------
Original: InventLocation

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

Warehouse - 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='wmx_warehouse'>
    <column name='wh_code'           type='char'     size='10'       required='y' info='Identify the warehouse'/>
    <column name='wh_name'           type='varchar'  size='40'       required='y' info='Description of the warehouse'/>
    <column name='wh_alias'          type='varchar'  size='15'                    info='Alias used in printed documents' />

    <column name='wh_site'           type='char'     size='10'       required='y' />
    
    <column name='wh_printer_group'  type='varchar'  size='10'                    info='Group or printers to use in this warehose'/>
    <column name='wh_status'         type='char'     size='1'        required='y' />

<!--
    <column name='wh_address'        type='nvarchar' size='60' />
    <column name='wh_city'           type='nvarchar' size='60' />
    <column name='wh_country'        type='varchar'  size='60' required='y'/>
    <column name='wh_postcode'       type='varchar'  size='10' />
    <column name='wh_region'         type='varchar'  size='60' />
    <column name='wh_business_phone' type='varchar'  size='15' />
    <column name='wh_business_email' type='varchar'  size='40' />
-->

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

    <!-- INDEXES -->
    <primary name='p_wmx_warehouse' columns='wh_code' />

	<foreign name='f1_wmx_warehouse'  columns='wh_site'  references='wmx_site'      refcols='site_code' />
</table>

Field 	Description
ActivityType_RU 	        String     Activity type of department responsible for the warehouse.
AllowLaborStandards 	    Enum       Allows labor standards to be used in the warehouse 
AllowMarkingReservationRemoval Enum    Remove reservations if inventory status changes 
BranchNumber 	            String     Identification of a company unit.
ConsolidateShipAtRTW 	    Enum       Consolidate similar sales orders 

CustAccount_HU 	            String     Customer account number if the warehouse is placed at a customer.
CycleCountAllowPalletMove 	Enum       Allow cycle counting to automatically move pallets located elsewhere in the warehouse 

DecrementLoadLine 	        Enum       Determine whether the load line quantity is decremented during the cancellation of shipping 

DefaultShipMaintenanceLoc 	String     The default location inventory will be moved during shipment maintenance processes 
DefaultStatusId 	        String     The default inventory status ID on inventory transactions 
emptyPalletLocation 	    String     Location where empty pallets automatically are placed.
FSHStore 	                Enum       Is this location a store?
InventCountingGroup_BR 	    Enum       Specify warehouse location.
InventLocationId 	        String     Identify the warehouse.
InventLocationIdGoodsInRoute_RU String Warehouse used to store items shipped with postponed passing of property.
InventLocationIdQuarantine 	String     Identify the warehouse.
InventLocationIdReqMain 	String     Warehouse to refill from when activating refilling
InventLocationIdTransit 	String     Warehouse used to identify and handle items in transit.
InventLocationLevel 	    Integer    Level in relation to the main warehouse where the warehouse is located.
InventLocationType 	        Enum       Warehouse type
InventProfileId_RU 	        String     Inventory profile.
InventProfileType_RU 	    Enum       Kind of activity.
InventSiteId 	            String	   Identify the site
Manual 	                    Enum       Are all items in the warehouse coverage planned manually (that is no planned orders, transactions and on-hand)?
maxPickingRouteTime 	    Integer    Maximum time per picking route
maxPickingRouteVolume 	    Real       Maximum volume per picking route
Name 	                    String     Description of the warehouse.
NumberSequenceGroup_RU 	    String     Group for allocation of different number sequences to different customers/vendors.
pickingLineTime 	        Integer    Time for pick of 1 line (picking route transit time)
PrintBOLBeforeShipConfirm 	Enum       Print the bill of lading before confirming the shipment 
ProdReserveOnlyWhse 	    Enum       Indicate whether to reserve production raw materials to the warehouse level and ignore the rest of the inventory dimensions on the bill of materials line 
RBODefaultInventProfileId_RU String    The inventory profile that is applied to retail transactions
RBODefaultWMSLocationId 	 String	   The warehouse location used for retail transactions. (This field applies only to the following version(s): Microsoft Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 R2 (SYS), Microsoft Dynamics AX 2012 Feature Pack (SYS))
RBODefaultWMSPalletId 	    String     The default pallet ID for retail transactions. (This field applies only to the following version(s): Microsoft Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 R2 (SYS), Microsoft Dynamics AX 2012 Feature Pack (SYS))
RemoveInventBlockingOnStatusChange 	Enum    Remove inventory blocking when the inventory status changes 
ReqCalendarId 	            String     Work-days calendar. When no coverage group is specified, used to calculate order date, requirement date, and preferred delivery date.
ReqRefill 	                Enum       Refill as per requirement via planned transfer from the main warehouse?
ReserveAtLoadPost 	        Enum       Run inventory reservations during load posting 
UniqueCheckDigits 	        Enum       Use unique check digits for the warehouse 
useWMSOrders 	            Enum       Use setting from item model group or overrule the setting for this warehouse.
VendAccount 	            String     Vendor account number if the warehouse is placed at a vendor.
WarehouseAutoReleaseReservation Enum   Reserve inventory when the periodic job that releases to the warehouse is used 
WHSEnabled 	                Enum       Indicate that the warehouse is controlled by processes defined for warehouse management and the use of reservation hierarchy 
WMSlocationIdDefaultIssue 	String     Location proposed for inventory issues of sales orders, production lines, etc. when nothing else is specified
WMSLocationIdDefaultReceipt String     Location proposed for inventory receipts of purchase orders, productions, etc. when nothing else is specified
WMSLocationIdGoodsInRoute 	String     Location used to register items shipped and stocked in the warehouse.






--------------------------------------
ZONAS DE ALMACEN
--------------------------------------
Original: wms_wh_zonlog y wms_wh_subzon
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.

The zone group is meant as a group of physical zones in a warehouse. The location type should reflect the purpose of the locations.

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

<table name="wmx_zone">
    <column name='zone_code'    type='varchar'  size='10' required='y' />
    <column name='zone_name'    type='varchar'  size='40' />
    <column name='zone_whcode'  type='varchar'  size='12' required='y' />
    <column name='zone_group'   type='varchar'  size='10' required='y' />

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

--------------------------------------
PASILLO
--------------------------------------
<table name="wmx_aisle">
    <column name='aisle_wh'       type='varchar'  size='12' required='y' />
	<column name='aisle_num'      type='smallint' required='y' />
	<column name='aisle_name'     type='varchar'  size='60'  />
	<column name='sortnum'        type='integer' />
	<column name='sortdescending' type='smallint'                       default='1'       required='y' info='1: Ascending, -1: Descending'/>

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

18.5.2 Ubicaciones

Esquema de ubicaciones

Copy
--------------------------------------
UBICACIONES
--------------------------------------
<table name="wmx_bin">
    <column name='bin_wh'             type='varchar'  size='12' required='y' />
    <column name='bin_code'           type='varchar'  size='15' required='y' />
    <column name='bin_name'           type='varchar'  size='30'                         info='Manual update of location name' />
    <column name='bin_zone'           type='varchar'  size='10' required='y' />
    
    <!-- En el futuro podriamos añadir una o dos zonas adicionales para poder realizar
         operaciones sobre ubicaciones usando distintos criterios de agrupación en zonas

        Additional Zone 1 field, select PICKZONE1.
        Additional Zone 2 field, select WEBSHOP1.
    -->

    <column name='bin_check_txt'      type='varchar'  size='10'                         info='Check text for location: for voice picking or easy alias'/>
                                      
    <column name='location_type'      type='varchar'  size='15'                         info='Location type - Use of location'/>
    <column name='location_profile'   type='varchar'  size='15'                         info='Location profile'/>
                                      
	<column name='sortnum'            type='integer'                                    info='Sort order of locations'/>
	<column name='sortdescending'     type='smallint'          required='y' default='1' info='1: Ascending, -1: Descending'/>
	<column name='sortmanual'         type='char'     size='1' required='y' default='N' info='Manual update of sort code. Preserve Sort Num'/>

    <!-- A rack usually contains all locations between two standing poles, a level is a shelf or a horizontal beam, a bin is a position on the shelf or beam. -->
	<column name='bin_aisle'          type='smallint'          required='y'             info='Aisle in a warehouse'/>
	<column name='bin_rack'           type='smallint'          required='y'             info='Rack in an aisle in a warehouse'/>
	<column name='bin_level'          type='smallint'          required='y'             info='Shelf in a rack in a warehouse'/>
	<column name='bin_position'       type='smallint'          required='y' default='0' info='Bin position for location in a shelf'/>
                                      
	<column name='bin_volume'         type='decimal' size='12,2' info='Volume of the location'/>
	<column name='bin_depth'          type='decimal' size='12,2' info='Depth of the location'/>
	<column name='bin_width'          type='decimal' size='12,2' info='Width of the location'/>
	<column name='bin_height'         type='decimal' size='12,2' info='Height of the location'/>
	<column name='bin_abs_height'     type='decimal' size='12,2' info='Height above ground level'/>
                                      
	<column name='bin_max_volume'     type='decimal' size='12,2' info='Maximum volume that can be stored on the location'/>
	<column name='bin_max_weight'     type='decimal' size='12,2' info='Maximum weight that can be stored on the location'/>
    <column name='bin_max_lpn'        type='smallint'            info='Maximum number of License Plates possible on the location'/>

    <column name='storage_area'       type='varchar' size='10'   info='Inbound area code in the location system'/>
    <column name='picking_area'       type='varchar' size='10'   info='Picking area code in the location system'/>
                                                                 
    <column name='input_block_cause'  type='varchar' size='10'   info='Reason why a location has been blocked for storage'/>
    <column name='output_block_cause' type='varchar' size='10'   info='Reason why a location has been blocked for picking'/>
                                                                 
    <column name='last_counted'       type='datetime'            info='The date and time when the location was last counted'/>
    <column name='last_activity'      type='datetime'            info='The date and time when the location had last activity'/>

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

<!-- Renombado a bin_max_lpn -->
<column name='bin_max_container'    type='smallint'           info='Maximum number of containers possible on the location'/>
<column name='bin_container_tgroup' type='varchar' size='10'  info='Name for group of pallet types allowed in location'/>

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)

ReservationPriority Integer Locations of a higher reservation priority will be utilized first.

locationStatus – The status of the location. There are four possible values:

    Undetermined – The location profile can't track status. Therefore, the current status is unknown.
    Empty – There is currently no inventory in the location.
    Picking – Outbound transactions have been performed against the location since it was last empty.
    Storage – Only inbound transactions have been performed against the location since the location was last empty.

--------------------------------------
UBICACIONES - MOTIVOS DE BLOQUEO
--------------------------------------
<table name="wmx_bin_block_cause"> <!-- Reason why a location has been blocked. ->
    <column name='cause_code'        type='varchar'  size='10' required='y' info='Blocking Cause Id Code'/>
    <column name='cause_name'        type='varchar'  size='40' required='y' info='Blocking Cause Id Name'/>

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

--------------------------------------
UBICACIONES - AREAS DE ALMACENAMIENTO
--------------------------------------
<table name="wmx_bin_store_area"> <!-- Groups of locations in the inventory ->
    <column name='area_code'        type='varchar'  size='10' required='y'             info='Storage Area Code'/>
    <column name='area_name'        type='varchar'  size='40' required='y'             info='Area Name'/>
    <column name='area_type'        type='smallint'           required='y'             info='Type - 0:Input, 1: Pick'/>
    <column name='area_handling'    type='smallint'           required='y'             info='Handling - 0:Online, 1: Robotics, 2: Paper-Document'/>
    <column name='area_refill'      type='char' size='1'      required='y' default='N' info='Automatic creation and activation of refill transports'/>

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

<!--
<table name="wmx_storezone">
	<column name='sz_whcode' type='varchar'  size='12' required='y' />
    <column name='sz_code'   type='varchar'  size='10' required='y' />
    <column name='sz_name'   type='varchar'  size='40' />

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

<table name="wmx_storezonearea">
    <column name='sz_code'   type='varchar'  size='10' required='y' info='Zone of areas in the inventory'/>
    <column name='area_code' type='varchar'  size='10' required='y' info='Storage Area Code'/>
</table>
-->


--------------------------------------
UBICACIONES - FORMATOS
--------------------------------------

<table name="wmx_bin_format">
    <column name='binf_code'    type='varchar'  size='10' required='y' info='The type of location'/>
    <column name='binf_name'    type='varchar'  size='50' required='y' info='Description of type'/>
    <column name='binf_format'  type='varchar'  size='20' required='y' info='Bin Format mask: #3a-#2r#2l#2p#ck (Aisle, Rack, Level, Position, Check digit if allowed'/>

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


--------------------------------------
UBICACIONES - TIPOS
--------------------------------------

<table name="wmx_bin_type">
    <column name='bint_code'    type='varchar'  size='10' required='y' info='The type of location'/>
    <column name='bint_name'    type='varchar'  size='50' required='y' info='Description of type'/>

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


--------------------------------------
UBICACIONES - PERFILES
--------------------------------------

<!-- https://dynamics-tips.com/location-profiles/ -->

<!-- 
Also on the profile is the usable volume percentage.  This allows you to configure a 'fudge factor'.
Your location might be 10 x 20 x 30, but product that's also 10 x 20 x 30 probably doesn't actually fit there.
You can set the usable percentage to 90% and the system will consider 90% of the location volume as available for storage.

Another note about using dimensions vs volume.  When using dimensions, I'm pretty sure the system does not "spin" the product when determining if something will fit.
So if your location is L40  x W48 x H50, and your product is L48  x W40 x H20, it will NOT put the product there. 
-->
<table name="wmx_bin_profile">
    <column name='binp_code'             type='varchar' size='10'  required='y' info='The unique identifier for the location profile'/>
    <column name='binp_name'             type='varchar' size='50'  required='y' info='The name of the location profile'/>
    <column name='binp_type'             type='varchar' size='10'  required='y' info='The type of location'/>
    <column name='binp_format'           type='varchar' size='10'  required='y' info='The location format'/>
    <column name='binp_dockmgmt'         type='varchar' size='10'  required='y' info='Dock management profile'/>
    <!-- binp_dockmgmt allows you to ensure that items from the same shipment, load, order, wave, or work order type are not placed in the same staging location or shipping dock location.
         This is useful if you have out bound staging lanes that you need to be organized or grouped in a particular way. Location directives will respect the dock management profile
         when evaluating and creating the work to be executed. -->
    
    <column name='binp_allowmixbatches'  type='char'    size='1'   required='y' default='N'   info='Allow storage of mixed inventory batches at all locations'/>
    <column name='binp_allowmixitems'    type='char'    size='1'   required='y' default='N'   info='Allow storage of mixed items at all locations'/>
    <column name='binp_allowmixstatus'   type='char'    size='1'   required='y' default='N'   info='Allow storage of items that have different inventory statuses at the same location'/>
    <column name='binp_allownegative'    type='char'    size='1'   required='y' default='N'   info='Allow negative inventory for work creation and picking at the location'/>
    <column name='binp_lpncontrolled'    type='char'    size='1'   required='y' default='N'   info='Use license plate tracking at the location'/>
    <column name='binp_cyclecountable'   type='char'    size='1'   required='y' default='Y'   info='Allow cycle counting at all locations'/>
    <column name='binp_checkdigit'       type='char'    size='1'   required='y' default='Y'   info='enerate a check digit for all locations'/>
    <column name='binp_ignorebatchrules' type='char'    size='1'   required='y' default='N'   info='Override rules for batch days when inventory is located'/>
    <!--
    binp_ignorebatchrules: On the warehouse management parameters the “Number of days to mix batches” parameter ensures that product cannot be put into a location
    that has a difference in expiration date greater than the number put into this field. However, on the location profile if you select the “Override rules for batch days”
    flag the system will ignore this parameter setting for locations associated to the location profile.
    -->

    <column name='binp_containertgroup'  type='varchar' size='10'                             info='Allowed container type group'/>

    <column name='binp_capacitymethod'   type='char'    size='1'   required='y' default='V'   info='The method to calculate cpacity: Dimensions, Volume'/>
    <column name='binp_fillpercent'      type='smallint'           required='y' default='100' info='The volume percentage that can be utilized at the location '/>
    <column name='binp_storageuom'       type='varchar' size='10'                             info='The unit for calculating volume of the location'/>
<!--
binp_storageuom: if using volume, you can specify what UOM you want it to use when determining if the product fits in the location (storage unit). 
For example, in a bin each picking location, a case might not fit the location, but if you dumped out the contents of of the case, the volume of the eaches would fit.
So you can set the profile to use the each dimensions when doing the math between the location dimensions and the product dimensions.
-->

    <column name='binp_width'            type='decimal' size='8,2'    info='The real width of the location'/>
    <column name='binp_height'           type='decimal' size='8,2'    info='The real height of the location'/>
    <column name='binp_depth'            type='decimal' size='8,2'    info='The real depth of the location'/>
    <column name='binp_volume'           type='decimal' size='8,2'    info='The real volume of the location'/>

    <column name='binp_usablewidth'      type='decimal' size='8,2' required='y' default='0'   info='The real width of the location'/>
    <column name='binp_usableheight'     type='decimal' size='8,2' required='y' default='0'   info='The real height of the location'/>
    <column name='binp_usabledepth'      type='decimal' size='8,2' required='y' default='0'   info='The real depth of the location'/>
    <column name='binp_usablevolume'     type='decimal' size='8,2' required='y' default='0'   info='The real volume of the location'/>

    <column name='binp_maxweight'        type='decimal' size='8,2' required='y' default='0'   info='The maximum weight that the location can hold'/>

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

Directiva de ubicación

https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/create-location-directive

· After line item quantities are received in on a Purchase Order that received quantity becomes registered.

· A 2 step process for receiving in a Purchase Order is supported. Registering the inbound inventory is step 1 and the put away operation is step 2

· Location directives is how the system finds the inventory location for the put away.

· Work is created with Pick Put pairs in the Work Templates and you can have multiple pairs to support staging, packing, and shipping.

· Pick put pairs require a work class and these work classes help separate work between mobile device users.

· Stop flags in work templates can assist staging and packing operations.

.

Ejemplo de codigo en query para evaluar directiva de ubicación:

Copy
var bdi_filter = "o.codfam == 'F1' || o.codfam == 'F2'";
var f = new Function('o', 'return (' + bdi_filter + ')');
console.log(f({codfam : "F2"})); 

var bdi_filter = "codfam == 'F1' || codfam == 'F2'";
var f = new Function('obj', `for (v in obj) { this[v] = obj[v] }; return (${bdi_filter})`);
console.log(f({codfam : "F2"}));

.

Copy
Location directives
---------------------------------------------------------

<table name="wmx_bin_directive">
    <column name="bdi_recid" type="serial"           required='y'  default='0' info='Serial to identify directive'   />
    <column name="bdi_transtype" type="smallint"           required='y'             info='The type of work order for which a location directive is defined'   />
<!--                                                                                
0 	None                                                                            
1 	Purchase orders                                                                 
2 	Sales orders                                                                    
5 	Transfer issue                                                                  
6 	Transfer receipt                                                                
7 	Inventory movement                                                              
8 	Canceled work                                                                   
10 	Cycle counting                                                                  
11 	Replenishment                                                                   
12 	Return orders                                                                   
-->                                                                                 
    <column name='bdi_seqnum'    type='smallint'           required='y'             info='Position of the rule'/>
    <column name='bdi_name'      type='varchar'  size='60' required='y'             info='The name of the ldirective'/>
                                                                                    
    <column name='bdi_site'      type='varchar'  size='10' required='y'             info='Site code'/>
    <column name='bdi_wh'        type='varchar'  size='10'                          info='Identify the warehouse'/>
                                                                                    
	<column name="bdi_task_type" type="smallint"           required='y'             info=' The type of work' />
<!--                                                                                
0 	None                                                                            
1 	Pick                                                                            
2 	Put                                                                             
3 	Counting                                                                        
4 	Print                                                                           
5 	Adjustments                                                                     
6 	Quarantine                                                                      
7 	License plate building                                                          
8 	Status change                                                                   
9 	Custom                                                                          
-->                                                                                 
    <column name='bdi_hintcode'  type='varchar' size='10'                           info='The unique identifier for the directive code'/>
    <column name='bdi_nultisku'  type='char'    size='1'   required='y' default='N' info='Specify whether it is a multiple SKU Rule'/>

    <column name='bdi_filter'   type='varchar'  size='255'                          info='Filter used in the qualification' />

    <column name='user_created' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_created' type='datetime' size='year to second' required='y' default='current' />
    <column name='user_updated' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_updated' type='datetime' size='year to second' required='y' default='current' />
    
    <primary name='p_wmx_bin_directive' columns='bdi_recid' />
    
    <foreign name='f_wmx_bin_directive1' columns='bdi_hintcode' references='wmx_bin_directive_hint' refcols='bdh_code' />
</table>

DispositionCode 	String The disposition code - Only for transtypes Purchase orders or Return orders



Sequence number
Enter the sequence in which the location directive is processed for the selected work type. You can also modify the sequence, if needed.

Name
Enter a name for the location directive. This field is required.

Work type
Select the type of work to be performed. The type of work available is based on the type of inventory transaction that you have selected in the Work order type field.

Site
Select the site in which the work should be completed. This field is required.

Warehouse
Select the warehouse location in which the work should be completed. This field is required.

Directive code
Select the directive code to associate to a work template or replenishment template. To configure a directive code with a work template, see Create a work template.

Disposition code
Optional: Select a disposition code to redirect the put away of the received items to a location. For more information, see Create disposition codes. This field is available only if you select Purchase orders or Return orders in the Work order type field.



Location directive lines - This table holds the location directive details.
---------------------------------------------------------


<table name="wmx_bin_directive_line">
    <column name="bdl_recid" type="serial"           required='y'  default='0' info='Serial to identify directive line'   />
    <column name="bdl_refrecid" type="serialref"     required='y'              info='Serial relation to directive table'   />
    
    <column name='bdl_seqnum'    type='smallint'           required='y'             info='Position of the rule'/>

    <!-- Campos de filtro -->
    <column name='bdl_fromqty'    type='decimal' size='14, 2'         required='y' default='0'            info='The from quantity'/>
    <column name='bdl_toqty'    type='decimal' size='14, 2'         required='y' default='999999'            info='The to quantity'/>

    <column name='bdl_uom'     type='varchar'  size='10'              info='Unit of meassure'/>
    
    <!-- Campos de configuración -->
    <column name='bdl_restrict_byuom'     type='char'  size='1'       required='y' default='N' info='Restrict the units of measure that are to be considered as valid'/>
    <column name='bdl_restrict_bypacking' type='char'  size='1'       required='y' default='N' info='Use the packing unit/quantity when locating'/>
    <column name='bdl_allow_split'        type='char'  size='1'       required='y' default='N' info='Specify whether to allow the location directive to split units'/>

    <column name='user_created' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_created' type='datetime' size='year to second' required='y' default='current' />
    <column name='user_updated' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_updated' type='datetime' size='year to second' required='y' default='current' />
    
    <primary name='p_wmx_bin_directive_line' columns='bdl_recid' />
    <foreign name='f_wmx_bin_directive_line1' columns='bdl_refrecid' references='wmx_bin_directive' refcols='bdi_recid' />
</table>


LocateQty 	Enum The method of quantity to locate. 
0 	None
1 	License plate quantity
2 	Unitized quantity
3 	Remaining quantity
4 	Expected quantity




Sequence number
Enter the sequence in which the location directive is processed for the selected work type. You can also modify the sequence, if needed.


The “From quantity” and “To quantity”, is really just a filter criterion that can be used to select a certain location directive line based on the released quantity.

The “Unit” field is also more of a filter field. This field is often confused with the “Restrict by unit” field. For example, if I released an order with a unit of measure “EA” and my first location directive line “Unit”  was “PL” (pallet) it would skip my first line and look for a line with a blank “Unit” field or one with “EA”.


Locate quantity
The “Locate quantity” field is a modifier for the “Unit” field.

Select the method to calculate quantity that is used to check whether the quantity is in the range that is set in the From quantity and To quantity fields.

If the location directive is for an inbound transaction, select one of the following options:
    License plate quantity ─ The license plate quantity.
    Unitized quantity ─ The unitized quantity from the specified inventory transaction.
    For example, in a warehouse if you can receive a quantity of 1000 and break it into 10 license plates of 100 each, you can use a quantity of 1000 items instead of the license plate quantity of 100.
    Remaining quantity ─ The quantity yet to be received that is specified on the purchase order line.
    Expected quantity ─ The total quantity that is specified on the purchase order line.

Restrict by unit
Select this check box to restrict the units of measure that are to be considered as valid selection criteria for the location directive lines. When units of measure have been specified, only those items with a unit that matches at least one unit defined for the unit sequence group will be considered as valid for the line selection.

For example, say that the unit is restricted to pallets and the item is associated with a unit of measures sequence group that includes pallets. In this case the items will be considered a valid choice for the location directive.

However, the Restrict by unit check box does not control the unit or units that are applied on work lines. The unit restriction only restricts the units that are made available via the unit sequence group.

For example, say that an item is associated with a sequence group that includes both the Pallets and the Pcs units. A unit of measure has been defined with 1 pallet = 100 pcs and the location directive uses Restrict by unit for pallets only. Furthermore a work template has been defined that breaks the work header creation by 50 pcs. In this case work lines of 50 pcs will be created.

To specify the unit of measure for restriction:

    Click Restrict by unit. This button is available only when you press Ctrl+S after you have selected the Restrict by unit check box.
    In the Unit field, select the unit of measure to restrict for the pick and put away process.

Restrict by packing
Locate packing quantity
Select this check box if a packing unit quantity is specified in the Sales order form. If you select this check box, only the locations with this packing unit quantity are selected.

Allow split
Select this check box to split the quantity across multiple locations.
Allow the reservation required to fulfill the sales order quantity to be done over multiple locations.

In the case of sales order picking the “Allow split” option lets you spread the reservation across multiple locations. On “Put” location directives it allows you to put away to multiple locations.

The “Immediate replenishment template” lets you tie the location directive line to a replenishment template and if the line cannot be allocated, the replenishment will occur immediately instead of after all lines of the location directive have been processed.


The “Round up to unit” field option is used to indicate if the raw material picking should be rounded up to a multiple of the handling unit specified in the “Restrict by unit” selection. However, this only applies to raw material picking.


Location directive Units Restriction - This table holds the restricted units for a location directive line.
---------------------------------------------------------
<table name="wmx_bin_directive_line_uom">
    <column name="bdu_recid" type="serial"           required='y'  default='0' info='Serial to identify directive uom restriction'   />
    <column name="bdu_refrecid" type="serialref"     required='y'              info='Serial relation to directive line'   />
    
    <column name='bdu_seqnum'  type='smallint'           required='y'             info='Position of the rule'/>
    <column name='bdu_uom'     type='varchar'  size='10'              info='The restricted unit'/>
    
    <column name='user_created' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_created' type='datetime' size='year to second' required='y' default='current' />
    <column name='user_updated' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_updated' type='datetime' size='year to second' required='y' default='current' />
    
    <primary name='p_wmx_bin_directive_line_uom'  columns='bdu_recid' />
    <foreign name='f_wmx_bin_directive_line_uom1' columns='bdy_refrecid' references='wmx_bin_directive_line' refcols='bdl_recid' />
</table>


Location directive action
---------------------------------------------------------
<table name="wmx_bin_directive_action">
    <column name="bda_recid" type="serial"           required='y'  default='0' info='Serial to identify action'   />
    <column name="bda_refrecid" type="serialref"     required='y'              info='Serial relation to directive line'   />

    <column name='bda_seqnum'    type='smallint'           required='y'             info='Position of the action'/>
    <column name='bda_name'      type='varchar'  size='60' required='y'             info='The name, explaining the action'/>
    
    <column name='bda_location_query' type='varchar'  size='255'                    info='The location query filter' />
    
	<column name="bda_fixed_loc" type="smallint"           required='y'             info='Location directives should only use the fixed locations' />
<!--
- Fixed and non-fixed locations
- Only fixed locations for the product
- Only non-fixed locations for the product
-->

	<column name="bda_strategy" type="smallint"           required='y'             info='The strategy used in locating' />
<!--
0 	None
1 	Match packing quantity
2 	Consolidate
3 	FEFO batch reservation
4 	Round up to full LP
5 	Round up to the full LP and FEFO batch
-->

    <column name='bda_allow_negative'  type='char'    size='1'   required='y' default='N' info='Should this location directive allow locations to be picked negative?'/>
    <column name='bda_bsth_enabled'  type='char'    size='1'   required='y' default='N' info='Specify whether batch strategies are enabled'/>

    <column name='user_created' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_created' type='datetime' size='year to second' required='y' default='current' />
    <column name='user_updated' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_updated' type='datetime' size='year to second' required='y' default='current' />
    
    <primary name='p_wmx_bin_directive_action' columns='bda_recid' />
    
    <foreign name='f_wmx_bin_directive_action1' columns='bda_refrecid' references='wmx_bin_directive_line' refcols='bdl_recid' />
</table>



“Fixed location usage” is where you can define if the location should be fixed, non-fixed, or only fixed locations. Fixed locations are when you have a fixed location for specific items. Fixed locations are a separate setup.

“Allow negative inventory” to be honest I have never seen this used and would not recommend using negative inventory with advanced warehouse management. 
The “Batch enabled” flag indicates whether the line is used for batch enabled items. 
The “Strategy” used is dependent on several things including if the location directive is a “Pick” or a “Put”. Below is an explanation of the strategies:
Match packing quantity – determines if the pick location has the specified packing quantity. 
Consolidate – consolidates items in a location where the item exists on-hand. 
FEFO batch reservation – reserves and allocates inventory based on first expiry first out principle according to the batch expiration date. 
Round up to full LP – is used to round up the inventory quantity to match the license plate (LP) quantity that is assigned to the items to be picked. This strategy is only be used for replenishment. 
Empty location with no incoming work – used to locate empty locations. The location is considered empty if it has no physical inventory and no expected incoming work.
    
    
    

In the Sequence number field, the sequence in which the location directive is processed for the selected work type is displayed. You can modify the sequence, if needed.

In the Name field, enter the name for the location directive action.

Optional: Click Edit query to modify the filter for warehouse locations and other criteria.

You can select the following additional settings for a location directive.

    Only fixed locations for the product
    Select this check box to include a fixed location for the item that is being put away. For more information about how to assign fixed locations to set up location directives, see the “Optional: Assign a fixed location to an inventory item” section in the Set up parameters to create a warehouse location topic.


    This field has been  added as an option in a new field named Fixed location usage. In the field, two additional options are available:

        Fixed and non-fixed locations – The location directive will consider all locations.
        Only fixed locations for the product variant – The location directive will consider only fixed locations for product variants.

Allow negative inventory
Select this check box to allow negative inventory at the specified warehouse location.

Batch enabled
Select this check box to use batch strategies for the items that are batch enabled.

In the Strategy field, select one of the strategies for the specified location directive.
    Consolidate
    This strategy is used in Microsoft Dynamics AX to consolidate items in a particular location when similar items are already available.

    Match packing quantity
    This strategy will find a location that contains a license plate that has the exact quantity required. It cannot be used with locations that are not license plate controlled.

    FEFO batch reservation
    This strategy is used when inventory is located using a batch expiration date and is allocated for batch reservation. You can only use this strategy for batch enabled items.

    FEFO batch reservation strategy is also used when inventory is located using a batch best before date in addition to the expiration date.

    Round up to full LP
    This strategy is used to round up the inventory quantity to match the license plate (LP) quantity that is assigned to the items to be picked. You can only use this strategy for replenishment.

    Empty location with no incoming work
    This strategy is used to locate empty locations. The location is considered empty if it has no physical inventory and no expected incoming work.


Location directive failure
---------------------------------------------------------
Field 	Type 	Description
WorkTransType 	Enum    The type of work order for which a location directive is defined
LocDirFailWork 	Enum    Stop work from being created if all location directives fail to find a location
	
Loation directives hint code
---------------------------------------------------------
<table name="wmx_bin_directive_hint">
    <column name='bdh_code'  type='varchar' size='10'       required='y'                    info='Code the hint code'/>
    <column name='bdh_name'  type='varchar' size='40'                                       info='A description of what the directive code is used for'/>

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

    <primary name='p_wmx_bin_directive_hint' columns='bdh_code' />
</table>

Location Stocking Limits

You can use the Location stocking limits page to control the load capacity at warehouse locations without having to use the more advanced processes for volumetric calculations of physical products.

The purpose of location stocking limits is to evaluate the maximum quantity that a location can contain. You can set up the feature on any of three levels, each of which has its own tab on the Location stocking limits page:

  • In the Warehouse field, select the warehouse for which you want to define stocking limits.
  • Select a location ID or a location profile ID.
  • Select a pack size category ID or an item number. You can associate a pack size category ID with an item in the Released product details form on the Warehouse management FastTab.
  • Select the Allow unlimited quantity check box to indicate that the location quantity is unlimited. If this check box is cleared, you need to specify the unit and quantity of the item to be stocked in the location.
  • In the Unit field, select a unit of measure for the item that you are defining stocking limits for. If you don’t select a unit of measure, the quantity that you validate against is the item’s inventory unit.
  • In the Quantity field, enter the quantity for the stocking limit in the selected unit of measure.

18.6 Otras tablas

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

Copy
-------------------------------------
wmx_item - Productos
-------------------------------------

<table name='wmx_item'>

    <column name="item_recid"            type="serial"             required='y' />
    <column name="client_code"           type="varchar"  size="10" required='y'             info='Client WMS'/>
    <column name="item_code"             type="varchar"  size="16" required='y'             into='Identify item'/>
    <column name='item_name'             type='nvarchar' size='255' />
    <column name='item_rfdescription'    type='nvarchar' size='50'                          info='Find fast name applying to the item' />

    <column name='item_default_dim'      type='smallint'           required='y' default='0' info='Default dimensions'/>
    <column name='item_category'         type='varchar'  size='12' required='y'             info='Item category - familia'/>
    <column name='item_part_no'          type='varchar'  size='25'                          info='product part number'/>

    <column name='item_status'           type='char'     size='1'  required='y' />

    <column name='item_ref1'             type='varchar'  size='30' />
    <column name='item_ref2'             type='varchar'  size='30' />
    <column name='item_type1'            type='varchar'  size='15' />
    <column name='item_type2'            type='varchar'  size='15' />
    <column name='item_type3'            type='varchar'  size='15' />
    <column name='item_type4'            type='varchar'  size='15' />

    <column name='item_uom_base'         type='char'     size='6'   required='y' />
    <column name='item_uom_aux'          type='char'     size='6' />
    <column name='item_useauxuom'        type='char'     size='1'   required='y' default='N' />

    <column name='item_primary_vendor'   type='varchar'  size='25'                          info='Primary vendor for planned purchase order'/>
    <column name='item_manufacturer'     type='varchar'  size='12' />
    <column name='item_brand'            type='varchar'  size='15' />
    <column name='item_model'            type='varchar'  size='30' />

    <column name='item_abcvalue'         type='char'     size='1'                           info='Items ABC-code for inventory value - A, B, C' />

    <column name='item_height'           type='decimal'  size='12,2'                        info='Measurement conversion factor for the height dimension' />
    <column name='item_depth'            type='decimal'  size='12,2'                        info='Measurement conversion factor for the depth dimension' />
    <column name='item_width'            type='decimal'  size='12,2'                        info='Factor for the measurement dimension width' />
    <column name='item_volume'           type='decimal'  size='12,2'                        info='Volume in cubic cm of an inventory unit' />
    <column name='item_netweight'        type='decimal'  size='12,2'                        info=' Net weight of inventory item for one inventory unit' />
    <column name='item_tareweight'       type='decimal'  size='12,2'                        info='The tare weight of the item for an inventory unit' />

    <column name='item_enabled_at'       type='date'                  required='y' default='today'/>
    <column name='item_disabled_at'      type='date' />

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

    <index name='i_wmx_item1'  columns='item_rfdescription' />
    <index name='i_wmx_item2'  columns='item_ref1' />
    <index name='i_wmx_item3'  columns='item_ref2' />

    <primary name='p_wmx_item' columns='item_code, client_code' />
    
    <unique name='u_wmx_item'  columns='item_recid' />
</table>


Field 	Type 	Configuration key 	Description

    <column name='item_uom_sales'        type='char'     size='6' />
    <column name='item_uom_purchase'     type='char'     size='6' />
    <column name='item_uom_ship'         type='char'     size='6' />
    <column name='item_uom_receipt'      type='char'     size='6' />
    
ABCContributionMargin 	EnumABC  Item's ABC-code for contribution margin
ABCRevenue 	      Enum  Item's ABC-code for sales
ABCTieUp 	      Enum  Item's ABC-code for inventory carrying cost


AltItemId           String     Alternative inventory number is used for order entry.
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
UseAltItemId 	    Enum       When should alternative item number be used?
0 	Never
1 	Nothing in inventory
2 	Always


TaxRate 	        Real       The tax rate that is used to calculate the approximate tax amount for the product
BatchMergeDateCalculationMethod 	Enum   Date calculation method to use when merging batches.
0 	Manual
1 	Earliest
2 	Latest

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?


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.
Depth 	            Real      Measurement conversion factor for the depth dimension.
Width 	            Real      Factor for the measurement dimension width.

Volume 	            Real      Volume in cubic cm of an inventory unit
NetWeight 	        Real      Net weight of inventory item for one inventory unit
TareWeight 	        Real      The tare weight of the item for an inventory unit


Density 	        Real      Measurement conversion factor for the density dimension.
EPCManager 	        Real      RFID 	The EPC manager of the item.

Intracode 	            String    Item commodity code
IntrastatExclude 	    NoYes     If this check box is selected, the item is excluded from the Intrastat report
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.

ItemBuyerGroupId 	    String    Identification of the buyer group.
ItemDimCostPrice 	    Enum      Activate, use, and maintain cost prices for product variants.
ItemPriceToleranceGroupId  String Identification of item price tolerance group for accounts payable invoice matching
ItemTaggingLevel 	    RFIDTag   Is item tagging mandatory?
ItemType 	            Enum      Type determining how the item is administered.
MarkupCode_RU 	        String    Identification of the charges
MatchingPolicy 	        Enum      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

NGPCodesTable_FR 	    Int64     French national item code
OrigCountyId 	        String    County of origin of the current inventory item
OrigRegionId 	        String    Country/region of origin of the current inventory item
OrigStateId 	        String    State of origin for the current item

PackagingGroupId 	    String    Identification of the packing group
PalletTagging 	        Enum      Is pallet tagging mandatory?

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 Enum    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?
PmfPlanningItemId 	    String    Default planning formula.
PmfProductType 	        Enum      Define production type of an item.
PmfYieldPct 	        Real      Yield percentage of formula lines.

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
prodCategoryId 	        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?

ReqGroupId 	            String    Group that determines how a requirement is calculated for the item.

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 	Enum      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

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
qtyPerLayer 	        Real      Quantity per layer on standard pallet

StatisticsFactor 	    Real      Portion of the amount in hundredths

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



----------------------------------------------------------
CONVERSIÓN DE UNIDADES DE MEDIDA (InventPackagingUnit)
----------------------------------------------------------
Contains information about units of measure that are used for packing material.

<table name="wmx_item_packunit">
    <column name='client_code'     type='char'     size='10' required='y' />
    <column name='ipu_item_code'   type='char'     size='16' required='y' />
    <column name='ipu_item_dim'    type='smallint'           required='y' default='0' info='Item dimensions. O: All dimensions'/>
    
    <column name='ipu_uom'         type='varchar'  size='10'   required='y'             info='Unit to convert from'/>
    <column name='ipu_factor'      type='decimal'  size='14,4' required='y'             info='Conversion factor to the inventory unit'/>

    <column name='user_created' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_created' type='datetime' size='year to second' required='y' default='current' />
    <column name='user_updated' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_updated' type='datetime' size='year to second' required='y' default='current' />
   
    <primary name='p_wmx_item_packunit' columns='ipu_item_code, client_code, ipu_uom, ipu_item_dim' />
</table>

-------------------------------------
InventoryLocation - Almacenes
-------------------------------------

https://github.com/MicrosoftDocs/Dynamics-365-Operations.es-es/blob/live/articles/supply-chain/warehousing/tasks/configure-locations-wms-enabled-warehouse.md


Field 	                            Type 	Description


ConsolidateShip 	                Enum    Consolidate similar sales orders

CycleCountAllowPalletMove 	        Enum    Allow cycle counting to automatically move pallets located elsewhere in the warehouse
DecrementLoadLine 	                Enum    Determine whether the load line quantity is decremented during the cancellation of shipping
DefaultShipMaintenanceLoc 	        String  The default location inventory will be moved during shipment maintenance processes 
DefaultStatusId 	                String	The default inventory status ID on inventory transactions

InventLocationemptyPallet           String  Location where empty pallets automatically are placed.
InventLocationIdQuarantine          String  Identify the warehouse.
InventLocationIdReqMain 	        String  Warehouse to refill from when activating refilling
InventLocationIdTransit 	        String  Warehouse used to identify and handle items in transit.
InventLocationLevel 	            Integer Level in relation to the main warehouse where the warehouse is located.
InventLocationType 	                Enum    Warehouse type
0 	Default
1 	Quarantine
2 	Transit
101 	Goods shipped
100 	External inventory

FSHStore 	                        NoYes   Is this location a store? 
InventProfileId 	            String  Inventory profile.
InventProfileType 	            Enum    Kind of activity.

InventSiteId 	                String  Identify the site

Manual 	                        Enum    Are all items in the warehouse coverage planned manually (that is no planned orders, transactions and on-hand)?
maxPickingRouteTime 	        Integer Maximum time per picking route
maxPickingRouteVolume 	        Real    Maximum volume per picking route
NumberSequenceGroup_RU 	        String  Group for allocation of different number sequences to different customers/vendors.
pickingLineTime 	            Integer	Time for pick of 1 line (picking route transit time)
PrintBOLBeforeShipConfirm 	    Enum    Print the bill of lading before confirming the shipment
ProdReserveOnlyWhse 	        Enum    Indicate whether to reserve production raw materials to the warehouse level and ignore the rest of the inventory dimensions on the bill of materials line
RBODefaultInventProfileId_RU 	String  The inventory profile that is applied to retail transactions 
RBODefaultWMSLocationId 	String	The warehouse location used for retail transactions.
RBODefaultWMSPalletId 	    String	The default pallet ID for retail transactions. 
RemoveInventBlockingOnStatusChange 	Enum    Remove inventory blocking when the inventory status changes 
ReqCalendarId 	                String  Work-days calendar. When no coverage group is specified, used to calculate order date, requirement date, and preferred delivery date.
ReqRefill 	                    Enum    Refill as per requirement via planned transfer from the main warehouse?
ReserveAtLoadPost 	            Enum	Run inventory reservations during load posting 


RetailWeightEx1 	                Real	Retail 	The weight for allocating quantities by the replenishment rule.
RetailWMSLocationIdDefaultReturn 	String	Retail 	Set default return location 
RetailWMSPalletIdDefaultReturn 	    String	Retail 	Set default return pallet 
	
UniqueCheckDigits 	                Enum    Use unique check digits for the warehouse
useWMSOrders 	                    Enum    Use setting from item model group or overrule the setting for this warehouse.
VendAccount 	                    String  Vendor account number if the warehouse is placed at a vendor.
WarehouseAutoReleaseReservation 	Enum	Reserve inventory when the periodic job that releases to the warehouse is used 
WHSEnabled 	                        Enum	Indicate that the warehouse is controlled by processes defined for warehouse management and the use of reservation hierarchy 
WMSAisleNameActive 	                Enum    Aisle is included in location name.
WMSLevelFormat                      String	Format for the part of the location name given by the shelf.
WMSLevelNameActive 	                Enum	Shelf is included in location name.
WMSlocationIdDefaultIssue 	        String  Location proposed for inventory issues of sales orders, production lines, etc. when nothing else is specified
WMSLocationIdDefaultReceipt         String	Location proposed for inventory receipts of purchase orders, productions, etc. when nothing else is specified
WMSLocationIdGoodsInRoute_RU 	    String  Location used to register items shipped and stocked in the warehouse. 
WMSPositionFormat 	                String	Format for the part of the location name given by the bin
WMSPositionNameActive 	            Enum	Bin is included in location name.
WMSRackFormat 	                    String  Format for the part of the location name given by the rack
WMSRackNameActive 	                Enum    Rack is included in location name.
	
	


-------------------------------------
STOCKING LOCATION LIMIT
-------------------------------------
Field 	Type 	 	Description
InventLocationId 	String  Identify the warehouse. 
WMSLocationId 	    String  Location in a warehouse.

LocProfileId 	    String  Location profile
ItemId 	            String  Identify item. 
PackSizeCateogryId 	String  The pack size quantity identification
UnitId 	            String	Unit symbol
Qty 	            Real    Number of units
AllowUnlimitedQty 	Enum	Is it possible to specify an unlimited quantity on a location.
Copy
--------------------------------------
UNIDADES DE MEDIDA
--------------------------------------
<table name="wmx_uom">
    <column name='uom_code'     type='varchar'  size='10' required='y'             info='Unit Code'/>
    <column name='uom_name'     type='varchar'  size='50' required='y'             info='Description of unit'/>
    <column name='uom_class'    type='smallint'           required='y'             info='Class of units'/>
    <column name='uom_decimals' type='smallint'           required='y' default='0' info='Number of decimals for the value'/>
<!--
0 Quantity
1 Length
2 Area
3   Volume
4   Mass
5   Time
-->

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


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

https://cloudblogs.microsoft.com/dynamics365/no-audience/2016/12/01/improved-packing-functionality-dynamics-365-for-operations-1611/

--------------------------------------
CONTAINER TYPES (PALLET, BOX, ETC.)
--------------------------------------
<table name="wmx_container_type">
    <column name='cont_code'         type='varchar'  size='15' required='y' info='The unique identifier for the container type'/>
    <column name='cont_name'         type='varchar'  size='40'              info='Description of the container type'/>

	<column name='cont_width'        type='decimal' size='12,2'  info='Width of the container'/>
	<column name='cont_height'       type='decimal' size='12,2'  info='Height of the container'/>
	<column name='cont_depth'        type='decimal' size='12,2'  info='Depth of the container'/>

	<column name='cont_volume'       type='decimal' size='12,2'  info='Volume of the container excl. items'/>
	<column name='cont_weight'       type='decimal' size='12,2'  info='Tare weight: Weight of the pallet excl. items'/> 

	<column name='cont_maxvolume'    type='decimal' size='12,2'  info='The maximum volume that the container can hold'/>
	<column name='cont_maxweight'    type='decimal' size='12,2'  info='The maximum weight that the container can hold'/>

	<!-- When selected, the volume depends on both the container volume and the inventory put on the container (open pallet).
	     When cleared, the volume is considered fixed and doesn’t depend on what inventory is put into the container (fixed cage). -->
	<column name='cont_flexvolume'   type='char'    size='1' default='Y' info='the volume depends on both the container volume and the inventory put on the container (open pallet)'/>

	<!-- The unit of the container type is used as part of the stocking limit calculations where unit conversions between container types
	     can be used as a ratio to calculate storage capacity within locations. E.g. use PL for pallets -->
    <column name='cont_uom'          type='varchar' size='10'            info='The unit for calculating volume of the location'/>
	    
    <column name='user_created' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_created' type='datetime' size='year to second' required='y' default='current' />
    <column name='user_updated' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_updated' type='datetime' size='year to second' required='y' default='current' />
	
    <primary name='p_wmx_container_type' columns='cont_code' />
</table>


--------------------------------------
CONTAINER TYPE GROUPS
--------------------------------------
<table name="wmx_container_tgroup">
    <column name='ctg_code'     type='varchar'  size='10' required='y' info='Code of group of container types'/>
    <column name='ctg_name'     type='varchar'  size='40'           info='Description of the container type group'/>

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

--------------------------------------
CONTAINER TYPE GROUPS MEMBERS
--------------------------------------
<table name="wmx_container_tgroup_line">
    <column name='ctg_code'     type='varchar'  size='10' required='y' info='Code of group of container types'/>
    <column name='ctg_type'     type='varchar'  size='15' required='y' info='Code of the container type'/>

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

    <foreign name='f_wmx_container_tgroup_line1' columns='ctg_code'      references='wmx_container_tgroup'   refcols='ctg_code' />
    <foreign name='f_wmx_container_tgroup_line2' columns='ctg_type'      references='wmx_container_type'     refcols='cont_code' />
</table>


https://www.linkedin.com/pulse/dynamics-365-wms-sorting-functionality-oleh-karnaukhov

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


--------------------------------------
LICENSE PLATE / TOTE / HANDLING UNIT
--------------------------------------
<table name="wmx_licenseplate">
    <column name='lpn_code'      type='varchar'  size='20' required='y'             info='License plate identification number'/>
    <column name='lpn_parent'    type='varchar'  size='20'                          info='LPN identifier for the parent license plate '/>
    <column name='lpn_ldevel'    type='smallint'           required='y' default='0' info='The license plate level in the license plate hierarchy where zero is the lowest level'/>
    <column name='lpn_cont_type' type='varchar'  size='15'                          info='Code for the container type'/>

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


--------------------------------------
LICENSE PLATE LABEL
--------------------------------------
Contiene información para imprimir las etiquetas y adjuntarlas en los bultos
Solamente tiene sentido en etiquetas que correspondan a bultos de expedición.

<table name="wmx_licenseplate_label">
    <column name="label_id"     type="serial"    required="y" default="0" info='The unique label ID' />
    <column name='label_lpn'    type='varchar'  size='20' required='y'             info='License plate identification number'/>

    <primary name='p_wmx_licenseplate_label' columns='label_id' />
</table>

Field 	Type 	Configuration key 	Description

AccountNum      String	Number identifying the account.
AccountName     String	Name of account

FromName 	 String	The from name 
AddressStreetFrom String Street of the address
AddressCityFrom String	City for ZIP/postal code
AddressZipCodeIdFrom 	String	Identify ZIP/postal code district 
AddressStateFrom String Identification of state 

ToName 	          String The to name 
AddressStreetTo String	Enter the street of the address
AddressCityTo   String  City for ZIP/postal code
AddressZipCodeIdTo 	String	Identify ZIP/postal code district 
AddressStateTo 	String Identification of state

BillOfLadingId 	String	The bill of lading identification number 
CarrierCode 	 String	The unique identifier for the carrier 
ConfigId 	 String	Descriptive name of configuration 
ContainerId 	 String	The container identification number

InventBatchId 	 String	Batch dimension. 
InventLocationId 	 String 	Identify the warehouse. 
InventOwnerId_RU 	 String	Inventory owner. 

InventQty 	     Real	Quantity of the item in inventory unit 
InventSerialId 	 String Serial number dimension. 
InventSiteId 	 String	Identify the site
InventSizeId     String	Descriptive name of size
InventStyleId 	 String Descriptive name of style 
InventUnitId     String	Unit symbol 
ItemId 	         String	Identify item. 
ItemName 	     String 	Description of the item.
LabelFormat 	 String	The label format that will be used 
LabelReportName  String	The name of the label report 
LineNum 	     Real	Identification of line.

CustPurchaseOrder String	Customer requisition number
OrderedQty        Real   The ordered quantity 
OrderNum          String	The order number
PackingQty 	      Real	Number of units
PrintedDate       Date	Transaction date 
PrintSettings 	  Container	Printer settings as defined by the user. 
Qty 	          Real	Number of units 
RemainingQty 	  Real   The remaining quantity 
ReportFileName 	  String	The report file name that will be used 
ShipmentId        String	The shipment identification number
UCCCompanyPrefix  String	The GS1 company prefix used in license plate generation 
UnitOfMeassure 	  String	Unit symbol
UserId 	          String	The user for processing work 
Weight 	          Real	Specification of weight.
WMSLocationIdFrom String	Location in a warehouse.
WMSLocationIdTo   String	Location in a warehouse. 
WorkCenterLocationId String	Location in a warehouse. 

WorkId 	StringThe work identification number 
WorkTemplateCode String	The unique code for the work template 
WorkTransType 	EnumThe type of work order for which a location directive is defined 
ZoneIdFrom 	String  The from zone ID 
ZoneIdTo 	String	The to zone ID

--------------------------------------
INVENTORY 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'             required='y' default='user'    />
    <column name='date_created' type='datetime' size='year to second' required='y' default='current' />
    <column name='user_updated' type='varchar'  size='20'             required='y' default='user'    />
    <column name='date_updated' type='datetime' size='year to second' required='y' default='current' />
</table>

--------------------------------------
FORKLIFT: TORITOS - TRANSPALETS
--------------------------------------
<table name="wms_forklift">
	<column name='fl_code'            type='varchar'  size='15'              required='y' /><!-- Identification of the forklift -->
	<column name='fl_candoin'         type='char'     size='1'  default='Y'  required='y' /><!-- May the forklift carry out input transports? -->
	<column name='fl_candoout'        type='char'     size='1'  default='Y'  required='y' /><!-- May the forklift carry out output transports? -->
	<column name='fl_candorefill'     type='char'     size='1'  default='Y'  required='y' /><!-- May the forklift carry out refilling transports? -->
	<column name='fl_candorelocation' type='char'     size='1'  default='Y'  required='y' /><!-- May the forklift carry out relocation transports? -->
	<column name='fl_maxheight'       type='decimal'  size='14, 2'                        /><!-- Maximum lifting height -->

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


WHSJourLoadTable - Unidades de envio

18.7 Más tablas

Copy
--------------
wmx_sales_line - additional fields for sales lines.
--------------
Field 	Type 	Configuration key 	Description

InventTransId 	String  Identification of the item lot. 
OnWave 	        Enum    Specify whether this is on a wave
OnWaveQty 	    Real   The quantity on waves 
PackingQty 	    Real	Number of units
LeftToLoadQty 	Real	The quantity to load on a line 
ReleasedQty 	Real    The quantity released

-----------
wmx_order
-----------
Field 	Type 	Configuration key 	Description
orderId                 String  Identification of the inventory order
order_type 	            Enum    Handling type

customer 	            String 	Customer code
DeliveryPostalAddress 	Int64 	Reference field in a different table
dlvDate                 Date	The date goods should be shipped on, in order to meet the requested receipt date.
dlvMode 	            String  The means by which the order will be delivered
dlvTerm 	            String  Unique identification of delivery terms

FreightSlipType 	    Enum    Freight company
freightZone 	        String  The UPS zone for the customer

itemId 	                String  Identify item.
InventDimId 	        String  Identification of dimensions for the item.
toInventDimId 	        String  Identification of dimensions for the item.
inventTransId 	        String	Identification of the item lot.

inventTransRefId        String  The ID of the record that is the origin for the requirement transaction
inventTransType 	    Enum    Specify the module that generated the transaction.

CaseTagging             Enum	Is case tagging mandatory?
ItemTagging 	        Enum    Is item tagging mandatory?
PalletTagging 	        Enum    Is pallet tagging mandatory?

optimizedPicking 	    Enum    Controls whether the shipment reservation can assign the line to a picking route utilizing guided picking.
PdsCWQty 	            Real    Catch weight quantity.
PdsCWQtyNoShipment 	    Real    CW quantity not yet selected for any shipment. 
PdsCWQtyRequested 	    Real	Original issue CW quantity requested based on issue reference line 
postTransfer        	Enum    Post physical transactions in the inventory
qty 	                Real    Quantity of the item in inventory unit
qtyRequested 	        Real    Original issue quantity requested based on issue reference line
qtyNoShipment 	        Real    Quantity not yet selected for any shipment
shipmentGroupingRefId 	String  The grouping reference number that can be used for joint shipments
shipmentGroupingTransType 	Enum    The grouping reference type that can be used for joint shipments
status 	                Enum    Status of the inventory order