| Quintiq file version 2.0 | 
| #parent: #root | 
| Function CalcShelfLifePlannedEndAgeAndQuantityVectorAsBinaryValue | 
| { | 
|   TextBody: | 
|   [* | 
|     // Get the shelf life supply vectors | 
|     quantityvector := RealVector::Construct( this.ShelfLifeSupplyAfterDDQuantityVectorAsBinaryValue() ); | 
|     agevector := RealVector::Construct( this.ShelfLifeSupplyAfterDDAgeVectorAsBinaryValue() ); | 
|     pispippl := this.ProductInStockingPointInPeriodPlanningLeaf(); | 
|      | 
|     // Check if the product has shelf life or maturation | 
|     product := pispippl.ProductInStockingPoint_MP().Product_MP(); | 
|     if( product.HasShelfLifeOrMaturation() ) | 
|     { | 
|       // Deduct the values of the elements in the shelf life supply vectors with the values of sales demand and operation demand   | 
|       salesdemands := pispippl.GetSortedLeafSalesDemandsInPeriod(); | 
|       salesdemand := sum( salesdemands, Elements, e, | 
|                           true, | 
|                           ifexpr( e.HasOptimizerFulfillment() or not e.IsWithinThresholdQuantity(), | 
|                                   e.OptimizerFulfilledQuantity(), | 
|                                   e.QuantityForSystemFulfilledQuantity() ) ); | 
|      | 
|       salesdemandforaggregated := sum ( pispippl.GetDisaggregatedSalesDemandInPeriod(),  | 
|                                      Elements,  | 
|                                      e,  | 
|                                      true,  | 
|                                      ifexpr( e.HasOptimizerFulfillment() or not e.IsWithinThresholdQuantity(), | 
|                                      e.OptimizerFulfilledQuantity(), | 
|                                      e.QuantityForSystemFulfilledQuantity() ) );  | 
|      | 
|       salesdemandfornegativesupply := sum( pispippl, InventorySupply, invsup, invsup.Quantity() < 0, abs( invsup.Quantity() ) );      | 
|      | 
|       salesdemand := salesdemand + salesdemandforaggregated + salesdemandfornegativesupply;  | 
|              | 
|       // The quantity and age consumed by sales demand | 
|       source_quantityconsumedvector := RealVector::Construct(); | 
|       source_ageconsumedvector := RealVector::Construct(); | 
|        | 
|       ShelfLife::SetAvailableAgeAndQuantityVectorAfterDemand( quantityvector, agevector, | 
|                                                               source_quantityconsumedvector, source_ageconsumedvector, | 
|                                                               salesdemand, | 
|                                                               false, // do not ignore maturation | 
|                                                               true, // consume oldest product first if possible | 
|                                                               pispippl, | 
|                                                               0.0 // the passed in source_agevector has not been aged so there is need to un-age  | 
|                                                             ); | 
|        | 
|       // Get the age that is considered expired | 
|       if( product.HasShelfLife() ) | 
|       { | 
|         isnonexpiredinperiodvector := BooleanVector::Construct(); | 
|         traverse( agevector.AsValues(), Elements, age ) | 
|         { | 
|           isusableinperiod := product.GetIsUsableInTargetPeriod( [Real] age, pispippl.Start(), pispippl.Period_MP() ); | 
|           isnonexpiredinperiodvector.Append( isusableinperiod ); | 
|         } | 
|              | 
|         agevector := agevector.GetSelection( isnonexpiredinperiodvector ); | 
|         quantityvector := quantityvector.GetSelection( isnonexpiredinperiodvector ); | 
|       } | 
|        | 
|       durationindays := pispippl.Period_MP().DurationInDays(); | 
|       durationindays := durationindays; | 
|       agevector := agevector.Plus( durationindays ); | 
|     } | 
|      | 
|     this.ShelfLifePlannedEndAgeVectorAsBinaryValue( agevector.AsBinaryValue() ); | 
|     this.ShelfLifePlannedEndQuantityVectorAsBinaryValue( quantityvector.AsBinaryValue() ); | 
|   *] | 
| } |