| Quintiq file version 2.0 | 
| #parent: #root | 
| Method InitVariablesForSalesDemands ( | 
|   CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, | 
|   const LibOpt_Scope scope | 
| ) const | 
| { | 
|   Description: 'Initialize all sales demand quantity variables for AggregatedSalesDemandInPeriod, DisaggregatedSalesDemandInPeriod and LeafSalesDemandInPeriod' | 
|   TextBody: | 
|   [* | 
|     // edz1 Oct-20-2016 (created) | 
|      | 
|     // Leaf sales demands  | 
|     traverse( scope.GetLeafSalesDemandInPeriodInRunConst(), Elements, lsdip )  | 
|     { | 
|       // Type    : LeafSalesDemandInPeriod | 
|       // Variable: 'SalesDemandQty' UoM: PISP | 
|       var := program.SalesDemandQtyVariables().New( lsdip ); | 
|       upperbound := maxvalue( 0.0, lsdip.GetQuantityForOptimizer( scope ) ); | 
|       this.FreezeVariableUpperBound( var, upperbound ); | 
|      | 
|       if ( lsdip.ProductInStockingPoint_MP().IsOptShelfLife() )  | 
|       { | 
|         traverse( lsdip, ProductInStockingPoint_MP.IncomingShelfLifeDay, islday )  | 
|         { | 
|            // Leaf sales demands added to balance constraint | 
|            program.SalesDemandShelfLifeQtyVariables().New( lsdip, islday ); | 
|         } | 
|       } | 
|            | 
|       // Postponed sales demand variable | 
|       if( lsdip.CanBePostponed() ) | 
|       { | 
|         // Type    : LeafSalesDemandInPeriod | 
|         // Variable: 'DelayedSalesDemandQty' UoM: PISP  | 
|         lsdip.InitVariablesForPostponedSalesDemands(  this, program, scope, 1, false /* shelf life var only false */ );  | 
|       } | 
|     } | 
|      | 
|     // Aggregated sales demands for higher product level | 
|     traverse( scope.GetAggregatedSalesDemandInPeriodInRunConst(), Elements, asdip )  | 
|     { | 
|       // There is no decision variable for AggregatedSalesDemandInPeriod | 
|       // Traverse the children ( Disaggregated Sales demands ) | 
|       traverse ( asdip,  | 
|                  DisaggregatedSalesDemandInPeriod,  | 
|                  dasdip, | 
|                  not dasdip.IsPostponed() // note that postponed dasdip is still owned by the original asdip and that we do not unplan the postponed asdip object until handle feasible | 
|                  and scope.Contains( dasdip.AsPlanningBaseSalesDemandInPeriod().PISPIPInOptimizerRun() ) ) // so un aggregated variables need to be taken care of like this | 
|       { | 
|         // Type    : DisaggregatedSalesDemandInPeriod | 
|         // Variable: 'DisaggregatedSalesDemandQty' UoM: PISP | 
|         var := program.DisaggregatedSalesDemandQtyVariables().New( dasdip ); | 
|         lowerbound := 0.0; | 
|         upperbound := maxvalue( 0.0, asdip.GetQuantityForOptimizer( scope ) ); | 
|         this.FreezeVariableLowerUpperBound( var, lowerbound, upperbound ); | 
|      | 
|         if ( dasdip.ProductInStockingPoint_MP().IsOptShelfLife() )  | 
|         { | 
|           traverse( dasdip, ProductInStockingPoint_MP.IncomingShelfLifeDay, islday )  | 
|           { | 
|             program.DisaggregatedSalesDemandShelfLifeQtyVariables().New( dasdip, islday ); | 
|           } | 
|         } | 
|         // Postponed or delayed sales demand variable | 
|         if( asdip.CanBePostponed() ) | 
|         { | 
|           // Type    : DelayedDisaggregatedSalesDemandInPeriod | 
|           // Variable: 'DelayedDisaggregatedSalesDemandQty' UoM: PISP | 
|           dasdip.InitVariablesForPostponedSalesDemands( this, program, scope, 1, false /* shelf life var only false */ );  | 
|         } | 
|       } | 
|     } | 
|      | 
|     // Sales demand before the optimization horizon, including those before the planning horizon. | 
|     this.InitVariablesForSalesDemandsInScopeWhenPostponed( program, scope ); | 
|      | 
|      | 
|     // extra for extended collection of periods for shelf life prior to scope | 
|     traverse( scope.GetProductInStockingPointInOptimizerRunConst(), Elements, pisp, pisp.IsOptShelfLife() )  | 
|     { | 
|       initpispips := pisp.PISPInOptimizerRun().GetPISPIPForShelfLifeOptimizer( scope );  | 
|       traverse( initpispips, Elements, pispip, not scope.Contains( pispip.PISPIPInOptimizerRun() ) ) | 
|       { | 
|         traverse( pispip.GetLeafSalesDemandInPeriod(), Elements, lsdip )  | 
|         { | 
|           traverse( lsdip, ProductInStockingPoint_MP.IncomingShelfLifeDay, islday )  | 
|           { | 
|             // Leaf sales demands added to balance constraint | 
|             program.SalesDemandShelfLifeQtyVariables().New( lsdip, islday ); | 
|           } | 
|            | 
|           // Postponed sales demand variable | 
|           if( lsdip.CanBePostponed() ) | 
|           { | 
|             // Type    : LeafSalesDemandInPeriod | 
|             // Variable: 'DelayedSalesDemandQty' UoM: PISP  | 
|             lsdip.InitVariablesForPostponedSalesDemands(  this, program, scope, 1, true /* shelf life var only true */ );  | 
|           } | 
|         } | 
|          | 
|         traverse( pispip.GetDisaggregatedSalesDemandInPeriod(),  | 
|                   Elements,  | 
|                   dasdip, | 
|                   not dasdip.IsPostponed() ) // note that postponed dasdip is still owned by the original asdip and that we do not unplan the postponed asdip object until handle feasible | 
|         { | 
|           asdip := dasdip.AggregatedSalesDemandInPeriod();  | 
|      | 
|           traverse( dasdip, ProductInStockingPoint_MP.IncomingShelfLifeDay, islday )  | 
|           { | 
|             program.DisaggregatedSalesDemandShelfLifeQtyVariables().New( dasdip, islday ); | 
|           } | 
|           // Postponed or delayed sales demand variable | 
|           if( asdip.CanBePostponed() ) | 
|           { | 
|             // Type    : DelayedDisaggregatedSalesDemandInPeriod | 
|             // Variable: 'DelayedDisaggregatedSalesDemandQty' UoM: PISP | 
|             dasdip.InitVariablesForPostponedSalesDemands( this, program, scope, 1, true /* shelf life var only false */ );  | 
|           } | 
|         } | 
|       } | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |