Quintiq file version 2.0
|
#parent: #root
|
Method MPSyncUnitCalendar (
|
Boolean isoverwritemanualconfig,
|
IOUnitCalendars iounitcalendars
|
)
|
{
|
Description:
|
[*
|
Synchronization of IOUnitCalendar from MPSync to UnitCalendar Macroplan
|
Synchronization of IOEvent from MPSync to LibCal_Event Macroplan
|
Synchronization of IOParticipation from MPSync to LibCal_Participation Macroplan
|
*]
|
TextBody:
|
[*
|
// Get Common calendar
|
commoncalendar := this.CalendarRegistry().CommonCalendar();
|
|
// Select a set of existing UnitCalendar
|
existingUnitCalendar := selectset( this, Unit.UnitCalendar, uc, true );
|
|
// Select a set of existing Event
|
existingEvent := selectset( existingUnitCalendar, Elements.Event, e, true );
|
updatesEvent := construct( LibCal_Events );
|
|
// Select a set of existing Participation
|
existingParticipation := selectset( existingUnitCalendar, Elements.Participation.astype( LibCal_Subscription ), p, true );
|
updatesParticipation := construct( LibCal_Subscriptions );
|
|
// Select a set of existing LeadingParticipation
|
existingLeadingParticipation := selectset( existingUnitCalendar, Elements.Event.LeadingParticipation, lp, true );
|
updatesLeadingParticipation := construct( LibCal_LeadingParticipations );
|
|
// Traverse IOUnitCalendar objects
|
traverse( iounitcalendars, Elements, iounitcalendar )
|
{
|
// Find existing Unit
|
unit := Unit::FindUnitTypeIndex( iounitcalendar.OwnerID() );
|
|
if( not isnull( unit ) )
|
{
|
// Create UnitCalendar if unit doesn't have one
|
unitCalendar := unit.FindCreateUnitCalendar( iounitcalendar );
|
if( not isnull( unitCalendar ) )
|
{
|
unitCalendar.Synchronize( iounitcalendar.Base(),
|
iounitcalendar.UpdateInterval(),
|
iounitcalendar.Window(),
|
iounitcalendar.History(),
|
iounitcalendar.IsAlwaysAvailable() );
|
}
|
|
// Event
|
traverse( iounitcalendar, IOEvent, ioevent )
|
{
|
ioleadparticipation := ioevent.IOLeadingParticipation();
|
if( not isnull( ioleadparticipation ) )
|
{
|
event := unitCalendar.SynchronizeEvent( ioevent.EventID(),
|
ioevent.CalendarType(),
|
ioevent.CalendarID(),
|
ioevent.Category(),
|
ioevent.Subject(),
|
ioevent.Description(),
|
ioevent.Type(),
|
ioevent.PartialCapacity(),
|
ioevent.IsDefault(),
|
ioevent.IsRecurring(),
|
ioevent.IsAllDay(),
|
ioevent.StartTimeOfDay(),
|
ioevent.Duration(),
|
ioevent.PatternType(),
|
ioevent.RecurrenceInterval(),
|
ioevent.PatternDaily_IsEveryWeekday(),
|
ioevent.PatternWeekly_Weekdays(),
|
ioevent.PatternMonthly_IsDay(),
|
ioevent.PatternMonthly_Day(),
|
ioevent.PatternMonthly_WeekOfMonth(),
|
ioevent.PatternMonthly_DayOfWeek(),
|
ioevent.PatternYearly_IsDay(),
|
ioevent.PatternYearly_Month(),
|
ioevent.PatternYearly_Day(),
|
ioevent.PatternYearly_WeekOfMonth(),
|
ioevent.PatternYearly_DayOfWeek(),
|
ioleadparticipation.ParticipationID(),
|
ioleadparticipation.StartDate(),
|
ioleadparticipation.HasSpecificPeriod(),
|
ioleadparticipation.PeriodType(),
|
ioleadparticipation.PeriodStartDate(),
|
ioleadparticipation.PeriodNrOfOccurences(),
|
ioleadparticipation.PeriodStartDate() );
|
updatesEvent.Add( event );
|
updatesLeadingParticipation.Add( event.LeadingParticipation() );
|
}
|
}
|
}
|
}
|
|
// After every Events are created, traverse Events to created Participations
|
// Traverse IOEvent objects
|
traverse( iounitcalendars, Elements.IOEvent, ioevent )
|
{
|
// Find exisiting Event
|
event := LibCal_Event::FindByEventID( ioevent.EventID() );
|
// Participation
|
traverse( ioevent, IOParticipation, ioparticipation )
|
{
|
// Check preventing error in SynchronizeSubscription with null subscription being created
|
if( event.Calendar() <> event.LeadingParticipation().Calendar() )
|
{
|
participation := event.Calendar().SynchronizeSubscription( ioparticipation.ParticipationID(),
|
ioparticipation.EventID(),
|
ioparticipation.CalendarType(),
|
ioparticipation.CalendarID(),
|
ioparticipation.EventIsRecurring(),
|
event.IsAllDay(),
|
event.StartTimeOfDay(),
|
event.Duration(),
|
ioparticipation.StartDate(),
|
ioparticipation.HasSpecificPeriod(),
|
ioparticipation.PeriodType(),
|
ioparticipation.PeriodStartDate(),
|
ioparticipation.PeriodNrOfOccurences(),
|
ioparticipation.PeriodEndDate() );
|
updatesParticipation.Add( participation );
|
}
|
}
|
}
|
|
// Make sure that the declarative logic is propagated before creating occurences.
|
Transaction::Transaction().Propagate( attribute( LibCal_Calendar, EndDate ) );
|
|
// Get every Calendars
|
synchronizedCalendars := this.CalendarRegistry().Calendar( relget );
|
|
// Update the calendars that have been synchronized.
|
traverse( synchronizedCalendars, Elements, calendar )
|
{
|
calendar.GenerateOccurrences();
|
}
|
|
// Get the set of old LeadingParticipation to be deleted
|
tobedeletesetleadingparticipation := existingLeadingParticipation.Difference( updatesLeadingParticipation );
|
|
// Traverse the set of LeadingParticipation to be deleted
|
traverse( tobedeletesetleadingparticipation, Elements, ele )
|
{
|
ele.Delete();
|
}
|
|
// Get the set of old Participation to be deleted
|
// Filter out participation to Common Calendar
|
tobedeletesetparticipation := existingParticipation.Difference( updatesParticipation );
|
|
// Traverse the set of Participation to be deleted
|
traverse( tobedeletesetparticipation, Elements, ele, ele.Event().Calendar() <> commoncalendar )
|
{
|
ele.Delete();
|
}
|
|
// Get the set of old Event to be deleted
|
tobedeletesetevent := existingEvent.Difference( updatesEvent );
|
|
// Traverse the set of Event to be deleted
|
traverse( tobedeletesetevent, Elements, ele )
|
{
|
ele.Delete();
|
}
|
*]
|
}
|