Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method MPSyncDetailedSchedule ( 
 | 
  Boolean isoverwitemanualconfig, 
 | 
  IODetailedSchedules iodetailedschedule_mps 
 | 
) 
 | 
{ 
 | 
  Description: 'Synchronization of Detailed Schedules to Feedback for MPSync' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Select a set of existing Feedbacks, only get frozen  
 | 
    existing := selectset( this, Feedback.astype( FeedbackPeriodTaskOperation ), feedback, feedback.IsLocked() ); 
 | 
    updates := construct( FeedbackPeriodTaskOperations ); 
 | 
     
 | 
    // The synchronization is as follow 
 | 
    // 1. We group scheduled work orders according to operationID and datetime 
 | 
    // 2. Then group planning periods by datetime 
 | 
    // We then loop through sorted scheduled work orders 
 | 
    // for each detailed scheule, we populate all  
 | 
    // planning operation period tasks associated to it 
 | 
    if( iodetailedschedule_mps.Size() > 0 ) 
 | 
    { 
 | 
      iodetailedschedule_mps.Sort( attribute( IODetailedSchedule, RoutingID ), true /*ascending*/, 
 | 
                                   attribute( IODetailedSchedule, RoutingStepSeqNr ), true /*ascending*/, 
 | 
                                   attribute( IODetailedSchedule, ResourceID ), true /*ascending*/, 
 | 
                                   attribute( IODetailedSchedule, ScheduledStart ), true /*ascending*/, 
 | 
                                   attribute( IODetailedSchedule, ScheduledEnd ), true /*ascending*/ ); 
 | 
        
 | 
      traverse( iodetailedschedule_mps, Elements, ioschwo ) 
 | 
      { 
 | 
        FeedbackPeriodTaskOperation::CreateUpdate( this, 
 | 
                                                   ioschwo.ScheduledStart(), ioschwo.ScheduledEnd(), ioschwo.ResourceID(),  
 | 
                                                   ioschwo.RoutingID(), ioschwo.RoutingStepSeqNr(), ioschwo.Quantity(),  
 | 
                                                   updates /* output structured FeedbackPTO */ ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    this.PostProcessDetailScheduleFeedback( true, updates, existing );//set to false if not creating zero feedback 
 | 
    // Get the set of old Feedback to be deleted 
 | 
    tobedeleteset := existing.Difference( updates ); 
 | 
    // Traverse the set of Feedback to be deleted 
 | 
    // Only delete Feedback that is not manually configured or the imported instance should overwrite manual configuration 
 | 
    traverse( tobedeleteset, Elements, ele, not ele.IsManuallyConfigured() or isoverwitemanualconfig) 
 | 
    { 
 | 
      ele.Delete(); 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |