Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method SetPISPIPRoutings ( 
 | 
  ProductInStockingPointInPeriods pispips, 
 | 
  Operation process, 
 | 
  LibOpt_Scope scope, 
 | 
  RunContextForCapacityPlanning runcontext 
 | 
) 
 | 
{ 
 | 
  Description: 'Set the relation to the routings of the given PISPIPs which are used for smart plan 1 step upstream.' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // tomvdh Nov-17-2016 (created) 
 | 
    traverse(  pispips, Elements, pispip ) 
 | 
    {   
 | 
      period := pispip.Period_MP(); 
 | 
      // Traverse over the operations that produce this product as an output 
 | 
      // If this product is a byproduct, we do not want to add its operations, unless they only produce byproduct. 
 | 
      // This is to avoid adding products to the smart plan that are only related to the smart plan input pispips because they are produced together with the same byproduct 
 | 
      traverse( pispip, ProductInStockingPoint_MP.OperationOutput.Operation, operation, 
 | 
                ifexpr( runcontext.IsSmartPlanForPeriodTask(), isnull( process ) or process.RoutingForPlanningMatrix() = operation.RoutingStep().Routing(), true ) //Only check this for period task smart plan. When an operation is specified, only set the routing of that operation. 
 | 
                and operation.GetIsAvailableForOptimization()                                // The operation must be available 
 | 
                and PeriodTaskOperation::GetIsValidPeriodTask( operation, period )       // The resulting period task must be valid 
 | 
                and ( not pispip.ProductInStockingPoint_MP().Product_MP().IsByProduct()  // This product is not a byproduct 
 | 
                      or forall( operation, OperationOutput.ProductInStockingPoint_MP.Product_MP, product, product.IsByProduct() ) ) )  // or all outputs are byproducts 
 | 
      { 
 | 
        scope.Add( operation.RoutingStep().Routing().RoutingOfSmartPlanPISPIPSInOptimizerRun( relnew ) );  
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |