From b962ecb119d9d474b6687c1cbc99b6d582e921c0 Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Wed, 7 Oct 2015 23:29:10 -0400 Subject: [PATCH] Add vehicle service controller and view --- Web/Controllers/VehicleServiceController.cs | 47 +++++++++++++ Web/DAL/DataService.cs | 34 ++++++++++ Web/Models/Vehicle.cs | 1 + Web/Scripts/Shared/Site.js | 2 +- .../VehicleServiceQueryViewModel.cs | 39 +++++++++++ .../VehicleServiceResultsViewModel.cs | 9 +++ .../VehicleService/VehicleServiceViewModel.cs | 67 +++++++++++++++++++ Web/Views/Shared/_Layout.cshtml | 8 ++- Web/Views/VehicleService/Create.cshtml | 19 ++++++ Web/Views/VehicleService/Index.cshtml | 31 +++++++++ Web/Web.csproj | 14 ++++ 11 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 Web/Controllers/VehicleServiceController.cs create mode 100644 Web/ViewModels/VehicleService/VehicleServiceQueryViewModel.cs create mode 100644 Web/ViewModels/VehicleService/VehicleServiceResultsViewModel.cs create mode 100644 Web/ViewModels/VehicleService/VehicleServiceViewModel.cs create mode 100644 Web/Views/VehicleService/Create.cshtml create mode 100644 Web/Views/VehicleService/Index.cshtml diff --git a/Web/Controllers/VehicleServiceController.cs b/Web/Controllers/VehicleServiceController.cs new file mode 100644 index 0000000..1003ef5 --- /dev/null +++ b/Web/Controllers/VehicleServiceController.cs @@ -0,0 +1,47 @@ +using System; +using System.Linq; +using System.Web.Mvc; +using MileageTraker.Web.Attributes; +using MileageTraker.Web.ViewModels.VehicleService; + +namespace MileageTraker.Web.Controllers +{ + [Authorize(Roles = "Administrator, Developer")] + public class VehicleServiceController : ControllerBase + { + public ActionResult Index(VehicleServiceQueryViewModel query) + { + var vehicleServices = DataService.GetVehicleServices(); + var viewModel = new VehicleServiceResultsViewModel + { + ServiceItems = vehicleServices.Select(s => new VehicleServiceViewModel(s)) + }; + return View(viewModel); + } + + public ActionResult Create() + { + return View(); + } + + [HttpPost] + [ActionLog] + public ActionResult Create(VehicleServiceViewModel viewModel) + { + if (ModelState.IsValid) + { + var vehicleService = viewModel.GetVehicleService(); + + vehicleService.Vehicle = DataService.GetVehicle(viewModel.VehicleId); + DataService.AddVehicleService(vehicleService); + + TempData["StatusMessage-Type"] = "alert-success"; + TempData["StatusMessage"] = + string.Format("Vehicle Service for vehicle {0} created", viewModel.VehicleId); + return RedirectToAction("Index"); + } + + return View(viewModel); + } + } +} \ No newline at end of file diff --git a/Web/DAL/DataService.cs b/Web/DAL/DataService.cs index 9619f56..106a4db 100644 --- a/Web/DAL/DataService.cs +++ b/Web/DAL/DataService.cs @@ -803,5 +803,39 @@ namespace MileageTraker.Web.DAL return ym.OrderByDescending(dt => dt).ToList(); } #endregion + + #region Vehicle Service + public void AddVehicleService(VehicleService vehicleService) + { + _db.VehicleServices.Add(vehicleService); + _db.SaveChanges(); + } + + public void UpdateVehicleService(VehicleService vehicleService) + { + _db.Entry(vehicleService).State = EntityState.Modified; + _db.SaveChanges(); + } + + public IEnumerable GetVehicleServices() + { + var vehicleServices = _db.VehicleServices; + return vehicleServices; + } + + public VehicleService GetVehicleServices(string id) + { + return _db.VehicleServices.Find(id); + } + + public void DeleteVehicleService(int id) + { + var vehicleService = _db.VehicleServices.Find(id); + + _db.VehicleServices.Remove(vehicleService); + _db.SaveChanges(); + } + + #endregion } } \ No newline at end of file diff --git a/Web/Models/Vehicle.cs b/Web/Models/Vehicle.cs index bd6a39e..7151ae7 100644 --- a/Web/Models/Vehicle.cs +++ b/Web/Models/Vehicle.cs @@ -50,6 +50,7 @@ namespace MileageTraker.Web.Models [Required] [InputSize("small")] + [Units("$")] public decimal Price { get; set; } [Required] diff --git a/Web/Scripts/Shared/Site.js b/Web/Scripts/Shared/Site.js index 05238dd..1f9669e 100644 --- a/Web/Scripts/Shared/Site.js +++ b/Web/Scripts/Shared/Site.js @@ -1,7 +1,7 @@ $(function () { $('.enable-javascript').show(); - $("input#Date, input#InactiveDate").datepicker({ maxDate: '+0d' }); + $("input#Date, input#InactiveDate, input#InvoiceDate").datepicker({ maxDate: '+0d' }); $("input#CityName").autocomplete({ source: "/City/Autocomplete", diff --git a/Web/ViewModels/VehicleService/VehicleServiceQueryViewModel.cs b/Web/ViewModels/VehicleService/VehicleServiceQueryViewModel.cs new file mode 100644 index 0000000..326e1f7 --- /dev/null +++ b/Web/ViewModels/VehicleService/VehicleServiceQueryViewModel.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace MileageTraker.Web.ViewModels.VehicleService +{ + public class VehicleServiceQueryViewModel + { + public int? Year { get; set; } + public int? Month { get; set; } + + public string YearMonthStart {get + { + return string.Format("{0}-{1:00}", Year, Month); + }} + + public override string ToString() + { + var v = new List(); + + if (Year.HasValue && Month.HasValue) + { + var str = YearMonthStart; + + v.Add(str); + } + else if (Year.HasValue) + { + v.Add(Year.ToString()); + } + + return String.Join("_", v).Replace(' ', '-'); + } + + public bool HasParameters() + { + return Year.HasValue; + } + } +} \ No newline at end of file diff --git a/Web/ViewModels/VehicleService/VehicleServiceResultsViewModel.cs b/Web/ViewModels/VehicleService/VehicleServiceResultsViewModel.cs new file mode 100644 index 0000000..a817fef --- /dev/null +++ b/Web/ViewModels/VehicleService/VehicleServiceResultsViewModel.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace MileageTraker.Web.ViewModels.VehicleService +{ + public class VehicleServiceResultsViewModel + { + public IEnumerable ServiceItems { get; set; } + } +} diff --git a/Web/ViewModels/VehicleService/VehicleServiceViewModel.cs b/Web/ViewModels/VehicleService/VehicleServiceViewModel.cs new file mode 100644 index 0000000..4c35787 --- /dev/null +++ b/Web/ViewModels/VehicleService/VehicleServiceViewModel.cs @@ -0,0 +1,67 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Web.Mvc; +using AutoMapper; +using MileageTraker.Web.Attributes; + +namespace MileageTraker.Web.ViewModels.VehicleService +{ + public class VehicleServiceViewModel + { + [HiddenInput(DisplayValue = false)] + public int? VehicleServiceId { get; set; } + + [Required] + [Remote("Exists", "Vehicle", ErrorMessage = "ID not found")] + [StringLength(6, MinimumLength = 4, ErrorMessage = "Must be at least a 4 digit number")] + [Display(Name = "Vehicle ID")] + [RegularExpression(@"\d+", ErrorMessage = "Vehicle ID must be all numbers")] + [InputSize("mini")] + public string VehicleId { get; set; } + + [DataType(DataType.DateTime)] + [DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] + [FormatHint("mm/dd/yyyy")] + [InputSize("small")] + public DateTime? InvoiceDate { get; set; } + + [Required] + [StringLength(64, MinimumLength = 3, ErrorMessage = "Minimum 3 characters")] + public string ServiceCenterName { get; set; } + + [Required] + [StringLength(32)] + [InputSize("small")] + public string InvoiceNumber { get; set; } + + [Required] + [InputSize("small")] + [Units("$")] + public decimal Price { get; set; } + + [StringLength(64, MinimumLength = 3, ErrorMessage = "Minimum 3 characters")] + public string Description { get; set; } + + static VehicleServiceViewModel() + { + Mapper.CreateMap(); + Mapper.CreateMap(); + } + + public VehicleServiceViewModel(Models.VehicleService vehicleService) + { + Mapper.Map(vehicleService, this); + } + + public VehicleServiceViewModel() + { + } + + public Models.VehicleService GetVehicleService() + { + var vehicleService = new Models.VehicleService(); + Mapper.Map(this, vehicleService); + return vehicleService; + } + } +} \ No newline at end of file diff --git a/Web/Views/Shared/_Layout.cshtml b/Web/Views/Shared/_Layout.cshtml index d470ed6..c304bdb 100644 --- a/Web/Views/Shared/_Layout.cshtml +++ b/Web/Views/Shared/_Layout.cshtml @@ -36,7 +36,13 @@ @if (User.IsInRole("Developer") || User.IsInRole("Administrator")) {
  • @Html.ActionLink("Logs", "Index", "Log")
  • -
  • @Html.ActionLink("Vehicles", "Index", "Vehicle")
  • +
  • @Html.ActionLink("Fuel Logs", "Index", "FuelLog")
  • @Html.ActionLink("Users", "Index", "User")