Quintiq file version 2.0
|
#parent: #root
|
Method PruneProductInTrips (
|
MacroPlan macroplan,
|
LibOpt_Task task
|
)
|
{
|
TextBody:
|
[*
|
totalnrpit := 0;
|
pruned := 0;
|
|
traverse( macroplan,
|
Unit.Lane.LaneLeg.Trip.ProductInTrip,
|
pit,
|
pit.Quantity() = 0
|
and not pit.HasUserQuantity()
|
and not pit.HasFeedback() )
|
{
|
totalnrpit++;
|
dest_pispip := pit.ArrivalPISPIP();
|
if ( dest_pispip.IsPruningCandidate() ) // determined by looking if there is local demand ( sales, inventory ) at the pispip or in the future
|
{
|
startdate := dest_pispip.Start().Date();
|
hasoutgoingtrip := exists( dest_pispip, AsDeparturePISPIP, prtrip, true, true );
|
hasoperation := exists( dest_pispip,
|
ProductInStockingPoint_MP.OperationInput.Routing,
|
r,
|
true,
|
r.Start() <= startdate
|
and r.End() >= startdate
|
and r.IsEnabled() );
|
|
|
departurepispip := pit.DeparturePISPIP();
|
departurehasmax := guard( departurepispip.InventorySpecification().HasMaxLevel(), false )
|
or ( departurepispip.StockingPointInPeriod().MaxCapacity() > 0 and not departurepispip.StockingPointInPeriod().StockingPoint_MP().IsPlannedInfinite() );
|
|
arrivalhasnostorage := guard( dest_pispip.InventorySpecification().HasMaxLevel() and dest_pispip.MaxInventoryLevel() = 0, false )
|
or ( dest_pispip.StockingPointInPeriod().MaxCapacity() = 0 and not dest_pispip.StockingPointInPeriod().StockingPoint_MP().IsPlannedInfinite() );
|
arrivalhasstorage := not arrivalhasnostorage;
|
if ( not hasoperation
|
and not hasoutgoingtrip )
|
{
|
if ( arrivalhasnostorage // in this case we know for sure we can prune the product in trip
|
or ( arrivalhasstorage and not departurehasmax ) ) // otherwise, also prune in case it can feasibly be left at the departure
|
{
|
pruned++;
|
pit.Delete();
|
}
|
}
|
} // end if 'IsPruningCandidate'
|
} // end traverse pit
|
|
msg := 'Total product in trips:' + [String] totalnrpit + ' Pruned:' + [String] pruned + ' Remaining = ' + [String] (totalnrpit - pruned);
|
debuginfo( msg );
|
task.Log( msg );
|
*]
|
}
|