mirror of
https://github.com/hargata/lubelog.git
synced 2025-12-11 04:37:03 -06:00
Allow users to set which dashboard metric they want to see in the garage.
This commit is contained in:
parent
e6eb2b473c
commit
ec55c95c71
@ -59,22 +59,49 @@ namespace CarCareTracker.Controllers
|
|||||||
{
|
{
|
||||||
vehiclesStored = _userLogic.FilterUserVehicles(vehiclesStored, GetUserID());
|
vehiclesStored = _userLogic.FilterUserVehicles(vehiclesStored, GetUserID());
|
||||||
}
|
}
|
||||||
var vehicleViewModels = vehiclesStored.Select(x => new VehicleViewModel
|
var vehicleViewModels = vehiclesStored.Select(x => {
|
||||||
{
|
var vehicleVM = new VehicleViewModel
|
||||||
Id = x.Id,
|
{
|
||||||
ImageLocation = x.ImageLocation,
|
Id = x.Id,
|
||||||
Year = x.Year,
|
ImageLocation = x.ImageLocation,
|
||||||
Make = x.Make,
|
Year = x.Year,
|
||||||
Model = x.Model,
|
Make = x.Make,
|
||||||
LicensePlate = x.LicensePlate,
|
Model = x.Model,
|
||||||
SoldDate = x.SoldDate,
|
LicensePlate = x.LicensePlate,
|
||||||
IsElectric = x.IsElectric,
|
SoldDate = x.SoldDate,
|
||||||
IsDiesel = x.IsDiesel,
|
IsElectric = x.IsElectric,
|
||||||
UseHours = x.UseHours,
|
IsDiesel = x.IsDiesel,
|
||||||
ExtraFields = x.ExtraFields,
|
UseHours = x.UseHours,
|
||||||
Tags = x.Tags,
|
ExtraFields = x.ExtraFields,
|
||||||
LastReportedMileage = _vehicleLogic.GetMaxMileage(x.Id),
|
Tags = x.Tags,
|
||||||
HasReminders = _vehicleLogic.GetVehicleHasUrgentOrPastDueReminders(x.Id)
|
DashboardMetrics = x.DashboardMetrics
|
||||||
|
};
|
||||||
|
//dashboard metrics
|
||||||
|
if (x.DashboardMetrics.Any())
|
||||||
|
{
|
||||||
|
var vehicleRecords = _vehicleLogic.GetVehicleRecords(x.Id);
|
||||||
|
var userConfig = _config.GetUserConfig(User);
|
||||||
|
var distanceUnit = x.UseHours ? "h" : userConfig.UseMPG ? "mi." : "km";
|
||||||
|
if (vehicleVM.DashboardMetrics.Contains(DashboardMetric.Default))
|
||||||
|
{
|
||||||
|
vehicleVM.LastReportedMileage = _vehicleLogic.GetMaxMileage(vehicleRecords);
|
||||||
|
vehicleVM.HasReminders = _vehicleLogic.GetVehicleHasUrgentOrPastDueReminders(x.Id, vehicleVM.LastReportedMileage);
|
||||||
|
}
|
||||||
|
if (vehicleVM.DashboardMetrics.Contains(DashboardMetric.CostPerMile))
|
||||||
|
{
|
||||||
|
var vehicleTotalCost = _vehicleLogic.GetVehicleTotalCost(vehicleRecords);
|
||||||
|
var maxMileage = _vehicleLogic.GetMaxMileage(vehicleRecords);
|
||||||
|
var minMileage = _vehicleLogic.GetMinMileage(vehicleRecords);
|
||||||
|
var totalDistance = maxMileage - minMileage;
|
||||||
|
vehicleVM.CostPerMile = vehicleTotalCost / totalDistance;
|
||||||
|
vehicleVM.DistanceUnit = distanceUnit;
|
||||||
|
}
|
||||||
|
if (vehicleVM.DashboardMetrics.Contains(DashboardMetric.TotalCost))
|
||||||
|
{
|
||||||
|
vehicleVM.TotalCost = _vehicleLogic.GetVehicleTotalCost(vehicleRecords);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vehicleVM;
|
||||||
}).ToList();
|
}).ToList();
|
||||||
return PartialView("_GarageDisplay", vehicleViewModels);
|
return PartialView("_GarageDisplay", vehicleViewModels);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1275,12 +1275,13 @@ namespace CarCareTracker.Controllers
|
|||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult GetCostTableForVehicle(int vehicleId, int year = 0)
|
public IActionResult GetCostTableForVehicle(int vehicleId, int year = 0)
|
||||||
{
|
{
|
||||||
var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId);
|
var vehicleRecords = _vehicleLogic.GetVehicleRecords(vehicleId);
|
||||||
var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId);
|
var serviceRecords = vehicleRecords.ServiceRecords;
|
||||||
var collisionRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId);
|
var gasRecords = vehicleRecords.GasRecords;
|
||||||
var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId);
|
var collisionRecords = vehicleRecords.CollisionRecords;
|
||||||
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId);
|
var taxRecords = vehicleRecords.TaxRecords;
|
||||||
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId);
|
var upgradeRecords = vehicleRecords.UpgradeRecords;
|
||||||
|
var odometerRecords = vehicleRecords.OdometerRecords;
|
||||||
if (year != default)
|
if (year != default)
|
||||||
{
|
{
|
||||||
serviceRecords.RemoveAll(x => x.Date.Year != year);
|
serviceRecords.RemoveAll(x => x.Date.Year != year);
|
||||||
@ -1290,8 +1291,8 @@ namespace CarCareTracker.Controllers
|
|||||||
upgradeRecords.RemoveAll(x => x.Date.Year != year);
|
upgradeRecords.RemoveAll(x => x.Date.Year != year);
|
||||||
odometerRecords.RemoveAll(x => x.Date.Year != year);
|
odometerRecords.RemoveAll(x => x.Date.Year != year);
|
||||||
}
|
}
|
||||||
var maxMileage = _vehicleLogic.GetMaxMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords);
|
var maxMileage = _vehicleLogic.GetMaxMileage(vehicleRecords);
|
||||||
var minMileage = _vehicleLogic.GetMinMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords);
|
var minMileage = _vehicleLogic.GetMinMileage(vehicleRecords);
|
||||||
var vehicleData = _dataAccess.GetVehicleById(vehicleId);
|
var vehicleData = _dataAccess.GetVehicleById(vehicleId);
|
||||||
var userConfig = _config.GetUserConfig(User);
|
var userConfig = _config.GetUserConfig(User);
|
||||||
var totalDistanceTraveled = maxMileage - minMileage;
|
var totalDistanceTraveled = maxMileage - minMileage;
|
||||||
|
|||||||
9
Enum/DashboardMetric.cs
Normal file
9
Enum/DashboardMetric.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
namespace CarCareTracker.Models
|
||||||
|
{
|
||||||
|
public enum DashboardMetric
|
||||||
|
{
|
||||||
|
Default = 0,
|
||||||
|
TotalCost = 1,
|
||||||
|
CostPerMile = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -6,12 +6,14 @@ namespace CarCareTracker.Logic
|
|||||||
{
|
{
|
||||||
public interface IVehicleLogic
|
public interface IVehicleLogic
|
||||||
{
|
{
|
||||||
|
VehicleRecords GetVehicleRecords(int vehicleId);
|
||||||
|
decimal GetVehicleTotalCost(VehicleRecords vehicleRecords);
|
||||||
int GetMaxMileage(int vehicleId);
|
int GetMaxMileage(int vehicleId);
|
||||||
int GetMaxMileage(List<ServiceRecord> serviceRecords, List<CollisionRecord> repairRecords, List<GasRecord> gasRecords, List<UpgradeRecord> upgradeRecords, List<OdometerRecord> odometerRecords);
|
int GetMaxMileage(VehicleRecords vehicleRecords);
|
||||||
int GetMinMileage(int vehicleId);
|
int GetMinMileage(int vehicleId);
|
||||||
int GetMinMileage(List<ServiceRecord> serviceRecords, List<CollisionRecord> repairRecords, List<GasRecord> gasRecords, List<UpgradeRecord> upgradeRecords, List<OdometerRecord> odometerRecords);
|
int GetMinMileage(VehicleRecords vehicleRecords);
|
||||||
int GetOwnershipDays(string purchaseDate, string soldDate, List<ServiceRecord> serviceRecords, List<CollisionRecord> repairRecords, List<GasRecord> gasRecords, List<UpgradeRecord> upgradeRecords, List<OdometerRecord> odometerRecords, List<TaxRecord> taxRecords);
|
int GetOwnershipDays(string purchaseDate, string soldDate, List<ServiceRecord> serviceRecords, List<CollisionRecord> repairRecords, List<GasRecord> gasRecords, List<UpgradeRecord> upgradeRecords, List<OdometerRecord> odometerRecords, List<TaxRecord> taxRecords);
|
||||||
bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId);
|
bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId, int currentMileage);
|
||||||
}
|
}
|
||||||
public class VehicleLogic: IVehicleLogic
|
public class VehicleLogic: IVehicleLogic
|
||||||
{
|
{
|
||||||
@ -19,6 +21,7 @@ namespace CarCareTracker.Logic
|
|||||||
private readonly IGasRecordDataAccess _gasRecordDataAccess;
|
private readonly IGasRecordDataAccess _gasRecordDataAccess;
|
||||||
private readonly ICollisionRecordDataAccess _collisionRecordDataAccess;
|
private readonly ICollisionRecordDataAccess _collisionRecordDataAccess;
|
||||||
private readonly IUpgradeRecordDataAccess _upgradeRecordDataAccess;
|
private readonly IUpgradeRecordDataAccess _upgradeRecordDataAccess;
|
||||||
|
private readonly ITaxRecordDataAccess _taxRecordDataAccess;
|
||||||
private readonly IOdometerRecordDataAccess _odometerRecordDataAccess;
|
private readonly IOdometerRecordDataAccess _odometerRecordDataAccess;
|
||||||
private readonly IReminderRecordDataAccess _reminderRecordDataAccess;
|
private readonly IReminderRecordDataAccess _reminderRecordDataAccess;
|
||||||
private readonly IReminderHelper _reminderHelper;
|
private readonly IReminderHelper _reminderHelper;
|
||||||
@ -27,6 +30,7 @@ namespace CarCareTracker.Logic
|
|||||||
IGasRecordDataAccess gasRecordDataAccess,
|
IGasRecordDataAccess gasRecordDataAccess,
|
||||||
ICollisionRecordDataAccess collisionRecordDataAccess,
|
ICollisionRecordDataAccess collisionRecordDataAccess,
|
||||||
IUpgradeRecordDataAccess upgradeRecordDataAccess,
|
IUpgradeRecordDataAccess upgradeRecordDataAccess,
|
||||||
|
ITaxRecordDataAccess taxRecordDataAccess,
|
||||||
IOdometerRecordDataAccess odometerRecordDataAccess,
|
IOdometerRecordDataAccess odometerRecordDataAccess,
|
||||||
IReminderRecordDataAccess reminderRecordDataAccess,
|
IReminderRecordDataAccess reminderRecordDataAccess,
|
||||||
IReminderHelper reminderHelper
|
IReminderHelper reminderHelper
|
||||||
@ -35,10 +39,32 @@ namespace CarCareTracker.Logic
|
|||||||
_gasRecordDataAccess = gasRecordDataAccess;
|
_gasRecordDataAccess = gasRecordDataAccess;
|
||||||
_collisionRecordDataAccess = collisionRecordDataAccess;
|
_collisionRecordDataAccess = collisionRecordDataAccess;
|
||||||
_upgradeRecordDataAccess = upgradeRecordDataAccess;
|
_upgradeRecordDataAccess = upgradeRecordDataAccess;
|
||||||
|
_taxRecordDataAccess = taxRecordDataAccess;
|
||||||
_odometerRecordDataAccess = odometerRecordDataAccess;
|
_odometerRecordDataAccess = odometerRecordDataAccess;
|
||||||
_reminderRecordDataAccess = reminderRecordDataAccess;
|
_reminderRecordDataAccess = reminderRecordDataAccess;
|
||||||
_reminderHelper = reminderHelper;
|
_reminderHelper = reminderHelper;
|
||||||
}
|
}
|
||||||
|
public VehicleRecords GetVehicleRecords(int vehicleId)
|
||||||
|
{
|
||||||
|
return new VehicleRecords
|
||||||
|
{
|
||||||
|
ServiceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId),
|
||||||
|
GasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId),
|
||||||
|
CollisionRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId),
|
||||||
|
TaxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId),
|
||||||
|
UpgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId),
|
||||||
|
OdometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
public decimal GetVehicleTotalCost(VehicleRecords vehicleRecords)
|
||||||
|
{
|
||||||
|
var serviceRecordSum = vehicleRecords.ServiceRecords.Sum(x => x.Cost);
|
||||||
|
var repairRecordSum = vehicleRecords.CollisionRecords.Sum(x => x.Cost);
|
||||||
|
var upgradeRecordSum = vehicleRecords.UpgradeRecords.Sum(x => x.Cost);
|
||||||
|
var taxRecordSum = vehicleRecords.TaxRecords.Sum(x => x.Cost);
|
||||||
|
var gasRecordSum = vehicleRecords.GasRecords.Sum(x => x.Cost);
|
||||||
|
return serviceRecordSum + repairRecordSum + upgradeRecordSum + taxRecordSum + gasRecordSum;
|
||||||
|
}
|
||||||
public int GetMaxMileage(int vehicleId)
|
public int GetMaxMileage(int vehicleId)
|
||||||
{
|
{
|
||||||
var numbersArray = new List<int>();
|
var numbersArray = new List<int>();
|
||||||
@ -69,28 +95,28 @@ namespace CarCareTracker.Logic
|
|||||||
}
|
}
|
||||||
return numbersArray.Any() ? numbersArray.Max() : 0;
|
return numbersArray.Any() ? numbersArray.Max() : 0;
|
||||||
}
|
}
|
||||||
public int GetMaxMileage(List<ServiceRecord> serviceRecords, List<CollisionRecord> repairRecords, List<GasRecord> gasRecords, List<UpgradeRecord> upgradeRecords, List<OdometerRecord> odometerRecords)
|
public int GetMaxMileage(VehicleRecords vehicleRecords)
|
||||||
{
|
{
|
||||||
var numbersArray = new List<int>();
|
var numbersArray = new List<int>();
|
||||||
if (serviceRecords.Any())
|
if (vehicleRecords.ServiceRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(serviceRecords.Max(x => x.Mileage));
|
numbersArray.Add(vehicleRecords.ServiceRecords.Max(x => x.Mileage));
|
||||||
}
|
}
|
||||||
if (repairRecords.Any())
|
if (vehicleRecords.CollisionRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(repairRecords.Max(x => x.Mileage));
|
numbersArray.Add(vehicleRecords.CollisionRecords.Max(x => x.Mileage));
|
||||||
}
|
}
|
||||||
if (gasRecords.Any())
|
if (vehicleRecords.GasRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(gasRecords.Max(x => x.Mileage));
|
numbersArray.Add(vehicleRecords.GasRecords.Max(x => x.Mileage));
|
||||||
}
|
}
|
||||||
if (upgradeRecords.Any())
|
if (vehicleRecords.UpgradeRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(upgradeRecords.Max(x => x.Mileage));
|
numbersArray.Add(vehicleRecords.UpgradeRecords.Max(x => x.Mileage));
|
||||||
}
|
}
|
||||||
if (odometerRecords.Any())
|
if (vehicleRecords.OdometerRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(odometerRecords.Max(x => x.Mileage));
|
numbersArray.Add(vehicleRecords.OdometerRecords.Max(x => x.Mileage));
|
||||||
}
|
}
|
||||||
return numbersArray.Any() ? numbersArray.Max() : 0;
|
return numbersArray.Any() ? numbersArray.Max() : 0;
|
||||||
}
|
}
|
||||||
@ -124,30 +150,30 @@ namespace CarCareTracker.Logic
|
|||||||
}
|
}
|
||||||
return numbersArray.Any() ? numbersArray.Min() : 0;
|
return numbersArray.Any() ? numbersArray.Min() : 0;
|
||||||
}
|
}
|
||||||
public int GetMinMileage(List<ServiceRecord> serviceRecords, List<CollisionRecord> repairRecords, List<GasRecord> gasRecords, List<UpgradeRecord> upgradeRecords, List<OdometerRecord> odometerRecords)
|
public int GetMinMileage(VehicleRecords vehicleRecords)
|
||||||
{
|
{
|
||||||
var numbersArray = new List<int>();
|
var numbersArray = new List<int>();
|
||||||
var _serviceRecords = serviceRecords.Where(x => x.Mileage != default).ToList();
|
var _serviceRecords = vehicleRecords.ServiceRecords.Where(x => x.Mileage != default).ToList();
|
||||||
if (_serviceRecords.Any())
|
if (_serviceRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(_serviceRecords.Min(x => x.Mileage));
|
numbersArray.Add(_serviceRecords.Min(x => x.Mileage));
|
||||||
}
|
}
|
||||||
var _repairRecords = repairRecords.Where(x => x.Mileage != default).ToList();
|
var _repairRecords = vehicleRecords.CollisionRecords.Where(x => x.Mileage != default).ToList();
|
||||||
if (_repairRecords.Any())
|
if (_repairRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(_repairRecords.Min(x => x.Mileage));
|
numbersArray.Add(_repairRecords.Min(x => x.Mileage));
|
||||||
}
|
}
|
||||||
var _gasRecords = gasRecords.Where(x => x.Mileage != default).ToList();
|
var _gasRecords = vehicleRecords.GasRecords.Where(x => x.Mileage != default).ToList();
|
||||||
if (_gasRecords.Any())
|
if (_gasRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(_gasRecords.Min(x => x.Mileage));
|
numbersArray.Add(_gasRecords.Min(x => x.Mileage));
|
||||||
}
|
}
|
||||||
var _upgradeRecords = upgradeRecords.Where(x => x.Mileage != default).ToList();
|
var _upgradeRecords = vehicleRecords.UpgradeRecords.Where(x => x.Mileage != default).ToList();
|
||||||
if (_upgradeRecords.Any())
|
if (_upgradeRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(_upgradeRecords.Min(x => x.Mileage));
|
numbersArray.Add(_upgradeRecords.Min(x => x.Mileage));
|
||||||
}
|
}
|
||||||
var _odometerRecords = odometerRecords.Where(x => x.Mileage != default).ToList();
|
var _odometerRecords = vehicleRecords.OdometerRecords.Where(x => x.Mileage != default).ToList();
|
||||||
if (_odometerRecords.Any())
|
if (_odometerRecords.Any())
|
||||||
{
|
{
|
||||||
numbersArray.Add(_odometerRecords.Min(x => x.Mileage));
|
numbersArray.Add(_odometerRecords.Min(x => x.Mileage));
|
||||||
@ -186,9 +212,8 @@ namespace CarCareTracker.Logic
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId)
|
public bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId, int currentMileage)
|
||||||
{
|
{
|
||||||
var currentMileage = GetMaxMileage(vehicleId);
|
|
||||||
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
||||||
var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now);
|
var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now);
|
||||||
return results.Any(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue);
|
return results.Any(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue);
|
||||||
|
|||||||
@ -14,13 +14,14 @@
|
|||||||
public decimal GasRecordPerMile { get { return TotalDistance != default ? GasRecordSum / TotalDistance : 0; } }
|
public decimal GasRecordPerMile { get { return TotalDistance != default ? GasRecordSum / TotalDistance : 0; } }
|
||||||
public decimal CollisionRecordPerMile { get { return TotalDistance != default ? CollisionRecordSum / TotalDistance : 0; } }
|
public decimal CollisionRecordPerMile { get { return TotalDistance != default ? CollisionRecordSum / TotalDistance : 0; } }
|
||||||
public decimal UpgradeRecordPerMile { get { return TotalDistance != default ? UpgradeRecordSum / TotalDistance : 0; } }
|
public decimal UpgradeRecordPerMile { get { return TotalDistance != default ? UpgradeRecordSum / TotalDistance : 0; } }
|
||||||
public decimal ServiceRecordPerMonth { get { return NumberOfDays != default ? ServiceRecordSum / NumberOfDays : 0; } }
|
public decimal TaxRecordPerMile { get { return TotalDistance != default ? TaxRecordSum / TotalDistance : 0; } }
|
||||||
public decimal GasRecordPerMonth { get { return NumberOfDays != default ? GasRecordSum / NumberOfDays : 0; } }
|
public decimal ServiceRecordPerDay { get { return NumberOfDays != default ? ServiceRecordSum / NumberOfDays : 0; } }
|
||||||
public decimal CollisionRecordPerMonth { get { return NumberOfDays != default ? CollisionRecordSum / NumberOfDays : 0; } }
|
public decimal GasRecordPerDay { get { return NumberOfDays != default ? GasRecordSum / NumberOfDays : 0; } }
|
||||||
public decimal UpgradeRecordPerMonth { get { return NumberOfDays != default ? UpgradeRecordSum / NumberOfDays : 0; } }
|
public decimal CollisionRecordPerDay { get { return NumberOfDays != default ? CollisionRecordSum / NumberOfDays : 0; } }
|
||||||
public decimal TaxRecordPerMonth { get { return NumberOfDays != default ? TaxRecordSum / NumberOfDays : 0; } }
|
public decimal UpgradeRecordPerDay { get { return NumberOfDays != default ? UpgradeRecordSum / NumberOfDays : 0; } }
|
||||||
public decimal TotalPerMonth { get { return ServiceRecordPerMonth + CollisionRecordPerMonth + UpgradeRecordPerMonth + GasRecordPerMonth + TaxRecordPerMonth; } }
|
public decimal TaxRecordPerDay { get { return NumberOfDays != default ? TaxRecordSum / NumberOfDays : 0; } }
|
||||||
public decimal TotalPerMile { get { return ServiceRecordPerMile + CollisionRecordPerMile + UpgradeRecordPerMile + GasRecordPerMile; } }
|
public decimal TotalPerDay { get { return ServiceRecordPerDay + CollisionRecordPerDay + UpgradeRecordPerDay + GasRecordPerDay + TaxRecordPerDay; } }
|
||||||
|
public decimal TotalPerMile { get { return ServiceRecordPerMile + CollisionRecordPerMile + UpgradeRecordPerMile + GasRecordPerMile + TaxRecordPerMile; } }
|
||||||
public decimal TotalCost { get { return ServiceRecordSum + CollisionRecordSum + UpgradeRecordSum + GasRecordSum + TaxRecordSum; } }
|
public decimal TotalCost { get { return ServiceRecordSum + CollisionRecordSum + UpgradeRecordSum + GasRecordSum + TaxRecordSum; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
Models/Shared/VehicleRecords.cs
Normal file
12
Models/Shared/VehicleRecords.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace CarCareTracker.Models
|
||||||
|
{
|
||||||
|
public class VehicleRecords
|
||||||
|
{
|
||||||
|
public List<ServiceRecord> ServiceRecords { get; set; } = new List<ServiceRecord>();
|
||||||
|
public List<CollisionRecord> CollisionRecords { get; set; } = new List<CollisionRecord>();
|
||||||
|
public List<UpgradeRecord> UpgradeRecords { get; set; } = new List<UpgradeRecord>();
|
||||||
|
public List<GasRecord> GasRecords { get; set; } = new List<GasRecord>();
|
||||||
|
public List<TaxRecord> TaxRecords { get; set; } = new List<TaxRecord>();
|
||||||
|
public List<OdometerRecord> OdometerRecords { get; set; } = new List<OdometerRecord>();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -26,5 +26,6 @@
|
|||||||
/// Primarily used for vehicles where the odometer does not reflect actual mileage.
|
/// Primarily used for vehicles where the odometer does not reflect actual mileage.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string OdometerDifference { get; set; } = "0";
|
public string OdometerDifference { get; set; } = "0";
|
||||||
|
public List<DashboardMetric> DashboardMetrics { get; set; } = new List<DashboardMetric>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,12 @@
|
|||||||
public bool UseHours { get; set; } = false;
|
public bool UseHours { get; set; } = false;
|
||||||
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
||||||
public List<string> Tags { get; set; } = new List<string>();
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
public int LastReportedMileage;
|
//Dashboard Metric Attributes
|
||||||
public bool HasReminders = false;
|
public List<DashboardMetric> DashboardMetrics { get; set; } = new List<DashboardMetric>();
|
||||||
|
public int LastReportedMileage { get; set; }
|
||||||
|
public bool HasReminders { get; set; } = false;
|
||||||
|
public decimal CostPerMile { get; set; }
|
||||||
|
public decimal TotalCost { get; set; }
|
||||||
|
public string DistanceUnit { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,21 +36,40 @@
|
|||||||
@if (!string.IsNullOrWhiteSpace(vehicle.SoldDate))
|
@if (!string.IsNullOrWhiteSpace(vehicle.SoldDate))
|
||||||
{
|
{
|
||||||
<div class="vehicle-sold-banner"><p class='display-6 mb-0'>@translator.Translate(userLanguage, "SOLD")</p></div>
|
<div class="vehicle-sold-banner"><p class='display-6 mb-0'>@translator.Translate(userLanguage, "SOLD")</p></div>
|
||||||
} else if (vehicle.LastReportedMileage != default)
|
} else if (vehicle.DashboardMetrics.Any())
|
||||||
{
|
{
|
||||||
<div class="vehicle-sold-banner">
|
<div class="vehicle-sold-banner">
|
||||||
<div class="d-flex justify-content-between">
|
@if (vehicle.DashboardMetrics.Contains(DashboardMetric.Default) && vehicle.LastReportedMileage != default)
|
||||||
<div>
|
{
|
||||||
<span class="ms-2"><i class="bi bi-speedometer me-2"></i>@vehicle.LastReportedMileage.ToString("N0")</span>
|
|
||||||
</div>
|
<div class="d-flex justify-content-between">
|
||||||
@if (vehicle.HasReminders)
|
|
||||||
{
|
|
||||||
<div>
|
<div>
|
||||||
<span class="me-2"><i class="bi bi bi-bell-fill text-warning"></i></span>
|
<span class="ms-2"><i class="bi bi-speedometer me-2"></i>@vehicle.LastReportedMileage.ToString("N0")</span>
|
||||||
</div>
|
</div>
|
||||||
}
|
@if (vehicle.HasReminders)
|
||||||
</div>
|
{
|
||||||
<span></span>
|
<div>
|
||||||
|
<span class="me-2"><i class="bi bi bi-bell-fill text-warning"></i></span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@if (vehicle.DashboardMetrics.Contains(DashboardMetric.CostPerMile) && vehicle.CostPerMile != default)
|
||||||
|
{
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<div>
|
||||||
|
<span class="ms-2"><i class="bi bi-cash-coin me-2"></i>@($"{vehicle.CostPerMile.ToString("C2")}/{vehicle.DistanceUnit}")</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@if (vehicle.DashboardMetrics.Contains(DashboardMetric.TotalCost) && vehicle.TotalCost != default)
|
||||||
|
{
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<div>
|
||||||
|
<span class="ms-2"><i class="bi bi-cash-coin me-2"></i>@($"{vehicle.TotalCost.ToString("C2")}")</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
|||||||
@ -87,6 +87,29 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="accordion accordion-flush" id="vehicleModalMetricAccordion">
|
||||||
|
<div class="accordion-item">
|
||||||
|
<div class="accordion-header">
|
||||||
|
<button class="accordion-button skinny collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseMetricInfo">
|
||||||
|
@translator.Translate(userLanguage, "Dashboard Metrics")
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div id="collapseMetricInfo" class="accordion-collapse collapse" data-bs-parent="#vehicleModalMetricAccordion">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" role="switch" id="inputMetricDefault" value="@DashboardMetric.Default" checked="@Model.DashboardMetrics.Contains(DashboardMetric.Default)">
|
||||||
|
<label class="form-check-label" for="inputMetricDefault">@translator.Translate(userLanguage, "Last Odometer")</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" role="switch" id="inputMetricCostPerMile" value="@DashboardMetric.CostPerMile" checked="@Model.DashboardMetrics.Contains(DashboardMetric.CostPerMile)">
|
||||||
|
<label class="form-check-label" for="inputMetricCostPerMile">@translator.Translate(userLanguage, "Total Cost / Total Distance Driven")</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" role="switch" id="inputMetricTotalCost" value="@DashboardMetric.TotalCost" checked="@Model.DashboardMetrics.Contains(DashboardMetric.TotalCost)">
|
||||||
|
<label class="form-check-label" for="inputMetricTotalCost">@translator.Translate(userLanguage, "Total Cost")</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<label for="inputTag">@translator.Translate(userLanguage, "Tags(optional)")</label>
|
<label for="inputTag">@translator.Translate(userLanguage, "Tags(optional)")</label>
|
||||||
<select multiple class="form-select" id="inputTag">
|
<select multiple class="form-select" id="inputTag">
|
||||||
@foreach (string tag in Model.Tags)
|
@foreach (string tag in Model.Tags)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -48,6 +48,9 @@ function saveVehicle(isEdit) {
|
|||||||
var vehicleOdometerDifference = parseInt(globalParseFloat($("#inputOdometerDifference").val())).toString();
|
var vehicleOdometerDifference = parseInt(globalParseFloat($("#inputOdometerDifference").val())).toString();
|
||||||
var vehiclePurchasePrice = $("#inputPurchasePrice").val();
|
var vehiclePurchasePrice = $("#inputPurchasePrice").val();
|
||||||
var vehicleSoldPrice = $("#inputSoldPrice").val();
|
var vehicleSoldPrice = $("#inputSoldPrice").val();
|
||||||
|
var vehicleDashboardMetrics = $("#collapseMetricInfo :checked").map(function () {
|
||||||
|
return this.value;
|
||||||
|
}).toArray();
|
||||||
var extraFields = getAndValidateExtraFields(true);
|
var extraFields = getAndValidateExtraFields(true);
|
||||||
//validate
|
//validate
|
||||||
var hasError = false;
|
var hasError = false;
|
||||||
@ -130,7 +133,8 @@ function saveVehicle(isEdit) {
|
|||||||
odometerMultiplier: vehicleOdometerMultiplier,
|
odometerMultiplier: vehicleOdometerMultiplier,
|
||||||
odometerDifference: vehicleOdometerDifference,
|
odometerDifference: vehicleOdometerDifference,
|
||||||
purchasePrice: vehiclePurchasePrice,
|
purchasePrice: vehiclePurchasePrice,
|
||||||
soldPrice: vehicleSoldPrice
|
soldPrice: vehicleSoldPrice,
|
||||||
|
dashboardMetrics: vehicleDashboardMetrics
|
||||||
}, function (data) {
|
}, function (data) {
|
||||||
if (data) {
|
if (data) {
|
||||||
if (!isEdit) {
|
if (!isEdit) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user