public Task <CasePlanResult> Get(string id, CancellationToken token)
        {
            var result = _definitions.FirstOrDefault(d => d.AggregateId == id);

            if (result == null)
            {
                return(Task.FromResult((CasePlanResult)null));
            }

            return(Task.FromResult(CasePlanResult.ToDto(result)));
        }
        public async Task <CasePlanResult> Get(string id, CancellationToken token)
        {
            var result = await _dbContext.CasePlans
                         .FirstOrDefaultAsync(_ => _.AggregateId == id, token);

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

            return(CasePlanResult.ToDto(result));
        }
        public async Task <SearchResult <CasePlanResult> > Find(FindCasePlansParameter parameter, CancellationToken token)
        {
            IQueryable <CasePlanAggregate> result = _dbContext.CasePlans;

            if (MAPPING_WORKFLOWDEFINITION_TO_PROPERTYNAME.ContainsKey(parameter.OrderBy))
            {
                result = result.InvokeOrderBy(MAPPING_WORKFLOWDEFINITION_TO_PROPERTYNAME[parameter.OrderBy], parameter.Order);
            }

            if (!string.IsNullOrWhiteSpace(parameter.CaseFileId))
            {
                result = result.Where(r => r.CaseFileId == parameter.CaseFileId);
            }

            if (!string.IsNullOrWhiteSpace(parameter.Text))
            {
                result = result.Where(r => r.Name.IndexOf(parameter.Text, StringComparison.InvariantCultureIgnoreCase) >= 0);
            }

            if (!string.IsNullOrWhiteSpace(parameter.CasePlanId))
            {
                result = result.Where(r => r.CasePlanId == parameter.CasePlanId);
            }

            int totalLength = result.Count();

            result = result.Skip(parameter.StartIndex).Take(parameter.Count);
            var content = await result.ToListAsync(token);

            if (parameter.TakeLatest)
            {
                content = content.OrderByDescending(r => r.Version).GroupBy(r => r.CasePlanId).Select(r => r.First()).ToList();
            }

            return(new SearchResult <CasePlanResult>
            {
                StartIndex = parameter.StartIndex,
                Count = parameter.Count,
                TotalLength = totalLength,
                Content = content.Select(_ => CasePlanResult.ToDto(_)).ToList()
            });
        }
        public List <CasePlanResult> CalculateOptionsNew(List <FamilyMemberList> lstFamilyMembers, List <FamilyMemberUsesList> lstFamilyMemberUses, string JobNumber, decimal Income, bool SubsidyStatus, int UsageCode, bool Welness, decimal HSAPercentage, decimal TaxRate, decimal MaxEEHSA, bool IsAmericanIndian, bool ResultStatus, decimal IndividualSubsidy, decimal ShopSubsidy, long RatingAreaId, string ProgID, decimal HSALimit, string StateCode, int ACAPlanIdSub, int PlanTypeID, long IssuerId, int TierIntention, int CurrentPlan)
        {
            List <PlanAttributeMst> lstPlanAttributeMst = new List <PlanAttributeMst>();
            //PlanAttributeMst objPlanAttribute;
            List <CasePlanResult> result = new List <CasePlanResult>();

            var PlanAttributeMasterFromCache = MHMCache.GetMyCachedItem("PlanAttributeMaster");

            if (PlanAttributeMasterFromCache != null)
            {
                lstPlanAttributeMst = ((List <PlanAttributeMst>)PlanAttributeMasterFromCache).ToList();
            }
            else
            {
                var PlanAttributeMasterList = planAttributeMaster.GetPlanAttributeMaster().Where(r => r.OpenForEnrollment == true && r.ApprovalStatus == (int)MHMBLL.EnumStatusModel.CaseApprovalStatus.InProduction).ToList();
                MHMCache.AddToMyCache("PlanAttributeMaster", PlanAttributeMasterList, MyCachePriority.Default);
                lstPlanAttributeMst = (List <PlanAttributeMst>)PlanAttributeMasterList.ToList();
            }

            //Adding Default Plans
            int DefaultPlanIdSub  = ACAPlanIdSub;
            var DefaultPlansClass = rule.GetRules().Where(r => r.RuleName == "DefaultPlans" && r.RuleStatus == true).Select(t => t.ClassName).SingleOrDefault();

            if (DefaultPlansClass != null)
            {
                IRule IRule = (IRule)Activator.CreateInstance(Type.GetType("MHMBLL." + DefaultPlansClass));

                Dictionary <string, object> InObject  = new Dictionary <string, object>();
                Dictionary <string, object> OutObject = new Dictionary <string, object>();

                IRule.ExecuteRule(InObject, out OutObject);
                DefaultPlanIdSub = (int)OutObject["DefaultPlanIdSub"];
            }

            //Fetch ACAPlanSubid and defauly plan to ne included by default. Example 01 and 05
            var Default_ACAtPlanList = lstPlanAttributeMst.Where(r => r.PlanId.Contains("-0" + ACAPlanIdSub) || r.PlanId.Contains("-0" + DefaultPlanIdSub)).ToList();


            //Vaibhav EmployerId
            //var GroupPlanList = lstPlanAttributeMst.Where(r => r.MrktCover == Constants.GroupPlanType && r.StateCode == StateCode && r.EmployerId == EmployerId && r.InsuranceType == InsuranceTypeId && r.BusinessYear == BusinessYear).ToList();

            var OrgionallstFamilyMembers = lstFamilyMembers;

            //Fetching Job related plans
            var jobDetail = jobMaster.GetJobMaster().Where(r => r.JobNumber == JobNumber).ToList();

            var lstJobPlansId = jobDetail.Select(r => r.JobPlansMsts.Select(t => new { t.BusinessYear, t.PlanId }).ToList()).FirstOrDefault();
            var lstPlans      = lstPlanAttributeMst.Where(r => lstJobPlansId.Select(t => t.BusinessYear).Contains(r.BusinessYear) && lstJobPlansId.Select(t => t.PlanId).Contains(r.PlanId)).ToList();

            //List<PlanAttributeMst> lstPlans = jobDetail.Select(r => r.JobPlansMsts.Select(t => t.PlanAttributeMst).ToList()).FirstOrDefault();
            //var lstPlans = jobPlans.FirstOrDefault().Where(r => r.StateCode == StateCode && r.BusinessYear == BusinessYear).ToList();

            if (IssuerId > 0)
            {
                lstPlans.RemoveAll(r => r.CarrierId != IssuerId);
            }
            if (PlanTypeID > 0)
            {
                lstPlans.RemoveAll(r => r.PlanType != PlanTypeID);
            }

            //Remove catastrophic plans
            if (!(OrgionallstFamilyMembers.Count() == 1 && OrgionallstFamilyMembers.First().Age < 31) || OrgionallstFamilyMembers.Count() > 1)
            {
                lstPlans.RemoveAll(r => r.MetalLevel == "Catastrophic" && r.MrktCover == "Indi");
            }

            if (lstPlans.Count() == 0)
            {
                throw new Exception("No plan found matching the selected criteria.");
            }

            //Inject 01 and 05 plans to job plans
            lstPlans.AddRange(Default_ACAtPlanList.Where(r => lstPlans.Select(t => t.StandardComponentId).Contains(r.StandardComponentId)).ToList());

            //Getting all the master tables from Cache whhose are going to use inside the foreach loop for familysheet calculation.
            #region CacheDataFecthingforFamilySheetCalculation

            IEnumerable <PlanBenefitMst> objPlanBenefitMaster;
            var PlanBenefitMasterFromCache = MHMCache.GetMyCachedItem("PlanBenefitMaster");
            if (PlanBenefitMasterFromCache != null)
            {
                objPlanBenefitMaster = (IEnumerable <PlanBenefitMst>)PlanBenefitMasterFromCache;
            }
            else
            {
                var PlanBenefitMasterList = planBenefitMaster.GetPlanBenefitMaster();
                MHMCache.AddToMyCache("PlanBenefitMaster", PlanBenefitMasterList, MyCachePriority.Default);
                objPlanBenefitMaster = PlanBenefitMasterList;
            }

            //string IsserCode = planId.Substring(0, 5);

            IEnumerable <MHMBenefitMappingMst> objMHMBenefitMappingMaster;
            var MHMBenefitMappingMasterFromCache = MHMCache.GetMyCachedItem("MHMBenefitMappingMaster");
            if (MHMBenefitMappingMasterFromCache != null)
            {
                objMHMBenefitMappingMaster = (IEnumerable <MHMBenefitMappingMst>)MHMBenefitMappingMasterFromCache;
            }
            else
            {
                var MHMBenefitMappingMasterList = mhmPlanBenefitMappingMaster.GetMHMBenefitMappingMaster();
                MHMCache.AddToMyCache("MHMBenefitMappingMaster", MHMBenefitMappingMasterList, MyCachePriority.Default);
                objMHMBenefitMappingMaster = MHMBenefitMappingMasterList;
            }

            IEnumerable <MHMBenefitCostByAreaMst> objMHMBenefitCostByAreaMaster;
            var MHMBenefitCostByAreaMasterFromCache = MHMCache.GetMyCachedItem("MHMBenefitCostByAreaMaster");
            if (MHMBenefitCostByAreaMasterFromCache != null)
            {
                objMHMBenefitCostByAreaMaster = (IEnumerable <MHMBenefitCostByAreaMst>)MHMBenefitCostByAreaMasterFromCache;
            }
            else
            {
                var MHMBenefitCostByAreaMasterList = mhmBenefitCostByArea.GetMHMBenefitCostByAreaMaster();
                MHMCache.AddToMyCache("MHMBenefitCostByAreaMaster", MHMBenefitCostByAreaMasterList, MyCachePriority.Default);
                objMHMBenefitCostByAreaMaster = MHMBenefitCostByAreaMasterList;
            }

            //For Plan Mapping
            IEnumerable <IssuerMst> objIssuerMaster;
            var IssuerMasterFromCache = MHMCache.GetMyCachedItem("IssuerMaster");
            if (IssuerMasterFromCache != null)
            {
                objIssuerMaster = (IEnumerable <IssuerMst>)IssuerMasterFromCache;
            }
            else
            {
                var IssuerMasterList = issuerMaster.GetIssuerMaster();
                MHMCache.AddToMyCache("IssuerMaster", IssuerMasterList, MyCachePriority.Default);
                objIssuerMaster = IssuerMasterList;
            }

            IEnumerable <CSR_Rate_Mst> CSRRateList;

            var CSRRateListFromCache = MHMCache.GetMyCachedItem("CSR_Rate_Mst");
            if (CSRRateListFromCache != null)
            {
                CSRRateList = (IEnumerable <CSR_Rate_Mst>)CSRRateListFromCache;
            }
            else
            {
                CSRRateList = csrRateMaster.GetCSRRateMaster();
                MHMCache.AddToMyCache("CSR_Rate_Mst", CSRRateList, MyCachePriority.Default);
            }

            #endregion

            //var _CSRRateList = CSRRateList.Where(r => r.BusinessYear == BusinessYear && r.RatingAreaId == RatingAreaId).ToList();

            //if (!lstPlans.Any(p => p.Id == CurrentPlan))
            //{
            //    lstPlans.Add(lstPlanAttributeMst.Where(item => item.Id == CurrentPlan).FirstOrDefault());
            //}

            foreach (PlanAttributeMst objPlanAttribute in lstPlans)
            {
                Decimal BaseSum;
                if (objPlanAttribute.MrktCover == "Indi" || objPlanAttribute.MrktCover == "Shop")
                {
                    var     _CSRRateList = CSRRateList.Where(r => r.PlanID == objPlanAttribute.StandardComponentId && r.BusinessYear == objPlanAttribute.BusinessYear && r.RatingAreaId == RatingAreaId).ToList();
                    decimal CompanyHSA = 0, TrueOOPCost = 0, HSAContribution = 0;
                    BaseSum = new BaseRateCal().BaseRate(lstFamilyMembers, _CSRRateList, (int)EnumStatusModel.CalculationType.Premium);

                    if (BaseSum != 0)
                    {
                        decimal?Coinsurance = objPlanAttribute.TEHBDedInnTier1Coinsurance;

                        var memberCount = OrgionallstFamilyMembers.Count();

                        FamilySheetCalculation objSheet = new FamilySheetCalculation();

                        IEnumerable <PlanBenefitMst> objPlanBenefits;
                        objPlanBenefits = objPlanBenefitMaster.Where(r => r.PlanId == objPlanAttribute.PlanId && r.BusinessYear == objPlanAttribute.BusinessYear).ToList();

                        FamilySheetResult objFamilyResult = objSheet.CalculateFamilySheetNew(objPlanAttribute, UsageCode, memberCount, lstFamilyMemberUses, objPlanBenefits, objMHMBenefitCostByAreaMaster, objPlanAttribute.NonEmbeddedOOPLimits, TierIntention, jobDetail.FirstOrDefault());

                        TrueOOPCost = objFamilyResult.TotalOOPCost;

                        //check for plan is HSA Eligible or not
                        //HSAContribution = MaxEEHSA;
                        HSAContribution = objPlanAttribute.IsHSAEligible ? MaxEEHSA : 0;
                        var     HSAEETaxSavings    = objPlanAttribute.IsHSAEligible ? (TaxRate * (MaxEEHSA)) / 100 : 0;
                        var     GrossAnnualPremium = BaseSum * 12;
                        decimal FederalSubsidy     = objPlanAttribute.MrktCover == "Indi" ? IndividualSubsidy * 12 : ShopSubsidy * 12;


                        decimal PersonalHSACon = 0;

                        //Remove Subsidy from Catastrophic Plans
                        #region Changes for remove subsidy from Catastrophic plans as changes of 06-04-2016
                        var CatastrophicSubsidyClass = rule.GetRules().Where(r => r.RuleName == "CatastrophicSubsidy" && r.RuleStatus == true).Select(t => t.ClassName).SingleOrDefault();
                        if (CatastrophicSubsidyClass != null)
                        {
                            IRule IRule = (IRule)Activator.CreateInstance(Type.GetType("MHMBLL." + CatastrophicSubsidyClass));

                            Dictionary <string, object> InObject  = new Dictionary <string, object>();
                            Dictionary <string, object> OutObject = new Dictionary <string, object>();
                            InObject.Add("MetalLevel", objPlanAttribute.MetalLevel);
                            InObject.Add("SubsidyAmount", FederalSubsidy);
                            IRule.ExecuteRule(InObject, out OutObject);
                            FederalSubsidy = (decimal)OutObject["SubsidyAmount"];
                        }
                        #endregion

                        var NetPremium = GrossAnnualPremium - FederalSubsidy;
                        if (NetPremium < 0)
                        {
                            NetPremium = 0;
                        }

                        CasePlanResult PlanResult = new CasePlanResult()
                        {
                            PlanId = objPlanAttribute.Id,
                            PersonalHSAContribution = PersonalHSACon,
                            ReferralForSpecialist   = objPlanAttribute.ReferralForSpecialist,

                            GovtPlanNumber                = objPlanAttribute.PlanNumber,
                            PlanIdIndiv1                  = objPlanAttribute.PlanId,
                            Year                          = objPlanAttribute.BusinessYear,
                            GrossAnnualPremium            = Convert.ToInt64(GrossAnnualPremium),
                            FederalSubsidy                = Convert.ToInt64(FederalSubsidy),
                            NetAnnualPremium              = Convert.ToInt64(NetPremium),
                            ExcludedAmount                = objFamilyResult.ExcludedAmount,
                            Copays                        = objFamilyResult.Copays,
                            PaymentsToDeductibleLimit     = objFamilyResult.PaymentsuptoDeductible,
                            CoinsuranceToOutOfPocketLimit = objFamilyResult.Coinsurance,
                            TaxSavingFromHSAAccount       = (HSAEETaxSavings * -1),
                            Medical                       = Convert.ToInt64(TrueOOPCost - HSAEETaxSavings),
                            TotalPaid                     = Convert.ToInt64(NetPremium + (TrueOOPCost - HSAEETaxSavings)),
                            PaymentsByInsuranceCo         = objFamilyResult.PaymentsByInsurance,
                            MonthlyPremium                = Convert.ToInt64(NetPremium / 12),
                            //Check with Tobey :- We are just sending Tier1 range of deductible and MOOP of Medical
                            //DeductibleSingle = objPlanAttribute.MedicalDrugDeductiblesIntegrated == true ? objPlanAttribute.TEHBDedInnTier1Individual : objPlanAttribute.DEHBDedInnTier1Individual,
                            //DeductibleFamilyPerPerson = objPlanAttribute.MedicalDrugDeductiblesIntegrated == true ? objPlanAttribute.TEHBDedInnTier1FamilyPerPerson : objPlanAttribute.DEHBDedInnTier1FamilyPerPerson,
                            //DeductibleFamilyPerGroup = objPlanAttribute.MedicalDrugDeductiblesIntegrated == true ? objPlanAttribute.TEHBDedInnTier1FamilyPerGroup : objPlanAttribute.DEHBDedInnTier1FamilyPerGroup,
                            //OPLSingle = objPlanAttribute.MedicalDrugMaximumOutofPocketIntegrated == true ? objPlanAttribute.TEHBInnTier1IndividualMOOP : objPlanAttribute.DEHBInnTier1IndividualMOOP,
                            //OPLFamilyPerPerson = objPlanAttribute.MedicalDrugMaximumOutofPocketIntegrated == true ? objPlanAttribute.TEHBInnTier1FamilyPerPersonMOOP : objPlanAttribute.DEHBInnTier1FamilyPerPersonMOOP,
                            //OPLFamilyPerGroup = objPlanAttribute.MedicalDrugMaximumOutofPocketIntegrated == true ? objPlanAttribute.TEHBInnTier1FamilyPerGroupMOOP : objPlanAttribute.DEHBInnTier1FamilyPerGroupMOOP,
                            DeductibleSingle          = objFamilyResult.Limits["DeductibleSingle"],
                            DeductibleFamilyPerPerson = objFamilyResult.Limits["DeductibleFamilyPerPerson"],
                            DeductibleFamilyPerGroup  = objFamilyResult.Limits["DeductibleFamilyPerGroup"],
                            OPLSingle          = objFamilyResult.Limits["OPLSingle"],
                            OPLFamilyPerPerson = objFamilyResult.Limits["OPLFamilyPerPerson"],
                            OPLFamilyPerGroup  = objFamilyResult.Limits["OPLFamilyPerGroup"],
                            Coinsurance        = Convert.ToInt64(Coinsurance),
                            WorstCase          = memberCount > 1 ?
                                                 Convert.ToInt64(NetPremium - HSAEETaxSavings + objFamilyResult.Limits["OPLFamilyPerGroup"])
                            : Convert.ToInt64(NetPremium - HSAEETaxSavings + objFamilyResult.Limits["OPLSingle"]),
                            MedicalNetwork = objPlanAttribute.NetworkURL,
                            PlanName       = !String.IsNullOrEmpty(objPlanAttribute.MetalLevel) ? objPlanAttribute.PlanMarketingName + " / " + objPlanAttribute.MetalLevel : objPlanAttribute.PlanMarketingName,
                        };
                        result.Add(PlanResult);
                        objFamilyResult = null;
                        PlanResult      = null;
                    }
                }
                else
                {
                    var     _CSRRateList = CSRRateList.Where(r => r.PlanID == objPlanAttribute.PlanId && r.BusinessYear == objPlanAttribute.BusinessYear && r.RatingAreaId == UsageCode && r.Age == ProgID).ToList();
                    decimal Subsidy = 0, CompanyHSA = 0, TrueOOPCost = 0, EmployeeHSAContribution = 0, HSAContribution = 0, TotalERHSA = 0;
                    BaseSum = new BaseRateCal().GroupPlanBaseRate(_CSRRateList, out Subsidy, out TotalERHSA);

                    if (BaseSum != 0)
                    {
                        decimal?Coinsurance = objPlanAttribute.TEHBDedInnTier1Coinsurance;

                        var memberCount = OrgionallstFamilyMembers.Count();

                        FamilySheetCalculation objSheet = new FamilySheetCalculation();

                        IEnumerable <PlanBenefitMst> objPlanBenefits;
                        objPlanBenefits = objPlanBenefitMaster.Where(r => r.PlanId == objPlanAttribute.PlanId && r.BusinessYear == objPlanAttribute.BusinessYear).ToList();

                        FamilySheetResult objFamilyResult = objSheet.CalculateFamilySheetNew(objPlanAttribute, UsageCode, memberCount, lstFamilyMemberUses, objPlanBenefits, objMHMBenefitCostByAreaMaster, objPlanAttribute.NonEmbeddedOOPLimits, TierIntention, jobDetail.FirstOrDefault());


                        TrueOOPCost = objFamilyResult.TotalOOPCost;

                        //HSA calculation
                        var CompanyBaseHSA   = TotalERHSA;  //Employer HSA
                        var CompanyHSAMatch  = new HSACalculation().CalculateCompanyHSA(UsageCode, MaxEEHSA, jobDetail.FirstOrDefault());
                        var ActualCompanyHSA = objPlanAttribute.IsHSAEligible ? CompanyBaseHSA + CompanyHSAMatch : 0;

                        //var ActualEEHSAContribution = HSALimit - ActualCompanyHSA > MaxEEHSA ? HSALimit - ActualCompanyHSA : MaxEEHSA;
                        var ActualEEHSAContribution = MaxEEHSA > HSALimit - ActualCompanyHSA ? HSALimit - ActualCompanyHSA : MaxEEHSA;

                        TotalERHSA = ActualCompanyHSA;
                        var MainCompanyHSA = ActualCompanyHSA;

                        decimal PersonalHSACon = 0;
                        if (objPlanAttribute.IsHSAEligible)
                        {
                            //MaxEEHSA ==> (HSAPercentage / 100) * ContributeLimit
                            //MainCompanyHSA  ==> Employer HSA Contribution
                            if (MaxEEHSA < (HSALimit - MainCompanyHSA))
                            {
                                PersonalHSACon = MaxEEHSA;
                            }
                            if (MaxEEHSA > (HSALimit - ActualCompanyHSA))
                            {
                                PersonalHSACon = HSALimit - ActualCompanyHSA;
                            }
                            //MaxEEHSA - MainCompanyHSA : 0;
                        }

                        var HSAEETaxSavings = objPlanAttribute.IsHSAEligible ? (TaxRate * ActualEEHSAContribution) / 100 : 0;

                        //CompanyHSA = MainCompanyHSA;

                        //var HSALimitRemaining = HSALimit - MainCompanyHSA;
                        //EmployeeHSAContribution = HSALimitRemaining > MaxEEHSA ? MaxEEHSA : HSALimitRemaining;
                        //var HSAEETaxSavings = objPlanAttribute.IsHSAEligible ? (TaxRate * EmployeeHSAContribution) / 100 : 0;
                        //HSAContribution = objPlanAttribute.IsHSAEligible ? MainCompanyHSA : 0;

                        var     GrossAnnualPremium = BaseSum * 12;
                        decimal FederalSubsidy     = Subsidy * 12;

                        var NetPremium = GrossAnnualPremium - FederalSubsidy;
                        if (NetPremium < 0)
                        {
                            NetPremium = 0;
                        }

                        var HRAAmount    = objFamilyResult.FamilyHRAReimbursementTotal;
                        var worstCaseHRA = objPlanAttribute.IsHRAeligible ? UsageCode > 1 ? CheckNull(jobDetail.FirstOrDefault().HRAMaxReimburseDependent) : CheckNull(jobDetail.FirstOrDefault().HRAMaxReimbursePrimary) : 0;

                        CasePlanResult PlanResult = new CasePlanResult()
                        {
                            PlanId = objPlanAttribute.Id,
                            PersonalHSAContribution = Convert.ToInt64(PersonalHSACon),
                            ReferralForSpecialist   = objPlanAttribute.ReferralForSpecialist,

                            GovtPlanNumber                = objPlanAttribute.PlanNumber,
                            PlanIdIndiv1                  = objPlanAttribute.PlanId,
                            Year                          = objPlanAttribute.BusinessYear,
                            GrossAnnualPremium            = Convert.ToInt64(GrossAnnualPremium),
                            FederalSubsidy                = Convert.ToInt64(FederalSubsidy),
                            NetAnnualPremium              = Convert.ToInt64(NetPremium),
                            ExcludedAmount                = objFamilyResult.ExcludedAmount,
                            Copays                        = objFamilyResult.Copays,
                            PaymentsToDeductibleLimit     = objFamilyResult.PaymentsuptoDeductible,
                            CoinsuranceToOutOfPocketLimit = objFamilyResult.Coinsurance,
                            ContributedToYourHSAAccount   = Convert.ToInt64(MainCompanyHSA),
                            EmployerHRAReimbursement      = Convert.ToInt64(HRAAmount),
                            TaxSavingFromHSAAccount       = (Convert.ToInt64(HSAEETaxSavings) * -1),
                            Medical                       = Convert.ToInt64(TrueOOPCost - MainCompanyHSA - HSAEETaxSavings - HRAAmount),
                            TotalPaid                     = Convert.ToInt64(NetPremium + TrueOOPCost - MainCompanyHSA - HSAEETaxSavings - HRAAmount),
                            PaymentsByInsuranceCo         = objFamilyResult.PaymentsByInsurance,
                            MonthlyPremium                = Convert.ToInt64(NetPremium / 12),
                            DeductibleSingle              = objFamilyResult.Limits["DeductibleSingle"],
                            DeductibleFamilyPerPerson     = objFamilyResult.Limits["DeductibleFamilyPerPerson"],
                            DeductibleFamilyPerGroup      = objFamilyResult.Limits["DeductibleFamilyPerGroup"],
                            OPLSingle                     = objFamilyResult.Limits["OPLSingle"],
                            OPLFamilyPerPerson            = objFamilyResult.Limits["OPLFamilyPerPerson"],
                            OPLFamilyPerGroup             = objFamilyResult.Limits["OPLFamilyPerGroup"],
                            Coinsurance                   = Convert.ToInt64(Coinsurance),
                            WorstCase                     = memberCount > 1 ?
                                                            Convert.ToInt64(NetPremium + objFamilyResult.Limits["OPLFamilyPerGroup"] - TotalERHSA - HSAEETaxSavings + objFamilyResult.ExcludedAmount) :
                                                            Convert.ToInt64(NetPremium + objFamilyResult.Limits["OPLSingle"] - TotalERHSA - HSAEETaxSavings + objFamilyResult.ExcludedAmount),
                            //Convert.ToInt64(NetPremium + objFamilyResult.Limits["OPLFamilyPerGroup"] - TotalERHSA - worstCaseHRA - HSAEETaxSavings + objFamilyResult.ExcludedAmount) :
                            //Convert.ToInt64(NetPremium + objFamilyResult.Limits["OPLSingle"] - TotalERHSA - worstCaseHRA - HSAEETaxSavings + objFamilyResult.ExcludedAmount),
                            MedicalNetwork   = objPlanAttribute.NetworkURL,
                            PlanName         = !String.IsNullOrEmpty(objPlanAttribute.MetalLevel) ? objPlanAttribute.PlanMarketingName + " / " + objPlanAttribute.MetalLevel : objPlanAttribute.PlanMarketingName,
                            HRAReimbursedAmt = Convert.ToInt64(HRAAmount),
                            TotalEmployerContribution_Pre  = Convert.ToInt64(TotalERHSA + FederalSubsidy + HRAAmount),
                            TotalEmployerContribution_Post = Convert.ToInt64((1 + TaxRate / 100) * ((1 * TotalERHSA) + (1 * FederalSubsidy)))
                        };
                        result.Add(PlanResult);
                        objFamilyResult = null;
                        PlanResult      = null;
                    }
                }
            }

            List <CasePlanResult> PlanResults = result.AsEnumerable().OrderBy(r => Convert.ToDecimal(r.TotalPaid)).ToList();

            if (ResultStatus)
            {
                return(PlanResults.Select((entry, index) => new CasePlanResult()
                {
                    PlanId = entry.PlanId,
                    PersonalHSAContribution = entry.PersonalHSAContribution,
                    ReferralForSpecialist = entry.ReferralForSpecialist,

                    GovtPlanNumber = entry.GovtPlanNumber,
                    PlanIdIndiv1 = entry.PlanIdIndiv1,
                    Year = entry.Year,
                    GrossAnnualPremium = entry.GrossAnnualPremium,
                    FederalSubsidy = entry.FederalSubsidy,
                    NetAnnualPremium = entry.NetAnnualPremium,
                    ExcludedAmount = entry.ExcludedAmount,
                    Copays = entry.Copays,
                    PaymentsToDeductibleLimit = entry.PaymentsToDeductibleLimit,
                    CoinsuranceToOutOfPocketLimit = entry.CoinsuranceToOutOfPocketLimit,
                    ContributedToYourHSAAccount = entry.ContributedToYourHSAAccount,
                    TaxSavingFromHSAAccount = entry.TaxSavingFromHSAAccount,
                    Medical = entry.Medical,
                    TotalPaid = entry.TotalPaid,
                    PaymentsByInsuranceCo = entry.PaymentsByInsuranceCo,
                    MonthlyPremium = entry.MonthlyPremium,
                    DeductibleSingle = entry.DeductibleSingle,
                    DeductibleFamilyPerPerson = entry.DeductibleFamilyPerPerson,
                    DeductibleFamilyPerGroup = entry.DeductibleFamilyPerGroup,
                    OPLSingle = entry.OPLSingle,
                    OPLFamilyPerPerson = entry.OPLFamilyPerPerson,
                    OPLFamilyPerGroup = entry.OPLFamilyPerGroup,
                    Coinsurance = entry.Coinsurance,
                    WorstCase = entry.WorstCase,
                    MedicalNetwork = entry.MedicalNetwork,
                    PlanName = entry.PlanName.Length > 44 ? entry.PlanName.Substring(0, 44) : entry.PlanName,
                    HRAReimbursedAmt = entry.HRAReimbursedAmt,
                    EmployerHRAReimbursement = entry.EmployerHRAReimbursement,
                    TotalEmployerContribution_Pre = entry.TotalEmployerContribution_Pre,
                    TotalEmployerContribution_Post = entry.TotalEmployerContribution_Post,
                    Rank = index + 1
                }).ToList());
            }
            return(PlanResults.Select((entry, index) => new CasePlanResult()
            {
                PlanId = entry.PlanId,
                PersonalHSAContribution = entry.PersonalHSAContribution,
                ReferralForSpecialist = entry.ReferralForSpecialist,

                GovtPlanNumber = entry.GovtPlanNumber,
                PlanIdIndiv1 = entry.PlanIdIndiv1,
                Year = entry.Year,
                GrossAnnualPremium = entry.GrossAnnualPremium,
                FederalSubsidy = entry.FederalSubsidy,
                NetAnnualPremium = entry.NetAnnualPremium,
                ExcludedAmount = entry.ExcludedAmount,
                Copays = entry.Copays,
                PaymentsToDeductibleLimit = entry.PaymentsToDeductibleLimit,
                CoinsuranceToOutOfPocketLimit = entry.CoinsuranceToOutOfPocketLimit,
                ContributedToYourHSAAccount = entry.ContributedToYourHSAAccount,
                TaxSavingFromHSAAccount = entry.TaxSavingFromHSAAccount,
                Medical = entry.Medical,
                TotalPaid = entry.TotalPaid,
                PaymentsByInsuranceCo = entry.PaymentsByInsuranceCo,
                MonthlyPremium = entry.MonthlyPremium,
                DeductibleSingle = entry.DeductibleSingle,
                DeductibleFamilyPerPerson = entry.DeductibleFamilyPerPerson,
                DeductibleFamilyPerGroup = entry.DeductibleFamilyPerGroup,
                OPLSingle = entry.OPLSingle,
                OPLFamilyPerPerson = entry.OPLFamilyPerPerson,
                OPLFamilyPerGroup = entry.OPLFamilyPerGroup,
                Coinsurance = entry.Coinsurance,
                WorstCase = entry.WorstCase,
                MedicalNetwork = entry.MedicalNetwork,
                PlanName = entry.PlanName.Length > 44 ? entry.PlanName.Substring(0, 44) : entry.PlanName,
                HRAReimbursedAmt = entry.HRAReimbursedAmt,
                EmployerHRAReimbursement = entry.EmployerHRAReimbursement,
                TotalEmployerContribution_Pre = entry.TotalEmployerContribution_Pre,
                TotalEmployerContribution_Post = entry.TotalEmployerContribution_Post,
                Rank = index + 1
            }).Take(5).ToList());
        }