Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method SetIsActiveStatusCombis ( 
 | 
  Number windowsize, 
 | 
  LibOpt_Scope scope 
 | 
) 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    start := OS::PrecisionCounter();  
 | 
    nractive := 0;  
 | 
    earlieststartglobal := Date::MinDate();  
 | 
    lateststartglobal := Date::MaxDate() 
 | 
    latestcampaignhorizonend := max( this, OptCampaignUnit.Unit, unit, true, unit.CampaignTypeRequirementHorizon() );  
 | 
     
 | 
    scope.GetWindowCampaignSequenceOptimizer( earlieststartglobal, lateststartglobal, windowsize, latestcampaignhorizonend, this ); // we prefer the same window for all campaign units, but pick new window if that is not possible 
 | 
    debuginfo( 'global window =', earlieststartglobal, ' - ', lateststartglobal );  
 | 
     
 | 
    traverse( this, OptCampaignUnit, ocunit )  
 | 
    { 
 | 
      earlieststart := earlieststartglobal;  
 | 
      lateststart := lateststartglobal;  
 | 
      this.GetWindowCampaignSequenceOptimizer( earlieststart, lateststart, windowsize, ocunit, scope );  
 | 
      debuginfo(  'unit=', ocunit.UnitID(), 'window = ', earlieststart, ' - ', lateststart );  
 | 
      nractive := nractive + ocunit.SetIsActiveStatusCombis( earlieststart, lateststart );  
 | 
    } 
 | 
     
 | 
    // check for those periods that are not covered yet  - throw in simple <=3 element combis or those based on initial existing plan 
 | 
    traverse( this, OptCampaignUnit, ocunit )  
 | 
    { 
 | 
      subperiods := selectset( ocunit, OptCampaignUnitSubPeriod, ocusp, true );  
 | 
      subperiodscovered := construct( OptCampaignUnitSubPeriods );  
 | 
      traverse( ocunit, OptCampaignUnitSubPeriod.OptCampaignCombiSelected.OptCampaignCombiElement.OptCampaignUnitSubPeriod, ocuspcovered )  
 | 
      { 
 | 
        subperiodscovered.Add( ocuspcovered );  
 | 
      } 
 | 
      uncovered := subperiods.Difference( subperiodscovered ); 
 | 
      traverse( uncovered, Elements.OptCampaignCombi, combi, combi.NumberOfElements() <= 3 or combi.IsBasedOnExistingPlan() )  
 | 
      { 
 | 
        combi.IsActive( true );  
 | 
      } 
 | 
    } 
 | 
     
 | 
    end := OS::PrecisionCounter();  
 | 
    timeneededsec := ( end - start ) / OS::PrecisionCounterFrequency();  
 | 
    debuginfo( 'Processing combi active status. Nr active = ', nractive, ' Time used = ', timeneededsec,  ' seconds' ); 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |