private bool AreTrialsAvailable(DeviceReadingValueDto deviceReadingValueDto)
 {
     //DueDateValueCache is used for saving the previous value inserted by the user
     //if the user inserts twice the same wrong value, the values should be saved
     if (deviceReadingValueDto.DueDateValue == deviceReadingValueDto.DueDateValueCache)
     {
         deviceReadingValueDto.TrialsCunsumptionRule--;
     }
     else
     {
         deviceReadingValueDto.TrialsCunsumptionRule = 1;
         deviceReadingValueDto.DueDateValueCache     = deviceReadingValueDto.DueDateValue;
     }
     return(deviceReadingValueDto.TrialsCunsumptionRule > 0);
 }
        /// <summary>
        /// Executes the Check consumption
        /// </summary>
        /// <param name="deviceReadingValueDto">
        /// </param>
        /// <param name="args">
        /// Parameters of the validity check
        /// </param>
        /// <remarks>
        /// Required parameter count: 2 + 2
        /// args[0] :  Last year's status
        /// args[1] :  Last year's consumption
        /// args[2] :  Original Measure unit (optional, need in case of mask 9, 10, 11)
        /// args[3] :  New Measure unit (optional, need in case of mask 9, 10, 11)
        /// </remarks>
        public ValidationResult ValidateRule(DeviceReadingValueDto deviceReadingValueDto, params object[] args)
        {
            var    deviceMask      = deviceReadingValueDto.ReadingMask;
            double currentReading  = Convert.ToDouble(deviceReadingValueDto.DueDateValue);
            double lastReading     = Convert.ToDouble(args[0]);
            double lastConsumption = Convert.ToDouble(args[1]);
            double allowed;
            double?max       = null;
            double limitLow  = lastConsumption * 0.5;
            double limitHigh = lastConsumption * 2;
            bool   noNeedToCheckConsumptionLimit = false;

            switch (deviceMask)
            {
            //case "4":
            //    {
            //        allowed = CheckConstantsForValidation.CHKVJGRENZWERTM4;
            //        break;
            //    }
            //case "5":
            //    {
            //        allowed = CheckConstantsForValidation.CHKVJGRENZWERTM5;
            //        break;
            //    }
            case AppConstants.HCA_WITHOUT_KEYDATE:
            {
                allowed = CheckConstantsForValidation.GRENZWERTM6;
                break;
            }

            case AppConstants.HCA_WITH_KEYDATE:
            {
                allowed = CheckConstantsForValidation.GRENZWERTM7;
                break;
            }

            case AppConstants.WATER_METER:
            case AppConstants.WATER_METER_WITH_DATAMODULE:
            {
                allowed = CheckConstantsForValidation.GRENZWERTM8KALT;
                max     = CheckConstantsForValidation.XGRENZWERTM8;
                noNeedToCheckConsumptionLimit = true;
                break;
            }

            //case "9":
            //    {
            //        if (args.Length < 4)
            //        {
            //            throw new InvalidOperationException("Argument count < 4");
            //        }
            //        currentReading = ValidationHelper.ConvertValue(args[2], args[3], currentReading);
            //        allowed = CheckConstantsForValidation.CHKVJGRENZWERTM9;
            //        max = CheckConstantsForValidation.CHKFIXGRENZWERTM9;
            //        break;
            //    }

            case AppConstants.HEAT_METER:
            {
                if (args.Length < 4)
                {
                    throw new InvalidOperationException("Argument count < 4");
                }
                currentReading = ValidationHelper.ConvertValue(args[2], args[3], currentReading);
                allowed        = CheckConstantsForValidation.GRENZWERTM10;
                max            = CheckConstantsForValidation.XGRENZWERTM10;
                noNeedToCheckConsumptionLimit = true;
                break;
            }

            default:
            {
                throw new NotImplementedException();
            }
            }

            double consumption = Math.Abs(currentReading - lastReading);
            double delta       = Math.Abs(lastConsumption - consumption);

            if ((lastConsumption > 0 && delta >= allowed && (!noNeedToCheckConsumptionLimit && !(limitLow <= consumption && consumption <= limitHigh))) || (max.HasValue && consumption > max))
            {
                if (AreTrialsAvailable(deviceReadingValueDto))
                {
                    return(new ValidationResult
                    {
                        Errors = new List <string> {
                            "MS3_ManualReadingValues_ValueDifferesTooMuch"
                        },
                        IsError = true
                    });
                }
            }
            return(new ValidationResult {
                Errors = null, IsError = false
            });
        }