| Quintiq file version 2.0 | 
| #parent: #root | 
| StaticMethod ValidateInput ( | 
|   output String feedback_o, | 
|   output String sanitycheckfeedback_o, | 
|   MacroPlan macroplan, | 
|   ShiftPattern shiftpattern, | 
|   String disaggregationratio, | 
|   Number numberofdecimal, | 
|   Real balancetolerance, | 
|   Real lotsizetolerance, | 
|   Real bottlenecktolerance, | 
|   Duration bottleneckwindowstart, | 
|   Duration bottleneckwindowend, | 
|   Date startofkpihorizon, | 
|   Date endofkpihorizon, | 
|   String defaultsmartplanstrategyname, | 
|   Real capacitybelowthreshold, | 
|   Real capacityabovethreshold, | 
|   Number sanitychecklimit, | 
|   Real absoluteupperlimit, | 
|   Real absolutelowerlimit, | 
|   Real defaultallocation, | 
|   Real defaultefficiency, | 
|   Real defaultmincapacityforunit, | 
|   Real defaultmaxcapacityforunit, | 
|   Real defaultmaxloadpercentage, | 
|   Real defaultmaxcapacityforstockingpoint, | 
|   Real defaultoperationinputoutputquantity, | 
|   Boolean hasdefaultinventoryholding, | 
|   String defaultaccountforinventoryvalue, | 
|   Boolean hasabsolutecostforinventoryholding, | 
|   Real defaultabsolutecostforinventoryholding, | 
|   Real defaultannualinterestrateforinventoryholding, | 
|   String periodspecificationforunitactual, | 
|   Number defaultnumberofperiodsavgdemand, | 
|   Real optimizernoisethreshold, | 
|   Number numberofperiodssmartplan, | 
|   Boolean isslidinghorizon, | 
|   Number numberofperiodsinwindow, | 
|   Number numberofperiodsperslide, | 
|   Real defaultservicelevel, | 
|   Real stockingpointbottleneckthreshold | 
| ) declarative remote as Boolean | 
| { | 
|   Description: 'Called by designer' | 
|   TextBody: | 
|   [* | 
|     /***** | 
|      PLEASE ENSURE THAT DATA ISSUE IS CHECKED BEFORE DATA WARNING | 
|     **/ | 
|     feedback_o := ''; | 
|     sanitycheckfeedback_o := ''; | 
|      | 
|     // ShiftPattern | 
|     if( isnull( shiftpattern ) ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNullDefaultShiftPattern(); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); | 
|     } | 
|     // Absolute upper and lower limit | 
|     else if( absoluteupperlimit <= absolutelowerlimit ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsAbsoluteUpperLimitLowerThanAbsoluteLowerLimit( absoluteupperlimit, absolutelowerlimit ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); | 
|     } | 
|     //default number of periods average demand | 
|     else if( defaultnumberofperiodsavgdemand <= 0 ) | 
|     { | 
|       feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_InvalidNumberOfPeriodsForAvgSD( defaultnumberofperiodsavgdemand ); | 
|       sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); | 
|     } | 
|     // Number of decimal | 
|     else if( numberofdecimal < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeNumberOfDecimals( numberofdecimal ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Lot size tolerance | 
|     else if( lotsizetolerance < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeLotSizeTolerance( lotsizetolerance ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // KPI horizon start and end | 
|     else if( startofkpihorizon > endofkpihorizon ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsStartAfterEndOfKPIHorizon( endofkpihorizon, startofkpihorizon ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default smart plan strategy | 
|     else if( defaultsmartplanstrategyname = '' ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsDefaultSmartPlanStrategyNameEmpty(); | 
|     sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Sanity check limit | 
|     else if( sanitychecklimit < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeSanityCheckLimit( sanitychecklimit ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default allocation | 
|     else if( defaultallocation < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeDefaultAllocation( defaultallocation ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default Efficiency | 
|     else if( defaultefficiency < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeDefaultEfficiency( defaultefficiency ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default capacity for unit | 
|     else if( defaultmincapacityforunit < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeDefaultMinCapacityForUnit( defaultmincapacityforunit ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default max capacity for unit | 
|     else if( defaultmaxcapacityforunit < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeDefaultMaxCapacityForUnit( defaultmaxcapacityforunit ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default min and max capacity | 
|     else if( defaultmincapacityforunit > defaultmaxcapacityforunit ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsUnitDefaultMinCapacityGreaterThanDefaultMaxCapacity( defaultmaxcapacityforunit, defaultmincapacityforunit ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default max load percentage | 
|     else if( defaultmaxloadpercentage < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeDefaultMaxLoadPercentage( defaultmaxloadpercentage ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default max capacity for stocking point | 
|     else if( defaultmaxcapacityforstockingpoint < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeDefaultMaxCapacityForStockingPoint( defaultmaxcapacityforstockingpoint ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Default operation in/out quantity | 
|     else if( defaultoperationinputoutputquantity < 0 ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeDefaultOperationInputOutputQuantity( defaultoperationinputoutputquantity ); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Check valid period specification for actuals | 
|     else if( not GlobalParameters_MP::GetHasValidPeriodSpecificationUnitActual( macroplan, periodspecificationforunitactual ) ) | 
|     { | 
|        feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsInvalidPeriodSpecificationForUnitActual(); | 
|        sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     // Check for disaggregation factor | 
|     else if( not GlobalParameters_MP::GetIsValidDisaggregationFactor( disaggregationratio ) ) | 
|     { | 
|      feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_InvalidDisaggregationRatio(); | 
|      sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     else if( optimizernoisethreshold < 0 ) | 
|     { | 
|       feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_IsNegativeOptimizerNoiseThreshold( optimizernoisethreshold ); | 
|       sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning(); | 
|     } | 
|     else if( numberofperiodssmartplan <= 0 ) | 
|     { | 
|       feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_InsufficientPeriods( numberofperiodssmartplan ); | 
|       sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); | 
|     } | 
|     else if( isslidinghorizon and numberofperiodsinwindow <= 0 ) | 
|     { | 
|       feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_InsufficientPeriodsInWindow( numberofperiodsinwindow ); | 
|     } | 
|     else if( isslidinghorizon and numberofperiodsperslide <= 0 ) | 
|     { | 
|       feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_InsufficientPeriodsPerSlide( numberofperiodsperslide ); | 
|     } | 
|     else if( isslidinghorizon and numberofperiodsinwindow < numberofperiodsperslide ) | 
|     { | 
|       feedback_o := Translations::MP_GlobalParameters_MP_ValidateInput_TooManyPeriodsInSlide( numberofperiodsinwindow, numberofperiodsperslide ); | 
|     } | 
|     // check for | 
|     else if( hasdefaultinventoryholding ) | 
|     { | 
|       isValidDefaultInventoryHolding := GlobalParameters_MP::ValidateDefaultInventoryHoldingCosts( feedback_o, sanitycheckfeedback_o, macroplan, | 
|                                                                                                    defaultaccountforinventoryvalue, | 
|                                                                                                    hasabsolutecostforinventoryholding, | 
|                                                                                                    defaultabsolutecostforinventoryholding, | 
|                                                                                                    defaultannualinterestrateforinventoryholding ); | 
|       if( isValidDefaultInventoryHolding ) | 
|       { | 
|         if( defaultservicelevel <= 50 or defaultservicelevel >= 100 ) | 
|         { | 
|         feedback_o := Translations::MP_GlobalParameters_MP_IsValidDefaultServiceLevel( defaultservicelevel ); | 
|         sanitycheckfeedback_o := SanityCheckCategoryLevel::GetSanityCheckCategoryDataIssue(); | 
|         } | 
|         else if( feedback_o.Length() = 0 ) | 
|         { | 
|           GlobalParameters_MP::ValidateBottlenecktInput( feedback_o, sanitycheckfeedback_o, macroplan, bottlenecktolerance,bottleneckwindowstart, bottleneckwindowend, capacitybelowthreshold,capacityabovethreshold, stockingpointbottleneckthreshold, false );  | 
|         } | 
|       } | 
|     } | 
|      | 
|     // Add instance text | 
|     if( feedback_o <> '' ) | 
|     { | 
|      feedback_o := SanityCheckMessage::GetFormattedMessage( Translations::MP_GlobalParameters_Instance(), feedback_o ); | 
|     } | 
|      | 
|     return feedback_o = ''; | 
|   *] | 
| } |