Quintiq file version 2.0
|
#parent: #root
|
MethodOverride GetPeriodTasksToSearch (
|
ProductInStockingPointInPeriodPlanningLeaf pispip,
|
LibOpt_Scope scope,
|
RunContextForCapacityPlanning runcontext,
|
Units units,
|
Boolean isusingselectedunits,
|
Number depth
|
) as owning PeriodTaskOperations
|
{
|
TextBody:
|
[*
|
ptforrecursive := construct( PeriodTaskOperations );
|
|
if ( runcontext.IsSmartPlan() )
|
{
|
period := pispip.Period_MP();
|
// Traverse over the operations that produce this product as an output
|
// If this product is a byproduct, we do not want to add its operations, unless they only produce byproduct.
|
// This is to avoid adding products to the smart plan that are only related to the smart plan input pispips because they are produced together with the same byproduct
|
operations := selectset( pispip,
|
ProductInStockingPoint_MP.OperationOutput.Operation,
|
operation,
|
operation.GetIsAvailableForOptimization() // The operation must be available
|
and PeriodTaskOperation::GetIsValidPeriodTask( operation, period ) // The resulting period task must be valid
|
and ( not pispip.ProductInStockingPoint_MP().Product_MP().IsDerivedByProduct() // This product is not a byproduct
|
or operation.AllOutputAreDerivedByProducts() ) // or all outputs are byproducts
|
and ( not runcontext.IsOnlyPlanOneStepUpstream() //When only planning 1 step upstream the operation should be part of a routing that produce the product of the selected PISPIPs
|
or exists( scope.GetRoutingOfSmartPlanPISPIPs(), Elements, routing, routing = operation.RoutingStep().Routing() ) )
|
and ( not isusingselectedunits or exists( units, Elements, unit, unit = operation.Unit() ) )
|
/*and ( not exists ( operation, OperationOutput.ProductInStockingPoint_MP.ProductInStockingPointInPeriodPlanning, p, p.Period_MP() = period, not p.GetIsInOptimizerRun() ) ) */ //exclude if output is from a pispip not in scope)
|
);
|
|
|
traverse( operations, Elements, operation )
|
{
|
// Create/Select the related periodtaskoperation and add it to PTOperationsForOptimization
|
periodtaskoperation := PeriodTaskOperation::FindPeriodTaskOperationTypeIndex( period.Start() , operation.ID() );
|
|
if( isnull( periodtaskoperation ) )
|
{
|
unit := operation.Unit();
|
// Add the related unit periods to unitperiodsforoptimization
|
unitperiod := UnitPeriod::FindUnitPeriodTypeIndex( unit.ID(), period.Start(), period.End() );
|
periodtaskoperation := PeriodTaskOperation::Create( operation, unitperiod, 0.0, false );
|
// this transaction propagate is necessary, we need to get the dependent demand from the newly created periodtask.
|
Transaction::Transaction().Propagate( relation( PeriodTaskOperation, DependentDemand ) );
|
Transaction::Transaction().Propagate( relation( PeriodTaskOperation, NewSupply ) );
|
Transaction::Transaction().Propagate( relation( NewSupply, ProcessOutput ) );
|
Transaction::Transaction().Propagate( relation( DependentDemand, ProcessInput ) );
|
Transaction::Transaction().Propagate( attribute( PeriodTask_MP, IsFrozenForOptimizerUpstream ) );
|
}
|
|
if ( not periodtaskoperation.IsFrozenForOptimizerUpstream() )
|
{
|
ptforrecursive.Add( periodtaskoperation );
|
}
|
} // traverse operations
|
} // end smart plan case
|
else
|
{
|
// case for meta optimizer
|
ptforrecursive := selectset( pispip, NewSupplyOperationForMeta.PeriodTaskOperation, pto, true, true );
|
}
|
return &ptforrecursive
|
*]
|
}
|