Quintiq file version 2.0
|
#parent: #root
|
Method GetServiceLevel () declarative remote as ServiceLevelBase
|
{
|
Description: 'Selects and returns the ServiceLevel object'
|
TextBody:
|
[*
|
// edz1 Jul-11-2016 (created)
|
|
servicelevel := null( ServiceLevelBase );
|
|
setservicelevels := selectset( this,
|
ProductInStockingPoint_MP.ServiceLevels,
|
sl,
|
sl.IsUsedForSafetyStockCalculation()
|
and sl.IsEnabled()
|
and Period_MP::IsInPeriod( this.Start(), this.End(), sl.Start().DateTime(), sl.End().DateTime() ) );
|
|
//When no service level is defined on PISP with the matching date, look for service level where the prod / sp is specified.
|
if( setservicelevels.Size() = 0 )
|
{
|
setservicelevels := selectset( this,
|
ProductInStockingPoint_MP.Product_MP.MacroPlan.SafetyStockCalculationServiceLevel,
|
sl,
|
sl.IsUsedForSafetyStockCalculation()
|
and sl.IsEnabled(),
|
( isnull( sl.Product_MP() ) or sl.Product_MP() = this.ProductInStockingPoint_MP().Product_MP() )
|
and ( isnull( sl.StockingPoint_MP() ) or sl.StockingPoint_MP() = this.StockingPointInPeriod().StockingPoint_MP() )
|
and Period_MP::IsInPeriod( this.Start(), this.End(), sl.Start().DateTime(), sl.End().DateTime() ) );
|
}
|
if( setservicelevels.Size() > 0 )
|
{
|
servicelevel := maxselect ( setservicelevels, Elements, sl, true, sl.TargetPercentage() )
|
}
|
// If no service levels have been found, then check whether a service level has been defined for a parent of this product
|
// Martijn: I cannot make it recursive because it is declarative
|
// So I have to repeat the method but then while checking if the product of the service level is a parent of this product
|
else
|
{
|
// This will only select the service levels if it is on the direct parent (not a parent of the parent)
|
// The next if loop will select the service levels that are on higher level parents
|
setservicelevels := selectset( this,
|
ParentOfProductDimension.ProductInStockingPoint_MP.ServiceLevels,
|
sl,
|
sl.IsUsedForSafetyStockCalculation()
|
and sl.IsEnabled()
|
and Period_MP::IsInPeriod( this.Start(), this.End(), sl.Start().DateTime(), sl.End().DateTime() ) );
|
|
//When no service level is defined on PISP with the matching date, look for service level where the prod / sp is specified.
|
if( setservicelevels.Size() = 0 )
|
{
|
setservicelevels := selectset( this,
|
ProductInStockingPoint_MP.Product_MP.MacroPlan.SafetyStockCalculationServiceLevel,
|
sl,
|
sl.IsUsedForSafetyStockCalculation()
|
and sl.IsEnabled(),
|
( isnull( sl.Product_MP() ) or sl.Product_MP().IsParentOf( this.ProductInStockingPoint_MP().Product_MP() ) )
|
and ( isnull( sl.StockingPoint_MP() ) or sl.StockingPoint_MP() = this.StockingPointInPeriod().StockingPoint_MP() )
|
and Period_MP::IsInPeriod( this.Start(), this.End(), sl.Start().DateTime(), sl.End().DateTime() ) );
|
}
|
if( setservicelevels.Size() > 0 )
|
{
|
servicelevel := maxselect ( setservicelevels, Elements, sl, true, sl.TargetPercentage() )
|
}
|
}
|
|
return servicelevel;
|
*]
|
}
|