Merge pull request #126 from hargata/Hargata/recurring.reminder
Hargata/recurring.reminder
This commit is contained in:
@@ -222,14 +222,16 @@ namespace CarCareTracker.Controllers
|
|||||||
var vehicleRecords = _supplyRecordDataAccess.GetSupplyRecordsByVehicleId(vehicleId);
|
var vehicleRecords = _supplyRecordDataAccess.GetSupplyRecordsByVehicleId(vehicleId);
|
||||||
if (vehicleRecords.Any())
|
if (vehicleRecords.Any())
|
||||||
{
|
{
|
||||||
var exportData = vehicleRecords.Select(x => new SupplyRecordExportModel {
|
var exportData = vehicleRecords.Select(x => new SupplyRecordExportModel
|
||||||
|
{
|
||||||
Date = x.Date.ToShortDateString(),
|
Date = x.Date.ToShortDateString(),
|
||||||
Description = x.Description,
|
Description = x.Description,
|
||||||
Cost = x.Cost.ToString("C"),
|
Cost = x.Cost.ToString("C"),
|
||||||
PartNumber = x.PartNumber,
|
PartNumber = x.PartNumber,
|
||||||
PartQuantity = x.Quantity.ToString(),
|
PartQuantity = x.Quantity.ToString(),
|
||||||
PartSupplier = x.PartSupplier,
|
PartSupplier = x.PartSupplier,
|
||||||
Notes = x.Notes });
|
Notes = x.Notes
|
||||||
|
});
|
||||||
using (var writer = new StreamWriter(fullExportFilePath))
|
using (var writer = new StreamWriter(fullExportFilePath))
|
||||||
{
|
{
|
||||||
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
||||||
@@ -265,7 +267,8 @@ namespace CarCareTracker.Controllers
|
|||||||
var vehicleRecords = _planRecordDataAccess.GetPlanRecordsByVehicleId(vehicleId);
|
var vehicleRecords = _planRecordDataAccess.GetPlanRecordsByVehicleId(vehicleId);
|
||||||
if (vehicleRecords.Any())
|
if (vehicleRecords.Any())
|
||||||
{
|
{
|
||||||
var exportData = vehicleRecords.Select(x => new PlanRecordExportModel {
|
var exportData = vehicleRecords.Select(x => new PlanRecordExportModel
|
||||||
|
{
|
||||||
DateCreated = x.DateCreated.ToString("G"),
|
DateCreated = x.DateCreated.ToString("G"),
|
||||||
DateModified = x.DateModified.ToString("G"),
|
DateModified = x.DateModified.ToString("G"),
|
||||||
Description = x.Description,
|
Description = x.Description,
|
||||||
@@ -273,7 +276,8 @@ namespace CarCareTracker.Controllers
|
|||||||
Type = x.ImportMode.ToString(),
|
Type = x.ImportMode.ToString(),
|
||||||
Priority = x.Priority.ToString(),
|
Priority = x.Priority.ToString(),
|
||||||
Progress = x.Progress.ToString(),
|
Progress = x.Progress.ToString(),
|
||||||
Notes = x.Notes });
|
Notes = x.Notes
|
||||||
|
});
|
||||||
using (var writer = new StreamWriter(fullExportFilePath))
|
using (var writer = new StreamWriter(fullExportFilePath))
|
||||||
{
|
{
|
||||||
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
||||||
@@ -1022,7 +1026,37 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult GetVehicleHaveUrgentOrPastDueReminders(int vehicleId)
|
public IActionResult GetVehicleHaveUrgentOrPastDueReminders(int vehicleId)
|
||||||
{
|
{
|
||||||
var result = GetRemindersAndUrgency(vehicleId, DateTime.Now);
|
var result = GetRemindersAndUrgency(vehicleId, DateTime.Now);
|
||||||
if (result.Where(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue).Any())
|
//check for past due reminders that are eligible for recurring.
|
||||||
|
var pastDueAndRecurring = result.Where(x => x.Urgency == ReminderUrgency.PastDue && x.IsRecurring);
|
||||||
|
if (pastDueAndRecurring.Any())
|
||||||
|
{
|
||||||
|
foreach (ReminderRecordViewModel reminderRecord in pastDueAndRecurring)
|
||||||
|
{
|
||||||
|
//update based on recurring intervals.
|
||||||
|
//pull reminderRecord based on ID
|
||||||
|
var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecord.Id);
|
||||||
|
if (existingReminder.Metric == ReminderMetric.Both)
|
||||||
|
{
|
||||||
|
existingReminder.Date = existingReminder.Date.AddMonths((int)existingReminder.ReminderMonthInterval);
|
||||||
|
existingReminder.Mileage += (int)existingReminder.ReminderMileageInterval;
|
||||||
|
}
|
||||||
|
else if (existingReminder.Metric == ReminderMetric.Odometer)
|
||||||
|
{
|
||||||
|
existingReminder.Mileage += (int)existingReminder.ReminderMileageInterval;
|
||||||
|
}
|
||||||
|
else if (existingReminder.Metric == ReminderMetric.Date)
|
||||||
|
{
|
||||||
|
existingReminder.Date = existingReminder.Date.AddMonths((int)existingReminder.ReminderMonthInterval);
|
||||||
|
}
|
||||||
|
//save to db.
|
||||||
|
_reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder);
|
||||||
|
//set urgency to not urgent so it gets excluded in count.
|
||||||
|
reminderRecord.Urgency = ReminderUrgency.NotUrgent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//check for very urgent or past due reminders that were not eligible for recurring.
|
||||||
|
var pastDueAndUrgentReminders = result.Where(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue);
|
||||||
|
if (pastDueAndUrgentReminders.Any())
|
||||||
{
|
{
|
||||||
return Json(true);
|
return Json(true);
|
||||||
}
|
}
|
||||||
@@ -1067,7 +1101,10 @@ namespace CarCareTracker.Controllers
|
|||||||
Notes = result.Notes,
|
Notes = result.Notes,
|
||||||
VehicleId = result.VehicleId,
|
VehicleId = result.VehicleId,
|
||||||
Mileage = result.Mileage,
|
Mileage = result.Mileage,
|
||||||
Metric = result.Metric
|
Metric = result.Metric,
|
||||||
|
IsRecurring = result.IsRecurring,
|
||||||
|
ReminderMileageInterval = result.ReminderMileageInterval,
|
||||||
|
ReminderMonthInterval = result.ReminderMonthInterval
|
||||||
};
|
};
|
||||||
return PartialView("_ReminderRecordModal", convertedResult);
|
return PartialView("_ReminderRecordModal", convertedResult);
|
||||||
}
|
}
|
||||||
@@ -1272,7 +1309,8 @@ namespace CarCareTracker.Controllers
|
|||||||
Files = existingRecord.Files
|
Files = existingRecord.Files
|
||||||
};
|
};
|
||||||
_serviceRecordDataAccess.SaveServiceRecordToVehicle(newRecord);
|
_serviceRecordDataAccess.SaveServiceRecordToVehicle(newRecord);
|
||||||
} else if (existingRecord.ImportMode == ImportMode.RepairRecord)
|
}
|
||||||
|
else if (existingRecord.ImportMode == ImportMode.RepairRecord)
|
||||||
{
|
{
|
||||||
var newRecord = new CollisionRecord()
|
var newRecord = new CollisionRecord()
|
||||||
{
|
{
|
||||||
@@ -1285,7 +1323,8 @@ namespace CarCareTracker.Controllers
|
|||||||
Files = existingRecord.Files
|
Files = existingRecord.Files
|
||||||
};
|
};
|
||||||
_collisionRecordDataAccess.SaveCollisionRecordToVehicle(newRecord);
|
_collisionRecordDataAccess.SaveCollisionRecordToVehicle(newRecord);
|
||||||
} else if (existingRecord.ImportMode == ImportMode.UpgradeRecord)
|
}
|
||||||
|
else if (existingRecord.ImportMode == ImportMode.UpgradeRecord)
|
||||||
{
|
{
|
||||||
var newRecord = new UpgradeRecord()
|
var newRecord = new UpgradeRecord()
|
||||||
{
|
{
|
||||||
|
|||||||
13
Enum/ReminderMileageInterval.cs
Normal file
13
Enum/ReminderMileageInterval.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
namespace CarCareTracker.Models
|
||||||
|
{
|
||||||
|
public enum ReminderMileageInterval
|
||||||
|
{
|
||||||
|
FiveHundredMiles = 500,
|
||||||
|
OneThousandMiles = 1000,
|
||||||
|
ThreeThousandMiles = 3000,
|
||||||
|
FiveThousandMiles = 5000,
|
||||||
|
SevenThousandFiveHundredMiles = 7500,
|
||||||
|
TenThousandMiles = 10000,
|
||||||
|
FiftyThousandMiles = 50000
|
||||||
|
}
|
||||||
|
}
|
||||||
10
Enum/ReminderMonthInterval.cs
Normal file
10
Enum/ReminderMonthInterval.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
namespace CarCareTracker.Models
|
||||||
|
{
|
||||||
|
public enum ReminderMonthInterval
|
||||||
|
{
|
||||||
|
ThreeMonths = 3,
|
||||||
|
SixMonths = 6,
|
||||||
|
OneYear = 12,
|
||||||
|
FiveYears = 60
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,7 +21,8 @@ namespace CarCareTracker.Helper
|
|||||||
Mileage = reminder.Mileage,
|
Mileage = reminder.Mileage,
|
||||||
Description = reminder.Description,
|
Description = reminder.Description,
|
||||||
Notes = reminder.Notes,
|
Notes = reminder.Notes,
|
||||||
Metric = reminder.Metric
|
Metric = reminder.Metric,
|
||||||
|
IsRecurring = reminder.IsRecurring
|
||||||
};
|
};
|
||||||
if (reminder.Metric == ReminderMetric.Both)
|
if (reminder.Metric == ReminderMetric.Both)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
public int Mileage { get; set; }
|
public int Mileage { get; set; }
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
public string Notes { get; set; }
|
public string Notes { get; set; }
|
||||||
|
public bool IsRecurring { get; set; } = false;
|
||||||
|
public ReminderMileageInterval ReminderMileageInterval { get; set; } = ReminderMileageInterval.FiveThousandMiles;
|
||||||
|
public ReminderMonthInterval ReminderMonthInterval { get; set; } = ReminderMonthInterval.OneYear;
|
||||||
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
public int Mileage { get; set; }
|
public int Mileage { get; set; }
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
public string Notes { get; set; }
|
public string Notes { get; set; }
|
||||||
|
public bool IsRecurring { get; set; } = false;
|
||||||
|
public ReminderMileageInterval ReminderMileageInterval { get; set; } = ReminderMileageInterval.FiveThousandMiles;
|
||||||
|
public ReminderMonthInterval ReminderMonthInterval { get; set; } = ReminderMonthInterval.OneYear;
|
||||||
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
||||||
public ReminderRecord ToReminderRecord() { return new ReminderRecord {
|
public ReminderRecord ToReminderRecord() { return new ReminderRecord {
|
||||||
Id = Id,
|
Id = Id,
|
||||||
@@ -16,6 +19,9 @@
|
|||||||
Mileage = Mileage,
|
Mileage = Mileage,
|
||||||
Description = Description,
|
Description = Description,
|
||||||
Metric = Metric,
|
Metric = Metric,
|
||||||
|
IsRecurring = IsRecurring,
|
||||||
|
ReminderMileageInterval = ReminderMileageInterval,
|
||||||
|
ReminderMonthInterval = ReminderMonthInterval,
|
||||||
Notes = Notes }; }
|
Notes = Notes }; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,5 +13,9 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
||||||
public ReminderUrgency Urgency { get; set; } = ReminderUrgency.NotUrgent;
|
public ReminderUrgency Urgency { get; set; } = ReminderUrgency.NotUrgent;
|
||||||
|
/// <summary>
|
||||||
|
/// Recurring Reminders
|
||||||
|
/// </summary>
|
||||||
|
public bool IsRecurring { get; set; } = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,27 @@
|
|||||||
<div class="col-md-6 col-12">
|
<div class="col-md-6 col-12">
|
||||||
<label for="reminderNotes">Notes(optional)</label>
|
<label for="reminderNotes">Notes(optional)</label>
|
||||||
<textarea id="reminderNotes" class="form-control" rows="5">@Model.Notes</textarea>
|
<textarea id="reminderNotes" class="form-control" rows="5">@Model.Notes</textarea>
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" onChange="enableRecurring()" role="switch" id="reminderIsRecurring" checked="@Model.IsRecurring">
|
||||||
|
<label class="form-check-label" for="reminderIsRecurring">Is Recurring</label>
|
||||||
|
</div>
|
||||||
|
<label for="reminderRecurringMileage">Odometer</label>
|
||||||
|
<select class="form-select" id="reminderRecurringMileage" @(Model.IsRecurring ? "" : "disabled")>
|
||||||
|
<!option value="FiveHundredMiles" @(Model.ReminderMileageInterval == ReminderMileageInterval.FiveHundredMiles || isNew ? "selected" : "")>500 mi. / Km</!option>
|
||||||
|
<!option value="OneThousandMiles" @(Model.ReminderMileageInterval == ReminderMileageInterval.OneThousandMiles ? "selected" : "")>1000 mi. / Km</!option>
|
||||||
|
<!option value="ThreeThousandMiles" @(Model.ReminderMileageInterval == ReminderMileageInterval.ThreeThousandMiles ? "selected" : "")>3000 mi. / Km</!option>
|
||||||
|
<!option value="FiveThousandMiles" @(Model.ReminderMileageInterval == ReminderMileageInterval.FiveThousandMiles || isNew ? "selected" : "")>5000 mi. / Km</!option>
|
||||||
|
<!option value="SevenThousandFiveHundredMiles" @(Model.ReminderMileageInterval == ReminderMileageInterval.SevenThousandFiveHundredMiles ? "selected" : "")>7500 mi. / Km</!option>
|
||||||
|
<!option value="TenThousandMiles" @(Model.ReminderMileageInterval == ReminderMileageInterval.TenThousandMiles ? "selected" : "")>10000 mi. / Km</!option>
|
||||||
|
<!option value="FiftyThousandMiles" @(Model.ReminderMileageInterval == ReminderMileageInterval.FiftyThousandMiles ? "selected" : "")>50000 mi. / Km</!option>
|
||||||
|
</select>
|
||||||
|
<label for="reminderRecurringMonth">Month</label>
|
||||||
|
<select class="form-select" id="reminderRecurringMonth" @(Model.IsRecurring ? "" : "disabled")>
|
||||||
|
<!option value="ThreeMonths" @(Model.ReminderMonthInterval == ReminderMonthInterval.ThreeMonths || isNew ? "selected" : "")>3 Months</!option>
|
||||||
|
<!option value="SixMonths" @(Model.ReminderMonthInterval == ReminderMonthInterval.SixMonths ? "selected" : "")>6 Months</!option>
|
||||||
|
<!option value="OneYear" @(Model.ReminderMonthInterval == ReminderMonthInterval.OneYear ? "selected" : "")>1 Year</!option>
|
||||||
|
<!option value="FiveYears" @(Model.ReminderMonthInterval == ReminderMonthInterval.FiveYears ? "selected" : "")>5 Years</!option>
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -69,12 +69,27 @@ function appendMileageToOdometer(increment) {
|
|||||||
reminderMileage += increment;
|
reminderMileage += increment;
|
||||||
$("#reminderMileage").val(reminderMileage);
|
$("#reminderMileage").val(reminderMileage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function enableRecurring() {
|
||||||
|
var reminderIsRecurring = $("#reminderIsRecurring").is(":checked");
|
||||||
|
if (reminderIsRecurring) {
|
||||||
|
$("#reminderRecurringMileage").attr('disabled', false);
|
||||||
|
$("#reminderRecurringMonth").attr('disabled', false);
|
||||||
|
} else {
|
||||||
|
$("#reminderRecurringMileage").attr('disabled', true);
|
||||||
|
$("#reminderRecurringMonth").attr('disabled', true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getAndValidateReminderRecordValues() {
|
function getAndValidateReminderRecordValues() {
|
||||||
var reminderDate = $("#reminderDate").val();
|
var reminderDate = $("#reminderDate").val();
|
||||||
var reminderMileage = $("#reminderMileage").val();
|
var reminderMileage = $("#reminderMileage").val();
|
||||||
var reminderDescription = $("#reminderDescription").val();
|
var reminderDescription = $("#reminderDescription").val();
|
||||||
var reminderNotes = $("#reminderNotes").val();
|
var reminderNotes = $("#reminderNotes").val();
|
||||||
var reminderOption = $('#reminderOptions input:radio:checked').val();
|
var reminderOption = $('#reminderOptions input:radio:checked').val();
|
||||||
|
var reminderIsRecurring = $("#reminderIsRecurring").is(":checked");
|
||||||
|
var reminderRecurringMonth = $("#reminderRecurringMonth").val();
|
||||||
|
var reminderRecurringMileage = $("#reminderRecurringMileage").val();
|
||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
var reminderId = getReminderRecordModelData().id;
|
var reminderId = getReminderRecordModelData().id;
|
||||||
//validation
|
//validation
|
||||||
@@ -118,6 +133,9 @@ function getAndValidateReminderRecordValues() {
|
|||||||
mileage: reminderMileage,
|
mileage: reminderMileage,
|
||||||
description: reminderDescription,
|
description: reminderDescription,
|
||||||
notes: reminderNotes,
|
notes: reminderNotes,
|
||||||
metric: reminderOption
|
metric: reminderOption,
|
||||||
|
isRecurring: reminderIsRecurring,
|
||||||
|
reminderMileageInterval: reminderRecurringMileage,
|
||||||
|
reminderMonthInterval: reminderRecurringMonth
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user