From 7933632cfb6c5efb52962e5a8df3252cd12d517d Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Fri, 23 Oct 2015 12:13:09 -0400 Subject: [PATCH] Update existing reports, removing mileage drill down --- Web/Controllers/LogController.cs | 13 +++++ Web/DAL/DataService.cs | 20 ++------ Web/Utility/CustomExtensions.cs | 51 +++++++++++++++++--- Web/Utility/ExcelWriter.cs | 48 +++++++++--------- Web/ViewModels/DriverMileageItem.cs | 2 +- Web/ViewModels/Vehicle/VehicleMileageItem.cs | 6 +-- Web/Views/Log/MonthlyDriverMileage.cshtml | 7 +-- Web/Views/Log/MonthlyVehicleMileage.cshtml | 12 +++-- 8 files changed, 98 insertions(+), 61 deletions(-) diff --git a/Web/Controllers/LogController.cs b/Web/Controllers/LogController.cs index d1d89a7..3958757 100644 --- a/Web/Controllers/LogController.cs +++ b/Web/Controllers/LogController.cs @@ -76,6 +76,19 @@ namespace MileageTraker.Web.Controllers return View(report); } + public ActionResult ExportMonthlyVehicleMileage(LogQueryViewModel query) + { + var items = DataService.GetMonthlyVehicleMileageItems(query); + + //var report = new VehicleMileageViewModel(items, query); + + var name = string.Format("MonthlyVehicleMileage_{0}", query); + + var export = ExcelWriter.WriteXls(items, name, name); + + return File(export, "application/ms-excel", name + ".xls"); + } + public ActionResult MonthlyDriverMileage(LogQueryViewModel query) { var items = DataService.GetMonthlyDriverMileageItems(query); diff --git a/Web/DAL/DataService.cs b/Web/DAL/DataService.cs index cde89c1..303bddf 100644 --- a/Web/DAL/DataService.cs +++ b/Web/DAL/DataService.cs @@ -169,10 +169,6 @@ namespace MileageTraker.Web.DAL let miles = g.Sum(l => l.miles) let gasPurchased = g.Sum(l => l.log.GasPurchased) where miles > 0 || gasPurchased > 0 - let logPairs = - from i in g - orderby i.log.Date descending , i.log.EndOdometer descending - select new { PreviousLog = i.previousLog, Log = i.log } select new { @@ -180,7 +176,7 @@ namespace MileageTraker.Web.DAL GasPurchased = gasPurchased, Miles = miles, g.Key.Prog, - LogPairs = logPairs + TripCount = g.Count() }; return items.ToList().Select(i => new VehicleMileageItem @@ -189,8 +185,7 @@ namespace MileageTraker.Web.DAL GasPurchased = i.GasPurchased, Miles = i.Miles, Prog = i.Prog, - LogPairs = i.LogPairs.ToList() - .Select(lp => new Tuple(lp.PreviousLog, lp.Log)) + TripCount = i.TripCount }); } @@ -206,23 +201,17 @@ namespace MileageTraker.Web.DAL from i in g group i by i.log.Vehicle into v let vehicle = v.Key - //from vehicle in _db.Vehicles - //where vehicle.VehicleId == v.Key.VehicleId let vehicleProg = vehicle.Prog let vehicleMiles = v.Sum(l => l.miles) let vehicleGasPurchased = v.Sum(l => l.log.GasPurchased) where vehicleMiles > 0 || vehicleGasPurchased > 0 - let vehicleLogPairs = - from i in v - orderby i.log.Date descending, i.log.EndOdometer descending - select new { PreviousLog = i.previousLog, Log = i.log } select new { v.Key.VehicleId, Prog = vehicleProg, Miles = vehicleMiles, GasPurchased = vehicleGasPurchased, - LogPairs = vehicleLogPairs + TripCount = v.Count() } select new @@ -240,8 +229,7 @@ namespace MileageTraker.Web.DAL Prog = v.Prog, Miles = v.Miles, GasPurchased = v.GasPurchased, - LogPairs = v.LogPairs.ToList() - .Select(lp => new Tuple(lp.PreviousLog, lp.Log)) + TripCount = v.TripCount }).ToList() }); } diff --git a/Web/Utility/CustomExtensions.cs b/Web/Utility/CustomExtensions.cs index 2baecf5..02e1494 100644 --- a/Web/Utility/CustomExtensions.cs +++ b/Web/Utility/CustomExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data.SqlTypes; @@ -143,21 +144,38 @@ namespace MileageTraker.Web.Utility : propertyMember.Name; } - public static object GetValue(this PropertyInfo propertyMember, object obj) + + public static string GetNullDisplayText(this PropertyInfo propertyMember, object obj) { var value = propertyMember.GetValue(obj, null); - var displayAttr = - propertyMember.GetCustomAttributes(typeof (DisplayFormatAttribute), true).FirstOrDefault() as DisplayFormatAttribute; + var displayAttr = GetDisplayAttribute(propertyMember); if (displayAttr != null) { if (value == null && !String.IsNullOrEmpty(displayAttr.NullDisplayText)) return displayAttr.NullDisplayText; - - if (!String.IsNullOrEmpty(displayAttr.DataFormatString)) - return String.Format(displayAttr.DataFormatString, value); } - return value; + return null; + } + + public static string GetDataFormatString(this PropertyInfo propertyMember, object obj) + { + var value = propertyMember.GetValue(obj, null); + var displayAttr = GetDisplayAttribute(propertyMember); + + if (displayAttr != null) + { + if (!String.IsNullOrEmpty(displayAttr.DataFormatString)) + return displayAttr.DataFormatString; + } + return null; + } + + private static DisplayFormatAttribute GetDisplayAttribute(PropertyInfo propertyMember) + { + var displayAttr = + propertyMember.GetCustomAttributes(typeof (DisplayFormatAttribute), true).FirstOrDefault() as DisplayFormatAttribute; + return displayAttr; } public static IEnumerable GetPropertyNames(this Type type) @@ -293,6 +311,25 @@ namespace MileageTraker.Web.Utility select mg.Key).ToList() }).ToDictionary(arg => arg.Item1, arg => arg.Item2List); } + + public static bool IsNonStringEnumerable(this Type type) + { + if (type == null || type == typeof(string)) + return false; + return typeof(IEnumerable).IsAssignableFrom(type); + } + + public static bool IsHiddenFromModel(this MemberInfo propertyMember) + { + var hiddenInputAttribute = + propertyMember.GetCustomAttributes(typeof(HiddenInputAttribute), true).FirstOrDefault() as HiddenInputAttribute; + + if (hiddenInputAttribute != null) + { + return !hiddenInputAttribute.DisplayValue; + } + return false; + } //public static IEnumerable ToSelectList( // this IEnumerable enumerable, diff --git a/Web/Utility/ExcelWriter.cs b/Web/Utility/ExcelWriter.cs index a4556d8..2f59c0a 100644 --- a/Web/Utility/ExcelWriter.cs +++ b/Web/Utility/ExcelWriter.cs @@ -38,7 +38,8 @@ namespace MileageTraker.Web.Utility { return typeof (T).GetProperties() - .Where(p => !p.PropertyType.IsCollection()) + .Where(p => !p.PropertyType.IsNonStringEnumerable()) + .Where(p => !p.IsHiddenFromModel()) .Where(p => !p.Name.Contains("PreviousLog")) .ToList(); } @@ -92,36 +93,39 @@ namespace MileageTraker.Web.Utility (item, r) => GetProperties().Zip(CustomExtensions.GetNumbers().Skip(startCol), (p, c) => { - var value = p.GetValue(item); + var value = p.GetValue(item); - string formatString = null; + string formatString = null; - if (value is decimal) // assume that it's currency - formatString = "#,##0.00"; + if (value is decimal) // assume that it's currency + formatString = "#,##0.00"; - if (value is DateTime && p.Name == "Date") - formatString = @"MM/DD/YYYY"; - else if (value is DateTime) - formatString = @"MM/DD/YYYY hh:mm:ss"; + if (value is DateTime && p.Name.Contains("Date")) + formatString = @"MM/DD/YYYY"; + else if (value is DateTime) + formatString = @"MM/DD/YYYY hh:mm:ss"; - if (p.Name == "GasPurchased") // format to the .000 place - formatString = "#,##0.000"; + if (p.Name == "GasPurchased") // format to the .000 place + formatString = "#,##0.000"; - int intValue; // write int-looking values as numbers - if (value is string && int.TryParse((string) value, out intValue)) - value = intValue; + int intValue; // write int-looking values as numbers + if (value is string && int.TryParse((string) value, out intValue)) + value = intValue; - double doubleValue; // write double-looking values as numbers - if (value is string && double.TryParse((string) value, out doubleValue)) - value = doubleValue; + double doubleValue; // write double-looking values as numbers + if (value is string && double.TryParse((string) value, out doubleValue)) + value = doubleValue; - if (value is MileageLogTypeWrapper) - value = ((MileageLogTypeWrapper) value).Enum.GetDisplayName(); + if (value is MileageLogTypeWrapper) + value = ((MileageLogTypeWrapper) value).Enum.GetDisplayName(); - var cell = formatString != null ? new Cell(value, formatString) : new Cell(value); - worksheet.Cells[r, c] = cell; + if (value == null) + value = p.GetNullDisplayText(item); - return (string) null; + var cell = formatString != null ? new Cell(value, formatString) : new Cell(value); + worksheet.Cells[r, c] = cell; + + return (string) null; }).ToList()).ToList(); } diff --git a/Web/ViewModels/DriverMileageItem.cs b/Web/ViewModels/DriverMileageItem.cs index 4d750f4..e83c3ae 100644 --- a/Web/ViewModels/DriverMileageItem.cs +++ b/Web/ViewModels/DriverMileageItem.cs @@ -21,7 +21,7 @@ namespace MileageTraker.Web.ViewModels public int TripCount { - get { return VehicleMileageItems.Sum(i => i.LogPairs.Count()); } + get { return VehicleMileageItems.Sum(i => i.TripCount); } } } } \ No newline at end of file diff --git a/Web/ViewModels/Vehicle/VehicleMileageItem.cs b/Web/ViewModels/Vehicle/VehicleMileageItem.cs index a98655b..a43bd94 100644 --- a/Web/ViewModels/Vehicle/VehicleMileageItem.cs +++ b/Web/ViewModels/Vehicle/VehicleMileageItem.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Linq; namespace MileageTraker.Web.ViewModels.Vehicle { @@ -11,8 +8,7 @@ namespace MileageTraker.Web.ViewModels.Vehicle public int Miles { get; set; } public double GasPurchased { get; set; } public string Prog { get; set; } - public IEnumerable> LogPairs { get; set; } - public int TripCount { get { return LogPairs.Count(); } } + public int TripCount { get; set; } [DisplayFormat(DataFormatString = "{0:0.000}")] public double MilesPerGallon { get { return GasPurchased == 0 || Miles == 0 ? 0 : Miles / GasPurchased; } } } diff --git a/Web/Views/Log/MonthlyDriverMileage.cshtml b/Web/Views/Log/MonthlyDriverMileage.cshtml index 970b202..591d959 100644 --- a/Web/Views/Log/MonthlyDriverMileage.cshtml +++ b/Web/Views/Log/MonthlyDriverMileage.cshtml @@ -45,11 +45,8 @@ @Html.DisplayTextFor(i => vehicleItem.TripCount) - lp.Item1 == null)){ - @:class="ui-state-error" - }> - @Html.DisplayTextFor(i => vehicleItem.Miles) - @Html.Partial("LogsSummary", vehicleItem.LogPairs) + + @Html.DisplayTextFor(i => vehicleItem.Miles) @Html.DisplayTextFor(i => vehicleItem.GasPurchased) diff --git a/Web/Views/Log/MonthlyVehicleMileage.cshtml b/Web/Views/Log/MonthlyVehicleMileage.cshtml index 1ff813c..84d6b40 100644 --- a/Web/Views/Log/MonthlyVehicleMileage.cshtml +++ b/Web/Views/Log/MonthlyVehicleMileage.cshtml @@ -1,6 +1,7 @@ @model MileageTraker.Web.ViewModels.Vehicle.VehicleMileageViewModel @{ ViewBag.Title = "Vehicle Mileage Report"; + var queryParams = new { Model.Query.Year, Model.Query.Month, Model.Query.LogType, Model.Query.MonthRange, Model.Query.VehicleId, Model.Query.EmployeeName }; } @{ Html.RenderPartial("BackToLogs"); } @@ -9,6 +10,10 @@

@ViewBag.Title

+
+ @Html.ActionLink("Export", "ExportMonthlyVehicleMileage", Model.Query, new { @class = "btn" }) +
+ @Html.DisplayFor(m => m.Query) @@ -38,11 +43,8 @@ -
@Html.DisplayTextFor(i => item.Prog) lp.Item1 == null)){ - @:class="ui-state-error" - }> - @Html.DisplayTextFor(i => item.Miles) - @Html.Partial("LogsSummary", item.LogPairs) + + @Html.DisplayTextFor(i => item.Miles) @Html.DisplayTextFor(i => item.GasPurchased)