public static void ValidateUserInput(ReportFiguresViewModel viewModel, HttpRequest request, int reportingYear)
        {
            ValidateBonusPayFigures(viewModel, request);
            ValidateHourlyPayFigures(viewModel, request);
            ValidatePayQuartileFigures(viewModel, request);

            if (viewModel.OptedOutOfReportingPayQuarters)
            {
                if (!ReportingYearsHelper.IsReportingYearWithFurloughScheme(reportingYear))
                {
                    const string errorMessage = "You cannot opt out of reporting your pay quarter figures for this reporting year";
                    viewModel.AddErrorFor(m => m.OptedOutOfReportingPayQuarters, errorMessage);
                }

                if (HasPayQuarterFigures(viewModel))
                {
                    const string errorMessage = "Do not enter the data for the percentage of men and women in each hourly pay quarter "
                                                + "if you have opted out of reporting your pay quarter figures";
                    viewModel.AddErrorFor(m => m.OptedOutOfReportingPayQuarters, errorMessage);
                }
            }
        }
        private static void ValidateBonusPayIntegrity(ReportFiguresViewModel viewModel)
        {
            const string errorMessageFemaleBonusGreaterThanZero = "Where the % of women receiving a bonus is > 0 AND men also received a bonus greater than 0, "
                                                                  + "then the mean or median bonus difference must be less than 100%";

            // ensure that bonus differences do not exceed 100% when females have a bonus
            if (viewModel.FemaleBonusPayPercent > 0)
            {
                if (viewModel.DiffMeanBonusPercent > 100)
                {
                    viewModel.AddErrorFor(m => m.DiffMeanBonusPercent, errorMessageFemaleBonusGreaterThanZero);
                }

                if (viewModel.DiffMedianBonusPercent > 100)
                {
                    viewModel.AddErrorFor(m => m.DiffMedianBonusPercent, errorMessageFemaleBonusGreaterThanZero);
                }
            }

            const string errorMessageMaleBonusIsZero = "Do not enter a bonus difference if 0% of men received a bonus";

            // prevents entering a difference when male bonus percent is 0
            if (viewModel.MaleBonusPayPercent == 0)
            {
                if (viewModel.DiffMeanBonusPercent.HasValue)
                {
                    viewModel.AddErrorFor(m => m.DiffMeanBonusPercent, errorMessageMaleBonusIsZero);
                }

                if (viewModel.DiffMedianBonusPercent.HasValue)
                {
                    viewModel.AddErrorFor(m => m.DiffMedianBonusPercent, errorMessageMaleBonusIsZero);
                }
            }

            const string errorMessageMaleBonusGreaterThanZero = "Enter a percentage lower than or equal to 100";

            if (viewModel.MaleBonusPayPercent > 0)
            {
                if (!viewModel.DiffMeanBonusPercent.HasValue)
                {
                    viewModel.AddErrorFor(m => m.DiffMeanBonusPercent, errorMessageMaleBonusGreaterThanZero);
                }

                if (!viewModel.DiffMedianBonusPercent.HasValue)
                {
                    viewModel.AddErrorFor(m => m.DiffMedianBonusPercent, errorMessageMaleBonusGreaterThanZero);
                }
            }
        }
        private static void ValidatePayQuartersAddUpToOneHundred(ReportFiguresViewModel viewModel)
        {
            // Validate percents add up to 100
            string errorMessage = "Figures for each quarter must add up to 100%";

            if (viewModel.FemaleUpperPayBand.HasValue &&
                viewModel.MaleUpperPayBand.HasValue &&
                viewModel.FemaleUpperPayBand.Value + viewModel.MaleUpperPayBand.Value != 100)
            {
                viewModel.AddErrorFor(m => m.FemaleUpperPayBand, errorMessage);
                viewModel.AddErrorFor(m => m.MaleUpperPayBand, errorMessage);
            }

            if (viewModel.FemaleUpperMiddlePayBand.HasValue &&
                viewModel.MaleUpperMiddlePayBand.HasValue &&
                viewModel.FemaleUpperMiddlePayBand.Value + viewModel.MaleUpperMiddlePayBand.Value != 100)
            {
                viewModel.AddErrorFor(m => m.FemaleUpperMiddlePayBand, errorMessage);
                viewModel.AddErrorFor(m => m.MaleUpperMiddlePayBand, errorMessage);
            }

            if (viewModel.FemaleLowerMiddlePayBand.HasValue &&
                viewModel.MaleLowerMiddlePayBand.HasValue &&
                viewModel.FemaleLowerMiddlePayBand.Value + viewModel.MaleLowerMiddlePayBand.Value != 100)
            {
                viewModel.AddErrorFor(m => m.FemaleLowerMiddlePayBand, errorMessage);
                viewModel.AddErrorFor(m => m.MaleLowerMiddlePayBand, errorMessage);
            }

            if (viewModel.FemaleLowerPayBand.HasValue &&
                viewModel.MaleLowerPayBand.HasValue &&
                viewModel.FemaleLowerPayBand.Value + viewModel.MaleLowerPayBand.Value != 100)
            {
                viewModel.AddErrorFor(m => m.FemaleLowerPayBand, errorMessage);
                viewModel.AddErrorFor(m => m.MaleLowerPayBand, errorMessage);
            }
        }