We currently use the product configurator to build a BOM. We would like to add logic to it that would also calculate a price. I’m looking for guidance on how to do that, from a high level.
Thank you!
Julie
We currently use the product configurator to build a BOM. We would like to add logic to it that would also calculate a price. I’m looking for guidance on how to do that, from a high level.
Thank you!
Julie
Does your configurator build the BOM on quotes, or are you creating parts? For quotes, if all the materials and labor have costs, you can calculate the cost and add a markup on the Worksheet tab.
It’s on my to-do list to study the trace log and see if the logic behind the Worksheet tab can be leveraged in a BPM to set the price of a non-configurable part created by a configurator.
Our configurators also create BOMs. By using a UD method we then get the cost of the parts. Once we have a total cost we use a multiplier on the cost to give us a price.
There are so many ways to get a price, in addition to the solutions identified above you can have feature pricing and then sum up the total price and pass that value over to the quote/order.
I have the following(ish) code in the document rules that updates the price. It’s nested in a switch so it varies based on the quote or order and there is another if to check to see if lock price is selected because I don’t want to change the price if one of my users already entered it and locked it.
Pricing.QuotePrice = Inputs.PriceTotal_dec.Value
Pricing based on the BOM is a challenge. One approach is to use the QUOTE to calculate the price… ie… you configure the item in a QUOTE, and then Get Details into the quote. This will load all the materials and operations into the quote, and then you can do markup pricing based on the cost.
But one problem with any approach where you are relying on a BOM/BOO is that some companies want to do “Option” or “Feature” level pricing… the option price may not be linked to any specific cost, but that feature may have a sales value that is much higher than the daily cost to add the feature. TO do this, you must use option level pricing, and to do this, you need to keep a table of options with their appropriate price. For example, you could have an option for “custom color”. The custom color takes no extra time, nor does the paint cost extra, but because it is custom, you simply want to charge an extra $50…
Thank you Tim. I will look into option level pricing. Is there a resource for that, just in case?
Our prizing rules are bizarre and complex, so we calculate the price in the code, but in the the config code not the rules.
Thank you Tim. I found this in the Epicor help:
Can we use that? I don’t see a pricing options panel in the configurator. We are on 10.2.200 and going to 10.2.700 soon.
Is the config code upgradable? Where do you enter that?
Yes, we calculate the price in the config code not the rules, I just use the document rules to move the price from the configurator to the quote/order. Having the config code calculate the rules allows for the user doing the configuring to see the price as they are configuring.
That’s a pretty loaded question, the code can be essentially anywhere in the configurator from on leave events, buttons, UD Methods, or pretty much anything else.
As for your question on is it upgradeable, yes it is upgradeable but depending on what exactly you mean by that there are varying levels of difficulty. If there is an upgrade/change in the code it will require a change in the configurator which is always a pain. If you mean going from E10 to Kinetic, generally that’s not an issue but will require some validation. If you mean updating like changing a price from A to B that can be done too.
We are using feature pricing so we have prices assigned to features in Lookup Tables and have the configurator go and look at the prices for that feature. That allows us to make a change to the price (as well as adding new options) without modifying the configurator code.
Cool! Are you also building a BOM in the configurator? We are using the configurator to build the BOM only. Now I’m trying to layer in pricing for what was configured. I think I can add another Lookup Table for that. Can it do a lookup on two tables, one for the BOM part and one for the price?
We also build the BOM but we do that mostly with the keep when rules inside of the method rules. You could absolutely use two lookup tables or even add a column to the current lookup tables for price.
Component pricing is essentially only for sales kits. We went down that road and ran into some major limitations.
When you click Actions > Refresh Worksheet, it calls Quote.UpdateCosts with the entire QuoteDataSet including all the other lines; and it gets back another entire QuoteDataset, including costs for all the other lines. Yikes! But if UpdateCosts only uses the data it receives and doesn’t validate against the database, we might be able to use this to our advantage. I wonder what happens if you construct a QuoteDataSet for a non-existent quote. Will UpdateCosts still do the math on it? Because that would be kind of awesome.
Thank you Maxwell!
Thank you Kevin.
I looked back at my notes and remembered what the showstopper was for us with Component Pricing.
If a BoM contains more than one of the same configurable subassembly, Component Pricing applies the calculated price of the first one to all of them, regardless of differences in configuration. This was acknowledged back in September as PRB0238807.
Every way you turn, it’s bugs, bugs, bugs. I often feel like I’m the very first person to ever use the configurator and actually pay attention to what it’s doing.
For a couple clients I added code that does an automatic get details when the configurator is saved which will populate the manufacturing tab based on the configurator rules. The worksheet will show the theoretical cost of making the item along with showing price based on markup. The user can manually pick the price from the worksheet.
For another client I do the get details, pull the price off the worksheet, setting the price via a document rule and then delete the quote BOM. The amount of code isn’t that much.
This is on the quote, the order doesn’t have a MOM so it would be more involved to do that same on an order.
Hi Jim,
Thank you for your reply! I am interested in the code you wrote for a quote. Currently our quotations people configure a product and then do Get Details. We have custom code that rolls the BOM and gets the rolled cost. They can also modify the BOM within the quote after they do Get Details. That is why we have a dynamic cost rollup of the BOM. Then we run a calculation for the markup. We want to keep the code that calculates the BOM cost. We built a second set of configurators that just calculates a price. We wanted to divorce the price from the cost. Now we need to calculate the margin for the quote using the price and the costs. I’m not sure how I can incorporate the two configurators. I think I can add rules to the standard configurators that also get the price from our lookup tables. By any chance, do you do that kind of work? I would also like you to help us with the code to do the automatic get details. Are you available to talk and provide me a quote for your services?
The code for that is pretty simple, I’ve done it for our company on a few configurators. I can give you what I use and go from there if you wanted.
The code that gets called out in the document rules is the following, where I call the delete details UD Method first to make sure I’m starting with a clean slate and the second line calls out the getting details UD Method.
UDMethods.DeleteAllDetails(Context.QuoteNumber, Context.QuoteLineNumber);
UDMethods.GettingDetailsInQuote(Context.QuoteNumber, Context.QuoteLineNumber);
Here is the code that is in the Delete details UDMethod
var BusinessObject = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.QuoteAsmSvcContract>(this.Db);
using (BusinessObject)
{
BusinessObject.DeleteAllAssembly(Quote,QuoteLine);
}
And here is the code that is in the Getting details method
int TargetAsm = 0;
string SourceFile = "Method";
int SourceQuote = 0;
int SourceLine = 0;
string SourceJob = "";
int SourceAsm = 0;
string SourcePart = "PartNum";
string SourceRev = "A";
string SourceAltMethod = "";
bool UseMethodForParts = false;
bool CompleteTree = false;
bool GetCostsFromTemp = false;
string PartErrors = "";
var BusinessObject = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.QuoteAsmSvcContract> (this.Db);
using (BusinessObject)
{
BusinessObject.GetDetails (Quote, Line, TargetAsm, SourceFile, SourceQuote, SourceLine, SourceJob, SourceAsm, SourcePart, SourceRev, SourceAltMethod, UseMethodForParts, CompleteTree, GetCostsFromTemp, out PartErrors);
}
I would say you need to add the Erp.Contracts.BO.QuoteAsm.dll as a reference assembly to call the systems business object.