| Quintiq file version 2.0 | 
| #parent: #root | 
| StaticMethod CreateUpdate ( | 
|   MacroPlan owner, | 
|   DateTime scheduleStart, | 
|   DateTime scheduleEnd, | 
|   String scheduleResourceID, | 
|   String scheduleRoutingID, | 
|   Number scheduleRoutingStepSeqNr, | 
|   Real scheduleQuantity, | 
|   output FeedbackPeriodTaskOperations feedbackPTOs_o | 
| ) | 
| { | 
|   Description: 'Create one or more FeedbackPeriodTaskOperation (depending if span multiple periods)' | 
|   TextBody: | 
|   [* | 
|     planningperiods := selectsortedset( owner, PlanningPeriod, pp, pp.IsInPeriod( scheduleStart, scheduleEnd ), scheduleStart ); | 
|      | 
|     traverse( planningperiods, Elements, planningPeriod ) | 
|     { | 
|       ratio := guard( ( minvalue( planningPeriod.End(), scheduleEnd ) - maxvalue( planningPeriod.Start(), scheduleStart ) ) / ( scheduleEnd - scheduleStart ), 0 ); | 
|       qty := scheduleQuantity * ratio; | 
|        | 
|       unit := Unit::FindUnitTypeIndex( scheduleResourceID ); | 
|       operation := select( unit, Operation, op, op.RoutingID() = scheduleRoutingID and op.RoutingStepSeqNr() = scheduleRoutingStepSeqNr ); | 
|                                                                        | 
|       existingFeedback := select( operation, FeedbackPeriodTaskOperation, fpto, fpto.IsLocked() and fpto.DateTime() = planningPeriod.Start() ); | 
|       if( isnull( existingFeedback ) ) | 
|       { | 
|         existingFeedback := FeedbackPeriodTaskOperation::Create( owner, | 
|                                                                  owner.IDHolder().GetFeedbackID(), | 
|                                                                  guard( operation.ID(), '' ), | 
|                                                                  planningPeriod.Start(), | 
|                                                                  qty, | 
|                                                                  '', | 
|                                                                  true /*isplannedexact*/, | 
|                                                                  false ); /*isfromdb*/ | 
|         // For above select to work (if multiple feedback for operation to able find the newly created feedback)                                                                  | 
|         Transaction::Transaction().Propagate( relation( Operation, FeedbackPeriodTaskOperation ) ); | 
|         feedbackPTOs_o.Add( existingFeedback );                                                           | 
|       } | 
|       else | 
|       { | 
|         if( feedbackPTOs_o.Find( existingFeedback ) >= 0 ) // Add-on the quantity instead of replace | 
|         { | 
|           existingFeedback.UpdateQtyDelta( qty );  | 
|         } | 
|         else // Replaces the quantity | 
|         { | 
|           existingFeedback.Update( qty, existingFeedback.Description(), not existingFeedback.IsManuallyConfigured() ); | 
|           feedbackPTOs_o.Add( existingFeedback ); // Only add to structured if not already in it | 
|         } | 
|       } | 
|     } | 
|   *] | 
| } |