| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GetIsBalanceSlackAllowed ( | 
|   const ProductInStockingPointInPeriod pispip, | 
|   const constcontent ProductInStockingPointInPeriods smartplanpispips, | 
|   constcontent ProductInStockingPoint_MPs intermediatepisps, | 
|   const RunContextForCapacityPlanning runcontext | 
| ) const as Boolean | 
| { | 
|   Description: | 
|   [* | 
|     Determines whether we allow slack on the balance constraint. | 
|     For smart plans that should only plan one step upstream we remove some of the balance slacks to make sure that we actually plan the step | 
|     and that the balance violations occur at the input side rather than at the end or at an intermediate stage. | 
|   *] | 
|   TextBody: | 
|   [* | 
|     // Martijn Dec-7-2016 (created) | 
|     // If this is not a smart plan run or if we are not only planning one step upstream, then we always allow balance slack. | 
|     // Or if it is a single step smart plan and the pispip is not the end product and it is either not an intermediate product or it is a by product, then we allow the slack | 
|     isallowed := not runcontext.IsSmartPlan() | 
|                  or not runcontext.IsOnlyPlanOneStepUpstream() | 
|                  or ( not exists( smartplanpispips, Elements.ProductInStockingPoint_MP, pisp, pisp = pispip.ProductInStockingPoint_MP() ) | 
|                       and ( pispip.ProductInStockingPoint_MP().Product_MP().IsDerivedByProduct() | 
|                             or not exists( intermediatepisps, Elements, pisp, pisp = pispip.ProductInStockingPoint_MP() ) ) ) | 
|      | 
|     return isallowed; | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |