| Quintiq file version 2.0 | 
| #parent: #root | 
| Method AddSubscription ( | 
|   LibCal_Calendar subscriber_i, | 
|   LibCal_ExplicitTimeInterval occurrence_i | 
| ) as LibCal_Subscription | 
| { | 
|   Description: 'Let subscriber_i subscribe to a specific occurrence_i of an event.' | 
|   TextBody: | 
|   [* | 
|     subscription := null( LibCal_Subscription ); | 
|      | 
|     // See if there is already a subscription for occurrence_i. | 
|     leadingETI   := ifexpr( isnull( occurrence_i.LeadingETI() ), occurrence_i, occurrence_i.LeadingETI() ); | 
|     timeInterval := select( leadingETI, SubscribingETI, subscribingETI, true, subscribingETI.Calendar() = subscriber_i ); | 
|      | 
|     if( not isnull( timeInterval ) ) | 
|     { | 
|       // Return the already existing subscription. | 
|       subscription := timeInterval.Participation().astype( LibCal_Subscription ); | 
|     } | 
|     else | 
|     { | 
|       // Create a new subscription, linked to the LeadingParticipation of the event. | 
|       useLeadingPeriod := false; | 
|       subscription     := occurrence_i.Participation().Event().LeadingParticipation().AddSubscription( subscriber_i, useLeadingPeriod ); | 
|        | 
|       if( not isnull( subscription ) ) | 
|       { | 
|         // Let the recurrence period end at the same day that it starts, in order to have just ONE occurrence. | 
|         timezone := this.Calendar().GetTimeZone(); | 
|         nrOfOccurrences := 1; | 
|         subscription.UpdateSubscription( LibCal_RecurrencePeriod::TYPE_WITHENDDATE(), occurrence_i.Start().Date( timezone ), nrOfOccurrences, | 
|                                                                                       occurrence_i.Start().Date( timezone ) ); | 
|       } | 
|     } | 
|      | 
|     return subscription; | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |