| Quintiq file version 2.0 | 
| #parent: #root | 
| MethodOverride InitVariablesForPostponedSalesDemands ( | 
|   const CapacityPlanningSuboptimizer subopt, | 
|   CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, | 
|   const LibOpt_Scope scope, | 
|   Number optminpostponementperiod, | 
|   Boolean shelflifevaronly | 
| ) const | 
| { | 
|   TextBody: | 
|   [* | 
|     lsdip := this;  | 
|      | 
|     if( lsdip.CanBePostponed() and lsdip.NeedsToBePlanned() ) | 
|     { | 
|       nextpispip := lsdip.AsPlanningBaseSalesDemandInPeriod().NextPlanningPISPIP(); | 
|        | 
|       for( i := 2; | 
|            i <= optminpostponementperiod | 
|            and not isnull( nextpispip ); | 
|            i++ | 
|          ) | 
|       { | 
|         nextpispip := nextpispip.NextPlanningPISPIP(); | 
|       } | 
|        | 
|       for( i := optminpostponementperiod; | 
|            i <= lsdip.MaxPostponementPeriod()                                           // within the maximum number of postponement periods | 
|            and not isnull( nextpispip );                                          // the next pispip exists | 
|            i++ ) | 
|       { | 
|         if( scope.Contains(  nextpispip.PISPIPInOptimizerRun() ) ) | 
|         { | 
|           // DelayedSalesDemandQty variable UoM: PISP | 
|           // look if variable is already defined, because we also init variable for the extra shelf life pispips prior to horizon | 
|           var := ifexpr( shelflifevaronly, program.DelayedSalesDemandQtyVariables().Find( lsdip, nextpispip.Period_MP() ), null(  MPVariable ) ); | 
|           if ( isnull( var ) ) | 
|           { | 
|             var := program.DelayedSalesDemandQtyVariables().New( lsdip, nextpispip.Period_MP() ); | 
|             upperbound := maxvalue( 0.0, lsdip.GetQuantityForOptimizer( scope ) ); | 
|             subopt.FreezeVariableUpperBound( var, upperbound ); | 
|           }  | 
|                 | 
|           if ( nextpispip.ProductInStockingPoint_MP().IsOptShelfLife() )  | 
|           { | 
|             traverse( nextpispip, ProductInStockingPoint_MP.IncomingShelfLifeDay, islday )  | 
|             { | 
|               // look if variable is already defined, because we also init variable for the extra shelf life pispips prior to horizon | 
|               dvar := program.DelayedSalesDemandShelfLifeQtyVariables().Find( lsdip, nextpispip.Period_MP(), islday );  | 
|               if ( isnull( dvar ) ) | 
|               { | 
|                 program.DelayedSalesDemandShelfLifeQtyVariables().New( lsdip, nextpispip.Period_MP(), islday ); | 
|               } | 
|             } | 
|           } | 
|         } | 
|         nextpispip := nextpispip.NextPlanningPISPIP(); | 
|       } | 
|     } | 
|   *] | 
| } |