Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method GenerateCombiExistingCampaign ( 
 | 
  Campaign_MP campaign, 
 | 
  output OptCampaignUnitSubPeriod lastocuspforcombicreate, 
 | 
  Boolean usemultiperiodcombi 
 | 
) as OptCampaignCombi 
 | 
{ 
 | 
  Description: 'create combi element that reflects an existing campaign object' 
 | 
  TextBody: 
 | 
  [* 
 | 
    ocusps := selectsortedset( campaign, CampaignPeriod_MP.UnitPeriod.OptCampaignUnitSubPeriod, p, not p.IsFixed() and guard( p.StartTime() > lastocuspforcombicreate.StartTime(), true ), p.StartTime() );  
 | 
    combi := null( OptCampaignCombi );  
 | 
     
 | 
    if ( ocusps.Size() > 0 )  
 | 
    { 
 | 
      firstocusp :=  ocusps.Element( 0 );  
 | 
      if ( guard( firstocusp.PreviousSubPeriod().IsFixed() and not isnull( firstocusp.PreviousSubPeriod().Transition_MP() ), false ) ) 
 | 
      { 
 | 
        // we need to start out with a single period combi in order to get the sequence constraint right with previous fixed period at start of plan  
 | 
        combi := this.GetCombiForExistingPlan( firstocusp );  
 | 
        combi.AddCombiElementTransition( firstocusp.PreviousSubPeriod().Transition_MP().TransitionType_MP(), firstocusp );  
 | 
        combi.AddCombiElementCampaign( campaign.CampaignType_MP(), firstocusp );  
 | 
        ocusps.Remove( firstocusp );  
 | 
        lastocuspforcombicreate := firstocusp;  
 | 
      } 
 | 
         
 | 
      if ( usemultiperiodcombi )  
 | 
      { 
 | 
        firstloop := true;  
 | 
        traverse( ocusps, Elements, ocusp )  
 | 
        { 
 | 
          if ( firstloop ) // for the 1st period, if we have a previous period we must start with that combi element type 
 | 
          { 
 | 
            combi := this.GetCombiForExistingPlan( ocusp );  
 | 
            startingcombielement := ocusp.GetLastElementPreviousSubPeriod();   
 | 
            if ( not isnull( startingcombielement ) )  
 | 
            { 
 | 
              // start of combi with combi element of previous unit sub period 
 | 
              type :=  startingcombielement.GetOptCampaignElementType();  
 | 
              combi.AddCombiElement( type, ocusp ); 
 | 
            } 
 | 
           } // endif firstloop 
 | 
         
 | 
          if ( not firstloop or guard( not combi.LastCombiElement().OptCampaignElementType().Name() = campaign.CampaignTypeName(), true ) )   // add campaign type to combi ( if not already added because of previous period ) 
 | 
          {   
 | 
            combi.AddCombiElementCampaign( campaign.CampaignType_MP(), ocusp );  
 | 
          } 
 | 
          firstloop := false;  
 | 
          lastocuspforcombicreate := ocusp;  
 | 
        } 
 | 
      } 
 | 
      else // not usemultiperiod combi  
 | 
      { 
 | 
        traverse( ocusps, Elements, ocusp )  
 | 
        { 
 | 
          combi := this.GetCombiForExistingPlan( ocusp );  
 | 
          startingcombielement := ocusp.GetLastElementPreviousSubPeriod();   
 | 
          if ( not isnull( startingcombielement ) )  
 | 
          { 
 | 
            // start of combi with combi element of previous unit sub period 
 | 
            type :=  startingcombielement.GetOptCampaignElementType();  
 | 
            combi.AddCombiElement( type, ocusp ); 
 | 
          } 
 | 
           
 | 
          if ( guard( not combi.LastCombiElement().OptCampaignElementType().Name() = campaign.CampaignTypeName(), true ) ) // if not added already add campaign type 
 | 
          { 
 | 
            combi.AddCombiElementCampaign( campaign.CampaignType_MP(), ocusp );  
 | 
          } 
 | 
          lastocuspforcombicreate := ocusp;  
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    return combi; 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |