private decimal?CalculateAmountPerUnit(SchoolFinancialDataModel dataModel, string fieldName, UnitType unit,
                                               decimal total)
        {
            var rawAmount    = dataModel.GetDecimal(fieldName);
            var pupilCount   = dataModel.PupilCount;
            var teacherCount = dataModel.TeacherCount;

            if (rawAmount == null)
            {
                return(null);
            }

            switch (unit)
            {
            case UnitType.AbsoluteMoney:
                return(rawAmount);

            case UnitType.PerTeacher:
                return((teacherCount == 0) ? null : (rawAmount / (decimal)teacherCount));

            case UnitType.PerPupil:
                return((pupilCount == 0) ? null : (rawAmount / (decimal)pupilCount));

            case UnitType.PercentageOfTotal:
                return((total == 0) ? 0 : ((rawAmount / total) * 100));

            default:
                return(rawAmount);
            }
        }
        private decimal?CalculateWFAmount(SchoolFinancialDataModel schoolData, string fieldName, UnitType unit)
        {
            decimal?amount    = null;
            decimal?rawAmount = null;

            switch (unit)
            {
            case UnitType.AbsoluteCount:
                amount = schoolData.GetDecimal(fieldName);
                break;

            case UnitType.NoOfPupilsPerMeasure:
                rawAmount = schoolData.GetDecimal(fieldName);
                if (rawAmount == null || rawAmount == 0)
                {
                    break;
                }
                amount = (schoolData.PupilCount == 0) ? null : ((decimal)schoolData.PupilCount / rawAmount);
                if (amount.HasValue)
                {
                    amount = decimal.Round(amount.GetValueOrDefault(), 2, MidpointRounding.AwayFromZero);
                }
                break;

            case UnitType.HeadcountPerFTE:
                string fieldNameBase = fieldName.Contains("FullTimeEquivalent")
                        ? fieldName.Substring(0, fieldName.Length - 18)
                        : fieldName.Substring(0, fieldName.Length - 9);
                var total = schoolData.GetDecimal(fieldNameBase + "Headcount").GetValueOrDefault();
                rawAmount = schoolData.GetDecimal(fieldNameBase + "FullTimeEquivalent");
                if (rawAmount == null)
                {
                    break;
                }
                if (total == 0)
                {
                    amount = 0;
                }
                else
                {
                    amount = (total == 0) ? 0 : (total / rawAmount);
                    amount = decimal.Round(amount.GetValueOrDefault(), 2, MidpointRounding.AwayFromZero);
                }
                break;

            case UnitType.FTERatioToTotalFTE:
                total     = schoolData.GetDecimal("TotalSchoolWorkforceFullTimeEquivalent").GetValueOrDefault();
                rawAmount = schoolData.GetDecimal(fieldName);
                if (rawAmount == null)
                {
                    break;
                }
                if (total == 0)
                {
                    amount = 0;
                }
                else
                {
                    amount = (total == 0) ? 0 : (rawAmount / total) * 100;
                    amount = decimal.Round(amount.GetValueOrDefault(), 2, MidpointRounding.AwayFromZero);
                }
                break;
            }

            return(amount);
        }