Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method SynchronizeSubscriptions ( 
 | 
  LibCal_StagingCalendar stagingCalendar_i, 
 | 
  Boolean doDelete_i, 
 | 
  Boolean keepIfNotImported_i 
 | 
) 
 | 
{ 
 | 
  Description: 
 | 
  [* 
 | 
    Synchronize the staging objects. The deletion behavior is determined by the arguments: 
 | 
    doDelete_i = TRUE deletes instances that do not exist in staging (anymore). When FALSE, no instances are deleted. 
 | 
    keepIfNotImported_i = TRUE does not delete instances that do not exist in staging if they were not imported previously (i.e. have been created manually or by the application). 
 | 
  *] 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Consider all existing subscriptions to be soft-deleted. 
 | 
    // Ignore the subscription to Event "Always available", that is already synchronized as part of synchronizing the Calendar. 
 | 
    softDeletedSubscriptions := selectset( this.Subscriptions(), Elements, subscription, true, 
 | 
                                           not subscription.Event().IsAlwaysAvailableEvent() ); 
 | 
     
 | 
    // Ignore the LeadingParticipation. That is synchronized as part of synchronizing the Event. 
 | 
    traverse( stagingCalendar_i, StagingParticipation, stagPart, not stagPart.IsLeading() ) 
 | 
    { 
 | 
      // Get the subscription that must be synchronized. 
 | 
      subscription := select( this.Subscriptions(), Elements, subscr, true, subscr.ParticipationID() = stagPart.StagingParticipationID() ); 
 | 
       
 | 
      // Synchronize the participation / subscription if there are no errors. 
 | 
      if( stagPart.CanSynchronize() ) 
 | 
      { 
 | 
        // Get the event to subscribe to. 
 | 
        event := LibCal_Event::FindByEventID( stagPart.EventID() ); 
 | 
     
 | 
        if( not isnull( event ) ) 
 | 
        { 
 | 
          useLeadingPeriod := not stagPart.HasSpecificPeriod();  // HasSpecificPeriod is easier to understand 
 | 
                                                                 // in the source (e.g. Excelsheet) from which the data is imported. 
 | 
          if( not isnull( subscription ) ) 
 | 
          { 
 | 
            if( event <> subscription.Event() ) 
 | 
            { 
 | 
              // Change the event to which is subscribed. 
 | 
              // Very unlikely to happen, is not supported in the UI. 
 | 
              // Can happen though if IsAlwaysAvailable is changed from FALSE to TRUE (or vice versa). 
 | 
              subscription.Event().RemoveSubscriber( this ); 
 | 
              subscription := event.AddSubscriber( this, useLeadingPeriod ); 
 | 
              subscription.ParticipationID( stagPart.StagingParticipationID() ); 
 | 
            } 
 | 
          } 
 | 
          else  // Subscription does not exist. 
 | 
          { 
 | 
            // Add the calendar as subcriber to the event from another calendar. 
 | 
            subscription := event.AddSubscriber( this, useLeadingPeriod ); 
 | 
            subscription.ParticipationID( stagPart.StagingParticipationID() ); 
 | 
            subscription.IsCreatedByImport( true ); 
 | 
          } 
 | 
          
 | 
          // Synchronize the data. A subscription to event "Always available" does not have to be synchronized. 
 | 
          subscription.Synchronize( stagPart );         
 | 
        } 
 | 
        else 
 | 
        { 
 | 
          LibCal_Util::Warning( "LibCal_Calendar.SynchronizeSubscriptions() : Event with ID '" + stagPart.EventID() + "' not found for StagingParticipation with ID '" + stagPart.StagingParticipationID() + "'." ); 
 | 
        } 
 | 
      } 
 | 
     
 | 
      if( not isnull( subscription ) ) 
 | 
      { 
 | 
        // Remove the subscriptions from the set of soft-deleted subscriptions. 
 | 
        softDeletedSubscriptions.Remove( subscription ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    // If applicable, delete the subscriptions that are soft-deleted, i.e. that are not present in staging. 
 | 
    if( doDelete_i ) 
 | 
    { 
 | 
      traverse( softDeletedSubscriptions, Elements, subscription ) 
 | 
      { 
 | 
        // Only the subscriptions that are created by an import action should be deleted, unless indicated otherwise. 
 | 
        if( subscription.IsCreatedByImport() or not keepIfNotImported_i ) 
 | 
        { 
 | 
          subscription.Delete(); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |