Quintiq file version 2.0
|
#parent: #root
|
MethodOverride Operation (
|
LibOpt_Task task
|
) as stream[JSON]
|
{
|
TextBody:
|
[*
|
pispipssmartplan := task.Scope().GetSmartPlanPISPIPsInOptimizerRun();
|
lanelegs_foroptimization := task.Scope().GetLaneLegForOptimization();
|
runcontext := this.GetRunContext();
|
units := runcontext.GetSelectedUnits();
|
isusingselectedunits := runcontext.IsUsingSelectedUnits();
|
periods := task.Scope().GetPeriodInOptimizerRun();
|
process := runcontext.Process_MP();
|
|
this.UpdateSupplyUser( pispipssmartplan, runcontext ); // sets the manual specified quantity to be planned on the pispip (if there is only one)
|
|
cleanscope := LibOpt_Scope::Create( task.Run() );
|
cleanscope.AddLaneLegsForOptimizationToScope( lanelegs_foroptimization );
|
cleanscope.AddPeriodsToScope( periods );
|
cleanscope.AddOptimizerAccountsToScope( task.Scope().GetAccountsInOptimizerRun() );
|
|
cleanscope.AddSmartPlanPISPIPsToScope( pispipssmartplan );
|
|
this.SelectOptimizerInputForSmartPlan( pispipssmartplan,
|
lanelegs_foroptimization,
|
periods,
|
isusingselectedunits,
|
units,
|
false /* skip fill gaps */,
|
process,
|
cleanscope,
|
runcontext,
|
true /* reset visited */ );
|
|
cleanscope.CompleteForPTO_PIT(); // add in unitperiods, units, operations, trips based on pto and pit
|
cleanscope.CompleteFor_PISPIP(); // ensure scope contains period, pisp, spip and sales demand objects for pispip in scope
|
|
runcontext.SetPeriodTaskOperationUser( runcontext.HasOverwrittenManualPlanning(), cleanscope, false );
|
runcontext.SetProductInTripManualQuantity( runcontext.HasOverwrittenManualPlanning(), cleanscope, false );
|
|
// Reset the total available supply user for the non smart plan pispips
|
// or for all pispips if this is not a downstream smart plan
|
isupstream := this.GetIsUpstream();
|
traverse( cleanscope.GetPISPIPInOptimizerRun(), Elements, pispip,
|
pispip.HasTotalAvailableSupplyUser()
|
and ( isupstream
|
or not exists( pispipssmartplan, Elements, smartplanpispip, smartplanpispip = pispip ) ) )
|
{
|
pispip.UpdateTotalAvailableSupplyUser( false, 0.0 );
|
}
|
|
if ( runcontext.IsSmartPlan() ) // if this is an actual smart plan ( and we are not just using the transformer ) we delay extending pisp horizon for shelf life
|
{ // until we know the scope and extend only there for performance reasons
|
pisps := cleanscope.GetProductInStockingPointInOptimizerRun();
|
this.Optimization().astype( Optimization ).ShelfLifeExtendHistoricalPeriods( false, &pisps );
|
|
// we need to add pisp to all ancestor scopes, so that in case of shelf life planning, in the OptimizerPrePostProcessing.OnFinalize( ) the scope
|
// contains all the pisps and we can restore the historical pispips only there (for efficiency)
|
traverse( pisps, Elements, pisp )
|
{
|
LibOpt_ScopeElement::Transform( task, construct( LibOpt_ScopeElements ), pisp.PISPInOptimizerRun() );
|
}
|
}
|
|
taskcontext := task.TaskContext( relnew, TaskContextSmartPlan );
|
taskcontext.AddCleanUpFromScope( cleanscope ); // we save pit and period tasks scope so we can clean up unused ones in onfinalize
|
|
return this.Continue( task, cleanscope );
|
*]
|
}
|