| 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: | 
|   [* | 
|     // Tianma fix 20230727 | 
|     // 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() ) ) | 
|     { | 
|       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 := 0.0;   | 
|       if( operation.HasLeadTime() )     // Get the dependent demands that is located at different period from the period of period task. | 
|       { | 
|         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 | 
|       { | 
|         fulfilledqty := sum( pispipperiods, Elements, pispipperiod, | 
|                              this.GetOptimalValue( program.OperationDemandQtyVariables().Get( dd.OperationInput(), pispipperiod ) ) ); | 
|         if( runcontext.IsMetaIteration() and operation.IsBlending() ) // no filtering for numerical sensitive blending operation in meta optimizer | 
|         { | 
|           fulfilledqty := sum( pispipperiods, Elements, pispipperiod, | 
|                                this.GetOptimalValueUnfiltered( program.OperationDemandQtyVariables().Get( dd.OperationInput(), pispipperiod ) ) ); | 
|         } | 
|       } | 
|       dd.OptimizerFulfilledQuantity( fulfilledqty ); | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |