private void initLearningMetrics() { if (learningMetricsInitialized) { return; } double defaultWeight = SystemDao.getDefaultWeight(); double lastWeekLift = getDemandUplift(SystemDao.getReviewCycleStartDate()); Sales beginOfRunCycleSales = getSales(SystemDao.getReviewCycleStartDate()); double beginOfRunCycleRcAvgSales = 0; if (beginOfRunCycleSales != null) { beginOfRunCycleRcAvgSales = beginOfRunCycleSales.getRcAvgSales(); } rcAvgSales = getWeightedWeight1(learningWeekCounter, defaultWeight) * epSales / lastWeekLift + (1 - getWeightedWeight1(learningWeekCounter, defaultWeight)) * beginOfRunCycleRcAvgSales; // Tim's documentation states: // Its important sales metrics are initialized to AVG_WEEKLY_SALES based on the initialization // logic. // This estimates initial values based on different combinations of the PLs product and location // hierarchies dependent on the specific situation for that PL rcAvgSalesActual = rcAvgSales; rcAvgDemand = rcAvgSales; rcOldAvgDemand = rcAvgSales; rcAvgDemandActual = rcAvgSales; epAvgInv = rcAvgSales; rcWass2 = Math.pow(rcAvgSales, 2); learningMetricsInitialized = true; }
// Hook: MSSalesOutlierCheckHook.java public void performOutlierProcessing(String locId) { // only apply constraint if we are not in a seasonal period System.out.println( "Starting the Outlier/Unreported Sales Calculation for product/location: " + locId); int specialPuchaseOrderWassMult = SystemDao.getSpecialPurchaseOrderWassMultiplier(); int specialPuchaseOrderSizeMult = SystemDao.getSpecialPurchaseOrderSizeMultipler(); double rcWass2 = Math.pow(rcAvgSales, 2); Double maxValue = Math.max( rcAvgSales + specialPuchaseOrderSizeMult * Math.sqrt(Math.max(0, rcWass2)), specialPuchaseOrderWassMult * innerPackQty); if (epSalesActual > maxValue && eventSeasonalIndicator == false) { epSales = maxValue; } else { epSales = epSalesActual; } }