Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method DoGenerateOccurrence ( 
 | 
  DateTime start_i, 
 | 
  DateTime end_i, 
 | 
  ExplicitTimeInterval firstOccurrence_i 
 | 
) as Boolean 
 | 
{ 
 | 
  Description: 'Determine if an occurrence should be generated.' 
 | 
  TextBody: 
 | 
  [* 
 | 
    doGenerate := false; 
 | 
    calendar   := this.Calendar(); 
 | 
     
 | 
    /* Special case #1: CalendarWindow moved forward and 
 | 
     *                  the occurrence-to-be-generated starts before but ends after the new start of the window. 
 | 
     *                  In this case, the occurrence should not be generated. 
 | 
     * 
 | 
     * The fact that this occurrence was not found indicates that it was explicitly deleted; 
 | 
     * it should *not* be created now, but its deletion should be preserved. 
 | 
     * 
 | 
     * So: an occurrence can be generated when the CalendarWindow did not move forward, 
 | 
     *     or when the occurrence starts after the start of the window. 
 | 
     */ 
 | 
    startOfWindowMovedForward := calendar.StartDate() > calendar.PreviousStartDate(); 
 | 
    doGenerate := not startOfWindowMovedForward 
 | 
               or start_i >= calendar.Start(); 
 | 
     
 | 
    if( doGenerate ) 
 | 
    { 
 | 
      /* Special case #2 : CalendarWindow moved backward and 
 | 
       *                   the occurrence-to-be-generated has overlap with the first already existing occurrence. 
 | 
       *                   In this case, the occurrence should not be generated. 
 | 
       * 
 | 
       * This indicates that the first occurrence was modified and preserved, 
 | 
       * and generating a new occurrence would result in a 'double' occurrence. 
 | 
       * 
 | 
       * So: an occurrence can be generated when the CalendarWindow did not move backward, 
 | 
       *     or when there is no overlap with the first existing occurrence. 
 | 
       */ 
 | 
      startOfWindowMovedBackward    := calendar.StartDate() < calendar.PreviousStartDate(); 
 | 
      hasOverlapWithFirstOccurrence := not isnull( firstOccurrence_i ) 
 | 
                                   and end_i   > firstOccurrence_i.Start() 
 | 
                                   and start_i < firstOccurrence_i.End(); 
 | 
                                    
 | 
      doGenerate := not startOfWindowMovedBackward 
 | 
                 or not hasOverlapWithFirstOccurrence; 
 | 
    } 
 | 
     
 | 
    return doGenerate; 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |