diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index 297b1e6..d98bf7a 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -832,7 +832,7 @@ namespace CarCareTracker.Controllers { foreach(int reminderRecordId in serviceRecord.ReminderRecordId) { - PushbackRecurringReminderRecordWithChecks(reminderRecordId); + PushbackRecurringReminderRecordWithChecks(reminderRecordId, DateTime.Parse(serviceRecord.Date), serviceRecord.Mileage); } } var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord()); @@ -924,7 +924,7 @@ namespace CarCareTracker.Controllers { foreach (int reminderRecordId in collisionRecord.ReminderRecordId) { - PushbackRecurringReminderRecordWithChecks(reminderRecordId); + PushbackRecurringReminderRecordWithChecks(reminderRecordId, DateTime.Parse(collisionRecord.Date), collisionRecord.Mileage); } } var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord()); @@ -1038,7 +1038,7 @@ namespace CarCareTracker.Controllers { foreach (int reminderRecordId in taxRecord.ReminderRecordId) { - PushbackRecurringReminderRecordWithChecks(reminderRecordId); + PushbackRecurringReminderRecordWithChecks(reminderRecordId, DateTime.Parse(taxRecord.Date), null); } } var result = _taxRecordDataAccess.SaveTaxRecordToVehicle(taxRecord.ToTaxRecord()); @@ -1336,19 +1336,36 @@ namespace CarCareTracker.Controllers if (!string.IsNullOrWhiteSpace(vehicleHistory.VehicleData.PurchaseDate)) { var endDate = vehicleHistory.VehicleData.SoldDate; + int daysOwned = 0; if (string.IsNullOrWhiteSpace(endDate)) { endDate = DateTime.Now.ToShortDateString(); } try { - vehicleHistory.DaysOwned = (DateTime.Parse(endDate) - DateTime.Parse(vehicleHistory.VehicleData.PurchaseDate)).Days.ToString("N0"); + daysOwned = (DateTime.Parse(endDate) - DateTime.Parse(vehicleHistory.VehicleData.PurchaseDate)).Days; + vehicleHistory.DaysOwned = daysOwned.ToString("N0"); } catch (Exception ex) { _logger.LogError(ex.Message); vehicleHistory.DaysOwned = string.Empty; } + //calculate depreciation + var totalDepreciation = vehicleHistory.VehicleData.PurchasePrice - vehicleHistory.VehicleData.SoldPrice; + //we only calculate depreciation if a sold price is provided. + if (totalDepreciation != default && vehicleHistory.VehicleData.SoldPrice != default) + { + vehicleHistory.TotalDepreciation = totalDepreciation; + if (daysOwned != default) + { + vehicleHistory.DepreciationPerDay = Math.Abs(totalDepreciation / daysOwned); + } + if (distanceTraveled != default) + { + vehicleHistory.DepreciationPerMile = Math.Abs(totalDepreciation / distanceTraveled); + } + } } List reportData = new List(); var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId); @@ -1568,9 +1585,7 @@ namespace CarCareTracker.Controllers List results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, dateCompare); return results; } - [TypeFilter(typeof(CollaboratorFilter))] - [HttpGet] - public IActionResult GetVehicleHaveUrgentOrPastDueReminders(int vehicleId) + private bool GetAndUpdateVehicleUrgentOrPastDueReminders(int vehicleId) { var result = GetRemindersAndUrgency(vehicleId, DateTime.Now); //check if user wants auto-refresh past-due reminders @@ -1585,7 +1600,7 @@ namespace CarCareTracker.Controllers //update based on recurring intervals. //pull reminderRecord based on ID var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecord.Id); - existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder); + existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder, null, null); //save to db. _reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder); //set urgency to not urgent so it gets excluded in count. @@ -1597,9 +1612,16 @@ namespace CarCareTracker.Controllers var pastDueAndUrgentReminders = result.Where(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue); if (pastDueAndUrgentReminders.Any()) { - return Json(true); + return true; } - return Json(false); + return false; + } + [TypeFilter(typeof(CollaboratorFilter))] + [HttpGet] + public IActionResult GetVehicleHaveUrgentOrPastDueReminders(int vehicleId) + { + var result = GetAndUpdateVehicleUrgentOrPastDueReminders(vehicleId); + return Json(result); } [TypeFilter(typeof(CollaboratorFilter))] [HttpGet] @@ -1619,17 +1641,17 @@ namespace CarCareTracker.Controllers [HttpPost] public IActionResult PushbackRecurringReminderRecord(int reminderRecordId) { - var result = PushbackRecurringReminderRecordWithChecks(reminderRecordId); + var result = PushbackRecurringReminderRecordWithChecks(reminderRecordId, null, null); return Json(result); } - private bool PushbackRecurringReminderRecordWithChecks(int reminderRecordId) + private bool PushbackRecurringReminderRecordWithChecks(int reminderRecordId, DateTime? currentDate, int? currentMileage) { try { var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecordId); if (existingReminder is not null && existingReminder.Id != default && existingReminder.IsRecurring) { - existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder); + existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder, currentDate, currentMileage); //save to db. var reminderUpdateResult = _reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder); if (!reminderUpdateResult) @@ -1752,7 +1774,7 @@ namespace CarCareTracker.Controllers { foreach (int reminderRecordId in upgradeRecord.ReminderRecordId) { - PushbackRecurringReminderRecordWithChecks(reminderRecordId); + PushbackRecurringReminderRecordWithChecks(reminderRecordId, DateTime.Parse(upgradeRecord.Date), upgradeRecord.Mileage); } } var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord()); @@ -2209,7 +2231,7 @@ namespace CarCareTracker.Controllers //push back any reminders if (existingRecord.ReminderRecordId != default) { - PushbackRecurringReminderRecordWithChecks(existingRecord.ReminderRecordId); + PushbackRecurringReminderRecordWithChecks(existingRecord.ReminderRecordId, DateTime.Now, odometer); } } return Json(result); diff --git a/Helper/ReminderHelper.cs b/Helper/ReminderHelper.cs index 2dc1932..6307109 100644 --- a/Helper/ReminderHelper.cs +++ b/Helper/ReminderHelper.cs @@ -4,7 +4,7 @@ namespace CarCareTracker.Helper { public interface IReminderHelper { - ReminderRecord GetUpdatedRecurringReminderRecord(ReminderRecord existingReminder); + ReminderRecord GetUpdatedRecurringReminderRecord(ReminderRecord existingReminder, DateTime? currentDate, int? currentMileage); List GetReminderRecordViewModels(List reminders, int currentMileage, DateTime dateCompare); } public class ReminderHelper: IReminderHelper @@ -14,46 +14,48 @@ namespace CarCareTracker.Helper { _config = config; } - public ReminderRecord GetUpdatedRecurringReminderRecord(ReminderRecord existingReminder) + public ReminderRecord GetUpdatedRecurringReminderRecord(ReminderRecord existingReminder, DateTime? currentDate, int? currentMileage) { + var newDate = currentDate ?? existingReminder.Date; + var newMileage = currentMileage ?? existingReminder.Mileage; if (existingReminder.Metric == ReminderMetric.Both) { if (existingReminder.ReminderMonthInterval != ReminderMonthInterval.Other) { - existingReminder.Date = existingReminder.Date.AddMonths((int)existingReminder.ReminderMonthInterval); + existingReminder.Date = newDate.AddMonths((int)existingReminder.ReminderMonthInterval); } else { - existingReminder.Date = existingReminder.Date.AddMonths(existingReminder.CustomMonthInterval); + existingReminder.Date = newDate.Date.AddMonths(existingReminder.CustomMonthInterval); } if (existingReminder.ReminderMileageInterval != ReminderMileageInterval.Other) { - existingReminder.Mileage += (int)existingReminder.ReminderMileageInterval; + existingReminder.Mileage = newMileage + (int)existingReminder.ReminderMileageInterval; } else { - existingReminder.Mileage += existingReminder.CustomMileageInterval; + existingReminder.Mileage = newMileage + existingReminder.CustomMileageInterval; } } else if (existingReminder.Metric == ReminderMetric.Odometer) { if (existingReminder.ReminderMileageInterval != ReminderMileageInterval.Other) { - existingReminder.Mileage += (int)existingReminder.ReminderMileageInterval; + existingReminder.Mileage = newMileage + (int)existingReminder.ReminderMileageInterval; } else { - existingReminder.Mileage += existingReminder.CustomMileageInterval; + existingReminder.Mileage = newMileage + existingReminder.CustomMileageInterval; } } else if (existingReminder.Metric == ReminderMetric.Date) { if (existingReminder.ReminderMonthInterval != ReminderMonthInterval.Other) { - existingReminder.Date = existingReminder.Date.AddMonths((int)existingReminder.ReminderMonthInterval); + existingReminder.Date = newDate.AddMonths((int)existingReminder.ReminderMonthInterval); } else { - existingReminder.Date = existingReminder.Date.AddMonths(existingReminder.CustomMonthInterval); + existingReminder.Date = newDate.AddMonths(existingReminder.CustomMonthInterval); } } return existingReminder; diff --git a/Models/Report/VehicleHistoryViewModel.cs b/Models/Report/VehicleHistoryViewModel.cs index 811a7dc..f6b7a38 100644 --- a/Models/Report/VehicleHistoryViewModel.cs +++ b/Models/Report/VehicleHistoryViewModel.cs @@ -13,5 +13,8 @@ public decimal TotalCostPerMile { get; set; } public decimal TotalGasCostPerMile { get; set; } public string DistanceUnit { get; set; } + public decimal TotalDepreciation { get; set; } + public decimal DepreciationPerDay { get; set; } + public decimal DepreciationPerMile { get; set; } } } diff --git a/Models/Vehicle.cs b/Models/Vehicle.cs index 79e23d2..a64f62d 100644 --- a/Models/Vehicle.cs +++ b/Models/Vehicle.cs @@ -10,6 +10,8 @@ public string LicensePlate { get; set; } public string PurchaseDate { get; set; } public string SoldDate { get; set; } + public decimal PurchasePrice { get; set; } + public decimal SoldPrice { get; set; } public bool IsElectric { get; set; } = false; public bool UseHours { get; set; } = false; public List ExtraFields { get; set; } = new List(); diff --git a/Views/Vehicle/_VehicleHistory.cshtml b/Views/Vehicle/_VehicleHistory.cshtml index b64fb5e..94ab471 100644 --- a/Views/Vehicle/_VehicleHistory.cshtml +++ b/Views/Vehicle/_VehicleHistory.cshtml @@ -62,6 +62,30 @@
+ @if (Model.TotalDepreciation != default) + { +
+
+ @(Model.TotalDepreciation > 0 ? translator.Translate(userLanguage, "Depreciation") : translator.Translate(userLanguage, "Appreciation")) +
+
+ @Math.Abs(Model.TotalDepreciation).ToString("C") +
+ @if (Model.DepreciationPerDay != default) + { +
+ @($"{Model.DepreciationPerDay.ToString("C")}/{translator.Translate(userLanguage, "day")}") +
+ } + @if (Model.DepreciationPerMile != default) + { +
+ @($"{Model.DepreciationPerMile.ToString("C")}/{Model.DistanceUnit}") +
+ } +
+
+ }
diff --git a/Views/Vehicle/_VehicleModal.cshtml b/Views/Vehicle/_VehicleModal.cshtml index c4e930c..7d1d8d8 100644 --- a/Views/Vehicle/_VehicleModal.cshtml +++ b/Views/Vehicle/_VehicleModal.cshtml @@ -46,10 +46,6 @@ }
- - - -
@@ -70,6 +66,25 @@
+
+
+
+ +
+
+ + + + + + + + +
+
+