Quintiq file version 2.0
|
#parent: #root
|
Method SynchronizeEvents (
|
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 events to be soft-deleted.
|
softDeletedEvents := this.Event( relget );
|
|
traverse( stagingCalendar_i, StagingEvent, stagEvent )
|
{
|
// Get the event that must be synchronized.
|
event := select( this, Event, evnt, true, evnt.EventID() = stagEvent.StagingEventID() );
|
|
// Synchronize the event if there are no errors.
|
if( stagEvent.CanSynchronize() )
|
{
|
// The event does not exist for the current calendar yet.
|
// A new event should be created, but this can only be done if the event does not already exist in another calendar.
|
if( isnull( event ) )
|
{
|
eventInOtherCalendar := LibCal_Event::FindByEventID( stagEvent.StagingEventID() );
|
if( isnull( eventInOtherCalendar ) )
|
{
|
// Create a new event.
|
event := LibCal_Event::CreateForImport( this, stagEvent.StagingEventID() );
|
}
|
else
|
{
|
LibCal_Util::Warning( stagEvent.CalendarType() + "." + stagEvent.CalendarID()
|
+ "Event with ID '" + stagEvent.StagingEventID() + "' cannot be created because if already exists for "
|
+ eventInOtherCalendar.Calendar().DefinitionName() + "." + eventInOtherCalendar.Calendar().CalendarID() + "." );
|
}
|
}
|
|
// Synchronize the data.
|
if( not isnull( event ) )
|
{
|
event.Synchronize( stagEvent );
|
|
// Synchronize the LeadingParticipation as part of synchronizing the Event.
|
// The other participations (subscriptions) are synchronized later on.
|
leadingStagPart := stagEvent.LeadingStagingParticipation();
|
if( not isnull( leadingStagPart ) )
|
{
|
// If necessary, create a LeadingParticipation for the event.
|
participationCreated := false;
|
if( isnull( event.LeadingParticipation() ) )
|
{
|
LibCal_LeadingParticipation::CreateForImport( this, leadingStagPart.StagingParticipationID(), event );
|
participationCreated := true;
|
}
|
|
// Synchronize the data.
|
event.LeadingParticipation().Synchronize( leadingStagPart );
|
|
// If a new LeadingParticipation was just created, SetDuration() and SetIsAllDay() of the event must be called.
|
// These methods could not be executed during the synchronization of the event, because they depend on the event's
|
// LeadingParticipation, which did not exist yet at that time.
|
if( participationCreated )
|
{
|
event.SetDuration( stagEvent.Duration() );
|
event.SetIsAllDay( stagEvent.IsAllDay() );
|
}
|
}
|
else
|
{
|
LibCal_Util::Warning( stagEvent.CalendarType() + "." + stagEvent.CalendarID() + " : " +
|
"no LeadingParticipation found for event '" + event.Subject() + "'." );
|
}
|
}
|
}
|
|
// Remove the event from the set of soft-deleted events.
|
if( not isnull( event ) )
|
{
|
softDeletedEvents.Remove( event );
|
}
|
}
|
|
// If applicable, delete the events that are soft-deleted, i.e. that are not present in staging.
|
// Except for the "Always available" event, which should never be deleted.
|
if( doDelete_i )
|
{
|
traverse( softDeletedEvents, Elements, event, not event.IsAlwaysAvailableEvent() )
|
{
|
// Only the events that are imported should be deleted, unless indicated otherwise.
|
if( event.IsCreatedByImport() or not keepIfNotImported_i )
|
{
|
event.Delete();
|
}
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|