Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method CanSubscribe ( 
 | 
  Date startOfSubscription_i, 
 | 
  Date endOfSubscription_i, 
 | 
  Boolean isWithoutEnd_i 
 | 
) remote as Boolean 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Explicitly collect the FeedbackText, in order to be able to show it in a MessageBox. 
 | 
    feedback := FeedbackObject::LocalFeedback(); 
 | 
    feedback.EnableLocalFeedbackText(); 
 | 
     
 | 
    context              := "     -  Subscription to event '" + this.Subject() + "'"; // + "' : "; 
 | 
    leadingParticipation := this.LeadingParticipation(); 
 | 
    startOfCalendar      := leadingParticipation.Calendar().StartDate(); 
 | 
    canSubscribe         := true; 
 | 
     
 | 
    if( leadingParticipation.IsRecurring() ) 
 | 
    { 
 | 
      period := leadingParticipation.RecurrencePeriod(); 
 | 
       
 | 
      // Additional restrictions if the event that is subscribed to has an end. 
 | 
      // These checks are done on period-level, so on Dates, not DateTimes. 
 | 
      if( period.PeriodType() = LibCal_RecurrencePeriod::TYPE_WITHENDDATE() ) 
 | 
      { 
 | 
        // The subscription should start before the end of the recurrence period of the event. 
 | 
        canSubscribe := startOfSubscription_i <= period.EndDate(); 
 | 
         
 | 
        if( not feedback.CheckHard( canSubscribe ) ) 
 | 
        { 
 | 
          feedback.AddHard( context ); 
 | 
          /* Might be useful later 
 | 
          feedback.AddHard( context + Translations::Period_StartMustBeBeforeEndOfEvent( "subscription", 
 | 
                                                                                        startOfSubscription_i.Format( Translations::DateFormat() ), 
 | 
                                                                                        period.EndDate().Format( Translations::DateFormat() ) ) + String::NewLine() ); 
 | 
         */ 
 | 
        } 
 | 
      } 
 | 
       
 | 
      // If the subscription has an end... 
 | 
      if( feedback.IsAllowed() and 
 | 
          isWithoutEnd_i = false ) 
 | 
      { 
 | 
        if( period.StartDate() >= startOfCalendar ) 
 | 
        { 
 | 
          // ...the end must be greater that the start of the recurrence period of the event. 
 | 
          canSubscribe := endOfSubscription_i >= period.StartDate(); 
 | 
     
 | 
          if( not feedback.CheckHard( canSubscribe ) ) 
 | 
          { 
 | 
            feedback.AddHard( context ); 
 | 
             
 | 
            /* Might be useful later 
 | 
            feedback.AddHard( context + Translations::Period_EndMustBeGreaterThanStartOfEvent( "subscription", 
 | 
                                                                                               period.StartDate() .Format( Translations::DateFormat() ), 
 | 
                                                                                               endOfSubscription_i.Format( Translations::DateFormat() ) ) + String::NewLine() ); 
 | 
            */ 
 | 
          } 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
          // ...the end must be greater than the start of the calendar 
 | 
          canSubscribe :=  endOfSubscription_i >= startOfCalendar; 
 | 
     
 | 
          if( not feedback.CheckHard( canSubscribe ) ) 
 | 
          { 
 | 
            feedback.AddHard( context ); 
 | 
             
 | 
            /* 
 | 
            feedback.AddHard( context + Translations::Period_EndMustBeGreaterThanStartOfCalendar( "subscription", 
 | 
                                                                                                  endOfSubscription_i.Format( Translations::DateFormat() ), 
 | 
                                                                                                  startOfCalendar    .Format( Translations::DateFormat() ) ) + String::NewLine() ); 
 | 
            */ 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    else 
 | 
    { 
 | 
      // No restrictions in case of a non-recurring event. 
 | 
    } 
 | 
     
 | 
    return feedback.IsAllowed(); 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |