| Quintiq file version 2.0 | 
| #parent: #root | 
| Method CompleteCombiForLastPeriod ( | 
|   OptCampaignCombi combi, | 
|   output Campaign_MPs campaigns, | 
|   output Transition_MPs transitions | 
| ) | 
| { | 
|   Description: 'added combi transition and campaigns for last period of multiperiod combi' | 
|   TextBody: | 
|   [* | 
|     if ( not isnull( combi ) )  | 
|     { | 
|       lastocusp := combi.LastCombiElement().OptCampaignUnitSubPeriod();  | 
|       assert( not isnull( lastocusp ), 'expecting last combi element sub period is set' );  | 
|       // keep adding campaign / transitions for as longs as they end within lastocusp | 
|       done := false;  | 
|       while( campaigns.Size() + transitions.Size() > 0 and not done )  | 
|       { | 
|         firstcampaign := guard( campaigns.Element( 0 ), null( Campaign_MP ) ); | 
|         firsttransition := guard( transitions.Element( 0 ), null( Transition_MP ) );   | 
|         if ( isnull( firstcampaign ) )  | 
|         { | 
|           combi.AddCombiElementTransition( firsttransition.TransitionType_MP(), lastocusp );  | 
|           if ( firsttransition.End() <= lastocusp.EndTime() )  | 
|           { | 
|             transitions.Remove( firsttransition ); // no need to continue anymore in next sub period  | 
|           } | 
|           done := true;  | 
|         } | 
|         else | 
|         { | 
|           if ( isnull( firsttransition ) )  | 
|           { | 
|             combi.AddCombiElementCampaign( firstcampaign.CampaignType_MP(), lastocusp );  | 
|             if ( firstcampaign.End() <= lastocusp.EndTime() )  | 
|             { | 
|               campaigns.Remove( firstcampaign );  | 
|             } | 
|             done := true;  | 
|           } | 
|           else  | 
|           { | 
|             // we still have both campaigns and transitions | 
|             if ( firstcampaign.Start() < firsttransition.Start() )  | 
|             { | 
|               combi.AddCombiElementCampaign( firstcampaign.CampaignType_MP(), lastocusp );  | 
|                | 
|               done := firstcampaign.End() >= lastocusp.EndTime();  | 
|               if ( firstcampaign.End() > lastocusp.EndTime() )  | 
|               { | 
|                 // don't remove campaign - need to continue with it next period(s).  | 
|               } | 
|               else if ( firstcampaign.End() = lastocusp.EndTime() )   // special case of ending right at period end.  | 
|               { | 
|                 campaigns.Remove( firstcampaign );  | 
|                 // add combi element so it matches with the next period combi - but disallowed nonzero duration because this will lead to a mismatch if current combi start with same elt | 
|                 elt := combi.AddCombiElementTransition( firsttransition.TransitionType_MP(), lastocusp );  | 
|                 elt.DebugFixEndDuration( true );  | 
|                 elt.DebugDurationOfCampaignElementTypeEndVariables( 0.0 );  | 
|               } | 
|               else | 
|               { | 
|                 campaigns.Remove( firstcampaign ); // campaign ending strictly before end of period, continue completing combi | 
|               } | 
|             }                                        | 
|             else | 
|             { | 
|               combi.AddCombiElementTransition( firsttransition.TransitionType_MP(), lastocusp );  | 
|               done := firsttransition.End() >= lastocusp.EndTime();  | 
|               if ( firsttransition.End() > lastocusp.EndTime() ) | 
|               { | 
|                 // don't remove transition - need to continue with it next period(s) | 
|               } | 
|               else if ( firsttransition.End() = lastocusp.EndTime() )    // special case of ending right at period end.  | 
|               { | 
|                 transitions.Remove( firsttransition );  | 
|                 // add combi element so it matches with the next period combi - but disallowed nonzero duration because this will lead to a mismatch if current combi start with same elt | 
|                 elt := combi.AddCombiElementCampaign( firstcampaign.CampaignType_MP(), lastocusp ); | 
|                 elt.DebugFixEndDuration( true );  | 
|                 elt.DebugDurationOfCampaignElementTypeEndVariables( 0.0 );       | 
|               } | 
|               else | 
|               { | 
|                 transitions.Remove( firsttransition ); // transition ending strictly before end of period, continue completing combi | 
|               }  | 
|             } | 
|           }   | 
|         }    | 
|       } | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |