Quintiq file version 2.0
|
#parent: #root
|
Method CreateSafetyStocks
|
{
|
Description: 'Create safety stocks for the product after the procedure is done for all periods'
|
TextBody:
|
[*
|
// Traverse through all PISPs and PISPIPs, if MEIO created a target delete all old inventory specifications
|
traverse( this, Product_MP.ProductInStockingPoint_MP, pisp )
|
{
|
if ( not pisp.IsActiveInMEIO() ) // not active == no safety stock kept and no sales demand
|
{
|
traverse( pisp, SafetyStock, ss, not ss.HasUserTarget() )
|
{
|
ss.Delete();
|
}
|
}
|
|
traverse( pisp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispip, pispip.MEIO_PISPIP_Target( relsize ) > 0 )
|
{
|
oldss := pispip.SafetyStock() // remove old inv spec if it only ranges over MEIO pispips
|
if ( not isnull( oldss ) and not oldss.HasUserTarget())
|
{
|
if ( forall( oldss, ProductInStockingPointInPeriod.astype( ProductInStockingPointInPeriodPlanningLeaf ), p, true, p.MEIO_PISPIP_Target( relsize ) > 0 ) )
|
{
|
oldss.Delete();
|
}
|
}
|
}
|
}
|
|
// create new inventory specifications
|
traverse( this, Product_MP.ProductInStockingPoint_MP, pisp )
|
{
|
traverse( pisp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispip )
|
{
|
target := maxselect( pispip, MEIO_PISPIP_Target, t, true, t.Target() );
|
if( not isnull( target ) )
|
{
|
|
// Create safety stock for the given PISPIP
|
target.IsSelected( true );
|
pispip.ServiceLevel( target.ServiceLevel() );
|
ss:=SafetyStock::FindTypeIndexSafetyStock( pisp.ProductID(), pisp.StockingPointID(), pispip.Start().Date() );
|
if ( isnull( ss ) )
|
{
|
SafetyStock::Create( pisp.Product_MP(),
|
pisp.StockingPoint_MP(),
|
pispip.Start().Date(),
|
false, 0.0, target.Target(), // Does not have a target in days, the initial targets are 0
|
true, false ,false ); // Is calculated and is not from database
|
}
|
}
|
}
|
}
|
*]
|
}
|