| Quintiq file version 2.0 | 
| #parent: #root | 
| Method UpdateTargetCampaignsStartEnd ( | 
|   DateTime newtargetend, | 
|   Campaign_MP_DELETED_Q320 source, | 
|   Campaign_MP_DELETED_Q320 target, | 
|   Campaign_MP_DELETED_Q320 checktarget | 
| ) | 
| { | 
|   Description: 'Look for the last non overlapping campaign and use it as a starting point to update target campaigns start and end.' | 
|   TextBody: | 
|   [* | 
|     isnonoverlapcampaignfound := false; | 
|     hasoverlap := false; | 
|     gaptonexttarget := guard( target.Start() - newtargetend, Duration::Zero() ); | 
|     transitiondurationtonexttarget := Campaign_MP_DELETED_Q320::GetMinTransitionDuration( guard( source.CampaignType_MP(), null( CampaignType_MP ) ), | 
|                                                                              guard( target.CampaignType_MP(), null( CampaignType_MP ) ) ); | 
|     while( not isnonoverlapcampaignfound and | 
|            not isnull( target ) and | 
|            target <> this and | 
|            ( newtargetend > target.Start() or | 
|              gaptonexttarget < transitiondurationtonexttarget) ) | 
|     { | 
|       nexttarget := this.GetNextCampaignExcludingSelf( target ); | 
|       transitionduration := Campaign_MP_DELETED_Q320::GetMinTransitionDuration( source.CampaignType_MP(), target.CampaignType_MP() ); | 
|       targetduration := target.End() - target.Start(); | 
|       newtargetend := newtargetend + transitionduration + targetduration; | 
|       gaptonexttarget := guard( nexttarget.Start() - newtargetend, Duration::Zero() ); | 
|       transitiondurationtonexttarget := Campaign_MP_DELETED_Q320::GetMinTransitionDuration( target.CampaignType_MP(), guard( nexttarget.CampaignType_MP(), null( CampaignType_MP ) ) ); | 
|       if(  not isnull( nexttarget ) and  | 
|            ( newtargetend > nexttarget.Start() or | 
|              gaptonexttarget < transitiondurationtonexttarget ) ) | 
|       { | 
|         source := target; | 
|         target := nexttarget;   | 
|       } | 
|       else | 
|       { | 
|         isnonoverlapcampaignfound := true;   | 
|       } | 
|       hasoverlap := true;  | 
|     } | 
|      | 
|     while( hasoverlap and not isnull( target ) ) | 
|     { | 
|       previoustarget := this.GetPreviousCampaignExcludingSelf( target ); | 
|       transitionduration := Campaign_MP_DELETED_Q320::GetMinTransitionDuration( guard( previoustarget.CampaignType_MP(), null( CampaignType_MP ) ), target.CampaignType_MP() );  | 
|       targetduration := target.End() - target.Start(); | 
|       newtargetstart := newtargetend - targetduration; | 
|        | 
|       // To prevent type index error, shift current campaign's start to make it not unique before updating target campaign's start/end | 
|       if( newtargetstart = this.Start() and newtargetend = this.End() ) | 
|       { | 
|         this.Update( this.CampaignType_MP(),  | 
|                      this.Start() + targetduration, | 
|                      this.End(), | 
|                      this.MinQuantity(), | 
|                      this.MaxQuantity(), | 
|                      this.Comment(), | 
|                      this.IsManuallyConfigured() );     | 
|       } | 
|        | 
|       target.Update( target.CampaignType_MP(), | 
|                      newtargetstart, | 
|                      newtargetend, | 
|                      target.MinQuantity(), | 
|                      target.MaxQuantity(), | 
|                      target.Comment(), | 
|                      target.IsManuallyConfigured() ); | 
|        | 
|       newtargetend := newtargetstart - transitionduration; | 
|                       | 
|       if( target <> checktarget ) | 
|       { | 
|         target := previoustarget;   | 
|       } | 
|       else | 
|       { | 
|         target := null( Campaign_MP_DELETED_Q320 );   | 
|       }  | 
|     } | 
|   *] | 
| } |