diff --git a/apply_guidance.ts b/apply_guidance.ts index afd00d9..f6c718d 100644 --- a/apply_guidance.ts +++ b/apply_guidance.ts @@ -1,152 +1,40 @@ export function apply_guidance(doc: any) { - let mostRelevantMarketPrice = null; - let mostRelevantMarketPriceEarly = null; - let mostRelevantMarketKey = null; - let mostRelevantMarketSeason = null; - let mostRelevantMarketSeasonEarly = null; - let highestMarketRelevanceLevel = 0; - let mostRelevantMarketSource = null; - let mostRelevantCustomerPriceEarly = null; - let mostRelevantCustomerPriceRecent = null; - let mostRelevantCustomerKey = null; - let mostRelevantCustomerSeasonEarly = null; - let mostRelevantCustomerSeasonRecent = null; - let highestCustomerRelevanceLevel = 0; - let mostRelevantCustomerSource = null; - - // Function to update price and assign relevance indicator - function setAnchors(items, channelFirstChar, v1ds, v0ds, histKey) { - for (let item of items) { - // Update the last_price with the most recent price - const years = Object.keys(item.season).map(Number).filter(year => year >= 2020); - if (years.length > 0) { - const recentYear = Math.max(...years.map(Number)); - const earlyYear = Math.min(...years.map(Number)); - const lastPrice = item.season[recentYear].price_usd; - const earlyPrice = item.season[earlyYear].price_usd; - item.last_price = lastPrice; - item.early_price = earlyPrice; - item.last_season = recentYear; - item.early_season = earlyYear; - } else { - item.last_price = null; // or some default value as appropriate - } - - // Initialize relevance as numeric value - let marketRelevance = 0; // Assume 0 is 'not relevant' - let customerRelevance = 0; // Assume 0 is 'not relevant' - - - // Check if the first character of the item's channel matches the first character of the document's channel - if (item.chan.charAt(0) === channelFirstChar) { - marketRelevance = 1; // 'relevant' - - - // Further refine relevance based on v1ds and v0ds - if (item.v1ds === v1ds) { - marketRelevance = 2; // 'most relevant' because v1ds matches - - // Check for customer relevance if 'cust' key exists - customerRelevance = item.cust ? 3 : 0; - } else if (item.v0ds === v0ds) { - marketRelevance = marketRelevance === 2 ? 2 : 1; // Keep relevance as is if v1ds was matched, otherwise it's just 'relevant' - customerRelevance = item.cust ? 2 : 0; - } else if (item.cust) { - customerRelevance = item.v1ds ? 2 : item.v0ds ? 1 : 0; - } - } - - // Assign the calculated relevance to the item - item.marketRelevance = marketRelevance; - item.customerRelevance = customerRelevance; - - // Update the most relevant market price if this item's relevance is higher and it doesn't have a 'cust' key - if (marketRelevance > highestMarketRelevanceLevel) { - highestMarketRelevanceLevel = marketRelevance; - mostRelevantMarketPrice = item.last_price; - mostRelevantMarketPriceEarly = item.early_price; - mostRelevantMarketKey = histKey; - mostRelevantMarketSource = item; - delete mostRelevantMarketSource.season; - mostRelevantMarketSeason = item.last_season; // Assuming 'season' is the key where the season info is stored - mostRelevantMarketSeasonEarly = item.early_season; - } - - // Update the most relevant customer price if this item's relevance is higher and it has a 'cust' key - if (customerRelevance > highestCustomerRelevanceLevel) { - highestCustomerRelevanceLevel = customerRelevance; - mostRelevantCustomerPriceRecent = item.last_price; - mostRelevantCustomerPriceEarly = item.early_price; - mostRelevantCustomerKey = histKey; - mostRelevantCustomerSource = item; - delete mostRelevantCustomerSource.season; - mostRelevantCustomerSeasonRecent = item.last_season; // Assuming 'season' is the key where the season info is stored - mostRelevantCustomerSeasonEarly = item.early_season; // Assuming 'season' is the key where the season info is stored - } - } - } - - //// Iterate over each key in the "hist" object - //for (let key of Object.keys(doc.hist)) { - // // Update price and relevance for each item in the current key - // setAnchors(doc.hist[key], doc.chan[0], doc.v1ds, doc.v0ds, key); - //} - - //// Assign the most relevant market price and key to the top level of the document - //if (mostRelevantMarketPrice !== null) { - // doc.mostRelevantMarketPriceInfo = { - // price: mostRelevantMarketPrice, - // price_early: mostRelevantMarketPriceEarly, - // source: mostRelevantMarketSource, - // season: mostRelevantMarketSeason, - // season_early: mostRelevantMarketSeasonEarly, - // relevance: highestMarketRelevanceLevel - // }; - //} - - //// Assign the most relevant customer price and key to the top level of the document - //if (mostRelevantCustomerPriceRecent !== null) { - // doc.mostRelevantCustomerPriceInfo = { - // price: mostRelevantCustomerPriceRecent, - // price_early: mostRelevantCustomerPriceEarly, - // source: mostRelevantCustomerSource, - // season: mostRelevantCustomerSeasonRecent, - // season_early: mostRelevantCustomerSeasonEarly, - // relevance: highestCustomerRelevanceLevel - // }; - //} - - const targetPrice = doc.v1tp ?? doc.v0tp; const earlyPrice = doc.hist?.cust?.early_price; - let anchorPrice = null; - let anchorSource = null; - let bridgePremium = doc.bridgePremium ?? 1.00000; + let anchorPrice = null; + let anchorSource = null; + let bridgePremium = doc.bridgePremium ?? 1.00000; + // ------if there is not target price just exit--------------- if (!targetPrice) { anchorSource = "No target pricing setup"; doc.finalReason = "No target pricing setup"; } else { - // Determine the anchor price and source + // if there is no customer anchor price use target if (earlyPrice) { // translate alternate product history to current product quoted anchorPrice = Number((earlyPrice * bridgePremium).toFixed(5)); - // after the early price is translated see if target is still less + // --------if the price needs bridged, add the details to the description-------- + if (bridgePremium === 1) { + anchorSource = doc.hist.cust.early_season + ' Customer Price ' + earlyPrice; + } else { + anchorSource = doc.hist.cust.early_season + ' Similar (' + doc.hist.cust.ds + ') Customer Price ' + earlyPrice + ' x ' + doc.bridgePremium + ' = ' + anchorPrice; + } + // --------after the early price is translated see if target is still less------- if (targetPrice < anchorPrice) { anchorSource = `Target Price ${targetPrice}`; anchorPrice = targetPrice; - } else { - anchorSource = doc.hist.cust.early_season + ' Similar (' + doc.hist.cust.ds + ') Customer Price ' + earlyPrice + ' x ' + doc.bridgePremium + ' = ' + anchorPrice; } } else { anchorPrice = targetPrice; anchorSource = `Target Price ${targetPrice}`; } - + //------get the most relevant inflation factor number--------------------------------- const inflation = Math.max(...Object.keys(doc.iidx).map(Number)); + //------extract the inflation factor using the relevance key-------------------------- const inflationFactor = doc.iidx[inflation] + 1; - var calcPrice = parseFloat((anchorPrice * inflationFactor).toFixed(5)); - let finalReason = ""; + let calcPrice = parseFloat((anchorPrice * inflationFactor).toFixed(5)); + let finalReason = ""; if (calcPrice >= doc.list && doc.list) { doc.calcCeiling = "Cap At List"; doc.finalPrice = doc.list; @@ -162,6 +50,5 @@ export function apply_guidance(doc: any) { doc.bridgePremium = bridgePremium; doc.targetPrice = targetPrice; } - return doc; } diff --git a/set_anchors.ts b/set_anchors.ts new file mode 100644 index 0000000..b76bb56 --- /dev/null +++ b/set_anchors.ts @@ -0,0 +1,118 @@ + + let mostRelevantMarketPrice = null; + let mostRelevantMarketPriceEarly = null; + let mostRelevantMarketKey = null; + let mostRelevantMarketSeason = null; + let mostRelevantMarketSeasonEarly = null; + let highestMarketRelevanceLevel = 0; + let mostRelevantMarketSource = null; + + let mostRelevantCustomerPriceEarly = null; + let mostRelevantCustomerPriceRecent = null; + let mostRelevantCustomerKey = null; + let mostRelevantCustomerSeasonEarly = null; + let mostRelevantCustomerSeasonRecent = null; + let highestCustomerRelevanceLevel = 0; + let mostRelevantCustomerSource = null; + + // Function to update price and assign relevance indicator + function setAnchors(items, channelFirstChar, v1ds, v0ds, histKey) { + for (let item of items) { + // Update the last_price with the most recent price + const years = Object.keys(item.season).map(Number).filter(year => year >= 2020); + if (years.length > 0) { + const recentYear = Math.max(...years.map(Number)); + const earlyYear = Math.min(...years.map(Number)); + const lastPrice = item.season[recentYear].price_usd; + const earlyPrice = item.season[earlyYear].price_usd; + item.last_price = lastPrice; + item.early_price = earlyPrice; + item.last_season = recentYear; + item.early_season = earlyYear; + } else { + item.last_price = null; // or some default value as appropriate + } + + // Initialize relevance as numeric value + let marketRelevance = 0; // Assume 0 is 'not relevant' + let customerRelevance = 0; // Assume 0 is 'not relevant' + + + // Check if the first character of the item's channel matches the first character of the document's channel + if (item.chan.charAt(0) === channelFirstChar) { + marketRelevance = 1; // 'relevant' + + + // Further refine relevance based on v1ds and v0ds + if (item.v1ds === v1ds) { + marketRelevance = 2; // 'most relevant' because v1ds matches + + // Check for customer relevance if 'cust' key exists + customerRelevance = item.cust ? 3 : 0; + } else if (item.v0ds === v0ds) { + marketRelevance = marketRelevance === 2 ? 2 : 1; // Keep relevance as is if v1ds was matched, otherwise it's just 'relevant' + customerRelevance = item.cust ? 2 : 0; + } else if (item.cust) { + customerRelevance = item.v1ds ? 2 : item.v0ds ? 1 : 0; + } + } + + // Assign the calculated relevance to the item + item.marketRelevance = marketRelevance; + item.customerRelevance = customerRelevance; + + // Update the most relevant market price if this item's relevance is higher and it doesn't have a 'cust' key + if (marketRelevance > highestMarketRelevanceLevel) { + highestMarketRelevanceLevel = marketRelevance; + mostRelevantMarketPrice = item.last_price; + mostRelevantMarketPriceEarly = item.early_price; + mostRelevantMarketKey = histKey; + mostRelevantMarketSource = item; + delete mostRelevantMarketSource.season; + mostRelevantMarketSeason = item.last_season; // Assuming 'season' is the key where the season info is stored + mostRelevantMarketSeasonEarly = item.early_season; + } + + // Update the most relevant customer price if this item's relevance is higher and it has a 'cust' key + if (customerRelevance > highestCustomerRelevanceLevel) { + highestCustomerRelevanceLevel = customerRelevance; + mostRelevantCustomerPriceRecent = item.last_price; + mostRelevantCustomerPriceEarly = item.early_price; + mostRelevantCustomerKey = histKey; + mostRelevantCustomerSource = item; + delete mostRelevantCustomerSource.season; + mostRelevantCustomerSeasonRecent = item.last_season; // Assuming 'season' is the key where the season info is stored + mostRelevantCustomerSeasonEarly = item.early_season; // Assuming 'season' is the key where the season info is stored + } + } + } + + //// Iterate over each key in the "hist" object + //for (let key of Object.keys(doc.hist)) { + // // Update price and relevance for each item in the current key + // setAnchors(doc.hist[key], doc.chan[0], doc.v1ds, doc.v0ds, key); + //} + + //// Assign the most relevant market price and key to the top level of the document + //if (mostRelevantMarketPrice !== null) { + // doc.mostRelevantMarketPriceInfo = { + // price: mostRelevantMarketPrice, + // price_early: mostRelevantMarketPriceEarly, + // source: mostRelevantMarketSource, + // season: mostRelevantMarketSeason, + // season_early: mostRelevantMarketSeasonEarly, + // relevance: highestMarketRelevanceLevel + // }; + //} + + //// Assign the most relevant customer price and key to the top level of the document + //if (mostRelevantCustomerPriceRecent !== null) { + // doc.mostRelevantCustomerPriceInfo = { + // price: mostRelevantCustomerPriceRecent, + // price_early: mostRelevantCustomerPriceEarly, + // source: mostRelevantCustomerSource, + // season: mostRelevantCustomerSeasonRecent, + // season_early: mostRelevantCustomerSeasonEarly, + // relevance: highestCustomerRelevanceLevel + // }; + //}