Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method SynchronizeInventorySpecInServiceLevel 
 | 
{ 
 | 
  Description: 
 | 
  [* 
 | 
    This method updates the InventorySpecificationInServiceLevel instances that link this service level to the relevant inventory specifications. 
 | 
    An inventory specification is relevant for the service level if it can influence the service level. 
 | 
    This means that it is specified either on a pispip of the service level, or on an upstream pispip of this service level. 
 | 
  *] 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Martijn Oct-18-2016 (created) 
 | 
     
 | 
    // Set all IsSynchronized of the InventorySpecificationInServiceLevel related to this service level to false 
 | 
    // This allows us to track which InvSpecInSL are outdated and need to be deleted 
 | 
    traverse( this, InventorySpecificationInServiceLevel, invspecinsl ) 
 | 
    { 
 | 
      invspecinsl.IsSynchronized( false ); 
 | 
    } 
 | 
     
 | 
    sdips := this.GetSalesDemandInPeriods() 
 | 
    pispips := selectset( sdips, Elements.AsSalesDemandInPeriodBase, pispip, true ); 
 | 
     
 | 
    // Add all upstream pispips to the pispips set 
 | 
    traverse( pispips, Elements, pispip ) 
 | 
    { 
 | 
      pispip.GetUpstreamPISPIPs( 20, pispips ); 
 | 
    } 
 | 
     
 | 
    traverse( pispips, Elements.InventorySpecification, invspec ) 
 | 
    { 
 | 
      // Create the instance of the invspecinservicelevel that links the inventory specification to the service level 
 | 
      // The create method will check whether it already exists 
 | 
      invspecinsl := InventorySpecificationInServiceLevel::Create( invspec, this ); 
 | 
      // This invspecinsl has been synchronized 
 | 
      invspecinsl.IsSynchronized( true ); 
 | 
    } 
 | 
     
 | 
    // Delete all the remaining invspecinsl that have not been synchronized 
 | 
    // since these invspecinsl are outdated 
 | 
    traverse( this, InventorySpecificationInServiceLevel, invspecinsl, not invspecinsl.IsSynchronized() ) 
 | 
    { 
 | 
      invspecinsl.Delete() 
 | 
    } 
 | 
     
 | 
    // Delete all the unused PeriodTaskOperations and Trips (that were created to identify the upstream pispips ) 
 | 
    // Any PeriodTaskOperation/Trip with a userquantity or with feedback should not be deleted 
 | 
    traverse( this, AsAllServiceLevelBase.Unit.Operation.PeriodTaskOperation, periodtaskoperation, 
 | 
              periodtaskoperation.Quantity() = 0.0 
 | 
              and not periodtaskoperation.HasUserQuantity() 
 | 
              and not periodtaskoperation.HasFeedback() ) 
 | 
    { 
 | 
      periodtaskoperation.Delete(); 
 | 
    } 
 | 
    traverse( this, AsAllServiceLevelBase.Unit.Lane.LaneLeg.Trip, trip ) 
 | 
    { 
 | 
      traverse( trip, ProductInTrip, pit, 
 | 
                pit.Quantity() = 0.0 
 | 
                and not pit.HasUserQuantity() 
 | 
                and not pit.HasFeedback() ) 
 | 
      { 
 | 
        pit.Delete(); 
 | 
      } 
 | 
      if( trip.ProductInTrip( relsize ) = 0 ) 
 | 
      { 
 | 
        trip.Delete(); 
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
} 
 |