price_api/apply_guidance.ts

110 lines
4.9 KiB
TypeScript
Raw Normal View History

export function apply_guidance(doc: any) {
2023-11-15 13:47:00 -05:00
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;
}
2023-11-16 10:25:41 -05:00
function lowestPrice(priceObject) {
let Price = Infinity;
let Reason = '';
let Source = '';
let Snapped = Infinity;
// Iterate over each property in the object
for (let key in priceObject) {
if (priceObject.hasOwnProperty(key) && key !== "mark") {
let [cprice, creason, csource, csnap] = priceObject[key];
// Check if the current price is lower than the found so far
if (cprice && cprice < Price) {
Price = cprice;
Reason = creason;
Source = csource;
Snapped = csnap;
}
}
}
return {Reason, Price, Source, Snapped};
}
function ceiling(value, significance) {
return Math.ceil(value / significance) * significance;
}
function pp(value) {
return (value * 1000).toFixed(2);
}
// --------------------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;
2023-11-16 10:25:41 -05:00
const earlyMarkPrice = doc.hist?.market?.early_price;
const earlyMarkSeason = doc.hist?.market?.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;
2023-11-15 15:26:21 -05:00
// ------------------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 custAdder = (ltp ?? 0) + optimization + inflationFactor;
let markAdder = (ltp ?? 0) + inflationFactor;
2023-11-16 10:25:41 -05:00
let inflReason = (inflationFactor ?? 0) !== 0 ? ` + ${(inflationFactor * 100).toFixed(1)}% infl`: "";
let ltpReason = ltp ? ` + ${(ltp * 100).toFixed(1)}% ltp` : "";
let optReason = (optimization ?? 0) !== 0 ? ` + ${(optimization * 100).toFixed(1)}% opt`: "";
let custAddReason = `${inflReason}${ltpReason}${optReason}`;
let markAddReason = `${inflReason}${ltpReason}`;
2023-11-15 13:47:00 -05:00
// ------------------start building price options------------------------------------------------
2023-11-16 10:25:41 -05:00
let snap = .0005;
let custPrice = Number((bridgedPrice * (1 + custAdder)).toFixed(5));
let custSeason = earlyCustSeason;
let custReason = bridgePremium
2023-11-16 10:25:41 -05:00
? `${custSeason} (similar ${altHist} price ${pp(earlyCustPrice)} x ${bridgePremium} = ${pp(bridgedPrice)})${custAddReason}`
: `${custSeason} + price ${pp(custPrice)}${custAddReason}`;
let markPrice = earlyMarkPrice * (1 + markAdder);
let markReason = `${earlyMarkSeason} ASP + ${pp(earlyMarkPrice)}${markAddReason}`;
let targPrice = targetPrice * (1 + markAdder);
2023-11-16 10:25:41 -05:00
let targReason = `Target price ${pp(targetPrice)}${markAddReason}`;
let listPrice = listUSD;
let listReason = "";
2023-11-15 13:47:00 -05:00
2023-11-16 10:25:41 -05:00
let prices = {
cust: [custPrice, custReason, "cust", ceiling(custPrice,snap)],
mark: [markPrice, markReason, "mark", ceiling(markPrice,snap)],
targ: [targPrice, targReason, "targ", ceiling(targPrice,snap)],
list: [listPrice, listReason, "list", ceiling(listPrice,snap)]
2023-11-15 17:04:16 -05:00
}
2023-11-16 10:25:41 -05:00
let finalPrice = lowestPrice(prices);
let guidance = {
prices
,finalPrice
2023-11-10 02:22:23 -05:00
}
2023-11-13 11:02:41 -05:00
doc.guidance = guidance;
return doc;
}