| Quintiq file version 2.0 | 
| #parent: #root | 
| Method PostProcessDetailScheduleFeedback ( | 
|   Boolean isgeneratezerofeedback, | 
|   output FeedbackPeriodTaskOperations updates, | 
|   output FeedbackPeriodTaskOperations existings | 
| ) | 
| { | 
|   Description: 'Only generate zero feedback for operation without feedback within the mp sc schedule horizon' | 
|   TextBody: | 
|   [* | 
|     if( isgeneratezerofeedback ) | 
|     { | 
|       operations := selectset( this, Unit.Operation, operation, not isnull( operation.AsOperationForOptimization() ) ); | 
|       feedbacks := selectsortedset( updates, Elements, f, true, f.DateTime() ); | 
|        | 
|       schorizonstart := guard( feedbacks.First().DateTime(), DateTime::MaxDateTime() ); | 
|       schorizonend := guard( feedbacks.Last().DateTime(), DateTime::MinDateTime() ); | 
|        | 
|       planningperiods := selectsortedset( this, PlanningPeriod, pp, pp.Start()>= schorizonstart and pp.Start()<= schorizonend , pp.Start() );                        | 
|        | 
|       if ( planningperiods.Size() > 0 ) | 
|       { | 
|         canbedeleted := existings.Difference( updates ); | 
|          | 
|         traverse( operations, Elements, op ) | 
|         { | 
|             traverse( planningperiods, Elements, pp ) | 
|             { | 
|                 //check on newly updated or created feedback | 
|                 feedback := select( feedbacks,  | 
|                                     Elements,  | 
|                                     updatedfeedback,  | 
|                                     pp.IsInPeriod( updatedfeedback.DateTime(), updatedfeedback.DateTime() ) and updatedfeedback.OperationID() = op.ID() ); | 
|                  | 
|                 //  only check on old feedback if cannot found | 
|                 if ( isnull( feedback ) )  | 
|                 { | 
|                   feedback := select( canbedeleted,  | 
|                                       Elements,  | 
|                                       oldfeedback,  | 
|                                       pp.IsInPeriod( oldfeedback.DateTime(), oldfeedback.DateTime() ) and oldfeedback.OperationID() = op.ID() ); | 
|                    | 
|                   //create if not found                                           | 
|                   if ( isnull( feedback ) ) | 
|                   { | 
|                        feedback := FeedbackPeriodTaskOperation::Create( this, | 
|                                                             this.IDHolder().GetFeedbackID(), | 
|                                                             guard( op.ID(), '' ), | 
|                                                             pp.Start(), | 
|                                                             0.0, | 
|                                                             '', | 
|                                                             true /*isplannedexact*/, | 
|                                                             false ); /*isfromdb*/ | 
|                                                              | 
|                   } | 
|                   else // update feedbackquantity if found 1 | 
|                   { | 
|                       feedback.FeedbackQuantity( 0.0 ); | 
|                   } | 
|                    | 
|                   updates.Add( feedback ); | 
|                 } | 
|                                                                | 
|             } | 
|          | 
|         }                        | 
|        | 
|       }                        | 
|                                 | 
|     } | 
|   *] | 
| } |