Quintiq file version 2.0
|
#parent: #root
|
StaticMethod OptimizerPostProcessing (
|
LibOpt_Scope scope,
|
RunContextForCapacityPlanning runcontext
|
)
|
{
|
TextBody:
|
[*
|
//We need to propagate InventoryDemandFulfilledQuantity
|
Transaction::Transaction().Propagate();
|
pispipssmartplan := scope.GetSmartPlanPISPIPsInOptimizerRun();
|
|
traverse( pispipssmartplan, Elements, pispip )
|
{
|
// If this pispip has a user specified total available supply
|
// Then set the total supply user equal to this total available supply
|
// To make sure that any future optimizer runs will provide the user available supply
|
if( pispip.HasTotalAvailableSupplyUser() )
|
{
|
pispip.UpdateTotalSupplyUser( true, pispip.TotalAvailableSupplyUser() );
|
}
|
else
|
{
|
qty := guard( pispip.InventoryLevelStartPISPIP().InventoryLevelEnd(), 0.0 ) + pispip.NewSupplyQuantity() + pispip.InventorySupplyQuantity();
|
pispip.UpdateTotalSupplyUser( true, qty );
|
}
|
|
|
//set the user flag for period tasks
|
//of the routing / laneleg units that are supplying to the pispip
|
//YY Question: Is it safe to assume
|
if( runcontext.IsSmartPlanForPeriodTask() and pispip.istype( ProductInStockingPointInPeriodPlanningLeaf ) )
|
{
|
traverse( pispip.astype( ProductInStockingPointInPeriodPlanningLeaf ),
|
NewSupply,
|
ns,
|
exists( scope.GetPeriodTaskOperationInOptimizerRun(), Elements.Operation, pto, ns.IsSuppliedByThisProcess( pto ), true )
|
or exists( scope.GetProductInTripInOptimizerRun(), Elements.Trip.LaneLeg, ll, ns.IsSuppliedByThisProcess( ll ), true ) )
|
{
|
if( ns.IsNewSupplyOfTrip() )
|
{
|
pit := ns.ProductInTrip();
|
pit.Update( pit.OptimizerQuantity(), true );
|
}
|
else if( ns.PeriodTask_MP().istype( PeriodTaskOperation ) )
|
{
|
pto := ns.PeriodTask_MP().astype( PeriodTaskOperation );
|
pto.Update( pto.OptimizerQuantity(), true, scope );
|
}
|
}
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|