Quintiq file version 2.0
|
#parent: #root
|
Method GenerateOccurrences
|
{
|
Description: 'Generate TimeIntervals for the occurrences of an Event, given the RecurrencePattern of the Event and the RecurrencePeriod of the Participation.'
|
TextBody:
|
[*
|
LibCal_Util::DebugInfo( "GenerateOccurrences of " + this.Event().GetEventInfo() );
|
|
// For debugging
|
//showInfo := this.Event().Subject() = "TEST";
|
//showInfo := true;
|
|
// Determine the data that is required for generating the applicable occurrences.
|
// The data is returned as output-arguments by PrepareGenerateOccurrences().
|
timezone := this.Calendar().GetTimeZone();
|
dateOfFirstRecurrence := Date::MinDate();
|
endDate := Date::MinDate();
|
startOverlap := Date::MinDate();
|
endOverlap := Date::MinDate();
|
preserveOccurrences := true;
|
|
if( this.PrepareGenerateOccurrences( dateOfFirstRecurrence, endDate, // Start and end of the period during which occurrences should be generated.
|
startOverlap, endOverlap, // Start and end of the overlap between the current period and the new period.
|
preserveOccurrences ) ) // Indicates if occurrences that already exist in the overlapping period should be preserved (i.e. used as-is).
|
{
|
// Mark the existing TimeIntervals as SoftDeleted.
|
traverse( this, ExplicitTimeInterval, timeInterval )
|
{
|
timeInterval.IsSoftDeleted( true );
|
}
|
|
// Execute the actual generation.
|
this.GenerateOccurrences( dateOfFirstRecurrence, endDate, startOverlap, endOverlap, preserveOccurrences );
|
|
// When occurrences should be preserved, the TimeIntervals that were already part of the original window should remain 'as-is';
|
// therefore they have been ignored in GenerateOccurrences().
|
// Their IsSoftDeleted-flag should now be reset, in order to prevent them from being deleted.
|
if( preserveOccurrences and this.Calendar().Window() > 0 )
|
{
|
traverse( this, ExplicitTimeInterval, eti )
|
{
|
// If the TimeInterval ends at the start of a day, this is the start of the next day.
|
// In that case, one day should be subtracted in order to not take the next day into account.
|
// Otherwise the occurrence will be preserved while it shouldn't.
|
etiStartDate := eti.Start().Date( timezone );
|
etiEndDate := eti.End().Date( timezone ) - ifexpr( eti.End() = eti.End().StartOfDay( timezone ), 1, 0 );
|
|
if( etiEndDate >= startOverlap and
|
etiStartDate <= endOverlap and
|
etiStartDate >= this.GetRecurrencePeriod().StartDate() ) // Don't start before the start of the period.
|
{
|
eti.IsSoftDeleted( false );
|
}
|
}
|
}
|
|
// Permanently delete the TimeIntervals that are still SoftDeleted.
|
this.DeleteTimeIntervals( true );
|
|
// Register that the changes have been processed.
|
this.IsChanged( false );
|
this.HasChangedRecurrencePeriod( false );
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|