2023-11-08 12:54:46 -05:00
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
2023-11-10 02:22:23 -05:00
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
}
}
}
2023-11-10 01:44:37 -05:00
//// 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
// };
//}
2023-11-10 02:59:19 -05:00
doc . targetPrice = doc . v1tp ? ? doc . v0tp ;
2023-11-10 02:22:23 -05:00
// Determine the anchor price and source
2023-11-10 02:59:19 -05:00
if ( doc . hist . cust ? . early_price !== undefined ) {
2023-11-10 02:22:23 -05:00
if ( doc . hist . cust . relevance !== 'customer exact' ) {
2023-11-10 02:59:19 -05:00
doc . anchorPrice = Number ( ( doc . hist . cust . early_price * doc . bridgePremium ) . toFixed ( 5 ) ) ;
if ( doc . targetPrice < doc . anchorPrice ) {
doc . anchorPrice = doc . targetPrice ;
doc . anchorSource = 'Target Price'
} else {
doc . anchorSource = doc . hist . cust . early_season + ' Similar (' + doc . hist . cust . ds + ') Customer Price ' + doc . hist . cust . early_price + ' x ' + doc . bridgePremium + ' = ' + doc . anchorPrice ;
if ( doc . targetPrice < doc . anchorPrice ) {
doc . anchorSource = 'Target Price' ;
doc . anchorPrice = doc . targetPrice ;
}
}
2023-11-10 02:22:23 -05:00
} else {
doc . anchorPrice = doc . hist . cust . early_price ;
doc . anchorSource = doc . hist . cust . early_season + ' Customer Price ' + doc . hist . cust . early_price ;
}
} else {
2023-11-10 02:59:19 -05:00
doc . anchorPrice = doc . targetPrice ;
doc . anchorSource = 'Target Price' ;
2023-11-10 02:22:23 -05:00
}
const inflation = Math . max ( . . . Object . keys ( doc . iidx ) . map ( Number ) ) ;
const inflationFactor = doc . iidx [ inflation ] + 1 ;
doc . inflationFactor = inflationFactor ;
var calcPrice = doc . anchorPrice * doc . inflationFactor ;
calcPrice = parseFloat ( calcPrice . toFixed ( 5 ) ) ;
let finalReason = "" ;
if ( calcPrice >= doc . list ) {
doc . calcCeiling = "Cap At List" ;
doc . finalPrice = doc . list ;
2023-11-10 02:59:19 -05:00
finalReason = ` ${ doc . anchorSource } x ${ inflationFactor } = ${ calcPrice } but cap at list ${ doc . list } ` ;
2023-11-10 02:22:23 -05:00
} else {
doc . finalPrice = calcPrice ;
2023-11-10 02:59:19 -05:00
finalReason = ` ${ doc . anchorSource } x ${ inflationFactor } = ${ calcPrice } ` ;
2023-11-10 02:22:23 -05:00
}
doc . finalReason = finalReason ;
2023-11-08 12:54:46 -05:00
return doc ;
}