| Quintiq file version 2.0 | 
| #parent: #root | 
| Method CanResequence ( | 
|   Campaign_MP targetcampaign, | 
|   Unit targetunit, | 
|   DateTime droptime, | 
|   output String feedback_o | 
| ) declarative remote as Boolean | 
| { | 
|   Description: 'Check if source campaign and target campaign are the same.' | 
|   TextBody: | 
|   [* | 
|     isvalid := true; | 
|      | 
|     //workaround to fix the webclient precondition issue when the ondroptarget is Transition | 
|     if( isnull( targetcampaign ) ) | 
|     { | 
|       targetcampaign := minselect( targetunit, Campaign_MP, campaign, | 
|                                    campaign.End() > droptime, | 
|                                    campaign.Start() ); | 
|     } | 
|      | 
|     if( not isnull( targetcampaign ) | 
|         and this.CampaignType_MP() <> targetcampaign.CampaignType_MP() | 
|         and not Campaign_MP::CheckHasTransitionType( this, targetcampaign ) ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_CampaignTypeForbiddenTransition( this.CampaignTypeName(),  | 
|                                                                                              targetcampaign.CampaignTypeName() ); | 
|     } | 
|      | 
|     if( not isnull( targetcampaign ) | 
|         and not isnull( targetcampaign.PreviousCampaign() ) | 
|         and targetcampaign.PreviousCampaign().CampaignType_MP() <> this.CampaignType_MP() | 
|         and not Campaign_MP::CheckHasTransitionType( targetcampaign.PreviousCampaign(), this ) ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_CampaignTypeForbiddenTransition( targetcampaign.PreviousCampaign().CampaignTypeName(),  | 
|                                                                                              this.CampaignTypeName() ); | 
|     } | 
|      | 
|     //target campaign is only null if it is dropped at the empty space after last campaign | 
|     //check if there is transition between the last campaign's campaign type and the source campaign type | 
|     if( isnull( targetcampaign ) | 
|         and not isnull( targetunit.LastCampaign() ) | 
|         and targetunit.LastCampaign().CampaignType_MP() <> this.CampaignType_MP() | 
|         and not Campaign_MP::CheckHasTransitionType( targetunit.LastCampaign(), this ) ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_CampaignTypeForbiddenTransition( targetunit.LastCampaign().CampaignTypeName(), | 
|                                                                                              this.CampaignTypeName() ); | 
|     } | 
|      | 
|     if( this.Unit() <> targetunit ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_SourceUnitAndTargetUnitAreDifferent( this.UnitID(), targetunit.ID() );  | 
|     } | 
|     if( targetcampaign = this ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_SourceAndTargetAreTheSame(); | 
|     } | 
|     if( droptime < this.MacroPlan().StartOfPlanning()  | 
|         or ( not isnull( targetcampaign ) and targetcampaign.IsHistorical() ) ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_DroptimeBeforePlanningHorizon();     | 
|     } | 
|      | 
|     if( droptime < this.EarliestStart() ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_DroptimeBeforeEarliestStart( this.EarliestStart() ); | 
|     } | 
|      | 
|     if( not isnull( this.NextCampaign() ) and this.NextCampaign() = targetcampaign ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_TargetCampaignIsAlreadyNextInSequence();  | 
|     } | 
|      | 
|     if( this.IsHistorical() ) | 
|     { | 
|       isvalid := false; | 
|       feedback_o := Translations::MP_Campaign_CanResequence_IsHistoricalCampaign( this.MacroPlan().StartOfPlanning() ); | 
|     } | 
|      | 
|     return isvalid; | 
|   *] | 
| } |