| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GetAverageSalesDemandQtyPerDay () const declarative remote as Real | 
| { | 
|   Description: | 
|   [* | 
|     The average daily sales demand over the next "target in days" days. | 
|     If not target in days has been defined, then the default number of periods will be used. | 
|     If there is no sales demand in that horizon, then the average daily sales demand over the whole horizon will be calculated. | 
|   *] | 
|   TextBody: | 
|   [* | 
|     demandperday := 1.0 | 
|      | 
|     // If this PISPIP is not related to a product in stocking point with demand then the average sales demand qty per day is not relevant | 
|     // If this is not a leading period, then it will not be considered by the optimizer and the avg sales demand qty per day is also not relevant | 
|     if( this.ProductInStockingPoint_MP().HasSalesDemand() ) | 
|     { | 
|       // By default, we will balance the inventory number of demand days based on the average daily demand in the next X periods | 
|       numberofdays := this.ProductInStockingPoint_MP().Product_MP().MacroPlan().GlobalParameters_MP().DefaultNumberOfPeriodsForAvgDemand() * this.Period_MP().DurationInDays(); | 
|        | 
|       // If there is a target in days, then we will calculate the average sales demand over the next "target in days" days | 
|       if( this.GetHasTargetInDays() and this.TargetInDays() > 0 ) | 
|       { | 
|         numberofdays := this.TargetInDays(); | 
|       } | 
|       // Set the numberofdays to 1 if it was zero, to avoid a division by 0 | 
|       else if( numberofdays = 0.0 ) | 
|       { | 
|         numberofdays := 1.0; | 
|       } | 
|      | 
|       // otherwise it is based on the defaultnumberofdays | 
|       nextpispips := this.GetNextPlanningPISPIPs( numberofdays ) | 
|              | 
|       // If there are no next pispips, calculate the average sales demand qty based on the current period | 
|       if( nextpispips.Size() = 0 ) | 
|       { | 
|         nextpispips := selectset( this, ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, pispip = this ); | 
|       } | 
|        | 
|       // Calculate the total demand in the next numberofdays days | 
|       totaldemand := ProductInStockingPointInPeriodPlanning::GetTotalDemandInRemainingDays( nextpispips, numberofdays ); | 
|      | 
|       // The demand per day is equal to the average sales demand per day over these days | 
|       demandperday := totaldemand / numberofdays; | 
|        | 
|       // If the demandperday is 0, then use the average demand per day over the whole horizon | 
|       if( demandperday = 0 ) | 
|       { | 
|         demandperday := average( this, ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, pispip, | 
|                                  guard( pispip.SalesDemandQuantity() / pispip.Period_MP().DurationInDays(), 0.0 ) ); | 
|       } | 
|     } | 
|      | 
|     return demandperday; | 
|   *] | 
| } |