admin
2025-01-22 7e31442f0e9b07764e9c6a9680d3d4aeba5fe1de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Quintiq file version 2.0
#parent: #root
Method StoreInitialInventoryViolations (
  RunContextForCapacityPlanning runcontext
)
{
  TextBody:
  [*
    // we need to store the violations how they are at the start of the run. Especially for the meta optimizer we should use those pre-existing violations and not those of the existing plan because 
    // earlier iterations can reduce violations for inventory specification in days, creating extra constraints on later fulfillment focus level iterations
    // only guarantee should be not to make the violations worse than what was pre existing
    startoptscope := runcontext.FirstPeriod_MP().Start(); 
    macroplan := this.Optimization().astype( Optimization ).MacroPlan(); 
    traverse( macroplan, PlanningPeriod, period, period.Start() < startoptscope ) 
    {
      traverse( period, ProductInStockingPointInPeriod.astype( ProductInStockingPointInPeriodPlanning ), pispip ) 
      {
        pispip.ViolationMinInventoryRunStart( maxvalue( 0.0, pispip.MinInventoryLevel() - pispip.InventoryLevelEnd() ) ); 
        pispip.ViolationMaxInventoryRunStart( maxvalue( 0.0, pispip.InventoryLevelEnd() - pispip.MaxInventoryLevel() ) ); 
        pispip.ViolationTargetInventoryRunStart( maxvalue( 0.0, pispip.TargetInventoryLevel() - pispip.InventoryLevelEnd() ) ); 
      }
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}