| Quintiq file version 2.0 | 
| #parent: #root | 
| Method PlanFeedbackPIT ( | 
|   LibOpt_Scope scope, | 
|   RunContextForCapacityPlanning runcontext | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     pitcount := 0;  | 
|     traverse( scope.GetPeriodInOptimizerRun(), Elements.UnitPeriod, up, not up.IsPeriodFrozen() )  | 
|     { | 
|       validfeedbackpit := selectset( up, Feedback.astype( FeedbackProductInTrip ), fbpit, true, fbpit.GetIsValidFeedback() );  | 
|       // create pit if needed | 
|       traverse( validfeedbackpit, Elements, fbpit )  | 
|       { | 
|         created := false;  | 
|         trip := fbpit.Trip();  | 
|         if ( isnull( trip ) ) | 
|         { | 
|           laneleg := fbpit.LaneLeg();  | 
|           if ( not isnull( laneleg ) )  | 
|           { | 
|             trip := Trip::Create( laneleg, up.Period_MP() );  | 
|             trip.CalcDeparture();  | 
|             created := true;  | 
|           } | 
|         } | 
|         departingpriortoscope := trip.Departure() < maxvalue( up.Unit().EndOfFrozen(), runcontext.FirstPeriod_MP().Start() );  | 
|         if ( created and departingpriortoscope )  | 
|         { | 
|           trip.Delete();  | 
|         } | 
|         tripexists := not isnull( trip );  | 
|         if ( tripexists and not departingpriortoscope )  | 
|         { | 
|           pit := fbpit.ProductInTrip(); | 
|           if ( isnull( pit ) )  | 
|           { | 
|             product := select( up.MacroPlan(), Product_MP, p, true, p.ID() = fbpit.ProductID() );  | 
|             pit := trip.AddProduct( product, 0.0, false );     | 
|           }  | 
|           if ( guard( not pit.Trip() = trip, true ) )  | 
|           { | 
|             info( 'Warning: cannot find trip for pit. Tripd id = ', pit.TripID(), 'product ID = ', pit.ProductID() );  | 
|           } | 
|         } | 
|         else | 
|         { | 
|           info( 'Warning: could not create trip for feedback with ID ', fbpit.ID(), 'Departing prior to scope = ', departingpriortoscope );  | 
|         } | 
|       } | 
|        | 
|       // propgate relations - used below | 
|       Transaction::Transaction().Propagate( relation( FeedbackProductInTrip, ProductInTrip ) );  | 
|        | 
|       pits := selectset( validfeedbackpit, Elements.ProductInTrip, pit, true, true ).Unique();  | 
|       traverse( pits, Elements, pit, not pit.Trip().Departure() < maxvalue( up.Unit().EndOfFrozen(), runcontext.FirstPeriod_MP().Start() ) )  | 
|       { | 
|         pit.HasUserQuantity( false );  | 
|         feedbackqty := sum( pit, FeedbackProductInTrip, fb, true, fb.FeedbackQuantity() );  | 
|         if ( pit.OptimizerQuantity() < feedbackqty )  | 
|         { | 
|           pit.OptimizerQuantity( feedbackqty );  | 
|           pitcount++;  | 
|         } | 
|       } | 
|     } | 
|     debuginfo(  'Planned feedback for #pit = ', pitcount ); | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |