Get details on quote in another site?

Seemingly related to Part Revisions in Multiplant and Multi-Site BOMs

We want to quote configured items in a retail site separate from where they’re manufactured. I can run the configurator in the retail site, but cannot run Get Details on the quote to populate the MoM. Therefore, the Worksheet is empty and there is no price. (The Worksheet correctly reflects the configured MoM when Get Details is run on a quote in the manufacturing site.) I’ve tried setting the PartPlant record in the retail site to Transfer, Manufactured, and Purchased. The revision doesn’t show up in the Get Details dialog.

It seems silly that I can run Get Details in another company, but not in another site in the same company…

I created an alternate revision for the retail site. This unapproved the base revision, so I approved both. This allowed me to run Get Details on a quote in the retail site.

The alternate revision inherits the configurator associated with the base revision, but the configurator doesn’t work. The base and alternate revisions both appear in Configurator Rules, but the alternate has no rules! It looks like we would need to manually duplicate the rules for every configurator in every retail site.

We did all our order entry and manufacturing in site ‘A’, but would often ship the manufactured items to site ‘B’ to join up with other line items from the order. This “joining” was just that they were shipped together. Not that any physical manufacturing was done at site B.

This gives us problems as we want the configured items to be manufactured in A, but shipped from B. They only way that worked for us was:

  1. Order entry in Site A would create the configured item.
  2. A P/N for this item was required to exist in sites A and B Even if we knew we’d never make it again.
  3. Order was setup to ship from B
  4. Job created to be manufactured in A
  5. Job received to Inventory
  6. Transfer Order Shipment from A to B
  7. Transfer Order Receipt at B
  8. Packer created at B, pulling item from B’s stock.

:frowning:

1 Like

Yep ~ we are like Calvin. We need to configure the part on the sales order via order entry opened in the mfg plant. It’s incredibly annoying.

Nancy

I maaaaaaaay have a solution… knock wood!

I created an Alternate Method for the revision and assigned it to the retail site. It was created unapproved and it also unapproved the base revision, so I went into the Engineering Workbench and approved both. (I don’t see an approve checkbox anywhere else for the alternate.)

The alternate appears in the tree in Configurator Rules. I just learned there’s a Copy Rules thing in the menu. It’s pretty painless.

Costs don’t seem to be site-specific per se; you see the same costs in Cost Adjustment no matter what site you’re logged in from. However, Get Details seems to join PartCost via PartPlant, so you need a PartPlant record in the retail site for each of the raw materials.

Now I can run Get Details on a quote in the retail site. Rules run and costs appear correctly in the Worksheet. I converted it to a SO, and MRP is running with “Get Details from Quote” checked. The PartPlant record for the top-level configured part is set to Transfer from the manufacturing site, so hopefully MRP creates a job for the base revision in the manufacturing site.

1 Like

MRP didn’t create a job. Hopefully I just ran it with the wrong settings. But I can manually create a job in manufacturing and add a make-to-order line for the order in retail. Running Get Details on the manufacturing job correctly copies the MoM from the retail quote.

1 Like

Hi Kevin,

I have had difficulties getting MRP to pull alternate method automatically, but this post makes me think I’ve done it wrong when if failed. Perhaps it’s what you need to do: MRP with Alternate Methods?

Nancy

Thanks, I’ll look into that.

I don’t understand what Primary Alternate Method actually does. It may or may not be important. The main thing I was missing was that the Part and/or PartPlant has to be Quantity Bearing so the MRP box can be checked in the Site > Planning tab.

With the PartPlant for the retail site set to Transfer, MRP wants to create a Transfer Order, which loses configurator inputs and is not tied to a specific Sales Order. I changed the PartPlant to Purchased and MRP tried to create a job! “Create Intersite Supply” tantalizingly suggests that it might be creating the job in the manufacturing site. But then “Part contains resources for a different site” suggests maybe not. And “Copying BOM from Part:K18-Sub Rev:X” seems to contradict the “Get Details from Quote” checkbox from launching MRP. I think I’ll write a BPM to prevent job deletion and see exactly what it’s creating and where.

07:18:07 Processing order requirement, Order:100011 Line:1 Rel:1.
07:18:07 Get Destination
07:18:08 Create Intersite Supply
07:18:08 Created new unfirm job:100011-1-1 Quantity:K18-Sub.
07:18:09 Created new unfirm job:100011-1-1 Quantity:2.00000000.
07:18:10 Adding to job:100011-1-1 Quantity:2.00000000.
07:18:10 Copying BOM from Part:K18-Sub Rev:X to Job:100011-1-1.
07:18:18 Part contains resources for a different site.
07:18:18 Error copying BOM, deleting Job:100011-1-1.
07:18:18 Deleting unfirm job 100011-1-1
07:18:20 Creating new mfg suggestion for Part:K18-Sub, Attribute Set: '', Quantity:2.00000000 on 9/13/2021 12:00:00 AM.

As an analogy, it’s like making an alternate ShipTo be the primary ship-to for a customer. The main then gets demoted to just another alternate floating out there. It’s for MRP to know which method to use.

I am rooting for you, as are the others, lol. The three of us have been annoyed by this for years, as you have found, I’m sure. This needs a solution.

So… this problem is dealing with CONFIGURED orders… this is always a challenge when configuring because MRP does NOT get the details from the Eng Workbench data directly. it runs through the Method Rules that are assigned to the SITE where the configurator was run. If you are configuring in site B, then you get site B rules. The configurator does not play nice if you really wanted to configure it for site A manufacturing.
My best suggestion would be to create a quote in Site A as an “internal” quote (for site B). But this quote needs to also create a new configuration specific part number so that you can also quote that new part number for site B. In site B, that part number should be marked as a transfer item. This way, when you sell the item in site B, it will automatically create the transfer order, which will automatically create a JOB in Site A to fulfill the transfer order.

1 Like

I experimented with transfer orders, but I’m going to have to repeat those experiments because I didn’t realize that MRP was site-specific. I’m not even sure which site I ran it in. I succeeded in getting it to create a transfer order suggestion. But when I accepted the transfer order and ran MRP again, instead of creating a job, it created another transfer order suggestion for the same sales order.

I wish PartPlant could specify the source site for manufacturing the way it can for transfers. It seems like that would kill several birds with one stone. I made a suggestion to that effect: Allow Quote to use revision from manufacturing site | Kinetic Ideas.

I gave up on configurators creating part numbers because as far as I can tell, only the quote worksheet is designed to work with material and labor costs. As it says in the name, configurator Component Pricing works exclusively with prices, not costs, and cannot capture labor costs from a configured MoM. Component Pricing seems to be for kitting, not manufacturing. Or maybe for manufacturing where the config inputs do not change the price, or only change the price by substituting pre-priced assemblies. Not for anything totally custom with cost-plus pricing.

I’m convinced that it makes perfect sense to get details from the revision that belongs to the site where a part will be manufactured, and it’s only a limitation of the Get Details dialog UI that it doesn’t present that option.

I think I may have struck gold. When you run Get Details from the menu and say yes to running the related configurator, ConfigurationRuntime.ProcessDocumentRules is immediately followed by QuoteAsm.GetDetails. So I hung a post processing method directive on ProcessDocumentRules. It consists of an Invoke BO Method widget that calls QuoteAsm.GetDetails for the default revision of the part, which happens to be in another site. Instead of running Get Details from the menu, users can just click the Configure button. And it works! Parameters come from pcValueDS.pcContextProperties:

This is just a proof of concept, but a very promising one. I did check that the error return is empty. I still need to make sure the configurator is being run from a quote line and remove any existing details on reconfiguration.

The only remaining issue is one that affects Get Details in general. Although PartCost is not site-specific, Get Details seems to join it via PartPlant. So you must have a PartPlant record in the current site for every raw material, or you get zeros in QuoteMtl.EstUnitCost. Customization–building a MOM for non-current site describes creating a temporary session with a different plant ID. I didn’t need to do that, but I wonder if it would eliminate the need to create all those redundant PartPlant records.

1 Like

So far, so good. Knock wood!

Creating a temporary session with a different plant ID does seem to eliminate the need to have PartPlant records for all raw materials in all sites.

I’ve tested this with a multi-level configurable MoM with keep-whens. I thought the calls to LINQ Single might blow up with a more complex MoM, but they didn’t. ProcessDocumentRules runs only once after saving the last configurator. I have not tested with a part replacement MoM. I also want to test different values of PullAsAssembly, etc. on materials.

// if the configurator ran on a quote line...
if(pcValueDS.PcValueHead.Single().RelatedToTableName == "QuoteDtl")
{
  var quoteAsm = ServiceRenderer.GetService<QuoteAsmSvcContract>(Db);
  var partRev = ServiceRenderer.GetService<PartRevSearchSvcContract>(Db);
  var props = pcValueDS.PcContextProperties.Single();
  // delete any previous MoM
  quoteAsm.DeleteAllAssembly(props.QuoteNumber, props.QuoteLineNumber);
  var rev = partRev.GetByID(props.PartNumber, props.PartRevisionNumber, "").PartRev.Single();
  string error;
  using (CallContext.Current.TemporarySessionCreator.SetPlantID(rev.Plant).Create())
  {
    // get the new MoM
    quoteAsm.GetDetails(
      props.QuoteNumber,
      props.QuoteLineNumber,
      0, "Method", 0, 0, "", 0,
      props.PartNumber,
      props.PartRevisionNumber,
      "", false, false, false,
      out error);
  }
  if(!string.IsNullOrEmpty(error))
  {
    PublishInfoMessage(error,
      Ice.Common.BusinessObjectMessageType.Error,
      Ice.Bpm.InfoMessageDisplayMode.Individual, "", "");
  }
}