public JsonResult Calculate(PremiumCalculatorVm vm)
 {
     var policy = _mapper.Map<Policy>(vm.Policy);
     var declined = _premiumCalculationService.DetermineIfPolicyShouldBeDeclined(policy);
     if (!declined.PolicyDeclined)
     {
         var premium = _premiumCalculationService.CalculatePremium(policy);
         ViewData.ModelState.Clear();
         return Json(new { message = $"Your policy premium will be: £{decimal.Round(premium,2)}", messageType = "success" });
     }
     string declineMessage = "";
     switch (declined.PolicyDeclineReason)
     {
         case PolicyDeclineReason.YoungestDriverTooYoung:
             var youngestDriverName = vm.Policy.Drivers.OrderByDescending(o => o.DateOfBirth).First().Name;
             declineMessage = declined.PolicyDeclineReason.GetDescription() + ' ' + youngestDriverName;
             break;
         case PolicyDeclineReason.OldestDriverTooOld:
             var oldestDriverName = vm.Policy.Drivers.OrderBy(o => o.DateOfBirth).First().Name;
             declineMessage = declined.PolicyDeclineReason.GetDescription() + ' ' + oldestDriverName;
             break;
         case PolicyDeclineReason.SingleDriverMoreThanTwoClaims:
             var driverWithTooManyClaims = vm.Policy.Drivers.Find(o => o.Claims.Count > 2).Name;
             declineMessage = declined.PolicyDeclineReason.GetDescription() + ' ' + driverWithTooManyClaims;
             break;
         case PolicyDeclineReason.TotalMoreThanThreeClaims:
             declineMessage = declined.PolicyDeclineReason.GetDescription();
             break;
         case PolicyDeclineReason.StartDateBeforeCurrentDate:
             declineMessage = declined.PolicyDeclineReason.GetDescription();
             break;
     }
     ViewData.ModelState.Clear();
     return Json(new { message = $"Unfortunately your policy has been declined with the reason: {declineMessage}", messageType = "danger" });
 }
 public ActionResult AddDriver(PremiumCalculatorVm vm)
 {
     vm.Policy.Drivers.Add(new DriverVm
     {
         DateOfBirth = DateTime.Today
     });
     ViewData.ModelState.Clear();
     return PartialView("_Drivers", vm);
 }
 public ActionResult AddClaim(PremiumCalculatorVm vm, int index)
 {
     var driver = vm.Policy.Drivers[index];
     if (driver.Claims == null)
     {
         driver.Claims = new List<ClaimVm>
         {
             new ClaimVm
             {
                 ClaimDate = DateTime.Today
             }
         };
     }
     else
     {
         driver.Claims.Add(new ClaimVm
         {
             ClaimDate = DateTime.Today
         });
     }
     ViewData.ModelState.Clear();
     return PartialView("_Drivers", vm);
 }
 public ActionResult RemoveDriver(PremiumCalculatorVm vm, int index)
 {
     var driverToRemove = vm.Policy.Drivers[index];
     vm.Policy.Drivers.Remove(driverToRemove);
     ViewData.ModelState.Clear();
     return PartialView("_Drivers", vm);
 }
 public ActionResult RemoveClaim(PremiumCalculatorVm vm, int driver, int claim)
 {
     var claimToRemove = vm.Policy.Drivers[driver].Claims[claim];
     vm.Policy.Drivers[driver].Claims.Remove(claimToRemove);
     ViewData.ModelState.Clear();
     return PartialView("_Drivers", vm);
 }
 public ActionResult PremiumCalculator()
 {
     var vm = new PremiumCalculatorVm
     {
         Policy = new PolicyVm
         {
             StartDate = DateTime.Today,
             Drivers = new List<DriverVm>
             {
                 new DriverVm
                 {
                     DateOfBirth = DateTime.Today
                 }
             }
         }
     };
     return View(vm);
 }