| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GetHasValidInputOuputProductLevel ( | 
|   output Strings feedback_o, | 
|   output Strings sanitycheckfeedback_o | 
| ) declarative remote as Boolean | 
| { | 
|   Description: 'Check whether both input and output product for the operation are from same product level.' | 
|   TextBody: | 
|   [* | 
|     products := selectuniquevalues( this, OperationInput.ProductInStockingPoint_MP.Product_MP, product, true, product.IsLeaf() ) | 
|      | 
|     isvalid := products.Size() <=1; | 
|      | 
|     if ( isvalid ) | 
|     { | 
|       isvalid := products.Size() =0  | 
|                  or forall( this, OperationOutput.ProductInStockingPoint_MP.Product_MP, product, true, product.IsLeaf() = products.Element( 0 ) );   | 
|     } | 
|      | 
|     if( not isnull( feedback_o ) and not isvalid ) | 
|     { | 
|       name := MacroPlan::GetSubstituteName( this.Name() ); | 
|       routingstep := MacroPlan::GetSubstituteName( this.RoutingStepName() ); | 
|       routing := MacroPlan::GetSubstituteName( this.RoutingID() ); | 
|       unitname := MacroPlan::GetSubstituteName( this.Unit().Name() ); | 
|       feedback_o.Add( SanityCheckMessage::GetFormattedMessage( Translations::MP_Operation_Instance( name, routingstep, routing, unitname ),  | 
|                                                                 Translations::MP_Operation_ViolateHaveDifferentInputOutputProductLevel() ) ); | 
|       sanitycheckfeedback_o.Add( SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue() );  | 
|     } | 
|      | 
|     return isvalid; | 
|   *] | 
| } |