| Quintiq file version 2.0 | 
| #parent: #root | 
| Method ExtendCombi | 
| { | 
|   TextBody: | 
|   [* | 
|     /////////////////////////////////////////////////////////////////////////////////////////////////// | 
|     //If the campaign or transition that starts the combi has a max duration then we need combis for  | 
|     //each subperiod up till the max dutation ending with each possible transition like:  | 
|     //A | A-> B (both in the same period | 
|     //A | A | A-> B | 
|     //A | A | A | A-> B | 
|     // | 
|     // | 
|     //If the campaign or tranisit that starts the combi has a min duration and no max duration then we | 
|     //want a mid combi which exist of a single subperiod with the campaign/transition and a combi with | 
|     //the min duration. Which campaign A minduration is 2 days this looks like: | 
|     //A  | 
|     //A | A : A-> B  | 
|     /////////////////////////////////////////////////////////////////////////////////////////////////// | 
|      | 
|     lastelement := this.LastCombiElement();       | 
|     hasminduration := this.HasminDurationCombi(); | 
|     hasmaxduration := this.HasMaxDurationCombi(); | 
|      | 
|     /////////////////////////////////////////////////////////////////////////////////////////////////// | 
|     //If the combi does not have a max duration then we need one combi with a single element so we need | 
|     //to duplicate the combi here to preserve the single element combi | 
|     /////////////////////////////////////////////////////////////////////////////////////////////////// | 
|     if( not this.HasFixedStartAndDuration() | 
|         and this.OptCampaignCombiElement( relsize ) = 1  | 
|         and not this.HasMaxDurationCombi() | 
|       ) | 
|     { | 
|       singlecombi := this.DuplicateCombi(); | 
|       singlecombi.IsCompleteCombi( true );   | 
|     } | 
|      | 
|      | 
|     //For debugging | 
|     /* | 
|     this.CalcName(); | 
|     if( this.OptCampaignUnitSubPeriod().StartTime().Date() = Date::Construct( 2018,1,1) ) | 
|     { | 
|       info(  this.Name() | 
|              , hasminduration  | 
|              , this.MaxEndTimeFirstElement(), this.MaxEndTimeFirstElement() , lastelement.OptCampaignUnitSubPeriod().EndTime() | 
|              , this.NeedsExtensionElement() | 
|              , this.NeedsExtensionSubPeriod() | 
|              )  | 
|     } | 
|     */ | 
|      | 
|     /////////////////////////////////////////////////////////////////////////////////////////////////////////////// | 
|     //If the combi has a min and or maxduration it and the duration is longer than the last subperiod added then the | 
|     //combi needs to be extended with an additional subperiod. | 
|     /////////////////////////////////////////////////////////////////////////////////////////////////////////////// | 
|     if( this.NeedsExtensionSubPeriod() ) | 
|     { | 
|       //If the last element is longer than the period add the same element again but the attached to the next period | 
|       if( hasmaxduration ) | 
|       { | 
|         if( not hasminduration  | 
|             or ( hasminduration and lastelement.OptCampaignUnitSubPeriod().EndTime() >= this.MinEndTimeFirstElement() ) ) | 
|         { | 
|           /////////////////////////////////////////////////////////////////////////////////////////////////////////////// | 
|           //Duplicate the combi if it is longer than minduration. The original will be used to grow with more  | 
|           //subperiods. The copy is used to complete the combi with the next element in the last periodthis.MinEndTimeFirstElement() | 
|           /////////////////////////////////////////////////////////////////////////////////////////////////////////////// | 
|           combi := this.DuplicateCombi(); | 
|           combi.ExtendCombiwithNextElement(); | 
|         } | 
|       } | 
|       //Add the next subperiod with the same element type | 
|       this.ExtendCombiWithNextSubPeriod(); | 
|     } | 
|     else if( this.NeedsExtensionElement() ) | 
|     { | 
|       /////////////////////////////////////////////////////////////////////////////////////////////////////////////// | 
|       //if there is already a 2nd element type in the combi then every extensions requires a duplicate to keep track of  | 
|       //all possible combination. | 
|       /////////////////////////////////////////////////////////////////////////////////////////////////////////////// | 
|       if( not lastelement.IsFirstElementTypeInCombi() ) | 
|       { | 
|         combi := this.DuplicateCombi(); | 
|         combi.IsCompleteCombi( true ); | 
|       } | 
|       this.ExtendCombiwithNextElement(); | 
|        | 
|     } | 
|     else | 
|     { | 
|       this.IsCompleteCombi( true );   | 
|     } | 
|   *] | 
| } |