Quintiq file version 2.0
|
#parent: #root
|
Function CalcKPIUpperBound
|
{
|
TextBody:
|
[*
|
value := Real::MaxReal();
|
if ( not this.KPIIsAccount() )
|
{
|
if ( this.KPIIsMaximize() )
|
{
|
if ( this.KPIName() = Translations::MP_GlobalParameters_KPIFulfillmentTargetName() )
|
{
|
value := sum( this, StrategyMacroPlan.MacroPlan.FulfillmentTarget, ft, ft.IsEnabled(), ft.TargetPercentage() * ft.TotalDemandQuantity() / 100 );
|
}
|
else if ( this.KPIName() = Translations::MP_GlobalParameters_KPIFulfillmentName() )
|
{
|
value := sum( this, StrategyMacroPlan.MacroPlan.SalesDemand, sd, true, sd.QuantityInDefaultUoM() );
|
}
|
else if ( this.KPIName() = Translations::MP_GlobalParameters_KPISalesDemandPriorityName() )
|
{
|
value := sum( this, StrategyMacroPlan.MacroPlan.SalesDemand, sd, sd.QuantityInDefaultUoM() * guard( sd.Priority().Weight(), 1.0 ) );
|
}
|
|
if ( this.KPIName() = Translations::MP_GlobalParameters_KPICampaignName() )
|
{
|
value := ifexpr( this.StrategyMacroPlan().UseCampaignSequenceOptimizer(), 0.0, Real::MaxReal() ) // non-sequencing campaign goal includes transition output, so we assume no a prior bound, seq optimizer computes penalties only
|
}
|
}
|
else
|
{
|
value := 0.0; // penalty KPI, know best score is 0
|
}
|
}
|
this.KPIUpperBound( value );
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|