Subcontracting with Warehouse management – Part 1
A typical real-world scenario for subcontracting in discrete manufacturing looks like this: the local production needs a part at one of the steps which is procured from a 3rd party. This supplier aka subcontractor is provided with some materials for free (“free issue materials”) to perform the work. The free issue materials remain in our local balance. They come back as a semi-finished product with a value-added service on top.
In standard D365FO, a sub-contracted operation is designated with a certain type in the route, and the bill of materials entails a service item representing the value added by the subcontractor. As the production order is getting estimated or converted from a planned production order in the MRP, a purchase order is opened with the supplier for the service item. The receipt of the service item in procurement (with a Delivery note i.e. Packing list or with an Invoice) may report the operation on the route as finished, consume materials associated with this operation, and absorb the sub-contracting cost into the value of the finished product.
The simulation by Microsoft https://docs.microsoft.com/en-us/dynamics365/supply-chain/production-control/subcontracting resembles this story, but it misses one key element: the receipt of the semi-finished product at the inbound location with the mobile scanning device (Warehouse management). Let’s get one thing straight: this just doesn’t work in Dynamics 365 for SCM for the following reason:
Assume, we need a perforated plate for the proverbial Contoso speaker from the Dynamics 365 demo database. We inform the supplier about the need for the perforation with a purchase order, send them the steel plate with a transfer order, receive the perforated plate back, put it on stock and use it in one or many production orders of our own.
Physically we treat the semi-finished product “Perforated plate” as a normal purchase order inbound delivery, but the purchase order is raised only for the service ‘inside’: “Perforation”. In theory, one may even capture a stocked service on a mobile scanner, but it cannot pass the license plate (pallet) number to the subcontracting production order, which is open for a different product number.
Two possible solutions– non-standard and standard – are presented below. None of them is fully satisfactory, though. As Germans figuratively put it, it is “die Wahl zwischen Pest und Cholera”, a choice between the devil and the deep blue sea.
above *) „Knight at the Crossroads“, 1882, by a Russian romantic and early art nouveau painter Viktor Vasnetsov
For this study, we need a new route operation (“Perforation”), and a new Route group (Production control > Setup > Routes > Route groups). The route group Sub will be somewhat special:
The added value is absorbed with the service item, therefore the estimation and costing of the subcontractor’s time it turned off; you will probably create a separate hour cost category with the price of zero.
The Automatic route consumption Quantity is set to Yes to trigger the automatic reporting as finished (RaF) of the semi-finished production upon the PO receipt. Typically, you do not plan the subcontractor’s capacity and consider them a “black box” with a quantity-independent lead time, but for the automatic route consumption and MRP you MUST activate the Process job. The lead time may be entered either in the default order properties of the SFG released product, or in the subcontracting route as a constant Transport time.
Another part of the puzzle for the automatic RaF is the Automatic report as finished flag in the Production control > Setup > Production control parameters:
If you capture production time and yield at Job card terminals with Manufacturing execution, then the ME route/job journals will neglect this flag, and the automatic RaF will only be triggered on manual route journals and subcontracting purchase order posting.
This was about the automatic reporting as finished; the automatic consumption of materials and routes (i.e. quantity reporting + RaF) is triggered by the 2 parameters on the Automatic update tab:
The supplier (en-us: vendor) needs an external warehouse of the Vendor type and a resource of the Vendor type. The subcontractor’s warehouse (here: EUS-104) must belong to the same site as the main warehouse (here: 5). This is because the materials in the semi-finished product BOM are tagged with the subcontractor warehouse in order to trigger a replenishment (“refill”) by an outbound transfer order. Yet the sub-production order may be pointing to our own warehouse (here: 51) to directly post the receipt of the SFG at the local site, if the inbound fransfer EUS-104 -> 51 is organized by the supplier. Such a ‘mix’ of warehouses in one BOM is only possible within the same site in D365FO.
In 99% of the cases, the external warehouse does not Use warehouse management processes, i.e. it is not an ‘advanced’ one, because there is no one from our organization to capture the inbound license plates. Instead, it requires a default receipt and issue location (here: IN_OUT).
The production resource uses this unique Input warehouse, therefore it requires an own dedicated resource group: resource <=> resource group <=> input warehouse.
Should the inbound transfer order from the supplier to our premises be managed by us, then the Output warehouse = Input warehouse = EUS-104.
The Output location is an interesting topic of its own. In reality, the output warehouse comes from the MRP planning, from the MRP demand. The MRP demand comes from the production BOM line which is deemed to consume the subcontracted SFG. Whatever the consumption warehouse is set there, it propagates the planned production order for the SFG, unless the inbound transport is managed by us (then it requires a separate replenishment setting EUS-104 -> 51).
If the same subcontractor delivers products to different warehouses of our own, then the sub-production order does not always comply with the above Warehouse setting at the resource level.
Fortunately, the developer of the method \Data Dictionary\Tables\ProdTable\Methods\defaultOutputLocation() was not sophisticated enough to check if the warehouse in the production order matches the warehouse of the last resource on the production route: the Output location is overwritten unconditionally on reporting the product as finished. It suffices if all warehouses have an output location with the same code RECV-SUB.
Finally, we need a set of released products:
|Item number||Name||Product type||Stor dim group||Item model group||UoM||Unit seq. group||Reserv. hier|
|M0070||Perforated plate (SFG)||Item||Ware (=WHS-managed)||e.g. FIFO (stocked)||Ea||Ea PL||Default|
|M0070_SC*||Perforation (service)||Service||Ware (WHS) or SiteWH (non-WHS)||e.g. FIFO (stocked)||Ea||Ea PL or none||Default or None|
|M0071||Steel plate (RM||Service||Ware||e.g. FIFO (stocked)||Ea||Ea PL||Default|
*Option 2 only
In standard D365 SCM (hereafter ‘Option 2’), there will be a ‘twin’ service item (here: M0070_SC) defined for every semi-finished product (M0070). As they put it, “…the service product is used to identify the arrival of the semi-finished product”.
Option 1: Subcontracting via Purchase order
1-level BOM: in this case subcontracting is managed through a ‘trading’ flow. The subcontracted semi-finished product is procured via a purchase order and received in stock as a regular inbound shipment. In other words, the subcontracted product does not originate in a production order as otherwise prescribed by the D365 best practices. The component(s) of the product are either provided for free or directly sold to the subcontractor and remain in the master product’s BOM.
In fact, the subcontracting operation “5” in the route on the diagram is not even required, everything is managed through the BOM:
According to the documentation https://docs.microsoft.com/en-us/dynamics365/unified-operations/supply-chain/production-control/manage-subcontract-work-production,
to use subcontracting of route operations for production or batch orders, the product that is used for the procurement of the service must be defined as a product of the Service type. However, an undocumented feature of D365FO allows for stocked products of the type Product (not Service!) in the Vendor-type line.
An analysis of the source code in
has shown, that an automatic consumption of the BOM or the route is not supported for Products, unless you extend the ProdBOM.verifyItemType() method. However, it is not such a bad thing: the automatic BOM consumption of a service PO receipt would have consumed the service itself, then any other material at the same route operation (Op 10). But we don’t want to consume the SFG M0070 immediately! The product has to be received, put away to the main warehouse, picked from the warehouse, brought to the step “Assembly” and then consumed.
To backflush the material M0071, it has been attached to the same operation 10 Assembly (note the external warehouse for consumption):
This is not ideal, because the material is needed at the moment of the Op 5 scheduled start. The operation 10 is scheduled later. To mitigate shortages, one should choose the transfer lead times of the free issue materials carefully.
Resource consumption = Yes means the material is picked from the location of the respective machine 5110 (here: 51/002)
Let’s create a production order for D0003 at the site “5”, estimate it and check the MRP explosion:
The estimation of the production order resulted in a purchase order for M0070. In addition, a planned transfer order has been created for the raw material from our site to their site. After the confirmation of the PO by the supplier, this transfer order must be dealt with soon, to ensure the smooth execution of their work. Potentially – depending on the MRP settings – this can be also a purchase order delivered directly to the subcontractor.
To proceed, firm the transfer order, locate the transfer order in the list Inventory management > Inbound orders > Transfer order list by looking at the target warehouse, contact the shipping carrier and organize a pick-up of the goods, then use Ship / Release to warehouse to initiate warehouse work for the reserved (!) material. Process the work at the mobile device: Outbound / Transfer pick. Check out my earlier blog how to call the mobile device emulator:
Once picked and ready to be loaded into the truck, the shipment appears in the list Warehouse management > Shipments > Shipments ready to ship. Print a packing list, confirm the shipment. The transfer order is now officially Shipped. Receive the transfer order for the whole quantity immediately, as this external warehouse is unmanaged. The plates for perforation are now at the warehouse EUS-104.
Someday, the plates come back, full of holes. They need to be received at the mobile scanner (Inbound / Purchase receive). The SSCC number typically exists and can be scanned, there can be an option to print an own label with the product ID and name. Next, the pallet is Put away to the main stock:
With a little customization, the purchase order may be updated with a delivery note by an automated batch for the whole registered quantity, yet this delivery note does not kick off any automatic action in production due to the wrong product type of M0070.
The production may be released now! Make sure the newly received subcontracted product has been reserved, then go for a Release. It creates warehouse work to pick the perforated plate and bring it to the assembly resource. At this moment, M0070 becomes reserved at the location level. Process the work at the mobile device: Production / Production pick
The perforated plate has been brought to the location 002 of the machine. From now on, the production order may be started, and a picking list for the ultimate material consumption may be posted in a vast number of ways. The material M0071 previously brought to the supplier is backflushed too:
Check out the 2nd part: Subcontracting via Production order.
Nice option this option no. 1, but at what price do you purchase the M0070 service that is now a product of type item?
You can only pay the service (labor charge) to the vendor and if your purchase item is FIFO than you get a semi finished item with wrong cost value on stock for a certain time! Even worse if your M0070 item would be standard cost, because then you would create purchase price variances at that point in time….
Looking forword to your second option 🙂
Hallo Jurgen, Sie kommt, die 2. Option. Ich habe heute um 3:30 es zusammengebracht 😊
Die 2. Option wird neben der ersten heute um 17:00 beim Powerthon vorgestellt und in 2-4 Arbeitstagen veröffentlicht, samt dem Quellcode (ja, im Standard geht’s nicht so gut). LG, Eugen