Towards the deconsolidation in Dynamics Warehouse Management

Towards the deconsolidation in Dynamics Warehouse Management

The deconsolidation (opening of a complex packaging, quality control, taking small packages out of the larger packages announced by the supplier of the goods via ASN) seems to be a well-established process in SAP EWM, yet the implementation in Dynamics for SCM, its WHS module may turn cumbersome. Below is the workflow one may configure in Dynamics WHS out of the box:

Deconsolidation workflow

It all begins with an Advance Shipping Notice transmission and import. The invaluable – and only available – source on this topic is located here: Processing of inbound ASNs in Warehouse Management in AX ‘7’ (kashperuk.blogspot.com). The ASN creates an inbound load and a packing structure for a Purchase Order in Dynamics. I identified 2 distinct scenarios:

  • Multi-SKU: The packing structure contains multiple items in one single box (or on one pallet). Here one needs to understand that the Import project in Dynamics Data management must still be “pre-conditioned” with an XML file containing nested cases (boxes) and all 6 entities in the composite entity “Inbound ASN” even though the real message will not be using either the WHSInboundLoadPackingStructureCaseEntity (representing the nested license plates i.e. packing structure cases) nor the WHSInboundLoadPackingStructureCaseLineV2Entity (the one with the items in the packing case). My file for the pre-conditioning is here: InboundASN_ASNEntityConditioning, while the real message can be stripped down to 4 entities
    the load Id
    … the purchase order(s) in that load
    …… the parent license plate(s)
    ……… the content of the license plate
  • Multi-case: the ASN contains a packing structure (max. 1 level of depth) where the boxes (packing cases) are on the Parent License plate (i.e. pallet or master box), and the multiple items are in their own cases (boxes). An example is here: InboundASN_NestedLPCase. Let’s state one thing straight: the process does not work in this scenario. Let’s explore, why.

Nested LP (multi case) scenario

Once the ASN has been imported, navigate to Warehouse management > Loads > Open loads, then open Ship and receive / Packing structure:

The cases (aka nested license plates) 00708581a and 00708581b are on the parent license plate 00708581 and contain the items. Use the Mobile menu item License plate receiving to process this ASN. It displays the list of the items and let the parent and the nested license plates emerge at the default receipt location (here: DOOR). The system registers the parent and the nested LPs all right, but the stock of the items is on the parent LP only!

This fundamental flaw in Dynamics is well documented here: License plate receiving via the Warehouse Management mobile app and therefore becomes a ‘feature’, not a ‘bug’ 😉 They further suggest using a Pack to nested license plates indirect menu item to distribute the stock over the nested LPs in accordance with the ASN, but here is how it is going to end:
Pack to nested license plates

This action culminates in an “insufficient on-hand” error, because the moment you receive the parent LP, it generates the put-away work and reserves the whole freshly received quantity for the same. The stock cannot be moved (because this is what the Pack to nested license plates really does: creates a series of movements between the parent and the nested licence plates).

The typical approach is to let the put-away work be omitted with a Work policy, or be automatically performed for the stock to stay at some logical staging location right after the receipt. The split nested LPs are then distributed into the main storage with a Movement by template menu item. However, a movement by template does not support either the Disposition codes or the Quality management (Quality management for warehouse processes – Supply Chain Management), because both the QC methods are only allowed for purchase orders and production orders, not the movements. This essentially rules out the standard WHS quality control.

The only viable solution is to elevate the cases to parent LPs in the ASN interface, i.e. to convert nested cases to multiple “parents” of their own. This effectively reduces the nested-LP scenario to a multi-parent, multi-SKU one:

Multi-SKU scenario

The list of the Cases in the Packing structure is empty now; instead, one or many parent license plates contain one or many items each:

Now, the secret of the proper work processing, deconsolidation and the proper location determination is the staged Work template for the purchase order receiving process:
Location DOOR → DECO → Final BIN or bulk location

The DOOR location is considered the staging area before the deconsolidation, while the DECO location (injected by the Directive code = Stage in the work template / location directive) is the staging area after the deconsolidation where the put-away work is sorted and clustered for further processing:
Purchase order work template
The process needs 3 mobile menu items: License plate receiving – Work (one Work class ID) – Work (another class ID).

The Print work type here substitutes the Print checkbox on the menu item, because the latter is printed earlier when the parent LP is at the DOOR while it is considered a Multi-SKU license plate: it is going to be printed only once and the item number and the location are going to be empty. Also note the Stop work break after the deconsolidation part (lines 1-4) to interrupt the flow at the DECO staging location and transfer the duties from one warehouse team to another.

The second piece of the puzzle is the Work header break by the Item number: it will create as many work headers as there are items, all for the same parent LP, with a unique final Put location each. This location is nicely printed on the label, along with the Item ID, i.e. we have successfully reduced a Multi-SKU case to a single-SKU one to locate a unique bin by item.

At the deconsolidation station, the same parent LP is scanned over and over again and it randomly directs to the next open purchase work = item to be taken out from the parent LP. A quality control is nicely tied in (however, the ASN quantity as a whole may be either accepted or rejected; a single damaged piece may only be split in a separate movement process at a QC location if fully rejected first):
Deconsolidation process

The last piece of the puzzle is the Generate license plate option at the menu item for the purchase work processing:

It replaces the ambiguous Parent LP number with a fresh unambiguous LP number (see the Confirm target license plate step above). The same is used by the “put-away people” to initiate the final movement into the destination bin / bulk location (lines 5-6 in the Work template):
PO put-away process

Bingo!

The last trick may be a batch job (Warehouse management > Periodic tasks > Change inventory status) updating the Inventory status from Inbound to Available in every bin, bulk, floor location every 2 minutes. The reason is a potentially early reservation of the goods in the receiving / staging locations while the quality inspection might not yet have taken place. The sales order location directives consider the regular bin/bulk/floor locations only, and the reservation in the receiving area results in an empty Pick location in the outbound work.

Use the configuration from by blog Dynamics 365 SCM: Do not reserve in Inbound to force the non-reserveable inventory Inbound status upon all purchase orders.

Auto-post inbound delivery notes in a batch

Auto-post inbound delivery notes in a batch

In order to register a manual or an OCR purchase invoice, the accountant should match the quantity against the delivery notes (en-us: packing slip) captured at the warehouse. But what if the inbound area is only equipped with mobile scanners? What if we do not have the carbon copy on hand, or just don’t care about the printed document at all? The shipment may be damaged or incomplete! Indeed, we should only pay for what we’ve physically received:
Register the actual quantity → Post the ‘Product receipt’ with that quantity → Match the invoice against the same → Claim the difference from the supplier, if any.

However, when registering the said delivery note against the purchase order with the Generate / Product receipt button or the respective periodic task, the user must provide the delivery note number as written by the supplier of the goods. This makes an automation with a batch job at the first glance impossible, because it requires human interaction.

Update product receipts

The automatic job Warehouse management / Periodic tasks / Update product receipts is the remedy. For every inbound load within the given constraints, it creates and posts a delivery note aka packing slip with the total registered quantity.
The inbound load does not necessary require any active management. The load may be…

  • Created manually out of the purchase order lines in the Load planning workbench
  • Imported from an ASN, but also
  • Added by the system automatically if the parameter Automatically create at purchase order entry is turned on


If the load is not confirmed, the Update product receipts will confirm it automatically first, then promote to the final status Received. The bogus delivery note number is like LOADID_N, where N is a running number. The quantity is the registered quantity versus the respective load line(s). It does not matter how the registration came about:

  • Mobile scanner PO line/item receiving or PO line/item receiving and put away
  • Mobile scanner License plate receiving or License plate receiving and put away [against an ASN]
  • Mobile scanner Load item receiving or Load item receiving and put away
  • Mobile scanner Mixed license plate receiving or Mixed license plate receiving and put away
  • the new simplified License plate receiving: license-plate-receiving-enhancements
  • the classic inventory Arrival journal
  • and last but not least, the classic Registration at the purchase order line level.

In essence, you just scan the last pallet of the PO and forget. At the end of the working day (or faster, depending on the batch job schedule) the system will process every In process load (i.e. where the receipt of at least one pallet has started) and make as many delivery notes as needed to update the purchase orders.

More on inbound loads

The only limitation is the use of the advanced Warehouse management processes at the warehouse, i.e. the inbound load may only be created at a WHS-enabled warehouse. More on inbound load handing here: https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/inbound-load-handling.

The recent features “Associate purchase order inventory transactions with load” and “Multiple product receipt postings per load” may be beneficial.

Subcontracting with Warehouse management – Part 2

Subcontracting with Warehouse management – Part 2

Following up the 1st part of this blog series, let’s elaborate on the standard model of subcontracting promoted by Microsoft
https://docs.microsoft.com/en-us/dynamics365/unified-operations/supply-chain/production-control/manage-subcontract-work-production

Option 2: Subcontracting via Production order

