| Quintiq file version 2.0 | 
| #parent: #root | 
| Method AddClosureTripsOperations ( | 
|   output LibOpt_Scope out_scope | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     addedopperiods := 0;  | 
|      | 
|     /* | 
|     wopuld need correction because in case of lead time period will be different for the input pispips | 
|     traverse(  out_scope.GetPISPIPInOptimizerRun(), Elements, pispip )  | 
|     { | 
|       traverse( pispip, ProductInStockingPoint_MP.OperationOutput.Operation, op, op.IsEnabled() )  | 
|       { | 
|         if ( not out_scope.Contains( op.OperationInOptimizerRun() ) ) | 
|         { | 
|           inputpispips := selectset(  op,  | 
|                                       OperationInput.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning,  | 
|                                       inppispip,  | 
|                                       true,  | 
|                                       inppispip.Period_MP() = pispip.Period_MP() );  | 
|                                        | 
|           outputpispips := selectset( op,  | 
|                                       OperationOutput.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning,  | 
|                                       outpispip,  | 
|                                       true,  | 
|                                       outpispip.Period_MP() = pispip.Period_MP() );  | 
|                                                                                        | 
|           if ( forall( inputpispips,  | 
|                        Elements, inppispip,   | 
|                        out_scope.Contains( inppispip.PISPIPInOptimizerRun() ) )   | 
|                and  | 
|                forall( outputpispips,  | 
|                        Elements, outpispip,   | 
|                        out_scope.Contains( outpispip.PISPIPInOptimizerRun() )  ) ) | 
|           {  | 
|             out_scope.Add( op );  | 
|        | 
|             // Add the units to which those operations belong to unitsforoptimization | 
|             unit := op.Unit(); | 
|             out_scope.Add(  unit );  | 
|             period := pispip.Period_MP();  | 
|      | 
|             // Add the related unit periods to unitperiodsforoptimization | 
|             unitperiod := UnitPeriod::FindUnitPeriodTypeIndex( unit.ID(), period.Start(), period.End() ); | 
|             if( not unitperiod.IsPeriodFrozen() ) | 
|             { | 
|               out_scope.Add(  unitperiod );  | 
|             }   | 
|        | 
|             // Create/Select the related periodtaskoperation and add it to PTOperationsForOptimization | 
|             periodtaskoperation := PeriodTaskOperation::FindPeriodTaskOperationTypeIndex( period.Start() , op.ID() ); | 
|          | 
|             if( isnull( periodtaskoperation ) ) | 
|             { | 
|               periodtaskoperation := PeriodTaskOperation::Create( op, unitperiod, 0.0, false ); | 
|               // I think this transaction propagate is necessary, we need to get the dependent demand from the newly created periodtask | 
|               Transaction::Transaction().Propagate( relation( PeriodTaskOperation, DependentDemand ) ) | 
|          | 
|             } | 
|               out_scope.Add( periodtaskoperation );    | 
|             } | 
|             addedopperiods++;  | 
|          }      | 
|       } | 
|     } | 
|     */ | 
|      | 
|     addedpit := 0;  | 
|     traverse(  out_scope.GetPISPIPInOptimizerRun(), Elements, pispip )  | 
|     { | 
|       traverse(  pispip, astype( ProductInStockingPointInPeriodPlanningLeaf ).AsArrivalPISPIP, pit )  | 
|       { | 
|         if ( out_scope.Contains( pit.Trip().TripInOptimizerRun() ) | 
|              and out_scope.Contains( pit.DeparturePISPIP().PISPIPInOptimizerRun() )  | 
|              and not out_scope.Contains( pit.ProductInTripInOptimizerRun() ) ) | 
|         { | 
|           out_scope.Add( pit );  | 
|           addedpit++   | 
|         } | 
|       }         | 
|     } | 
|     debuginfo( 'Closure added (op, period):', addedopperiods, ' added pit:', addedpit ); | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |