| Quintiq file version 2.0 | 
| #parent: #root | 
| Method CapacityPlanningAlgorithmHandleFeasibleOperationDependentDemandInputGroup ( | 
|   CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, | 
|   PeriodTaskOperation periodtaskoperation, | 
|   const RunContextForCapacityPlanning runcontext | 
| ) | 
| { | 
|   Description: 'Assign the optimal quantity from optimizer for dependent demand in input group.' | 
|   TextBody: | 
|   [* | 
|     // Dependent demand of input group fulfillment | 
|     ptperiod := periodtaskoperation.UnitPeriod().Period_MP(); | 
|     operation := periodtaskoperation.Operation(); | 
|     getfromperiodtask := this.GetPeriodsFromPeriodTaskOperation();  | 
|     traverse( periodtaskoperation,  | 
|               DependentDemandInputGroup,  | 
|               dd,  | 
|               dd.HasRegularProductForOptimizer() or dd.OperationInput().GetIsProductInOptimizerRun( runcontext.IsPostProcessing() ) ) | 
|     { | 
|       fulfilledqty := 0.0;  | 
|        | 
|       if( operation.HasLeadTime() )     // Get the dependent demands that is located at different period from the period of period task. | 
|       { | 
|         // compute dependent demand periods | 
|         pispipperiods := construct( Period_MPs, constcontent );  | 
|         if ( getfromperiodtask ) // in case we are able to get from period tasks, below method refinds periodtask for (operation, ptperiod) i.e. periodtaskoperation and then output dep.demand periods | 
|         { | 
|           traverse( periodtaskoperation, DependentDemand.ProductInStockingPointInPeriodPlanningLeaf.Period_MP, ddperiod )  | 
|           { | 
|             pispipperiods.Add( ddperiod );  | 
|           } | 
|         } | 
|         else | 
|         { | 
|           CapacityPlanningSuboptimizer::GetOperationDependentDemandPeriods( ptperiod, operation, &pispipperiods, getfromperiodtask ); | 
|         } | 
|          | 
|         fulfilledqty := sum( pispipperiods, Elements, pispipperiod, | 
|                              this.GetOptimalValue( program.PartialOperationDemandQtyVariables().Get( dd.OperationInput(), pispipperiod, ptperiod ) ) ); | 
|         if ( runcontext.IsMetaIteration() and operation.IsBlending() ) // no filtering for numerical sensitive blending operation in meta optimizer | 
|         {                      | 
|           fulfilledqty := sum( pispipperiods, Elements, pispipperiod, | 
|                                this.GetOptimalValueUnfiltered( program.PartialOperationDemandQtyVariables().Get( dd.OperationInput(), pispipperiod, ptperiod ) ) );     | 
|         }                      | 
|       } | 
|       else | 
|       {  | 
|         // note that in case there is no lead time then the set of dependent demand periods just equals the singleton set {ptperiod} | 
|         fulfilledqty := this.GetOptimalValue( program.OperationDemandQtyVariables().Get( dd.OperationInput(), ptperiod ) ); | 
|         if( runcontext.IsMetaIteration() and operation.IsBlending() ) // no filtering for numerical sensitive blending operation in meta optimizer | 
|         { | 
|           fulfilledqty := this.GetOptimalValueUnfiltered( program.OperationDemandQtyVariables().Get( dd.OperationInput(), ptperiod ) ); | 
|         } | 
|       } | 
|        | 
|       dd.OptimizerFulfilledQuantity( fulfilledqty ); | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |