Added data table

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD
2024-08-30 15:29:09 -06:00
parent 00bad986e5
commit 0be498d9bd
7 changed files with 167 additions and 4 deletions

View File

@@ -1140,6 +1140,11 @@ namespace CarCareTracker.Controllers
var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId); var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId);
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId);
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId); var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId);
var maxMileage = _vehicleLogic.GetMaxMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords);
var minMileage = _vehicleLogic.GetMinMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords);
var vehicleData = _dataAccess.GetVehicleById(vehicleId);
var userConfig = _config.GetUserConfig(User);
var totalDistanceTraveled = maxMileage - minMileage;
var viewModel = new ReportViewModel(); var viewModel = new ReportViewModel();
//get totalCostMakeUp //get totalCostMakeUp
viewModel.CostMakeUpForVehicle = new CostMakeUpForVehicle viewModel.CostMakeUpForVehicle = new CostMakeUpForVehicle
@@ -1148,7 +1153,9 @@ namespace CarCareTracker.Controllers
GasRecordSum = gasRecords.Sum(x => x.Cost), GasRecordSum = gasRecords.Sum(x => x.Cost),
CollisionRecordSum = collisionRecords.Sum(x => x.Cost), CollisionRecordSum = collisionRecords.Sum(x => x.Cost),
TaxRecordSum = taxRecords.Sum(x => x.Cost), TaxRecordSum = taxRecords.Sum(x => x.Cost),
UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost) UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost),
TotalDistance = totalDistanceTraveled,
DistanceUnit = vehicleData.UseHours ? "Per Hour" : userConfig.UseMPG ? "Per Mile" : "Per Kilometer"
}; };
//get costbymonth //get costbymonth
List<CostForVehicleByMonth> allCosts = StaticHelper.GetBaseLineCosts(); List<CostForVehicleByMonth> allCosts = StaticHelper.GetBaseLineCosts();
@@ -1205,7 +1212,6 @@ namespace CarCareTracker.Controllers
var collaborators = _userLogic.GetCollaboratorsForVehicle(vehicleId); var collaborators = _userLogic.GetCollaboratorsForVehicle(vehicleId);
viewModel.Collaborators = collaborators; viewModel.Collaborators = collaborators;
//get MPG per month. //get MPG per month.
var userConfig = _config.GetUserConfig(User);
var mileageData = _gasHelper.GetGasRecordViewModels(gasRecords, userConfig.UseMPG, userConfig.UseUKMPG); var mileageData = _gasHelper.GetGasRecordViewModels(gasRecords, userConfig.UseMPG, userConfig.UseUKMPG);
mileageData.RemoveAll(x => x.MilesPerGallon == default); mileageData.RemoveAll(x => x.MilesPerGallon == default);
var monthlyMileageData = StaticHelper.GetBaseLineCostsNoMonthName(); var monthlyMileageData = StaticHelper.GetBaseLineCostsNoMonthName();
@@ -1253,6 +1259,7 @@ namespace CarCareTracker.Controllers
var collisionRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId); var collisionRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId);
var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId); var taxRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId);
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId);
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId);
if (year != default) if (year != default)
{ {
serviceRecords.RemoveAll(x => x.Date.Year != year); serviceRecords.RemoveAll(x => x.Date.Year != year);
@@ -1260,14 +1267,22 @@ namespace CarCareTracker.Controllers
collisionRecords.RemoveAll(x => x.Date.Year != year); collisionRecords.RemoveAll(x => x.Date.Year != year);
taxRecords.RemoveAll(x => x.Date.Year != year); taxRecords.RemoveAll(x => x.Date.Year != year);
upgradeRecords.RemoveAll(x => x.Date.Year != year); upgradeRecords.RemoveAll(x => x.Date.Year != year);
odometerRecords.RemoveAll(x => x.Date.Year != year);
} }
var maxMileage = _vehicleLogic.GetMaxMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords);
var minMileage = _vehicleLogic.GetMinMileage(serviceRecords, collisionRecords, gasRecords, upgradeRecords, odometerRecords);
var totalDistanceTraveled = maxMileage - minMileage;
var vehicleData = _dataAccess.GetVehicleById(vehicleId);
var userConfig = _config.GetUserConfig(User);
var viewModel = new CostMakeUpForVehicle var viewModel = new CostMakeUpForVehicle
{ {
ServiceRecordSum = serviceRecords.Sum(x => x.Cost), ServiceRecordSum = serviceRecords.Sum(x => x.Cost),
GasRecordSum = gasRecords.Sum(x => x.Cost), GasRecordSum = gasRecords.Sum(x => x.Cost),
CollisionRecordSum = collisionRecords.Sum(x => x.Cost), CollisionRecordSum = collisionRecords.Sum(x => x.Cost),
TaxRecordSum = taxRecords.Sum(x => x.Cost), TaxRecordSum = taxRecords.Sum(x => x.Cost),
UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost) UpgradeRecordSum = upgradeRecords.Sum(x => x.Cost),
TotalDistance = totalDistanceTraveled,
DistanceUnit = vehicleData.UseHours ? "Per Hour" : userConfig.UseMPG ? "Per Mile" : "Per Kilometer"
}; };
return PartialView("_CostMakeUpReport", viewModel); return PartialView("_CostMakeUpReport", viewModel);
} }

