コード例 #1
0
        public PremiumViewModel calculatePremium(PremiumViewModel model)
        {
            PremiumItem prem;
            //Base Premium
            int famComp = 0;

            switch (model.PlanType)
            {
            case "Family Floater":
                famComp = getFamilyComposition(model);
                break;

            case "Individual":
                famComp = (model.Gender == "Male") ? cSelf : (cSelf * 2);
                break;
            }
            string chronic = "Non Chronic";

            if (model.ProductName == "Platinum" && model.PlanType != "Family Floater")
            {
                if (model.Diabetes)
                {
                    chronic = "Diabetic";
                }
                else if (model.Hypertension)
                {
                    chronic = "Hypertension";
                }
                else if (model.Hyperlipidaemia)
                {
                    chronic = "Hyperlipidaemia";
                }
                else if (model.Asthma)
                {
                    chronic = "Asthma";
                }
            }
            int deductible = model.Deductible;

            if (chronic != "Non Chronic")
            {
                deductible = 0;
            }
            int term      = model.Term;
            int thisterm  = term;
            int noOffBase = 0;
            //Base Premium Loop
            PremiumCalc pmc = new PremiumCalc {
                name = "Base Premium", LoadingFactor = 1m, DiscountFactor = 1m, RelativesFactor = 1m, TotalFactor = 1m
            };

            model.Premiums.Add(pmc);
            for (int age = model.Age; age < (term + model.Age); age++)
            {
                noOffBase++;
                prem = getPremiumRecord(model.ProductName, model.PlanName, model.PlanType, famComp, chronic,
                                        model.SumInsured, deductible, age, thisterm, "Base Premium " + thisterm);
                if (prem != null)
                {
                    pmc.BasePremium += prem.Amount;
                    pmc.premiumItems.Add(prem);
                }
                thisterm++;
            }
            pmc.NetAmount = pmc.BasePremium;

            //Premium Loading
            /*Co-Morbitity Load  */
            decimal coMorbitLoading = 0m;

            if (model.ProductName == "Platinum" && model.PlanType != "Family Floater")
            {
                if (model.Diabetes)
                {
                    coMorbitLoading = (model.Hypertension && model.Hyperlipidaemia && model.Asthma) ? 7050m : coMorbitLoading;
                    coMorbitLoading = (model.Hypertension && model.Hyperlipidaemia && !model.Asthma) ? 5150m : coMorbitLoading;
                    coMorbitLoading = (model.Hypertension && !model.Hyperlipidaemia && model.Asthma) ? 2780m : coMorbitLoading;
                    coMorbitLoading = (!model.Hypertension && model.Hyperlipidaemia && model.Asthma) ? 550m : coMorbitLoading;
                    coMorbitLoading = (model.Hypertension && !model.Hyperlipidaemia && !model.Asthma) ? 1050m : coMorbitLoading;
                    coMorbitLoading = (!model.Hypertension && !model.Hyperlipidaemia && model.Asthma) ? 1400m : coMorbitLoading;
                    coMorbitLoading = (!model.Hypertension && model.Hyperlipidaemia && !model.Asthma) ? 3600m : coMorbitLoading;
                }
                else if (model.Hypertension)
                {
                    coMorbitLoading = (model.Hyperlipidaemia && model.Asthma) ? 5250m : coMorbitLoading;
                    coMorbitLoading = (model.Hyperlipidaemia && !model.Asthma) ? 3350m : coMorbitLoading;
                    coMorbitLoading = (!model.Hyperlipidaemia && model.Asthma) ? 1150m : coMorbitLoading;
                }
                else if (model.Hyperlipidaemia)
                {
                    coMorbitLoading = (model.Asthma) ? 5650m : coMorbitLoading;
                }
            }
            if (coMorbitLoading > 0m)
            {
                //pmc.LoadingPerc += coMorbitLoading;
                //pmc.LoadingFactor *= (1m + coMorbitLoading);
                decimal loadAmount = coMorbitLoading * model.Term;
                pmc.NetAmount = pmc.BasePremium + (loadAmount);
                pmc.Info     += string.Format("\nCo-Morbitity Loading  " + loadAmount);
            }

            //Premium Waiver on co-pay for Essential
            if (model.PremiumWaiver && model.PlanName == "Essential")
            {
                pmc.LoadingFactor *= (1m + 0.25m);
                //pmc.LoadingPerc += 0.25m;
                pmc.Info += "\nPremium Waiver Loading 25%|";
            }
            //pmc.LoadingAmount = pmc.NetAmount * (1m - pmc.LoadingPerc);
            //pmc.NetAmount = pmc.NetAmount * pmc.LoadingAmount;

            //           pmc.NetAmount = pmc.BasePremium;
            /*Discounts*/
            //Term Discount
            if (noOffBase > 1)
            {
                pmc.Info += "\n" + noOffBase + " year term|";
                if (noOffBase == 2)
                {
                    pmc.DiscountFactor *= (1m - 0.075m);
                    pmc.Info           += "\nTerm discount 7.5%|";
                }
                if (noOffBase == 3)
                {
                    pmc.DiscountFactor *= (1m - 0.10m);
                    pmc.Info           += "\nTerm discount 10%|";
                }
            }
            //Staff Discount
            if (model.Staff)
            {
                pmc.DiscountFactor *= (1m - 0.10m);
                pmc.Info           += "\nStaff discount 10%|";
            }
            //pmc.DiscountAmount = pmc.NetAmount * (1m - pmc.DiscountPerc);
            //pmc.NetAmount = pmc.NetAmount * pmc.DiscountPerc;

            /* Relatives */
            //Zone
            if (model.Zone > 1)
            {
                if (model.Zone == 2)
                {
                    pmc.RelativesFactor *= (1m - 0.10m);
                    pmc.Info            += "\nZone Relative 10%|";
                }
                if (model.Zone == 3)
                {
                    pmc.RelativesFactor *= (1m - 0.25m);
                    pmc.Info            += "\nZone Relative 25%|";
                }
            }
            //Room Type
            if (model.RoomType != 1)
            {
                //Not Single
                if (model.PlanName == "Essential")
                {
                    if (model.RoomType == 2)//Shared
                    {
                        pmc.RelativesFactor *= (1m - 0.10m);
                        pmc.Info            += "\nRoomType Relative 10%|";
                    }
                    if (model.RoomType == 3)//General/Economy
                    {
                        pmc.RelativesFactor *= (1m - 0.20m);
                        pmc.Info            += "\nRoomType Relative 20%|";
                    }
                }
                if (model.PlanName == "Enhanced")
                {
                    if (model.RoomType == 2 || model.RoomType == 3)//Shared or General/Economy
                    {
                        pmc.RelativesFactor *= (1m - 0.10m);
                        pmc.Info            += "\nRoomType Relative 10%|";
                    }
                    if (model.RoomType == 4)//any room
                    {
                        pmc.RelativesFactor *= (1m + 0.25m);
                        pmc.Info            += "\nRoomType Loading Relative +25%|";
                    }
                }
            }

            pmc.TotalFactor = pmc.LoadingFactor * pmc.DiscountFactor * pmc.RelativesFactor;
            pmc.NetAmount   = pmc.NetAmount * pmc.TotalFactor;
            //pmc.RelativesAmount = pmc.NetAmount * (1m - pmc.RelativesPerc);
            //pmc.NetAmount = pmc.NetAmount * pmc.RelativesPerc;

            //Hospital Cash
            if (model.HospitalCash > 0)
            {
                pmc = new PremiumCalc {
                    name = "Hospital Daily Cash"
                };
                model.Premiums.Add(pmc);
                famComp = (model.Gender == "Male") ? cSelf : (cSelf * 2);
                for (int age = model.Age; age < (model.Term + model.Age); age++)
                {
                    prem = getPremiumRecord("Optional Benefit: Hospital Daily Cash Benefit", "HospCash",
                                            "Optional", famComp, "",
                                            model.HospitalCash, 0, age, model.Term, "Hospital Daily Cash");

                    if (prem != null)
                    {
                        pmc.BasePremium += prem.Amount;
                        pmc.premiumItems.Add(prem);
                    }
                }
                pmc.NetAmount = pmc.BasePremium;
            }

            //OPD
            if (model.OPD > 0)
            {
                pmc = new PremiumCalc {
                    name = "OPD Expenses"
                };
                model.Premiums.Add(pmc);
                prem = getPremiumRecord("Optional Benefit : OPD Expenses", "OPD",
                                        "Optional", cSelf, "",
                                        model.OPD, 0, 0, model.Term, "OPD Expenses");
                if (prem != null)
                {
                    pmc.NetAmount   = prem.Amount * model.Term; //Multiply by Term
                    pmc.BasePremium = prem.Amount;
                    pmc.premiumItems.Add(prem);
                }
            }
            //Maternity
            if (model.Maternity)
            {
                pmc = new PremiumCalc {
                    name = "Maternity Expenses"
                };
                model.Premiums.Add(pmc);

                for (int age = model.Age; age < (model.Term + model.Age); age++)
                {
                    prem = getPremiumRecord("Optional Benefit: Maternity Expenses", "Maternity",
                                            "Optional", (cSelf * 2), "",
                                            0, 0, age, model.Term, "Maternity Expenses");

                    if (prem != null)
                    {
                        pmc.BasePremium += (prem.Amount / 3);
                        pmc.NetAmount    = pmc.BasePremium;
                        pmc.premiumItems.Add(prem);
                    }
                }


                /*
                 *   if (prem != null)
                 *   {
                 *       pmc.BasePremium = prem.Amount;
                 *       //Maternity has a 3 Year Premium
                 *       pmc.NetAmount = (pmc.BasePremium / 3) * noOffBase;
                 *       pmc.premiumItems.Add(prem);
                 *   }
                 */
            }
            //Add a Total Row
            PremiumCalc totPrem = new PremiumCalc {
                name = "Total"
            };

            foreach (PremiumCalc pmc1 in model.Premiums)
            {
                totPrem.NetAmount   += pmc1.NetAmount;
                totPrem.BasePremium += pmc1.BasePremium;

                /*totPrem.DiscountPerc += pmc1.DiscountPerc;
                 * totPrem.DiscountAmount += pmc1.DiscountAmount;
                 * totPrem.RelativesPerc += pmc1.RelativesPerc;
                 * totPrem.RelativesAmount += pmc1.RelativesAmount;
                 * totPrem.LoadingPerc += pmc1.LoadingPerc;
                 * totPrem.LoadingAmount += pmc1.LoadingAmount;*/
                totPrem.LoadingFactor   = (pmc1.LoadingFactor > totPrem.LoadingFactor) ? pmc1.LoadingFactor : totPrem.LoadingFactor;
                totPrem.DiscountFactor  = (pmc1.DiscountFactor > totPrem.DiscountFactor) ? pmc1.DiscountFactor : totPrem.DiscountFactor;
                totPrem.RelativesFactor = (pmc1.RelativesFactor > totPrem.RelativesFactor) ? pmc1.RelativesFactor : totPrem.RelativesFactor;
                totPrem.TotalFactor     = (pmc1.TotalFactor > totPrem.TotalFactor) ? pmc1.TotalFactor : totPrem.TotalFactor;
                totPrem.Info           += pmc1.Info;
            }
            model.Premiums.Add(totPrem);

            return(model);
        }
コード例 #2
0
 public void btnSubmit_Click(object sender, EventArgs e)
 {
     PremiumCalc cal = new PremiumCalc();
 }