| Quintiq file version 2.0 | 
| #parent: #root | 
| FunctionOverride CalcQuantity | 
| { | 
|   TextBody: | 
|   [* | 
|     //For hourly buckets, SD will be linked to the last hourly bucket of the day | 
|     value := 0.0 | 
|     if( not isnull( this.AsSalesDemandInPeriodBase() ) ) | 
|     { | 
|       qtyToPlan := ifexpr( this.IsPostponed(), | 
|                            this.QuantityToPlan(), | 
|                            // if not postponed the quantity is derived from the Sales Demand | 
|                            this.GetUnPostponedQuantity() ); // Convert to stocking point uom, same as dependent demand. | 
|        | 
|       postponedqty := sum( this, | 
|                            PostponedSalesDemand, | 
|                            sd, | 
|                            sd.QuantityToPlan() ); | 
|        | 
|       // We need to have this piece of code here specifically because real value | 
|       // after arithmetic operation is inaccurate, and even when they are equal | 
|       // subtraction can result in values which are inaccurate, so we need to force it | 
|       // to be zero if they are equal. E.g., create two values, value1 := 0.12345 * 2,  | 
|       // value2 := 0.2469, subtraction should net to zero, but you will get decimals | 
|     //  value := ifexpr( qtyToPlan = postponedqty, 0.0, qtyToPlan - postponedqty ); | 
|       // Tianma 20230714: Fixed a bug where small decimal points are not tolerated | 
|       value := ifexpr( GlobalParameters_MP::GetIsBalanceWithinAbsoluteTolerance( qtyToPlan, postponedqty, 0.0000001 ), | 
|                        0.0, | 
|                        qtyToPlan - postponedqty ); | 
|     } | 
|     this.Quantity( value ); | 
|   *] | 
| } |