View File

@@ -7,7 +7,9 @@ namespace CarCareTracker.Logic
public interface IVehicleLogic public interface IVehicleLogic
{ {
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 GetMinMileage(int vehicleId); int GetMinMileage(int vehicleId);
int GetMinMileage(List<ServiceRecord> serviceRecords, List<CollisionRecord> repairRecords, List<GasRecord> gasRecords, List<UpgradeRecord> upgradeRecords, List<OdometerRecord> odometerRecords);
bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId); bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId);
} }
public class VehicleLogic: IVehicleLogic public class VehicleLogic: IVehicleLogic
@@ -66,6 +68,31 @@ 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)
{
var numbersArray = new List<int>();
if (serviceRecords.Any())
{
numbersArray.Add(serviceRecords.Max(x => x.Mileage));
}
if (repairRecords.Any())
{
numbersArray.Add(repairRecords.Max(x => x.Mileage));
}
if (gasRecords.Any())
{
numbersArray.Add(gasRecords.Max(x => x.Mileage));
}
if (upgradeRecords.Any())
{
numbersArray.Add(upgradeRecords.Max(x => x.Mileage));
}
if (odometerRecords.Any())
{
numbersArray.Add(odometerRecords.Max(x => x.Mileage));
}
return numbersArray.Any() ? numbersArray.Max() : 0;
}
public int GetMinMileage(int vehicleId) public int GetMinMileage(int vehicleId)
{ {
var numbersArray = new List<int>(); var numbersArray = new List<int>();
@@ -96,6 +123,36 @@ 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)
{
var numbersArray = new List<int>();
var _serviceRecords = serviceRecords.Where(x => x.Mileage != default).ToList();
if (_serviceRecords.Any())
{
numbersArray.Add(_serviceRecords.Min(x => x.Mileage));
}
var _repairRecords = repairRecords.Where(x => x.Mileage != default).ToList();
if (_repairRecords.Any())
{
numbersArray.Add(_repairRecords.Min(x => x.Mileage));
}
var _gasRecords = gasRecords.Where(x => x.Mileage != default).ToList();
if (_gasRecords.Any())
{
numbersArray.Add(_gasRecords.Min(x => x.Mileage));
}
var _upgradeRecords = upgradeRecords.Where(x => x.Mileage != default).ToList();
if (_upgradeRecords.Any())
{
numbersArray.Add(_upgradeRecords.Min(x => x.Mileage));
}
var _odometerRecords = odometerRecords.Where(x => x.Mileage != default).ToList();
if (_odometerRecords.Any())
{
numbersArray.Add(_odometerRecords.Min(x => x.Mileage));
}
return numbersArray.Any() ? numbersArray.Min() : 0;
}
public bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId) public bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId)
{ {
var currentMileage = GetMaxMileage(vehicleId); var currentMileage = GetMaxMileage(vehicleId);

View File

@@ -2,10 +2,24 @@
{ {
public class CostMakeUpForVehicle public class CostMakeUpForVehicle
{ {
public string DistanceUnit { get; set; } = "Per Mile";
public int TotalDistance { get; set; }
public decimal ServiceRecordSum { get; set; } public decimal ServiceRecordSum { get; set; }
public decimal GasRecordSum { get; set; } public decimal GasRecordSum { get; set; }
public decimal TaxRecordSum { get; set; } public decimal TaxRecordSum { get; set; }
public decimal CollisionRecordSum { get; set; } public decimal CollisionRecordSum { get; set; }
public decimal UpgradeRecordSum { get; set; } public decimal UpgradeRecordSum { get; set; }
public decimal ServiceRecordPerMile { get { return TotalDistance != default ? ServiceRecordSum / TotalDistance : 0; } }
public decimal GasRecordPerMile { get { return TotalDistance != default ? GasRecordSum / TotalDistance : 0; } }
public decimal CollisionRecordPerMile { get { return TotalDistance != default ? CollisionRecordSum / TotalDistance : 0; } }
public decimal UpgradeRecordPerMile { get { return TotalDistance != default ? UpgradeRecordSum / TotalDistance : 0; } }
public decimal ServiceRecordPerMonth { get { return ServiceRecordSum / 12; } }
public decimal GasRecordPerMonth { get { return GasRecordSum / 12; } }
public decimal CollisionRecordPerMonth { get { return CollisionRecordSum / 12; } }
public decimal UpgradeRecordPerMonth { get { return UpgradeRecordSum / 12; } }
public decimal TaxRecordPerMonth { get { return TaxRecordSum / 12; } }
public decimal TotalPerMonth { get { return ServiceRecordPerMonth + CollisionRecordPerMonth + UpgradeRecordPerMonth + GasRecordPerMonth + TaxRecordPerMonth; } }
public decimal TotalPerMile { get { return ServiceRecordPerMile + CollisionRecordPerMile + UpgradeRecordPerMile + GasRecordPerMile; } }
public decimal TotalCost { get { return ServiceRecordSum + CollisionRecordSum + UpgradeRecordSum + GasRecordSum + TaxRecordSum; } }
} }
} }

View File

@@ -8,6 +8,66 @@
@model CostMakeUpForVehicle @model CostMakeUpForVehicle
@if (Model.CollisionRecordSum + Model.ServiceRecordSum + Model.GasRecordSum + Model.TaxRecordSum + Model.UpgradeRecordSum > 0) @if (Model.CollisionRecordSum + Model.ServiceRecordSum + Model.GasRecordSum + Model.TaxRecordSum + Model.UpgradeRecordSum > 0)
{ {
<div class="d-none" id="vehicleDataTableModalContentClone">
<div class="modal-header">
<h5 class="modal-title">@(translator.Translate(userLanguage, "Vehicle Cost Breakdown"))</h5>
<button type="button" class="btn-close" onclick="hideDataTable()" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-12">
<table class="table table-hover">
<thead class="sticky-top">
<tr class="d-flex">
<th scope="col" class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Type")</th>
<th scope="col" class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Monthly Average")</th>
<th scope="col" class="col-3 flex-grow-1">@translator.Translate(userLanguage, Model.DistanceUnit)</th>
<th scope="col" class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Total")</th>
</tr>
</thead>
<tbody>
<tr class="d-flex">
<td class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Service Records")</td>
<td class="col-3 flex-grow-1">@Model.ServiceRecordPerMonth.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.ServiceRecordPerMile.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.ServiceRecordSum.ToString("C2")</td>
</tr>
<tr class="d-flex">
<td class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Repairs")</td>
<td class="col-3 flex-grow-1">@Model.CollisionRecordPerMonth.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.CollisionRecordPerMile.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.CollisionRecordSum.ToString("C2")</td>
</tr>
<tr class="d-flex">
<td class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Upgrades")</td>
<td class="col-3 flex-grow-1">@Model.UpgradeRecordPerMonth.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.UpgradeRecordPerMile.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.UpgradeRecordSum.ToString("C2")</td>
</tr>
<tr class="d-flex">
<td class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Fuel")</td>
<td class="col-3 flex-grow-1">@Model.GasRecordPerMonth.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.GasRecordPerMile.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.GasRecordSum.ToString("C2")</td>
</tr>
<tr class="d-flex">
<td class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Taxes")</td>
<td class="col-3 flex-grow-1">@Model.TaxRecordPerMonth.ToString("C2")</td>
<td class="col-3 flex-grow-1">---</td>
<td class="col-3 flex-grow-1">@Model.TaxRecordSum.ToString("C2")</td>
</tr>
<tr class="d-flex">
<td class="col-3 flex-grow-1">@translator.Translate(userLanguage, "Total")</td>
<td class="col-3 flex-grow-1">@Model.TotalPerMonth.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.TotalPerMile.ToString("C2")</td>
<td class="col-3 flex-grow-1">@Model.TotalCost.ToString("C2")</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<canvas id="pie-chart"></canvas> <canvas id="pie-chart"></canvas>
<script> <script>
renderChart(); renderChart();
@@ -36,6 +96,9 @@
] ]
}, },
options: { options: {
onClick: (e) => {
showDataTable();
},
plugins: { plugins: {
legend: { legend: {
position: "bottom", position: "bottom",

View File

@@ -146,6 +146,13 @@
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" data-bs-focus="false" id="vehicleDataTableModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content" id="vehicleDataTableModalContent">
</div>
</div>
</div>
<div id="vehicleHistoryReport" class="showOnPrint"></div> <div id="vehicleHistoryReport" class="showOnPrint"></div>
<script> <script>

File diff suppressed because one or more lines are too long

View File

@@ -180,6 +180,13 @@ function exportAttachments() {
} }
}); });
} }
function showDataTable() {
$("#vehicleDataTableModalContent").html($("#vehicleDataTableModalContentClone").html());
$("#vehicleDataTableModal").modal('show');
}
function hideDataTable() {
$("#vehicleDataTableModal").modal('hide');
}
function showGlobalSearch() { function showGlobalSearch() {
$('#globalSearchModal').modal('show'); $('#globalSearchModal').modal('show');
} }