yanweiyuan3
2023-08-09 588bc7829387dfc761cc25f06f77d4c81818bd10
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
Quintiq file version 2.0
#parent: #root
Method AddClosureForSPIP (
  TransformerSmartPlan tranformersmartplan,
  LibOpt_Scope scope,
  RunContextForCapacityPlanning runcontext
)
{
  TextBody:
  [*
    // >> begin compute relation to last SPIP in scope
    traverse( runcontext.FirstPeriod_MP().MacroPlan(), StockingPoint_MP, sp ) 
    {
      sp.MetaOptimizerLastSPIP( relflush ); 
    }
    
    stockingpoints := construct( StockingPoint_MPs ); 
    traverse( scope.GetStockingPointInPeriodInOptimizerRun(), Elements, spip, not spip.StockingPoint_MP().IsPlannedInfinite() ) 
    {
      sp := spip.StockingPoint_MP(); 
      start := spip.Start(); 
      if ( isnull( sp.MetaOptimizerLastSPIP() ) )  
      {
        stockingpoints.Add( sp ); 
        sp.MetaOptimizerLastSPIP( relset, spip );
      } 
      else if ( start > sp.MetaOptimizerLastSPIP().Start() ) 
      {
        sp.MetaOptimizerLastSPIP( relset, spip ); 
      }  
    }
    // << end compute relation to last SPIP in scope
    
    traverse( stockingpoints, Elements.MetaOptimizerLastSPIP, spip ) 
    {
      traverse( spip, 
                ProductInStockingPointInPeriod.astype( ProductInStockingPointInPeriodPlanning ), 
                pispip, 
                scope.Contains( pispip.ProductInStockingPoint_MP().PISPInOptimizerRun() )
                and ( isnull(  pispip.PISPIPInOptimizerRun() )
                      or not scope.Contains(  pispip.PISPIPInOptimizerRun() ) ) ) // those pispips adjacent to spip not in scope for which we know there is some other pispip in scope. Since spip is latest period we also know
      {                                                                           // this pispip has period < spip
        pispiptoadd := pispip; 
        repeat  // keep adding and go back period until we hit the pispip in scope 
        {
          scope.Add( pispiptoadd );
          pispiptoadd := pispiptoadd.PreviousPlanningPISPIP(); 
        }
        until ( scope.Contains( pispiptoadd.PISPIPInOptimizerRun() ) )
      }
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}