Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method CapacityPlanningAlgorithmHandleFeasibleOperationPeriodTask ( 
 | 
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, 
 | 
  const RunContextForCapacityPlanning runcontext, 
 | 
  LibOpt_Task task 
 | 
) 
 | 
{ 
 | 
  Description: 'Assign the optimal quantity from optimizer for period task planned quantity' 
 | 
  TextBody: 
 | 
  [* 
 | 
    scope := task.Scope();  
 | 
    // Assign PTQty to PeriodTask.OptimizerQuantity. 
 | 
    if ( this.GetPeriodsFromPeriodTaskOperation() )  
 | 
    { 
 | 
      traverse( scope.GetPeriodTaskOperationInOptimizerRun(), Elements, pt )  
 | 
      { 
 | 
        period := pt.UnitPeriod().Period_MP();  
 | 
        operation := pt.Operation();  
 | 
        ptvar := program.PTQtyVariables().Get( operation, period ); 
 | 
         
 | 
        quantity := this.GetOptimalValue( ptvar ); 
 | 
         
 | 
        if ( pt.Operation().IsBlending() and runcontext.IsMetaIteration() ) // no filtering for numerical sensitive blending operation in meta optimizer 
 | 
        { 
 | 
          quantity := this.GetOptimalValueUnfiltered( ptvar );  
 | 
        } 
 | 
     
 | 
        if ( quantity <= 0 )  
 | 
        { 
 | 
          quantity := 100;  
 | 
          quantity := 0.0;  
 | 
        } 
 | 
         
 | 
        if ( not ( quantity = 0 and pt.Quantity() = 0 ) ) // if both are 0 we can skip. Otherwise if they are different we clearly need to plan, both even if equal groups may be different  
 | 
        { 
 | 
          this.CapacityPlanningAlgorithmHandleFeasibleOperationPeriodTask_SetPT( program, runcontext, pt, quantity ) 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    else 
 | 
    { 
 | 
      traverse( scope.GetOperationInOptimizerRun(), Elements, operation ) 
 | 
      { 
 | 
        traverse( operation, Unit.PlanningUnitPeriod, unitperiod ) 
 | 
        { 
 | 
          period := unitperiod.Period_MP(); 
 | 
          ptvar := program.PTQtyVariables().Find( operation, period ); 
 | 
       
 | 
          // if the ptvar is null, then this combination of operation and period is not considered in this optimizer run 
 | 
          if( not isnull( ptvar ) ) 
 | 
          { 
 | 
            quantity := this.GetOptimalValue( ptvar ); 
 | 
            if ( quantity <= 0 )  
 | 
            { 
 | 
              quantity := 100;  
 | 
              quantity := 0.0;  
 | 
            } 
 | 
       
 | 
            pt := PeriodTaskOperation::FindPeriodTaskOperationTypeIndex( period.Start(), operation.ID() ); 
 | 
       
 | 
            if( isnull( pt ) and quantity > 0.0 )     // only create if the period task does not exist and the planned quantity is greater than zero 
 | 
            { 
 | 
              pt := PeriodTaskOperation::CreateValidPeriodTask( operation, unitperiod, quantity, false ); 
 | 
            } 
 | 
            if( not isnull( pt ) ) 
 | 
            { 
 | 
              this.CapacityPlanningAlgorithmHandleFeasibleOperationPeriodTask_SetPT( program, runcontext, pt, quantity );  
 | 
            } 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |