Update existing reports, removing mileage drill down

This commit is contained in:
2015-10-23 12:13:09 -04:00
parent 25fb070701
commit 7933632cfb
8 changed files with 98 additions and 61 deletions
+13
View File
@@ -76,6 +76,19 @@ namespace MileageTraker.Web.Controllers
return View(report); 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<VehicleMileageItem>.WriteXls(items, name, name);
return File(export, "application/ms-excel", name + ".xls");
}
public ActionResult MonthlyDriverMileage(LogQueryViewModel query) public ActionResult MonthlyDriverMileage(LogQueryViewModel query)
{ {
var items = DataService.GetMonthlyDriverMileageItems(query); var items = DataService.GetMonthlyDriverMileageItems(query);
+4 -16
View File
@@ -169,10 +169,6 @@ namespace MileageTraker.Web.DAL
let miles = g.Sum(l => l.miles) let miles = g.Sum(l => l.miles)
let gasPurchased = g.Sum(l => l.log.GasPurchased) let gasPurchased = g.Sum(l => l.log.GasPurchased)
where miles > 0 || gasPurchased > 0 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 select
new new
{ {
@@ -180,7 +176,7 @@ namespace MileageTraker.Web.DAL
GasPurchased = gasPurchased, GasPurchased = gasPurchased,
Miles = miles, Miles = miles,
g.Key.Prog, g.Key.Prog,
LogPairs = logPairs TripCount = g.Count()
}; };
return items.ToList().Select(i => new VehicleMileageItem return items.ToList().Select(i => new VehicleMileageItem
@@ -189,8 +185,7 @@ namespace MileageTraker.Web.DAL
GasPurchased = i.GasPurchased, GasPurchased = i.GasPurchased,
Miles = i.Miles, Miles = i.Miles,
Prog = i.Prog, Prog = i.Prog,
LogPairs = i.LogPairs.ToList() TripCount = i.TripCount
.Select(lp => new Tuple<Log,Log>(lp.PreviousLog, lp.Log))
}); });
} }
@@ -206,23 +201,17 @@ namespace MileageTraker.Web.DAL
from i in g from i in g
group i by i.log.Vehicle into v group i by i.log.Vehicle into v
let vehicle = v.Key let vehicle = v.Key
//from vehicle in _db.Vehicles
//where vehicle.VehicleId == v.Key.VehicleId
let vehicleProg = vehicle.Prog let vehicleProg = vehicle.Prog
let vehicleMiles = v.Sum(l => l.miles) let vehicleMiles = v.Sum(l => l.miles)
let vehicleGasPurchased = v.Sum(l => l.log.GasPurchased) let vehicleGasPurchased = v.Sum(l => l.log.GasPurchased)
where vehicleMiles > 0 || vehicleGasPurchased > 0 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 select new
{ {
v.Key.VehicleId, v.Key.VehicleId,
Prog = vehicleProg, Prog = vehicleProg,
Miles = vehicleMiles, Miles = vehicleMiles,
GasPurchased = vehicleGasPurchased, GasPurchased = vehicleGasPurchased,
LogPairs = vehicleLogPairs TripCount = v.Count()
} }
select select
new new
@@ -240,8 +229,7 @@ namespace MileageTraker.Web.DAL
Prog = v.Prog, Prog = v.Prog,
Miles = v.Miles, Miles = v.Miles,
GasPurchased = v.GasPurchased, GasPurchased = v.GasPurchased,
LogPairs = v.LogPairs.ToList() TripCount = v.TripCount
.Select(lp => new Tuple<Log, Log>(lp.PreviousLog, lp.Log))
}).ToList() }).ToList()
}); });
} }
+44 -7
View File
@@ -1,4 +1,5 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Data.SqlTypes; using System.Data.SqlTypes;
@@ -143,21 +144,38 @@ namespace MileageTraker.Web.Utility
: propertyMember.Name; : 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 value = propertyMember.GetValue(obj, null);
var displayAttr = var displayAttr = GetDisplayAttribute(propertyMember);
propertyMember.GetCustomAttributes(typeof (DisplayFormatAttribute), true).FirstOrDefault() as DisplayFormatAttribute;
if (displayAttr != null) if (displayAttr != null)
{ {
if (value == null && !String.IsNullOrEmpty(displayAttr.NullDisplayText)) if (value == null && !String.IsNullOrEmpty(displayAttr.NullDisplayText))
return 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<string> GetPropertyNames(this Type type) public static IEnumerable<string> GetPropertyNames(this Type type)
@@ -293,6 +311,25 @@ namespace MileageTraker.Web.Utility
select mg.Key).ToList() select mg.Key).ToList()
}).ToDictionary(arg => arg.Item1, arg => arg.Item2List); }).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<SelectListItem> ToSelectList<T>( //public static IEnumerable<SelectListItem> ToSelectList<T>(
// this IEnumerable<T> enumerable, // this IEnumerable<T> enumerable,
+26 -22
View File
@@ -38,7 +38,8 @@ namespace MileageTraker.Web.Utility
{ {
return return
typeof (T).GetProperties() typeof (T).GetProperties()
.Where(p => !p.PropertyType.IsCollection()) .Where(p => !p.PropertyType.IsNonStringEnumerable())
.Where(p => !p.IsHiddenFromModel())
.Where(p => !p.Name.Contains("PreviousLog")) .Where(p => !p.Name.Contains("PreviousLog"))
.ToList(); .ToList();
} }
@@ -92,36 +93,39 @@ namespace MileageTraker.Web.Utility
(item, r) => (item, r) =>
GetProperties().Zip(CustomExtensions.GetNumbers().Skip(startCol), GetProperties().Zip(CustomExtensions.GetNumbers().Skip(startCol),
(p, c) => { (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 if (value is decimal) // assume that it's currency
formatString = "#,##0.00"; formatString = "#,##0.00";
if (value is DateTime && p.Name == "Date") if (value is DateTime && p.Name.Contains("Date"))
formatString = @"MM/DD/YYYY"; formatString = @"MM/DD/YYYY";
else if (value is DateTime) else if (value is DateTime)
formatString = @"MM/DD/YYYY hh:mm:ss"; formatString = @"MM/DD/YYYY hh:mm:ss";
if (p.Name == "GasPurchased") // format to the .000 place if (p.Name == "GasPurchased") // format to the .000 place
formatString = "#,##0.000"; formatString = "#,##0.000";
int intValue; // write int-looking values as numbers int intValue; // write int-looking values as numbers
if (value is string && int.TryParse((string) value, out intValue)) if (value is string && int.TryParse((string) value, out intValue))
value = intValue; value = intValue;
double doubleValue; // write double-looking values as numbers double doubleValue; // write double-looking values as numbers
if (value is string && double.TryParse((string) value, out doubleValue)) if (value is string && double.TryParse((string) value, out doubleValue))
value = doubleValue; value = doubleValue;
if (value is MileageLogTypeWrapper) if (value is MileageLogTypeWrapper)
value = ((MileageLogTypeWrapper) value).Enum.GetDisplayName(); value = ((MileageLogTypeWrapper) value).Enum.GetDisplayName();
var cell = formatString != null ? new Cell(value, formatString) : new Cell(value); if (value == null)
worksheet.Cells[r, c] = cell; 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(); }).ToList()).ToList();
} }
+1 -1
View File
@@ -21,7 +21,7 @@ namespace MileageTraker.Web.ViewModels
public int TripCount public int TripCount
{ {
get { return VehicleMileageItems.Sum(i => i.LogPairs.Count()); } get { return VehicleMileageItems.Sum(i => i.TripCount); }
} }
} }
} }
+1 -5
View File
@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq;
namespace MileageTraker.Web.ViewModels.Vehicle namespace MileageTraker.Web.ViewModels.Vehicle
{ {
@@ -11,8 +8,7 @@ namespace MileageTraker.Web.ViewModels.Vehicle
public int Miles { get; set; } public int Miles { get; set; }
public double GasPurchased { get; set; } public double GasPurchased { get; set; }
public string Prog { get; set; } public string Prog { get; set; }
public IEnumerable<Tuple<Models.Log, Models.Log>> LogPairs { get; set; } public int TripCount { get; set; }
public int TripCount { get { return LogPairs.Count(); } }
[DisplayFormat(DataFormatString = "{0:0.000}")] [DisplayFormat(DataFormatString = "{0:0.000}")]
public double MilesPerGallon { get { return GasPurchased == 0 || Miles == 0 ? 0 : Miles / GasPurchased; } } public double MilesPerGallon { get { return GasPurchased == 0 || Miles == 0 ? 0 : Miles / GasPurchased; } }
} }
+2 -5
View File
@@ -45,11 +45,8 @@
<td> <td>
@Html.DisplayTextFor(i => vehicleItem.TripCount) @Html.DisplayTextFor(i => vehicleItem.TripCount)
</td> </td>
<td @if (vehicleItem.LogPairs.Any(lp => lp.Item1 == null)){ <td>
@:class="ui-state-error" @Html.DisplayTextFor(i => vehicleItem.Miles)
}>
<span class="report-miles">@Html.DisplayTextFor(i => vehicleItem.Miles)</span>
@Html.Partial("LogsSummary", vehicleItem.LogPairs)
</td> </td>
<td> <td>
@Html.DisplayTextFor(i => vehicleItem.GasPurchased) @Html.DisplayTextFor(i => vehicleItem.GasPurchased)
+7 -5
View File
@@ -1,6 +1,7 @@
@model MileageTraker.Web.ViewModels.Vehicle.VehicleMileageViewModel @model MileageTraker.Web.ViewModels.Vehicle.VehicleMileageViewModel
@{ @{
ViewBag.Title = "Vehicle Mileage Report"; 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"); } @{ Html.RenderPartial("BackToLogs"); }
@@ -9,6 +10,10 @@
<h2><i class="fa fa-road"></i> @ViewBag.Title</h2> <h2><i class="fa fa-road"></i> @ViewBag.Title</h2>
<div class="btn-toolbar clearfix">
@Html.ActionLink("Export", "ExportMonthlyVehicleMileage", Model.Query, new { @class = "btn" })
</div>
@Html.DisplayFor(m => m.Query) @Html.DisplayFor(m => m.Query)
<table class="table"> <table class="table">
@@ -38,11 +43,8 @@
<td> <td>
@Html.DisplayTextFor(i => item.Prog) @Html.DisplayTextFor(i => item.Prog)
</td> </td>
<td @if (item.LogPairs.Any(lp => lp.Item1 == null)){ <td>
@:class="ui-state-error" @Html.DisplayTextFor(i => item.Miles)
}>
<span class="report-miles">@Html.DisplayTextFor(i => item.Miles) </span>
@Html.Partial("LogsSummary", item.LogPairs)
</td> </td>
<td> <td>
@Html.DisplayTextFor(i => item.GasPurchased) @Html.DisplayTextFor(i => item.GasPurchased)