admin
2025-01-22 7e31442f0e9b07764e9c6a9680d3d4aeba5fe1de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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' }
}