| 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' } | 
| } |