price_api/apply_guidance.ts

94 lines
4.1 KiB
TypeScript
Raw Normal View History

export function apply_guidance(doc: any) {
2023-11-13 11:02:41 -05:00
const targetPrice = doc.pricing?.v1tp ?? doc.pricing?.v0tp;
2023-11-10 11:14:12 -05:00
const earlyPrice = doc.hist?.cust?.early_price;
2023-11-13 11:02:41 -05:00
const earlySeason = doc.hist?.cust?.early_season;
const bridgePremium = doc.pricing?.bridgePremium ?? 1.00000;
const altHist = doc.hist?.cust?.ds;
const iidx = doc.pricing?.iidx;
const curr = doc.customer?.curr;
2023-11-13 12:25:41 -05:00
const fxrate = doc.customer?.fxrate ?? 1.0;
2023-11-13 13:15:24 -05:00
const qty = doc.inputs?.qty;
const pltq = doc.product?.pltq;
2023-11-10 16:32:05 -05:00
let anchorPrice = null;
let anchorSource = null;
2023-11-13 11:45:47 -05:00
let custPrice = null;
let custSource = null;
2023-11-13 11:02:41 -05:00
let guidance = {};
let calcCeiling = null;
2023-11-13 12:25:41 -05:00
let finalReasonUSD = "";
let finalPriceUSD = null;
2023-11-13 11:02:41 -05:00
let finalReason = "";
let finalPrice = null;
2023-11-13 13:15:24 -05:00
let ltp = qty < pltq ? 1.15 : null;
let increase = null;
2023-11-13 11:02:41 -05:00
const inflation = Math.max(...Object.keys(iidx).map(Number));
const inflationFactor = iidx[inflation] + 1;
const list = doc.pricing?.list && doc.product?.itemrel === "2" ? doc.pricing?.list : null;
2023-11-10 16:32:05 -05:00
// ------if there is not target price just exit---------------
2023-11-10 16:04:06 -05:00
if (!targetPrice) {
anchorSource = "No target pricing setup";
2023-11-13 11:02:41 -05:00
guidance.FinalReason = "No target pricing setup";
2023-11-10 16:04:06 -05:00
} else {
2023-11-10 16:32:05 -05:00
// if there is no customer anchor price use target
2023-11-10 16:04:06 -05:00
if (earlyPrice) {
// translate alternate product history to current product quoted
2023-11-13 11:45:47 -05:00
custPrice = Number((earlyPrice * bridgePremium).toFixed(5));
anchorPrice = custPrice;
2023-11-10 16:32:05 -05:00
// --------if the price needs bridged, add the details to the description--------
if (bridgePremium === 1) {
2023-11-13 11:02:41 -05:00
anchorSource = earlySeason + ' Customer Price ' + earlyPrice;
2023-11-13 11:45:47 -05:00
custSource = anchorSource;
2023-11-10 16:32:05 -05:00
} else {
2023-11-13 11:02:41 -05:00
anchorSource = earlySeason + ' Similar (' + altHist + ') Customer Price ' + earlyPrice + ' x ' + bridgePremium + ' = ' + anchorPrice;
2023-11-13 11:45:47 -05:00
custSource = anchorSource;
2023-11-10 16:32:05 -05:00
}
// --------after the early price is translated see if target is still less-------
2023-11-10 16:04:06 -05:00
if (targetPrice < anchorPrice) {
anchorSource = `Target Price ${targetPrice}`;
anchorPrice = targetPrice;
}
2023-11-10 02:22:23 -05:00
} else {
2023-11-10 16:04:06 -05:00
anchorPrice = targetPrice;
anchorSource = `Target Price ${targetPrice}`;
2023-11-10 02:22:23 -05:00
}
2023-11-10 16:32:05 -05:00
//------get the most relevant inflation factor number---------------------------------
2023-11-13 12:25:41 -05:00
//------anchor x inflation / fxrate---------------------------------------------------
let calcPriceUSD = parseFloat((anchorPrice * inflationFactor).toFixed(5));
let calcPrice = parseFloat((calcPriceUSD / fxrate).toFixed(5));
2023-11-13 11:02:41 -05:00
if (calcPrice >= list && list) {
calcCeiling = "Cap At List";
2023-11-13 12:25:41 -05:00
//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}`;
}
2023-11-10 16:04:06 -05:00
} else {
2023-11-13 11:02:41 -05:00
finalPrice = calcPrice;
2023-11-13 12:25:41 -05:00
finalPriceUSD = calcPriceUSD;
if (curr === "CA") {
finalReason = `${anchorSource} x ${inflationFactor} / ${fxrate} FX = ${calcPrice} CAD`;
} else {
finalReason = `${anchorSource} x ${inflationFactor} = ${calcPrice}`;
}
2023-11-10 16:04:06 -05:00
}
2023-11-10 02:22:23 -05:00
}
2023-11-13 11:02:41 -05:00
guidance.AnchorPrice = anchorPrice;
guidance.AnchorSource = anchorSource;
2023-11-13 11:45:47 -05:00
guidance.CustAnchorPrice = custPrice;
guidance.CustAnchorSource = custSource;
2023-11-13 11:02:41 -05:00
guidance.InflationFactor = inflationFactor;
guidance.Ceiling = calcCeiling;
2023-11-13 12:25:41 -05:00
guidance.FinalPriceUSD = finalPriceUSD;
guidance.FinalReasonUSD = finalReasonUSD;
2023-11-13 11:02:41 -05:00
guidance.FinalPrice = finalPrice;
guidance.FinalReason = finalReason;
guidance.BridgePremium = bridgePremium;
guidance.TargetPrice = targetPrice;
guidance.ListPrice = list;
2023-11-13 11:02:41 -05:00
doc.guidance = guidance;
return doc;
}