| Quintiq file version 2.0 | 
| #parent: #root | 
| FunctionOverride CalcStockLevelInDays | 
| { | 
|   TextBody: | 
|   [* | 
|     totalDays := 0.0; | 
|     if ( not this.Period_MP().MacroPlan().IsMetaOptimizerRunning() )  | 
|     { | 
|       // Calculate stock level in days | 
|       futureperiods := selectsortedset( this, ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), p, | 
|                                         p.Start() >= this.End(), p.Start() ); | 
|        | 
|       balanceInv := this.InventoryLevelEnd(); | 
|        | 
|        | 
|       /* | 
|         Track if consecutive future periods has 0 demand (although we have balance supply, but if remaining future periods has 0 demand not consider as coverable). | 
|         Accumulate the coverable days and only add to total days if manage to find a subsequent period with demand. | 
|       */ | 
|       zeroDemandMode := false; | 
|       tempTotalDays := 0.0; | 
|       continue := true; // Terminate calculation once remaining supply is 0 | 
|        | 
|       traverse( futureperiods, Elements, pispip, continue ) | 
|       { | 
|         balanceInv := balanceInv - pispip.ExpiredInPeriodShelfLifeSupplyQuantity(); // Reduce inventory as expired | 
|         if( balanceInv > 0.0 ) | 
|         { | 
|           demandQty := pispip.DependentDemandAndSalesDemandQuantity(); | 
|           if( balanceInv > demandQty ) // Remaining supply can cover demand in period | 
|           { | 
|             if( not zeroDemandMode and demandQty = 0.0 ) // Hit first period with 0 demand | 
|             { | 
|               zeroDemandMode := true;  | 
|             } | 
|             else if( zeroDemandMode and demandQty > 0.0 ) | 
|             { | 
|               // Previous period(s) has 0 demand and finally this period has demand so add accumualted temp coverable days before we calculate this period coverable days | 
|               zeroDemandMode := false; // Reset so we calculate coverable days as usual (as the period has demand now) | 
|               totalDays := totalDays + tempTotalDays; | 
|               tempTotalDays := 0.0;  | 
|             } | 
|              | 
|             if( zeroDemandMode ) | 
|             { | 
|               // Temporary days coverable if there is 0 demand | 
|               tempTotalDays := tempTotalDays + pispip.Period_MP().DurationInDays();  | 
|             } | 
|             else | 
|             { | 
|               totalDays := totalDays + pispip.Period_MP().DurationInDays();  | 
|             } | 
|             balanceInv := balanceInv - demandQty;  | 
|           }  | 
|           else // Remaining supply partially cover the demand in period | 
|           { | 
|             // Main calc logic | 
|             totalDays := totalDays + ( balanceInv / demandQty * pispip.Period_MP().DurationInDays() ); | 
|             balanceInv := 0.0; | 
|           } | 
|         } | 
|          | 
|         continue := balanceInv > 0.0; | 
|       } | 
|     } | 
|     this.StockLevelInDays( totalDays ); | 
|   *] | 
| } |