The semi-finished product (here: M0070) has a BOM of its own. It includes all materials but also a service item (M0070_SC) for the value added by the subcontractor.

The service item drives the purchasing process with the subcontractor, is carries the purchase price of the service. We open a purchase order for a service, and provide components to the subcontractor which are either sent to the supplier from the main warehouse or procured directly to the supplier’s site. On the PO delivery note posting, the semi-finished product is received as an output of a sub-production order, it is then brought (“put away”) to the main warehouse, where it is picked for the master production order as a regular component.

The product structure transforms to a 2-level BOM:

Note that this time the service and the free issue material items belong to the same operation 5 which resides on an own route.

The standard process includes the following steps:

  1. The main order and the subcontracting order are either converted (firmed) from planned production orders, or the main order for D0003 is entered manually, then the estimation spawns the sub-production order automatically due to the type Vendor of the M0070 BOM line. The MRP explosion shows the following picture:
  2. With the firming/estimation of the sub-production order a purchase order for the service item M0070_SC is automatically generated by the system
  3. The purchase order is confirmed by the procurement department.
  4. The sub-production order is started from the screen Production / Subcontracted work. No materials or time may be consumed before this point.
  5. The transfer order for the free issue materials is released to the warehouse (it may be the same person who created and started the production order).
  6. The warehouse workers execute the picking work, confirm the TO shipment.
  7. The transfer order is getting shipped and received.

After a while the semi-finished product arrives at our doorstep. It is time to ‘receive’ the service. In standard Dynamics 365, this is not performed at a mobile scanner. Instead, a delivery note is posted against the purchase order. Thanks to the configuration described in first blog, this leads to an automatic consumption of the BOM and the route of the sub-production order. The system automatically:

– consumes both the materials delivered for free (M0071) and the service item M0070_SC itself,

– reports the route good quantity = purchase order quantity my means of a Route card journal, the same journal…

– …derives and posts a Report as finished journal which writes the semi-finished product in the stock ledger.

Normally, the last step – posting a RaF journal – is going to fail, because the license plate (SSCC pallet ID) is missing. To circumvent this, the special output location of the resource RECV-SUB can be given a “non-LP-controlled” location profile and assigned a “No putaway” work policy. This technique is described in detail in another blog of mine.

As a result, the received quantity of M0070 appears at the location 51/RECV-SUB with no license plate known and no production put-away work generated. A ‘fake’ put-away work may be triggered by the user with a special Movement by template menu item on the mobile device. The ‘from’ location in this menu item is pre-selected to RECV-SUB via the Default data setting of the menu item:

This menu item should be given a specific Directive code; a set of Location directives of the Inventory movement kind would react to this directive code and simulate the ‘put’ logic of a purchase order. The license plate number is scanned by the user during the movement. As a result of this movement, the pallet will land where it was supposed to be if we received the M0070 item from a purchase order (Option 1).

Now, the problem is that the step “Post purchase order delivery note” is not automated. Somebody needs to recognize the subcontracted PO as such, put aside the mobile device, open the rich Dynamics 365 interface and capture the quantity. In essence, this is an annoying deviation from the standard PO receipt process, a source of human error.

The suggested disruptive solution is a…

Warehouse-enabled service item

Astonishingly, it works: a service may be received on a license plate (pallet) in D365.

The stocked service item (Item model group -> Stocked product = Yes) should be given a WHS-enabled Storage dimension group with Use warehouse management process = Yes. Such an item participates in the master planning as long as it is assigned a Vendor-type BOM line, it does not have any on-hand stock at any given point in time, but it does record inventory transactions with all 5 mandatory WHS dimensions: Site, Warehouse, Location, Inventory status, License plate.

Provide the service item with the same unit, unit conversion factors, Unit sequence group, Reservation hierarchy as the subcontracted product it represents (here: M0070). Do not try to set the external supplier ID to the item number of M0070: the user would need to scan the real item ID (M0070_SC) at the baydoor.
Set the Output location of the subcontractor resource SUB_US-104 to the regular, LP-controlled location RECV. Here is what is going to happen on a timeline:

In practice, the consumption of M0070_SC in the below example will happen at the location 005 (the default WH production input location):
51/RECV +10 ea M0070_SC
51/005 -10 ea M0070_SC
This works even without the negative stock option set, because there is no such a thing as a service stock level: it is neither maintained nor controlled by the system. The location stock imbalance is not a problem for the inventory settlement and closing, because the location dimension is never a ‘financial’ one: the overall stock level at the warehouse level is zero, the (+) and (-) transactions will be settled and will mutually annihilate.

Subsequently, at the start of the sub-production order to the warehouse the system is going to say “The total quantity for production BOM XXXXXX could not be fulfilled. No work was created for wave USMF-YYYYYYYYY. See the work creation history log for details.”, because the item M0070_SC cannot be really picked, and this warning message can be safely ignored.

The scenario then continues as follows:

  1. The service from the purchase order is “received”, the license plate number is scanned or generated. Interestingly, the system does not build any put-away work for the item, probably because a service item cannot be reserved in any location.
  2. The delivery note (en-us: packing slip) posting should better be automated. In standard D365, this doesn’t work, because the batch mode posting requires a unique delivery note number. With a little customization this obstacle may be overcome by feeding the system with a fake delivery note number “DUMMY”. With the posting running in the batch mode and automatically updating every 2 minutes any purchase order with some quantity in the status Registered, this step may be fully automated:
  3. In standard D365 FO, the automatic posting of the picking list journal is going to fail because of the missing location (the Location dimension in the BOM of any WHS-enabled item is always empty, because it awaits a production order release to reserve at the location level according to the location directives, but a service cannot be reserved by definition), and the automatic posting of the Report as finished journals is going to ask for a license plate ID due to the LP-controlled location RECV. 2 little customizations outlined in the next chapter help: the service Licence plate ID propagates the production order and generates the RaF put-away work.
  4. The RaF put away location directives should be configured in exactly the same manner as the purchase order put-away locations. They can react to the M0070 item number or sense any other attribute of the sub-production order, such as a specific pool or a presence of a Vendor operation on the joined production route.The put-away work should be processed at the mobile device. A Print work line may be added to the Work template to print or re-print the pallet label which now has the proper Item ID: M0070 instead of the M0070_SC (beware that the Zebra ZPL printing language cannot carve a substring out of the printing stream or perform any other string manipulations).
  5. The semi-finished product is now placed in the main warehouse and the main production order may be reserved and released to the warehouse. A picking work for the subcontracted SFG is created.
  6. The picking work is performed at the mobile scanner:
  7. The main production order may be stated and the materials may be consumed with a Picking list in any eligible way.

ProdBOM table customization

The above scenario needs a little extension of the ProdBOM table:
– the location of the service may not remain empty. The method setInventDimId() has been extended to populate any WHS-enables service BOM line with the Default production input location of the warehouse. The location does not need to match the inbound location for the reasons described above.

– the license plate number of the service received with the purchase order should propagate the marked subcontracted production order. The method postVendorProdRoute() has been extended to write the service LP number right into the production order inventory dimensions. Obviously, this allows for the receipt of 1 pallet at a time, and updates the production order with the most recent license plate.

This does not contradict the current system logic though, as partial receipts can anyways only be enabled by an undocumented feature ProdJournalPostVendorProdBOMInOrderFeature:
This feature enables partial receipt of subcontracted items. Before, when reporting a partial quantity on a purchase order for a sub contracted service item, the full quantity was updated on the related picking list journal on the production order. Now, the correct partial received quantity is updated. This feature also fixes an issue with an incorrect updated scrap quantity when using BOM lines of type Vendor.

The source code can be downloaded here: ProdBOMLine_SubcontractingLicensePlate.axpp
Feel free to use, but I do not give any guarantees 😉

Conclusion, pros and contras

2 options have been presented:

Subcontracting via Purchase order

  • + A lightweight implementation can be easily adopted by the logistics department.
  • + It does not require any customizations.
  • – The raw material transfer to the subcontractor may be scheduled too late if we maintain the subcontracting lead time at the route operation level.
  • – The cost price of the semi-finished product only includes the cost of the subcontracting service, but not the materials. The standard price model will always show deviations.
  • – The free issue raw materials are only consumed at the next operation. On long-running orders this distorts the WIP value.

Subcontracting via Production order

  • – The solution contains too many moving parts: the sub-production order must be in the Started status, all raw material levels at the external warehouse must be exact.
  • – The segregation of duties between the procurement, logistics, warehouse and production departments is broken.
  • – Such a ‘deviant’ process is not easily adopted by the warehouse people: they must know when to use the normal purchase put-away menu items and when to leverage the production put-away menu.
  • – Comfortable work is not possible without the above production BOM and purchase delivery note auto-posting customizations
  • + The cost price of the semi-finished product is correct at all times.

Choose for yourself, but the CFO may let you reconsider 😉

There is a video recording in German explaining fine aspects of the 2 scenarios.