| Quintiq file version 2.0 | 
| #parent: #root | 
| Method Execute ( | 
|   AlgorithmRun algorithmrun, | 
|   ProductInStockingPointInPeriodPlannings pispipssmartplan, | 
|   LaneLegs lanelegsforoptimization, | 
|   Period_MPs periods, | 
|   Units units, | 
|   Boolean isusingselectedunits, | 
|   Process_MP process, | 
|   Number numberofperiodssmartplan, | 
|   Boolean isupstreamsmartplan, | 
|   Boolean ismiddleoutsmartplan, | 
|   OptimizerPuzzle optimizerpuzzle | 
| ) as stream[JSON] | 
| { | 
|   TextBody: | 
|   [* | 
|     // If the option is checked that only the demand of the selected pispips should be met | 
|     // Then the sales demand variables are frozen for all pispips that are not in pispipssmartplan | 
|     // Since we plan on base periods, we need to select the basepispips that are related to the smartplan pispips | 
|     allpispipssmartplan := construct( ProductInStockingPointInPeriodPlannings ); | 
|     traverse( pispipssmartplan, Elements, pispipsmartplan ) | 
|     { | 
|         allpispipssmartplan.Add( pispipsmartplan ); | 
|         // Also select the base pispips of all product leaves | 
|         leafpispipssmartplan := pispipsmartplan.GetPlanningLeavesOfProductDimension(); | 
|         allpispipssmartplan := allpispipssmartplan.Union( leafpispipssmartplan ); | 
|     } | 
|      | 
|     run := this.CreateRun( this.DefaultScope() ); | 
|      | 
|     run.StartScope().AddSmartPlanPISPIPsToScope( allpispipssmartplan );  | 
|     run.StartScope().AddLaneLegsForOptimizationToScope( lanelegsforoptimization );  | 
|     run.StartScope().AddPeriodsToScope( periods ); | 
|     optacccounts := selectset( this, Optimization.astype( Optimization ).MacroPlan.Account_MP, account, account.IsUsedByOptimizer() )  | 
|     run.StartScope().AddOptimizerAccountsToScope( optacccounts );  | 
|     run.StartScope().Add( optimizerpuzzle );  | 
|      | 
|     firstperiod := minselect(  periods, Elements, p, true, p.Start() );  | 
|     lastperiod := maxselect(  periods, Elements, p, true, p.Start() );  | 
|     context := RunContextForCapacityPlanning::Create( run, units, firstperiod, lastperiod );  | 
|     context.Initialize( algorithmrun );  | 
|     context.IsUsingSelectedUnits( isusingselectedunits ); // already set by algorithmrun - but will set here based on argument because algorithmrun will go | 
|     context.Process_MP( relset, process ); // process for smart plan  | 
|     context.NumberOfPeriodsSmartPlan( numberofperiodssmartplan ); | 
|      | 
|     this.CreateComponents( run ); | 
|      | 
|     transformerup := select( run, Component.astype(  TransformerSmartPlanUpStream ), tup, true, true ); | 
|     prepostcomp := select(  run, Component.astype(  OptimizerPrePostProcessing ), p, true, true );  | 
|     suboptdown := select(  run, Component.astype( CapacityPlanningSuboptimizer ), o, true, o.Name() = OptimizerSmartPlan::DownStreamSubOptimizerName() );  | 
|      | 
|     if ( not ismiddleoutsmartplan )  | 
|     { | 
|       if ( isupstreamsmartplan )  | 
|       { | 
|         prepostcomp.To( transformerup );   | 
|       } | 
|       else  | 
|       { | 
|         suboptdown.Next( relflush);     | 
|       } | 
|     } | 
|      | 
|     if ( context.IsSync() )  | 
|     { | 
|       this.ConfigureForOneTransaction( run );  | 
|     } | 
|      | 
|     return run.Start(); | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |