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