Quintiq file version 2.0 
 | 
#parent: #root 
 | 
StaticMethod ValidateInput ( 
 | 
  output String feedback_o, 
 | 
  output String sanitycheckfeedback_o, 
 | 
  MacroPlan macroplan, 
 | 
  CampaignType_MP campaigntype, 
 | 
  Campaign_MP campaign, 
 | 
  DateTime earlieststart, 
 | 
  Duration duration, 
 | 
  String inputType, 
 | 
  Real minqty, 
 | 
  Real maxqty, 
 | 
  Duration mindur, 
 | 
  Duration maxdur, 
 | 
  String comment, 
 | 
  Boolean checkunique, 
 | 
  Boolean checkmaxqty, 
 | 
  Boolean checkmaxdur, 
 | 
  Boolean iscampaignaddlast 
 | 
) declarative remote as Boolean 
 | 
{ 
 | 
  Description: 'Checks the correctness of input data from Create/Edit dialog.' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Precondition to validate the input for creating/editing Campaign_MP 
 | 
    feedback_o := ''; 
 | 
    sanitycheckfeedback_o := ''; 
 | 
    start := guard( Campaign_MP::GetAvailableStart( earlieststart, campaign ), DateTime::MinDateTime() ); 
 | 
    startofplanning := macroplan.StartOfPlanning(); 
 | 
     
 | 
    // Calculate possible campaign duration based on inputs 
 | 
    duration := Campaign_MP::GetDerivedDuration( campaigntype, minqty, maxqty, checkmaxqty, mindur, maxdur, checkmaxdur ); 
 | 
     
 | 
    // Calculate End possible end time for campaign 
 | 
    earliestend := earlieststart + duration; 
 | 
    end := ifexpr( start.IsFinite(), start + duration, DateTime::MinDateTime() ); 
 | 
     
 | 
    isQuantity := inputType = GlobalParameters_MP::GetCampaignTransitionsTypeQuantity(); 
 | 
    isDuration := inputType = GlobalParameters_MP::GetCampaignTransitionsTypeDuration(); 
 | 
         
 | 
    // Check if campaign type is null 
 | 
    if( isnull( campaigntype ) ) 
 | 
    { 
 | 
      feedback_o := Translations::MP_Campaign_ValidateInput_IsNullCampaignType(); 
 | 
      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); 
 | 
    } 
 | 
    // Check if there is TransitionType defined (only applies to New Campaign added to last) 
 | 
    else if( iscampaignaddlast 
 | 
             and isnull( campaign ) 
 | 
             and not isnull( campaigntype ) 
 | 
             and not isnull( campaigntype.Unit().LastCampaign() ) 
 | 
             and campaigntype.Unit().LastCampaign().CampaignType_MP() <> campaigntype 
 | 
             and not CampaignType_MP::CheckHasTransitionType( campaigntype.Unit().LastCampaign().CampaignType_MP(), campaigntype ) ) 
 | 
    { 
 | 
      feedback_o := Translations::MP_Campaign_CanResequence_CampaignTypeForbiddenTransition( campaigntype.Unit().LastCampaign().CampaignTypeName(), 
 | 
                                                                                             campaigntype.Name() ); 
 | 
    } 
 | 
    // Check if there is TransitionType defined for Next Campaign 
 | 
    else if( not isnull( campaign ) 
 | 
             and not isnull( campaign.NextCampaign() ) 
 | 
             and campaign.NextCampaign().CampaignType_MP() <> campaign.CampaignType_MP() 
 | 
             and not Campaign_MP::CheckHasTransitionType( campaign, campaign.NextCampaign() ) ) 
 | 
    { 
 | 
      feedback_o := Translations::MP_Campaign_CanResequence_CampaignTypeForbiddenTransition( campaign.CampaignTypeName(), 
 | 
                                                                                             campaign.NextCampaign().CampaignTypeName() ); 
 | 
      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue();                                                                                        
 | 
    } 
 | 
    //Check if earliest start is valid 
 | 
    else if( guard( not campaign.IsHistorical(), true )  
 | 
             and earlieststart < startofplanning ) 
 | 
    { 
 | 
      feedback_o := Translations::MP_Campaign_ValidateInput_InvalidEarliestStart( earlieststart, startofplanning ); 
 | 
      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); 
 | 
    } 
 | 
    // Check if campaign type has any operations with zero throughput 
 | 
    else if( min( campaigntype, OperationInCampaignType.Operation, opr, opr.Throughput() ) = 0 ) 
 | 
    { 
 | 
      feedback_o := Translations::MP_CampaignType_IsOperationThroughputZero(); 
 | 
      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); 
 | 
    } 
 | 
    // Check if campaign could ends before start of planning 
 | 
    else if( earliestend < startofplanning 
 | 
             and ( end.IsInfinite() or end < startofplanning ) 
 | 
             and guard( not( duration = campaign.Duration() ), true ) )          
 | 
    { 
 | 
      enddate := ifexpr( end.IsFinite(), end, earliestend ); 
 | 
      feedback_o := Translations::MP_CampaignType_IsEndBeforeStartOfPlanning( duration, enddate, startofplanning ); 
 | 
      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); 
 | 
    } 
 | 
    else if( not isDuration and not isQuantity ) 
 | 
    { 
 | 
      feedback_o := Translations::MP_Campaign_ValidateInput_DurationAndQuantitySelected(); 
 | 
      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); 
 | 
    } 
 | 
    else if( isDuration ) 
 | 
    { 
 | 
      // Check if duration is valid 
 | 
      if( mindur <= Duration::Zero() ) 
 | 
      { 
 | 
        feedback_o := Translations::MP_Campaign_ValidateInput_IsNegativeMinDuration( mindur ); 
 | 
        sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue();   
 | 
      } 
 | 
      else if( checkmaxdur and maxdur <= Duration::Zero() ) 
 | 
      { 
 | 
        feedback_o := Translations::MP_Campaign_ValidateInput_IsNegativeMaxDuration( maxdur ); 
 | 
        sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue();   
 | 
      } 
 | 
      // Check if maximum duration is larger than minimum duration 
 | 
      else if( checkmaxdur and maxdur < mindur ) 
 | 
      { 
 | 
        feedback_o := Translations::MP_Campaign_ValidateInput_IsMaxDurationLessThanMaxDuration( mindur, maxdur );  
 | 
        sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); 
 | 
      } 
 | 
    } 
 | 
    else if( isQuantity ) 
 | 
    { 
 | 
      // Check if minimum quantity is valid 
 | 
      if( minqty <= 0 ) 
 | 
      { 
 | 
        feedback_o := Translations::MP_Campaign_ValidateInput_IsNegativeMinQuantity( minqty ); 
 | 
        sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); 
 | 
      } 
 | 
      // Check if maximum quantity is valid 
 | 
      else if( checkmaxqty and maxqty <= 0 ) 
 | 
      { 
 | 
        feedback_o := Translations::MP_Campaign_ValidateInput_IsNegativeMaxQuantity( maxqty ); 
 | 
        sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); 
 | 
      } 
 | 
      // Check if maximum quantity is larger than minimum quantity 
 | 
      else if( checkmaxqty and maxqty < minqty ) 
 | 
      { 
 | 
        feedback_o := Translations::MP_Campaign_ValidateInput_IsMaxQuantityLessThanMaxQuantity( minqty, maxqty ); 
 | 
        sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); 
 | 
      } 
 | 
    }   
 | 
     
 | 
     
 | 
    // Format feedback text if any of the precondition above is violated 
 | 
    if( feedback_o <> '' ) 
 | 
    { 
 | 
      instance := Campaign_MP::GetInstanceText( campaigntype, start ); 
 | 
      feedback_o := SanityCheckMessage::GetFormattedMessage( instance, feedback_o ); 
 | 
    } 
 | 
         
 | 
    return feedback_o.Length() = 0; 
 | 
  *] 
 | 
} 
 |