| Quintiq file version 2.0 | 
| #parent: #root | 
| Method VerifyDependentDemand ( | 
|   MacroPlan macroplan, | 
|   PeriodTask_MP periodTask, | 
|   ProductInStockingPoint_MP ingredientPisp | 
| ) | 
| { | 
|   Description: 'Verify period task has expected dependent demand and whether the dependent demand is adhered to recipe configuration minimum and maximum bound.' | 
|   TextBody: | 
|   [* | 
|     // Verify period task has correct ratio for each input ingredient. | 
|     epsilon := 0.00025; | 
|      | 
|     if( this.Run().AssertNotIsNull( periodTask ) ) | 
|     { | 
|       /* Note: min & max bound for metal demo | 
|       Verification method for the min ratio of input ingredient  | 
|       Si = [ input quantity of Si in La Quinta  | 
|               + Input quantity of Scrap 3xxx in La Quinta * Minimum ratio of Si in recipe 3xxx  | 
|               + Input quantity of Scrap 5xxx in La Quinta * Minimum ratio of Si in recipe 5xxx  | 
|               + Input quantity of Prime in La Quinta * Minimum ratio of Si in recipe Prime ] /Total input quantity | 
|        | 
|        Verification method for the max ratio of input ingredient  | 
|       Si = [ input quantity of Si in La Quinta  | 
|               + Input quantity of Scrap 3xxx in La Quinta * Maximum ratio of Si in recipe 3xxx  | 
|               + Input quantity of Scrap 5xxx in La Quinta * Maximum ratio of Si in recipe 5xxx  | 
|               + Input quantity of Prime in La Quinta * Maximum ratio of Si in recipe Prime ] /Total input quantity | 
|       */ | 
|       // Get total supply of periodtask | 
|       totalInputQty := sum( periodTask, NewSupply, d, true, d.Quantity() ); | 
|        | 
|       // Get recipe-ingredient ratio for input ingredient | 
|       recipe3xxx := macroplan.FindRecipe( '3XXX' ).FindRecipeIngredient( '3XXX', ingredientPisp.ProductID() ); | 
|       recipe5xxx := macroplan.FindRecipe( '5XXX' ).FindRecipeIngredient( '5XXX', ingredientPisp.ProductID() ); | 
|       recipePrime := macroplan.FindRecipe( 'Prime' ).FindRecipeIngredient( 'Prime', ingredientPisp.ProductID() ); | 
|        | 
|       scrap3xxxInPT:= this.GetDependentDemand( periodTask, macroplan.GetProduct( 'Scrap 3XXX' ) ); | 
|       scrap5xxxInPT := this.GetDependentDemand( periodTask, macroplan.GetProduct( 'Scrap 5XXX' ) ); | 
|       primeInPT := this.GetDependentDemand( periodTask, macroplan.GetProduct( 'Prime' ) ); | 
|        | 
|       // Verify the actual ratio is between expected min & expected max | 
|       dd := this.GetDependentDemand( periodTask, ingredientPisp ); | 
|       actualRatio := guard( dd.Quantity() / totalInputQty, 0.0 ); | 
|        | 
|       scrap3xxx :=  guard( scrap3xxxInPT.Quantity()* recipe3xxx.Minimum(), 0.0 ); | 
|       scrap5xxx := guard( scrap5xxxInPT.Quantity() * recipe5xxx.Minimum(), 0.0 ); | 
|       prime :=  guard( primeInPT.Quantity() * recipePrime.Minimum(), 0.0 ); | 
|        | 
|       expectedMin := ( dd.Quantity() + scrap3xxx + scrap5xxx + prime ) / totalInputQty; | 
|        | 
|       scrap3xxx :=  guard( scrap3xxxInPT.Quantity() * recipe3xxx.Maximum(), 0.0 ); | 
|       scrap5xxx :=  guard( scrap5xxxInPT.Quantity() * recipe5xxx.Maximum(), 0.0 ); | 
|       prime :=  guard( primeInPT.Quantity() * recipePrime.Maximum(), 0.0 ); | 
|        | 
|       expectedMax := ( dd.Quantity() + scrap3xxx + scrap5xxx + prime ) / totalInputQty; | 
|        | 
|       this.Run().AssertGreaterOrEqual( expectedMin, actualRatio, epsilon, 'Verify minimum ratio for ' + ingredientPisp.Name() ) | 
|       this.Run().AssertLessOrEqual( expectedMax, actualRatio, epsilon, 'Verify maximum ratio for ' + ingredientPisp.Name() ); | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |