export function apply_guidance(doc: any) { function getAdjValue(number) { const data = [ {f: 2.001, t: 1000, snap: 3, adj: 0 }, {f: 1.001, t: 2, snap: 2, adj: 0 }, {f: 0.1, t: 1, snap: 1, adj: 0 }, {f: 0, t: 0.1, snap: 0, adj: 0 }, {f: -1, t: -0.00001, snap: -1, adj: 0.05}, {f: -2, t: -0.999999, snap: -2, adj: 0.05}, {f: -1000, t: -2.001, snap: -3, adj: 0.10}, ]; const match = data.find(row => number >= row.f && number <= row.t); return match ? match.adj : null; } function minExcludingNull(...values) { return values.reduce((min, val) => (val !== null && (min === null || val < min) ? val : min), null); } // --------------------extract incoming data------------------------------------------------------ const targetPrice = doc.pricing?.v1tp ?? doc.pricing?.v0tp; const priceBand = doc.pricing?.v1stdv ?? doc.pricing?.v0stdv; const earlyCustPrice = doc.hist?.cust?.early_price; const earlyCustSeason = doc.hist?.cust?.early_season; const earlyMarkPrice = doc.hist?.mark?.early_price; const earlyMarkSeason = doc.hist?.mark?.early_season; const bridgePremium = doc.pricing?.bridgePremium; const bridgedPrice = Number((earlyCustPrice * (bridgePremium ?? 1.00)).toFixed(5)); const altHist = doc.hist?.cust?.ds; const iidx = doc.pricing?.iidx; const curr = doc.customer?.curr; const fxrate = doc.customer?.fxrate ?? 1.0; const qty = doc.inputs?.qty; const pltq = doc.product?.pltq; const inflation = Math.max(...Object.keys(iidx).map(Number)); const inflationFactor = iidx[inflation]; const list = doc.pricing?.list && doc.product?.itemrel === "2" ? doc.pricing?.list : null; const listUSD = list ? list / fxrate :null; // ------------------calculate price adders------------------------------------------------------ let ltp = qty < pltq ? 0.15 : null; let anchor_sd = priceBand ? ((bridgedPrice - targetPrice) / priceBand).toFixed(2) : 0 let optimization = getAdjValue(anchor_sd); let inflReason = inflationFactor !== 0 ? ` +${(inflationFactor *100).toFixed(1)}%`: ""; let ltpReason = ltp ? ` +${(ltp * 100).toFixed(1))}%` : ""; let optReason = optimization !== 0 ? ` +${(inflationFactor *100).toFixed(1)}%`: ""; let custAdder = (ltp ?? 0) + optimization + inflationFactor; let markAdder = (ltp ?? 0) + inflationFactor; let custAddReason = `${inflReason}${ltpReason}${optReason}`; let markAddReason = `${inflReason}${ltpReason}`; // ------------------start building price options------------------------------------------------ let custPrice = bridgedPrice * (1 + custAdder); let custSeason = earlySeason; let custReason = bridgePremium ? `${custSeason} (similar + ${altHist} price ${earlyPrice} x ${bridgePremium} = ${custPrice}) + ${custAddReason}` : `${custSeason} + price ${custPrice} + ${custAddReason}`; let markReason = `${markSeason} ASP + ${markPrice} + ${markAddReason}`; let targPrice = targetPrice * (1 + markAdder); let targReason = `Target price ${targetPrice} + ${markAddReason}`; let finalPrice = minExcludingNull(listUSD,custPrice,targPrice); // ------if there is not target price just exit--------------- if (!targetPrice) { anchorSource = "No target pricing setup"; guidance.FinalReason = "No target pricing setup"; } else { // if there is no customer anchor price use target if (earlyCustPrice) { // translate alternate product history to current product quoted // --------if the price needs bridged, add the details to the description-------- if (bridgePremium === 1) { anchorSource = earlySeason + ' Price ' + earlyPrice; custSource = anchorSource; } else { anchorSource = earlySeason + ' Similar (' + altHist + ') Price ' + earlyPrice + ' x ' + bridgePremium + ' = ' + anchorPrice; custSource = anchorSource; } // --------after the early price is translated see if target is still less------- if (targetPrice < anchorPrice) { anchorSource = `Target Price ${targetPrice}`; anchorPrice = targetPrice; } } else { anchorPrice = targetPrice; anchorSource = `Target Price ${targetPrice}`; } //------get the most relevant inflation factor number--------------------------------- //------anchor x inflation / fxrate--------------------------------------------------- let calcPriceUSD = parseFloat((anchorPrice * inflationFactor).toFixed(5)); let calcPrice = parseFloat((calcPriceUSD / fxrate).toFixed(5)); if (calcPrice >= list && list) { calcCeiling = "Cap At List"; //multiply list by FX to get to USD if in CAD finalPrice = list; if (curr === "CA") { finalReason = `${anchorSource} x ${inflationFactor} / ${fxrate} FX = ${calcPrice} CAD, cap at list ${list} CAD`; } else { finalReason = `${anchorSource} x ${inflationFactor} = ${calcPrice}, cap at list ${list}`; } } else { finalPrice = calcPrice; finalPriceUSD = calcPriceUSD; if (curr === "CA") { finalReason = `${anchorSource} x ${inflationFactor} / ${fxrate} FX = ${calcPrice} CAD`; } else { finalReason = `${anchorSource} x ${inflationFactor} = ${calcPrice}`; } } } guidance.AnchorPrice = anchorPrice; guidance.AnchorSource = anchorSource; guidance.CustAnchorPrice = custPrice; guidance.CustAnchorSource = custSource; guidance.InflationFactor = inflationFactor; guidance.Ceiling = calcCeiling; guidance.FinalPriceUSD = finalPriceUSD; guidance.FinalReasonUSD = finalReasonUSD; guidance.FinalPrice = finalPrice; guidance.FinalReason = finalReason; guidance.BridgePremium = bridgePremium; guidance.TargetPrice = targetPrice; guidance.ListPrice = list; doc.guidance = guidance; return doc; }