Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Function CalcShelfLifeSupplyAgeAndQuantityVectorAsBinaryValue 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Construct the leading vectors 
 | 
    quantityvector := RealVector::Construct(); 
 | 
    agevector := RealVector::Construct(); 
 | 
    prev_quantityvectorend := RealVector::Construct( ); 
 | 
    prev_agevectorend := RealVector::Construct(); 
 | 
    pispippl := this.ProductInStockingPointInPeriodPlanningLeaf(); 
 | 
    prev_inventorylevelend :=0.0; 
 | 
             
 | 
    // Check if the product has shelf life or maturation 
 | 
    if( pispippl.ProductInStockingPoint_MP().Product_MP().HasShelfLifeOrMaturation() ) 
 | 
    { 
 | 
        prev_pispippl := guard( pispippl.PreviousPlanningPISPIP().astype( ProductInStockingPointInPeriodPlanningLeaf ), null( ProductInStockingPointInPeriodPlanningLeaf ) ); 
 | 
        prev_pispippl_shelflife := guard( prev_pispippl.ShelfLife(), null( ShelfLife ) ); 
 | 
         
 | 
         
 | 
        if ( not isnull( prev_pispippl_shelflife ) ) 
 | 
        { 
 | 
         // Get shelf life end vectors from previous planning PISPIP 
 | 
          prev_quantityvectorend := RealVector::Construct( prev_pispippl_shelflife.ShelfLifeEndQuantityVectorAsBinaryValue() ); 
 | 
          prev_agevectorend := RealVector::Construct( prev_pispippl_shelflife.ShelfLifeEndAgeVectorAsBinaryValue() ); 
 | 
               
 | 
          // Append the vectors into the leading vector 
 | 
          quantityvector.Append( prev_quantityvectorend ); 
 | 
          agevector.Append( prev_agevectorend ); 
 | 
          prev_inventorylevelend := prev_quantityvectorend.Sum(); 
 | 
        
 | 
        } 
 | 
     
 | 
        // if has total avaialable supply user 
 | 
        if ( this.ProductInStockingPointInPeriodPlanningLeaf().HasTotalAvailableSupplyUser() ) 
 | 
        { 
 | 
         
 | 
          agefromcurrentpisp := ShelfLife::GetShelfLifeDaysToAdd( pispippl.Period_MP(), pispippl.Period_MP() ) 
 | 
          balancewithoutsupply := pispippl.TotalAvailableSupplyUser() - pispippl.InventorySupplyAndNewSupplyQuantity(); 
 | 
          // totalavailablesupplyuser - inventorysupplyandnewsupplyquantity - previous inventory level end 
 | 
          balancediffwithprevious := pispippl.TotalAvailableSupplyUser() - pispippl.InventorySupplyAndNewSupplyQuantity() - prev_inventorylevelend; 
 | 
          if ( balancediffwithprevious > 0 ) 
 | 
          { 
 | 
           quantityvector.Append( balancediffwithprevious ); 
 | 
           agevector.Append( agefromcurrentpisp ); 
 | 
          }  
 | 
          else if ( this.ProductInStockingPointInPeriodPlanningLeaf().TotalAvailableSupplyUser() < prev_inventorylevelend )  
 | 
          { 
 | 
            quantityvector.Remove( 0 );// when less than previous inventory end, removed previous, only append current totalavaialableuser 
 | 
            agevector.Remove( 0 );// when less than previous, removed previous 
 | 
            if( balancewithoutsupply > 0 ) 
 | 
            { 
 | 
              quantityvector.Append( balancewithoutsupply ); 
 | 
              agevector.Append( agefromcurrentpisp ); 
 | 
            }     
 | 
          } 
 | 
        } 
 | 
        
 | 
        // Traverse all new supplies and get their shelf life supply vectors 
 | 
        traverse( pispippl, NewSupply, newsupply ) 
 | 
        { 
 | 
          ns_quantityvector := RealVector::Construct( newsupply.ShelfLifeQuantityVectorAsBinaryValue() ); 
 | 
          ns_agevector := RealVector::Construct( newsupply.ShelfLifeAgeVectorAsBinaryValue() ); 
 | 
           
 | 
          quantityvector.Append( ns_quantityvector ); 
 | 
          agevector.Append( ns_agevector ); 
 | 
        } 
 | 
         
 | 
        // Traverse all inventory supplies and get their quantity and age 
 | 
        traverse( pispippl, InventorySupply, invsupply, invsupply.Quantity() > 0 ) 
 | 
        { 
 | 
          quantityvector.Append( invsupply.Quantity() ); 
 | 
          agevector.Append( invsupply.Age() ); 
 | 
        } 
 | 
       
 | 
        // Merge expired (expired in previous period, still need the info of expired stock in current period for constraint and sanity check) 
 | 
        // shelf life supplies into a single element in the vector to reduce the size of the vector 
 | 
        ShelfLife::MergeVectorAccordingToAgeAndExpiration( quantityvector, agevector, 
 | 
                                                           pispippl, 
 | 
                                                           pispippl.Start() ); 
 | 
    } 
 | 
     
 | 
    this.ShelfLifeSupplyQuantityVectorAsBinaryValue( quantityvector.AsBinaryValue() ); 
 | 
    this.ShelfLifeSupplyAgeVectorAsBinaryValue( agevector.AsBinaryValue() ); 
 | 
  *] 
 | 
} 
 |