| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GetWindowCampaignSequenceOptimizer ( | 
|   output Date earlieststart, | 
|   output Date lateststart, | 
|   Number windowsizenrperiods, | 
|   OptCampaignUnit ocunit, | 
|   LibOpt_Scope scope | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     periods := selectsortedset( ocunit,  | 
|                                 Unit.UnitPeriod,  | 
|                                 up,  | 
|                                 not up.IsPeriodFrozen()  | 
|                                 and up.IsPlanning()  | 
|                                 and not up.Period_MP().IsHistorical() | 
|                                 and up.Start() <= up.Unit().CampaignTypeRequirementHorizon() | 
|                                 and scope.Contains( up.UnitPeriodInOptimizerRun() ),  | 
|                                 up.StartDate() );  | 
|      | 
|     if ( periods.Size() > 0 )  | 
|     { | 
|       debuginfo(  periods.Element( 0 ).StartDate(), periods.Element( periods.Size() - 1 ).StartDate(), periods.Size() );  | 
|       if ( not earlieststart >= periods.Element( 0 ).StartDate()                  // check if we can re-use the shared window, if not then pick new one | 
|            or not lateststart <= periods.Element( periods.Size() - 1 ).StartDate() )  | 
|       {      | 
|         start := maxvalue(  Number::Random( -windowsizenrperiods, periods.Size() - 1 ), 0 ); // give equal probability to first period by picking negative numbers also  | 
|         end := minvalue(  start + windowsizenrperiods, periods.Size() - 1 );  | 
|         earlieststart := periods.Element( start ).StartDate();  | 
|         lateststart := periods.Element( end ).StartDate();  | 
|       } | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |