Update existing reports, removing mileage drill down
This commit is contained in:
@@ -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
@@ -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()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,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; } }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user