Compare commits
58 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ed7dcb9ff | ||
|
|
1f4827abc0 | ||
|
|
9715a0fcf7 | ||
|
|
9bf475c352 | ||
|
|
c2aeb4bca0 | ||
|
|
07b3020999 | ||
|
|
c2a7f39025 | ||
|
|
a92d422972 | ||
|
|
345eb65c3a | ||
|
|
a459973983 | ||
|
|
470dd4d78a | ||
|
|
e4cb183140 | ||
|
|
6455af96bf | ||
|
|
42afa87464 | ||
|
|
97466eeff2 | ||
|
|
bcbfd4ba9c | ||
|
|
cfa052fc31 | ||
|
|
3f71f6a8d8 | ||
|
|
b70e442ca3 | ||
|
|
1f60b2aadc | ||
|
|
3d2117ddaf | ||
|
|
bcff18ea58 | ||
|
|
2e9821402f | ||
|
|
8914c5cd51 | ||
|
|
0b240498f9 | ||
|
|
16f66364cf | ||
|
|
f2b0cec427 | ||
|
|
fac05ff5c0 | ||
|
|
1ac6dfd2a6 | ||
|
|
8bcac7344f | ||
|
|
300c986abb | ||
|
|
91a5f92df6 | ||
|
|
d60a09d48f | ||
|
|
b22bb7c7ad | ||
|
|
63cddc4ab0 | ||
|
|
790061d5c4 | ||
|
|
6e4e2795b6 | ||
|
|
d4e51b714d | ||
|
|
6a164dc60b | ||
|
|
ce602dcf66 | ||
|
|
2facb1ab46 | ||
|
|
3c7d575c85 | ||
|
|
9635c3c2c5 | ||
|
|
72427fc19d | ||
|
|
0bbd3c5491 | ||
|
|
871de4e75a | ||
|
|
bf984f280e | ||
|
|
2b8f3cf13a | ||
|
|
1630a5c9ec | ||
|
|
f17faa33f4 | ||
|
|
c245b848a0 | ||
|
|
0ead9112c6 | ||
|
|
44da393369 | ||
|
|
5ae1628b7c | ||
|
|
59511d9ddd | ||
|
|
82b0fba99a | ||
|
|
618107e515 | ||
|
|
35f931adf2 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -11,3 +11,4 @@ wwwroot/translations/
|
|||||||
config/userConfig.json
|
config/userConfig.json
|
||||||
CarCareTracker.csproj.user
|
CarCareTracker.csproj.user
|
||||||
Properties/launchSettings.json
|
Properties/launchSettings.json
|
||||||
|
data/cartracker-log.db
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using CarCareTracker.External.Implementations;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.External.Interfaces;
|
|
||||||
using CarCareTracker.Filter;
|
using CarCareTracker.Filter;
|
||||||
using CarCareTracker.Helper;
|
using CarCareTracker.Helper;
|
||||||
using CarCareTracker.Logic;
|
using CarCareTracker.Logic;
|
||||||
@@ -27,6 +26,7 @@ namespace CarCareTracker.Controllers
|
|||||||
private readonly IReminderHelper _reminderHelper;
|
private readonly IReminderHelper _reminderHelper;
|
||||||
private readonly IGasHelper _gasHelper;
|
private readonly IGasHelper _gasHelper;
|
||||||
private readonly IUserLogic _userLogic;
|
private readonly IUserLogic _userLogic;
|
||||||
|
private readonly IVehicleLogic _vehicleLogic;
|
||||||
private readonly IOdometerLogic _odometerLogic;
|
private readonly IOdometerLogic _odometerLogic;
|
||||||
private readonly IFileHelper _fileHelper;
|
private readonly IFileHelper _fileHelper;
|
||||||
private readonly IMailHelper _mailHelper;
|
private readonly IMailHelper _mailHelper;
|
||||||
@@ -48,6 +48,7 @@ namespace CarCareTracker.Controllers
|
|||||||
IFileHelper fileHelper,
|
IFileHelper fileHelper,
|
||||||
IConfigHelper config,
|
IConfigHelper config,
|
||||||
IUserLogic userLogic,
|
IUserLogic userLogic,
|
||||||
|
IVehicleLogic vehicleLogic,
|
||||||
IOdometerLogic odometerLogic)
|
IOdometerLogic odometerLogic)
|
||||||
{
|
{
|
||||||
_dataAccess = dataAccess;
|
_dataAccess = dataAccess;
|
||||||
@@ -66,6 +67,7 @@ namespace CarCareTracker.Controllers
|
|||||||
_reminderHelper = reminderHelper;
|
_reminderHelper = reminderHelper;
|
||||||
_userLogic = userLogic;
|
_userLogic = userLogic;
|
||||||
_odometerLogic = odometerLogic;
|
_odometerLogic = odometerLogic;
|
||||||
|
_vehicleLogic = vehicleLogic;
|
||||||
_fileHelper = fileHelper;
|
_fileHelper = fileHelper;
|
||||||
_config = config;
|
_config = config;
|
||||||
}
|
}
|
||||||
@@ -143,6 +145,7 @@ namespace CarCareTracker.Controllers
|
|||||||
};
|
};
|
||||||
_odometerLogic.AutoInsertOdometerRecord(odometerRecord);
|
_odometerLogic.AutoInsertOdometerRecord(odometerRecord);
|
||||||
}
|
}
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"Added Service Record via API - Description: {serviceRecord.Description}");
|
||||||
response.Success = true;
|
response.Success = true;
|
||||||
response.Message = "Service Record Added";
|
response.Message = "Service Record Added";
|
||||||
return Json(response);
|
return Json(response);
|
||||||
@@ -210,6 +213,7 @@ namespace CarCareTracker.Controllers
|
|||||||
};
|
};
|
||||||
_odometerLogic.AutoInsertOdometerRecord(odometerRecord);
|
_odometerLogic.AutoInsertOdometerRecord(odometerRecord);
|
||||||
}
|
}
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"Added Repair Record via API - Description: {repairRecord.Description}");
|
||||||
response.Success = true;
|
response.Success = true;
|
||||||
response.Message = "Repair Record Added";
|
response.Message = "Repair Record Added";
|
||||||
return Json(response);
|
return Json(response);
|
||||||
@@ -277,6 +281,7 @@ namespace CarCareTracker.Controllers
|
|||||||
};
|
};
|
||||||
_odometerLogic.AutoInsertOdometerRecord(odometerRecord);
|
_odometerLogic.AutoInsertOdometerRecord(odometerRecord);
|
||||||
}
|
}
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"Added Upgrade Record via API - Description: {upgradeRecord.Description}");
|
||||||
response.Success = true;
|
response.Success = true;
|
||||||
response.Message = "Upgrade Record Added";
|
response.Message = "Upgrade Record Added";
|
||||||
return Json(response);
|
return Json(response);
|
||||||
@@ -330,6 +335,7 @@ namespace CarCareTracker.Controllers
|
|||||||
Cost = decimal.Parse(input.Cost)
|
Cost = decimal.Parse(input.Cost)
|
||||||
};
|
};
|
||||||
_taxRecordDataAccess.SaveTaxRecordToVehicle(taxRecord);
|
_taxRecordDataAccess.SaveTaxRecordToVehicle(taxRecord);
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"Added Tax Record via API - Description: {taxRecord.Description}");
|
||||||
response.Success = true;
|
response.Success = true;
|
||||||
response.Message = "Tax Record Added";
|
response.Message = "Tax Record Added";
|
||||||
return Json(response);
|
return Json(response);
|
||||||
@@ -347,7 +353,7 @@ namespace CarCareTracker.Controllers
|
|||||||
[Route("/api/vehicle/odometerrecords/latest")]
|
[Route("/api/vehicle/odometerrecords/latest")]
|
||||||
public IActionResult LastOdometer(int vehicleId)
|
public IActionResult LastOdometer(int vehicleId)
|
||||||
{
|
{
|
||||||
var result = GetMaxMileage(vehicleId);
|
var result = _vehicleLogic.GetMaxMileage(vehicleId);
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[TypeFilter(typeof(CollaboratorFilter))]
|
[TypeFilter(typeof(CollaboratorFilter))]
|
||||||
@@ -396,6 +402,7 @@ namespace CarCareTracker.Controllers
|
|||||||
Mileage = int.Parse(input.Odometer)
|
Mileage = int.Parse(input.Odometer)
|
||||||
};
|
};
|
||||||
_odometerRecordDataAccess.SaveOdometerRecordToVehicle(odometerRecord);
|
_odometerRecordDataAccess.SaveOdometerRecordToVehicle(odometerRecord);
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"Added Odometer Record via API - Mileage: {odometerRecord.Mileage.ToString()}");
|
||||||
response.Success = true;
|
response.Success = true;
|
||||||
response.Message = "Odometer Record Added";
|
response.Message = "Odometer Record Added";
|
||||||
return Json(response);
|
return Json(response);
|
||||||
@@ -477,6 +484,7 @@ namespace CarCareTracker.Controllers
|
|||||||
};
|
};
|
||||||
_odometerLogic.AutoInsertOdometerRecord(odometerRecord);
|
_odometerLogic.AutoInsertOdometerRecord(odometerRecord);
|
||||||
}
|
}
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, $"Added Gas record via API - Mileage: {gasRecord.Mileage.ToString()}");
|
||||||
response.Success = true;
|
response.Success = true;
|
||||||
response.Message = "Gas Record Added";
|
response.Message = "Gas Record Added";
|
||||||
return Json(response);
|
return Json(response);
|
||||||
@@ -494,7 +502,7 @@ namespace CarCareTracker.Controllers
|
|||||||
[Route("/api/vehicle/reminders")]
|
[Route("/api/vehicle/reminders")]
|
||||||
public IActionResult Reminders(int vehicleId)
|
public IActionResult Reminders(int vehicleId)
|
||||||
{
|
{
|
||||||
var currentMileage = GetMaxMileage(vehicleId);
|
var currentMileage = _vehicleLogic.GetMaxMileage(vehicleId);
|
||||||
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
||||||
var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now).Select(x=> new ReminderExportModel { Description = x.Description, Urgency = x.Urgency.ToString(), Metric = x.Metric.ToString(), Notes = x.Notes});
|
var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now).Select(x=> new ReminderExportModel { Description = x.Description, Urgency = x.Urgency.ToString(), Metric = x.Metric.ToString(), Notes = x.Notes});
|
||||||
return Json(results);
|
return Json(results);
|
||||||
@@ -510,7 +518,7 @@ namespace CarCareTracker.Controllers
|
|||||||
{
|
{
|
||||||
var vehicleId = vehicle.Id;
|
var vehicleId = vehicle.Id;
|
||||||
//get reminders
|
//get reminders
|
||||||
var currentMileage = GetMaxMileage(vehicleId);
|
var currentMileage = _vehicleLogic.GetMaxMileage(vehicleId);
|
||||||
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
||||||
var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now).OrderByDescending(x => x.Urgency).ToList();
|
var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now).OrderByDescending(x => x.Urgency).ToList();
|
||||||
results.RemoveAll(x => !urgencies.Contains(x.Urgency));
|
results.RemoveAll(x => !urgencies.Contains(x.Urgency));
|
||||||
@@ -560,35 +568,5 @@ namespace CarCareTracker.Controllers
|
|||||||
var result = _fileHelper.RestoreBackup("/defaults/demo_default.zip", true);
|
var result = _fileHelper.RestoreBackup("/defaults/demo_default.zip", true);
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
private int GetMaxMileage(int vehicleId)
|
|
||||||
{
|
|
||||||
var numbersArray = new List<int>();
|
|
||||||
var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId);
|
|
||||||
if (serviceRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(serviceRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId);
|
|
||||||
if (repairRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(repairRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId);
|
|
||||||
if (gasRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(gasRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId);
|
|
||||||
if (upgradeRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(upgradeRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId);
|
|
||||||
if (odometerRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(odometerRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
return numbersArray.Any() ? numbersArray.Max() : 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ namespace CarCareTracker.Controllers
|
|||||||
private readonly IVehicleDataAccess _dataAccess;
|
private readonly IVehicleDataAccess _dataAccess;
|
||||||
private readonly IUserLogic _userLogic;
|
private readonly IUserLogic _userLogic;
|
||||||
private readonly ILoginLogic _loginLogic;
|
private readonly ILoginLogic _loginLogic;
|
||||||
|
private readonly IVehicleLogic _vehicleLogic;
|
||||||
private readonly IFileHelper _fileHelper;
|
private readonly IFileHelper _fileHelper;
|
||||||
private readonly IConfigHelper _config;
|
private readonly IConfigHelper _config;
|
||||||
private readonly IExtraFieldDataAccess _extraFieldDataAccess;
|
private readonly IExtraFieldDataAccess _extraFieldDataAccess;
|
||||||
@@ -25,6 +26,7 @@ namespace CarCareTracker.Controllers
|
|||||||
IVehicleDataAccess dataAccess,
|
IVehicleDataAccess dataAccess,
|
||||||
IUserLogic userLogic,
|
IUserLogic userLogic,
|
||||||
ILoginLogic loginLogic,
|
ILoginLogic loginLogic,
|
||||||
|
IVehicleLogic vehicleLogic,
|
||||||
IConfigHelper configuration,
|
IConfigHelper configuration,
|
||||||
IFileHelper fileHelper,
|
IFileHelper fileHelper,
|
||||||
IExtraFieldDataAccess extraFieldDataAccess,
|
IExtraFieldDataAccess extraFieldDataAccess,
|
||||||
@@ -40,6 +42,7 @@ namespace CarCareTracker.Controllers
|
|||||||
_reminderRecordDataAccess = reminderRecordDataAccess;
|
_reminderRecordDataAccess = reminderRecordDataAccess;
|
||||||
_reminderHelper = reminderHelper;
|
_reminderHelper = reminderHelper;
|
||||||
_loginLogic = loginLogic;
|
_loginLogic = loginLogic;
|
||||||
|
_vehicleLogic = vehicleLogic;
|
||||||
}
|
}
|
||||||
private int GetUserID()
|
private int GetUserID()
|
||||||
{
|
{
|
||||||
@@ -56,7 +59,23 @@ namespace CarCareTracker.Controllers
|
|||||||
{
|
{
|
||||||
vehiclesStored = _userLogic.FilterUserVehicles(vehiclesStored, GetUserID());
|
vehiclesStored = _userLogic.FilterUserVehicles(vehiclesStored, GetUserID());
|
||||||
}
|
}
|
||||||
return PartialView("_GarageDisplay", vehiclesStored);
|
var vehicleViewModels = vehiclesStored.Select(x => new VehicleViewModel
|
||||||
|
{
|
||||||
|
Id = x.Id,
|
||||||
|
ImageLocation = x.ImageLocation,
|
||||||
|
Year = x.Year,
|
||||||
|
Make = x.Make,
|
||||||
|
Model = x.Model,
|
||||||
|
LicensePlate = x.LicensePlate,
|
||||||
|
SoldDate = x.SoldDate,
|
||||||
|
IsElectric = x.IsElectric,
|
||||||
|
UseHours = x.UseHours,
|
||||||
|
ExtraFields = x.ExtraFields,
|
||||||
|
Tags = x.Tags,
|
||||||
|
LastReportedMileage = _vehicleLogic.GetMaxMileage(x.Id),
|
||||||
|
HasReminders = _vehicleLogic.GetVehicleHasUrgentOrPastDueReminders(x.Id)
|
||||||
|
}).ToList();
|
||||||
|
return PartialView("_GarageDisplay", vehicleViewModels);
|
||||||
}
|
}
|
||||||
public IActionResult Calendar()
|
public IActionResult Calendar()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,6 +29,18 @@ namespace CarCareTracker.Controllers
|
|||||||
}
|
}
|
||||||
public IActionResult Index(string redirectURL = "")
|
public IActionResult Index(string redirectURL = "")
|
||||||
{
|
{
|
||||||
|
var remoteAuthConfig = _config.GetOpenIDConfig();
|
||||||
|
if (remoteAuthConfig.DisableRegularLogin && !string.IsNullOrWhiteSpace(remoteAuthConfig.LogOutURL))
|
||||||
|
{
|
||||||
|
var generatedState = Guid.NewGuid().ToString().Substring(0, 8);
|
||||||
|
remoteAuthConfig.State = generatedState;
|
||||||
|
if (remoteAuthConfig.ValidateState)
|
||||||
|
{
|
||||||
|
Response.Cookies.Append("OIDC_STATE", remoteAuthConfig.State, new CookieOptions { Expires = new DateTimeOffset(DateTime.Now.AddMinutes(5)) });
|
||||||
|
}
|
||||||
|
var remoteAuthURL = remoteAuthConfig.RemoteAuthURL;
|
||||||
|
return Redirect(remoteAuthURL);
|
||||||
|
}
|
||||||
return View(model: redirectURL);
|
return View(model: redirectURL);
|
||||||
}
|
}
|
||||||
public IActionResult Registration()
|
public IActionResult Registration()
|
||||||
@@ -248,7 +260,12 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult LogOut()
|
public IActionResult LogOut()
|
||||||
{
|
{
|
||||||
Response.Cookies.Delete("ACCESS_TOKEN");
|
Response.Cookies.Delete("ACCESS_TOKEN");
|
||||||
return Json(true);
|
var remoteAuthConfig = _config.GetOpenIDConfig();
|
||||||
|
if (remoteAuthConfig.DisableRegularLogin && !string.IsNullOrWhiteSpace(remoteAuthConfig.LogOutURL))
|
||||||
|
{
|
||||||
|
return Json(remoteAuthConfig.LogOutURL);
|
||||||
|
}
|
||||||
|
return Json("/Login");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
using LiteDB;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using CarCareTracker.Helper;
|
using CarCareTracker.Helper;
|
||||||
using CsvHelper;
|
using CsvHelper;
|
||||||
@@ -37,6 +36,7 @@ namespace CarCareTracker.Controllers
|
|||||||
private readonly IReportHelper _reportHelper;
|
private readonly IReportHelper _reportHelper;
|
||||||
private readonly IUserLogic _userLogic;
|
private readonly IUserLogic _userLogic;
|
||||||
private readonly IOdometerLogic _odometerLogic;
|
private readonly IOdometerLogic _odometerLogic;
|
||||||
|
private readonly IVehicleLogic _vehicleLogic;
|
||||||
private readonly IExtraFieldDataAccess _extraFieldDataAccess;
|
private readonly IExtraFieldDataAccess _extraFieldDataAccess;
|
||||||
|
|
||||||
public VehicleController(ILogger<VehicleController> logger,
|
public VehicleController(ILogger<VehicleController> logger,
|
||||||
@@ -59,6 +59,7 @@ namespace CarCareTracker.Controllers
|
|||||||
IExtraFieldDataAccess extraFieldDataAccess,
|
IExtraFieldDataAccess extraFieldDataAccess,
|
||||||
IUserLogic userLogic,
|
IUserLogic userLogic,
|
||||||
IOdometerLogic odometerLogic,
|
IOdometerLogic odometerLogic,
|
||||||
|
IVehicleLogic vehicleLogic,
|
||||||
IWebHostEnvironment webEnv,
|
IWebHostEnvironment webEnv,
|
||||||
IConfigHelper config)
|
IConfigHelper config)
|
||||||
{
|
{
|
||||||
@@ -82,6 +83,7 @@ namespace CarCareTracker.Controllers
|
|||||||
_extraFieldDataAccess = extraFieldDataAccess;
|
_extraFieldDataAccess = extraFieldDataAccess;
|
||||||
_userLogic = userLogic;
|
_userLogic = userLogic;
|
||||||
_odometerLogic = odometerLogic;
|
_odometerLogic = odometerLogic;
|
||||||
|
_vehicleLogic = vehicleLogic;
|
||||||
_webEnv = webEnv;
|
_webEnv = webEnv;
|
||||||
_config = config;
|
_config = config;
|
||||||
}
|
}
|
||||||
@@ -130,6 +132,10 @@ namespace CarCareTracker.Controllers
|
|||||||
if (isNewAddition)
|
if (isNewAddition)
|
||||||
{
|
{
|
||||||
_userLogic.AddUserAccessToVehicle(GetUserID(), vehicleInput.Id);
|
_userLogic.AddUserAccessToVehicle(GetUserID(), vehicleInput.Id);
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleInput.Id, User.Identity.Name, $"Added Vehicle - Description: {vehicleInput.Year} {vehicleInput.Make} {vehicleInput.Model}");
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleInput.Id, User.Identity.Name, $"Edited Vehicle - Description: {vehicleInput.Year} {vehicleInput.Make} {vehicleInput.Model}");
|
||||||
}
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
@@ -154,8 +160,13 @@ namespace CarCareTracker.Controllers
|
|||||||
_planRecordDataAccess.DeleteAllPlanRecordsByVehicleId(vehicleId) &&
|
_planRecordDataAccess.DeleteAllPlanRecordsByVehicleId(vehicleId) &&
|
||||||
_planRecordTemplateDataAccess.DeleteAllPlanRecordTemplatesByVehicleId(vehicleId) &&
|
_planRecordTemplateDataAccess.DeleteAllPlanRecordTemplatesByVehicleId(vehicleId) &&
|
||||||
_supplyRecordDataAccess.DeleteAllSupplyRecordsByVehicleId(vehicleId) &&
|
_supplyRecordDataAccess.DeleteAllSupplyRecordsByVehicleId(vehicleId) &&
|
||||||
|
_odometerRecordDataAccess.DeleteAllOdometerRecordsByVehicleId(vehicleId) &&
|
||||||
_userLogic.DeleteAllAccessToVehicle(vehicleId) &&
|
_userLogic.DeleteAllAccessToVehicle(vehicleId) &&
|
||||||
_dataAccess.DeleteVehicle(vehicleId);
|
_dataAccess.DeleteVehicle(vehicleId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), vehicleId, User.Identity.Name, "Deleted Vehicle");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -660,6 +671,10 @@ namespace CarCareTracker.Controllers
|
|||||||
}
|
}
|
||||||
gasRecord.Files = gasRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
gasRecord.Files = gasRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
||||||
var result = _gasRecordDataAccess.SaveGasRecordToVehicle(gasRecord.ToGasRecord());
|
var result = _gasRecordDataAccess.SaveGasRecordToVehicle(gasRecord.ToGasRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), gasRecord.VehicleId, User.Identity.Name, $"{(gasRecord.Id == default ? "Created" : "Edited")} Gas Record - Mileage: {gasRecord.Mileage.ToString()}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -704,6 +719,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteGasRecordById(int gasRecordId)
|
public IActionResult DeleteGasRecordById(int gasRecordId)
|
||||||
{
|
{
|
||||||
var result = _gasRecordDataAccess.DeleteGasRecordById(gasRecordId);
|
var result = _gasRecordDataAccess.DeleteGasRecordById(gasRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Gas Record - Id: {gasRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -715,6 +734,61 @@ namespace CarCareTracker.Controllers
|
|||||||
var result = _config.SaveUserConfig(User, currentConfig);
|
var result = _config.SaveUserConfig(User, currentConfig);
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
|
[HttpPost]
|
||||||
|
public IActionResult GetGasRecordsEditModal(List<int> recordIds)
|
||||||
|
{
|
||||||
|
return PartialView("_GasRecordsModal", new GasRecordEditModel { RecordIds = recordIds });
|
||||||
|
}
|
||||||
|
[HttpPost]
|
||||||
|
public IActionResult SaveMultipleGasRecords(GasRecordEditModel editModel)
|
||||||
|
{
|
||||||
|
var dateIsEdited = editModel.EditRecord.Date != default;
|
||||||
|
var mileageIsEdited = editModel.EditRecord.Mileage != default;
|
||||||
|
var consumptionIsEdited = editModel.EditRecord.Gallons != default;
|
||||||
|
var costIsEdited = editModel.EditRecord.Cost != default;
|
||||||
|
var noteIsEdited = !string.IsNullOrWhiteSpace(editModel.EditRecord.Notes);
|
||||||
|
var tagsIsEdited = editModel.EditRecord.Tags.Any();
|
||||||
|
//handle clear overrides
|
||||||
|
if (tagsIsEdited && editModel.EditRecord.Tags.Contains("---"))
|
||||||
|
{
|
||||||
|
editModel.EditRecord.Tags = new List<string>();
|
||||||
|
}
|
||||||
|
if (noteIsEdited && editModel.EditRecord.Notes == "---")
|
||||||
|
{
|
||||||
|
editModel.EditRecord.Notes = "";
|
||||||
|
}
|
||||||
|
bool result = false;
|
||||||
|
foreach (int recordId in editModel.RecordIds)
|
||||||
|
{
|
||||||
|
var existingRecord = _gasRecordDataAccess.GetGasRecordById(recordId);
|
||||||
|
if (dateIsEdited)
|
||||||
|
{
|
||||||
|
existingRecord.Date = editModel.EditRecord.Date;
|
||||||
|
}
|
||||||
|
if (consumptionIsEdited)
|
||||||
|
{
|
||||||
|
existingRecord.Gallons = editModel.EditRecord.Gallons;
|
||||||
|
}
|
||||||
|
if (costIsEdited)
|
||||||
|
{
|
||||||
|
existingRecord.Cost = editModel.EditRecord.Cost;
|
||||||
|
}
|
||||||
|
if (mileageIsEdited)
|
||||||
|
{
|
||||||
|
existingRecord.Mileage = editModel.EditRecord.Mileage;
|
||||||
|
}
|
||||||
|
if (noteIsEdited)
|
||||||
|
{
|
||||||
|
existingRecord.Notes = editModel.EditRecord.Notes;
|
||||||
|
}
|
||||||
|
if (tagsIsEdited)
|
||||||
|
{
|
||||||
|
existingRecord.Tags = editModel.EditRecord.Tags;
|
||||||
|
}
|
||||||
|
result = _gasRecordDataAccess.SaveGasRecordToVehicle(existingRecord);
|
||||||
|
}
|
||||||
|
return Json(result);
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
#region "Service Records"
|
#region "Service Records"
|
||||||
[TypeFilter(typeof(CollaboratorFilter))]
|
[TypeFilter(typeof(CollaboratorFilter))]
|
||||||
@@ -751,13 +825,24 @@ namespace CarCareTracker.Controllers
|
|||||||
if (serviceRecord.Supplies.Any())
|
if (serviceRecord.Supplies.Any())
|
||||||
{
|
{
|
||||||
serviceRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(serviceRecord.Supplies, DateTime.Parse(serviceRecord.Date), serviceRecord.Description);
|
serviceRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(serviceRecord.Supplies, DateTime.Parse(serviceRecord.Date), serviceRecord.Description);
|
||||||
|
if (serviceRecord.CopySuppliesAttachment)
|
||||||
|
{
|
||||||
|
serviceRecord.Files.AddRange(GetSuppliesAttachments(serviceRecord.Supplies));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//push back any reminders
|
//push back any reminders
|
||||||
if (serviceRecord.ReminderRecordId != default)
|
if (serviceRecord.ReminderRecordId.Any())
|
||||||
{
|
{
|
||||||
PushbackRecurringReminderRecordWithChecks(serviceRecord.ReminderRecordId);
|
foreach(int reminderRecordId in serviceRecord.ReminderRecordId)
|
||||||
|
{
|
||||||
|
PushbackRecurringReminderRecordWithChecks(reminderRecordId, DateTime.Parse(serviceRecord.Date), serviceRecord.Mileage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord());
|
var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), serviceRecord.VehicleId, User.Identity.Name, $"{(serviceRecord.Id == default ? "Created" : "Edited")} Service Record - Description: {serviceRecord.Description}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -790,6 +875,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteServiceRecordById(int serviceRecordId)
|
public IActionResult DeleteServiceRecordById(int serviceRecordId)
|
||||||
{
|
{
|
||||||
var result = _serviceRecordDataAccess.DeleteServiceRecordById(serviceRecordId);
|
var result = _serviceRecordDataAccess.DeleteServiceRecordById(serviceRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Service Record - Id: {serviceRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -828,13 +917,24 @@ namespace CarCareTracker.Controllers
|
|||||||
if (collisionRecord.Supplies.Any())
|
if (collisionRecord.Supplies.Any())
|
||||||
{
|
{
|
||||||
collisionRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(collisionRecord.Supplies, DateTime.Parse(collisionRecord.Date), collisionRecord.Description);
|
collisionRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(collisionRecord.Supplies, DateTime.Parse(collisionRecord.Date), collisionRecord.Description);
|
||||||
|
if (collisionRecord.CopySuppliesAttachment)
|
||||||
|
{
|
||||||
|
collisionRecord.Files.AddRange(GetSuppliesAttachments(collisionRecord.Supplies));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//push back any reminders
|
//push back any reminders
|
||||||
if (collisionRecord.ReminderRecordId != default)
|
if (collisionRecord.ReminderRecordId.Any())
|
||||||
{
|
{
|
||||||
PushbackRecurringReminderRecordWithChecks(collisionRecord.ReminderRecordId);
|
foreach (int reminderRecordId in collisionRecord.ReminderRecordId)
|
||||||
|
{
|
||||||
|
PushbackRecurringReminderRecordWithChecks(reminderRecordId, DateTime.Parse(collisionRecord.Date), collisionRecord.Mileage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord());
|
var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), collisionRecord.VehicleId, User.Identity.Name, $"{(collisionRecord.Id == default ? "Created" : "Edited")} Repair Record - Description: {collisionRecord.Description}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -867,6 +967,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteCollisionRecordById(int collisionRecordId)
|
public IActionResult DeleteCollisionRecordById(int collisionRecordId)
|
||||||
{
|
{
|
||||||
var result = _collisionRecordDataAccess.DeleteCollisionRecordById(collisionRecordId);
|
var result = _collisionRecordDataAccess.DeleteCollisionRecordById(collisionRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Repair Record - Id: {collisionRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -933,11 +1037,18 @@ namespace CarCareTracker.Controllers
|
|||||||
//move files from temp.
|
//move files from temp.
|
||||||
taxRecord.Files = taxRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
taxRecord.Files = taxRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
||||||
//push back any reminders
|
//push back any reminders
|
||||||
if (taxRecord.ReminderRecordId != default)
|
if (taxRecord.ReminderRecordId.Any())
|
||||||
{
|
{
|
||||||
PushbackRecurringReminderRecordWithChecks(taxRecord.ReminderRecordId);
|
foreach (int reminderRecordId in taxRecord.ReminderRecordId)
|
||||||
|
{
|
||||||
|
PushbackRecurringReminderRecordWithChecks(reminderRecordId, DateTime.Parse(taxRecord.Date), null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var result = _taxRecordDataAccess.SaveTaxRecordToVehicle(taxRecord.ToTaxRecord());
|
var result = _taxRecordDataAccess.SaveTaxRecordToVehicle(taxRecord.ToTaxRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), taxRecord.VehicleId, User.Identity.Name, $"{(taxRecord.Id == default ? "Created" : "Edited")} Tax Record - Description: {taxRecord.Description}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -971,6 +1082,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteTaxRecordById(int taxRecordId)
|
public IActionResult DeleteTaxRecordById(int taxRecordId)
|
||||||
{
|
{
|
||||||
var result = _taxRecordDataAccess.DeleteTaxRecordById(taxRecordId);
|
var result = _taxRecordDataAccess.DeleteTaxRecordById(taxRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Tax Record - Id: {taxRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -1217,26 +1332,43 @@ namespace CarCareTracker.Controllers
|
|||||||
{
|
{
|
||||||
var vehicleHistory = new VehicleHistoryViewModel();
|
var vehicleHistory = new VehicleHistoryViewModel();
|
||||||
vehicleHistory.VehicleData = _dataAccess.GetVehicleById(vehicleId);
|
vehicleHistory.VehicleData = _dataAccess.GetVehicleById(vehicleId);
|
||||||
var maxMileage = GetMaxMileage(vehicleId);
|
var maxMileage = _vehicleLogic.GetMaxMileage(vehicleId);
|
||||||
vehicleHistory.Odometer = maxMileage.ToString("N0");
|
vehicleHistory.Odometer = maxMileage.ToString("N0");
|
||||||
var minMileage = GetMinMileage(vehicleId);
|
var minMileage = _vehicleLogic.GetMinMileage(vehicleId);
|
||||||
var distanceTraveled = maxMileage - minMileage;
|
var distanceTraveled = maxMileage - minMileage;
|
||||||
if (!string.IsNullOrWhiteSpace(vehicleHistory.VehicleData.PurchaseDate))
|
if (!string.IsNullOrWhiteSpace(vehicleHistory.VehicleData.PurchaseDate))
|
||||||
{
|
{
|
||||||
var endDate = vehicleHistory.VehicleData.SoldDate;
|
var endDate = vehicleHistory.VehicleData.SoldDate;
|
||||||
|
int daysOwned = 0;
|
||||||
if (string.IsNullOrWhiteSpace(endDate))
|
if (string.IsNullOrWhiteSpace(endDate))
|
||||||
{
|
{
|
||||||
endDate = DateTime.Now.ToShortDateString();
|
endDate = DateTime.Now.ToShortDateString();
|
||||||
}
|
}
|
||||||
try
|
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)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex.Message);
|
_logger.LogError(ex.Message);
|
||||||
vehicleHistory.DaysOwned = string.Empty;
|
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<GenericReportModel> reportData = new List<GenericReportModel>();
|
List<GenericReportModel> reportData = new List<GenericReportModel>();
|
||||||
var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId);
|
var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId);
|
||||||
@@ -1387,78 +1519,14 @@ namespace CarCareTracker.Controllers
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
#region "Reminders"
|
#region "Reminders"
|
||||||
[TypeFilter(typeof(CollaboratorFilter))]
|
|
||||||
private int GetMaxMileage(int vehicleId)
|
|
||||||
{
|
|
||||||
var numbersArray = new List<int>();
|
|
||||||
var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId);
|
|
||||||
if (serviceRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(serviceRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId);
|
|
||||||
if (repairRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(repairRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId);
|
|
||||||
if (gasRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(gasRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId);
|
|
||||||
if (upgradeRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(upgradeRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId);
|
|
||||||
if (odometerRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(odometerRecords.Max(x => x.Mileage));
|
|
||||||
}
|
|
||||||
return numbersArray.Any() ? numbersArray.Max() : 0;
|
|
||||||
}
|
|
||||||
[TypeFilter(typeof(CollaboratorFilter))]
|
|
||||||
private int GetMinMileage(int vehicleId)
|
|
||||||
{
|
|
||||||
var numbersArray = new List<int>();
|
|
||||||
var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
|
||||||
if (serviceRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(serviceRecords.Min(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
|
||||||
if (repairRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(repairRecords.Min(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
|
||||||
if (gasRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(gasRecords.Min(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
|
||||||
if (upgradeRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(upgradeRecords.Min(x => x.Mileage));
|
|
||||||
}
|
|
||||||
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
|
||||||
if (odometerRecords.Any())
|
|
||||||
{
|
|
||||||
numbersArray.Add(odometerRecords.Min(x => x.Mileage));
|
|
||||||
}
|
|
||||||
return numbersArray.Any() ? numbersArray.Min() : 0;
|
|
||||||
}
|
|
||||||
private List<ReminderRecordViewModel> GetRemindersAndUrgency(int vehicleId, DateTime dateCompare)
|
private List<ReminderRecordViewModel> GetRemindersAndUrgency(int vehicleId, DateTime dateCompare)
|
||||||
{
|
{
|
||||||
var currentMileage = GetMaxMileage(vehicleId);
|
var currentMileage = _vehicleLogic.GetMaxMileage(vehicleId);
|
||||||
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
||||||
List<ReminderRecordViewModel> results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, dateCompare);
|
List<ReminderRecordViewModel> results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, dateCompare);
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
[TypeFilter(typeof(CollaboratorFilter))]
|
private bool GetAndUpdateVehicleUrgentOrPastDueReminders(int vehicleId)
|
||||||
[HttpGet]
|
|
||||||
public IActionResult GetVehicleHaveUrgentOrPastDueReminders(int vehicleId)
|
|
||||||
{
|
{
|
||||||
var result = GetRemindersAndUrgency(vehicleId, DateTime.Now);
|
var result = GetRemindersAndUrgency(vehicleId, DateTime.Now);
|
||||||
//check if user wants auto-refresh past-due reminders
|
//check if user wants auto-refresh past-due reminders
|
||||||
@@ -1473,7 +1541,7 @@ namespace CarCareTracker.Controllers
|
|||||||
//update based on recurring intervals.
|
//update based on recurring intervals.
|
||||||
//pull reminderRecord based on ID
|
//pull reminderRecord based on ID
|
||||||
var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecord.Id);
|
var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecord.Id);
|
||||||
existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder);
|
existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder, null, null);
|
||||||
//save to db.
|
//save to db.
|
||||||
_reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder);
|
_reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder);
|
||||||
//set urgency to not urgent so it gets excluded in count.
|
//set urgency to not urgent so it gets excluded in count.
|
||||||
@@ -1485,9 +1553,16 @@ namespace CarCareTracker.Controllers
|
|||||||
var pastDueAndUrgentReminders = result.Where(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue);
|
var pastDueAndUrgentReminders = result.Where(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue);
|
||||||
if (pastDueAndUrgentReminders.Any())
|
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))]
|
[TypeFilter(typeof(CollaboratorFilter))]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -1507,17 +1582,17 @@ namespace CarCareTracker.Controllers
|
|||||||
[HttpPost]
|
[HttpPost]
|
||||||
public IActionResult PushbackRecurringReminderRecord(int reminderRecordId)
|
public IActionResult PushbackRecurringReminderRecord(int reminderRecordId)
|
||||||
{
|
{
|
||||||
var result = PushbackRecurringReminderRecordWithChecks(reminderRecordId);
|
var result = PushbackRecurringReminderRecordWithChecks(reminderRecordId, null, null);
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
private bool PushbackRecurringReminderRecordWithChecks(int reminderRecordId)
|
private bool PushbackRecurringReminderRecordWithChecks(int reminderRecordId, DateTime? currentDate, int? currentMileage)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecordId);
|
var existingReminder = _reminderRecordDataAccess.GetReminderRecordById(reminderRecordId);
|
||||||
if (existingReminder is not null && existingReminder.Id != default && existingReminder.IsRecurring)
|
if (existingReminder is not null && existingReminder.Id != default && existingReminder.IsRecurring)
|
||||||
{
|
{
|
||||||
existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder);
|
existingReminder = _reminderHelper.GetUpdatedRecurringReminderRecord(existingReminder, currentDate, currentMileage);
|
||||||
//save to db.
|
//save to db.
|
||||||
var reminderUpdateResult = _reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder);
|
var reminderUpdateResult = _reminderRecordDataAccess.SaveReminderRecordToVehicle(existingReminder);
|
||||||
if (!reminderUpdateResult)
|
if (!reminderUpdateResult)
|
||||||
@@ -1543,6 +1618,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult SaveReminderRecordToVehicleId(ReminderRecordInput reminderRecord)
|
public IActionResult SaveReminderRecordToVehicleId(ReminderRecordInput reminderRecord)
|
||||||
{
|
{
|
||||||
var result = _reminderRecordDataAccess.SaveReminderRecordToVehicle(reminderRecord.ToReminderRecord());
|
var result = _reminderRecordDataAccess.SaveReminderRecordToVehicle(reminderRecord.ToReminderRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), reminderRecord.VehicleId, User.Identity.Name, $"{(reminderRecord.Id == default ? "Created" : "Edited")} Reminder - Description: {reminderRecord.Description}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -1575,7 +1654,8 @@ namespace CarCareTracker.Controllers
|
|||||||
ReminderMileageInterval = result.ReminderMileageInterval,
|
ReminderMileageInterval = result.ReminderMileageInterval,
|
||||||
ReminderMonthInterval = result.ReminderMonthInterval,
|
ReminderMonthInterval = result.ReminderMonthInterval,
|
||||||
CustomMileageInterval = result.CustomMileageInterval,
|
CustomMileageInterval = result.CustomMileageInterval,
|
||||||
CustomMonthInterval = result.CustomMonthInterval
|
CustomMonthInterval = result.CustomMonthInterval,
|
||||||
|
Tags = result.Tags
|
||||||
};
|
};
|
||||||
return PartialView("_ReminderRecordModal", convertedResult);
|
return PartialView("_ReminderRecordModal", convertedResult);
|
||||||
}
|
}
|
||||||
@@ -1583,6 +1663,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteReminderRecordById(int reminderRecordId)
|
public IActionResult DeleteReminderRecordById(int reminderRecordId)
|
||||||
{
|
{
|
||||||
var result = _reminderRecordDataAccess.DeleteReminderRecordById(reminderRecordId);
|
var result = _reminderRecordDataAccess.DeleteReminderRecordById(reminderRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Reminder - Id: {reminderRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -1621,13 +1705,24 @@ namespace CarCareTracker.Controllers
|
|||||||
if (upgradeRecord.Supplies.Any())
|
if (upgradeRecord.Supplies.Any())
|
||||||
{
|
{
|
||||||
upgradeRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(upgradeRecord.Supplies, DateTime.Parse(upgradeRecord.Date), upgradeRecord.Description);
|
upgradeRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(upgradeRecord.Supplies, DateTime.Parse(upgradeRecord.Date), upgradeRecord.Description);
|
||||||
|
if (upgradeRecord.CopySuppliesAttachment)
|
||||||
|
{
|
||||||
|
upgradeRecord.Files.AddRange(GetSuppliesAttachments(upgradeRecord.Supplies));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//push back any reminders
|
//push back any reminders
|
||||||
if (upgradeRecord.ReminderRecordId != default)
|
if (upgradeRecord.ReminderRecordId.Any())
|
||||||
{
|
{
|
||||||
PushbackRecurringReminderRecordWithChecks(upgradeRecord.ReminderRecordId);
|
foreach (int reminderRecordId in upgradeRecord.ReminderRecordId)
|
||||||
|
{
|
||||||
|
PushbackRecurringReminderRecordWithChecks(reminderRecordId, DateTime.Parse(upgradeRecord.Date), upgradeRecord.Mileage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord());
|
var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), upgradeRecord.VehicleId, User.Identity.Name, $"{(upgradeRecord.Id == default ? "Created" : "Edited")} Upgrade Record - Description: {upgradeRecord.Description}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -1660,6 +1755,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteUpgradeRecordById(int upgradeRecordId)
|
public IActionResult DeleteUpgradeRecordById(int upgradeRecordId)
|
||||||
{
|
{
|
||||||
var result = _upgradeRecordDataAccess.DeleteUpgradeRecordById(upgradeRecordId);
|
var result = _upgradeRecordDataAccess.DeleteUpgradeRecordById(upgradeRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Upgrade Record - Id: {upgradeRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -1684,6 +1783,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult SaveNoteToVehicleId(Note note)
|
public IActionResult SaveNoteToVehicleId(Note note)
|
||||||
{
|
{
|
||||||
var result = _noteDataAccess.SaveNoteToVehicle(note);
|
var result = _noteDataAccess.SaveNoteToVehicle(note);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), note.VehicleId, User.Identity.Name, $"{(note.Id == default ? "Created" : "Edited")} Note - Description: {note.Description}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -1701,6 +1804,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteNoteById(int noteId)
|
public IActionResult DeleteNoteById(int noteId)
|
||||||
{
|
{
|
||||||
var result = _noteDataAccess.DeleteNoteById(noteId);
|
var result = _noteDataAccess.DeleteNoteById(noteId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Note - Id: {noteId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -1743,6 +1850,16 @@ namespace CarCareTracker.Controllers
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
private List<UploadedFiles> GetSuppliesAttachments(List<SupplyUsage> supplyUsage)
|
||||||
|
{
|
||||||
|
List<UploadedFiles> results = new List<UploadedFiles>();
|
||||||
|
foreach(SupplyUsage supply in supplyUsage)
|
||||||
|
{
|
||||||
|
var result = _supplyRecordDataAccess.GetSupplyRecordById(supply.SupplyId);
|
||||||
|
results.AddRange(result.Files);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
private List<SupplyUsageHistory> RequisitionSupplyRecordsByUsage(List<SupplyUsage> supplyUsage, DateTime dateRequisitioned, string usageDescription)
|
private List<SupplyUsageHistory> RequisitionSupplyRecordsByUsage(List<SupplyUsage> supplyUsage, DateTime dateRequisitioned, string usageDescription)
|
||||||
{
|
{
|
||||||
List<SupplyUsageHistory> results = new List<SupplyUsageHistory>();
|
List<SupplyUsageHistory> results = new List<SupplyUsageHistory>();
|
||||||
@@ -1822,6 +1939,10 @@ namespace CarCareTracker.Controllers
|
|||||||
//move files from temp.
|
//move files from temp.
|
||||||
supplyRecord.Files = supplyRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
supplyRecord.Files = supplyRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
||||||
var result = _supplyRecordDataAccess.SaveSupplyRecordToVehicle(supplyRecord.ToSupplyRecord());
|
var result = _supplyRecordDataAccess.SaveSupplyRecordToVehicle(supplyRecord.ToSupplyRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), supplyRecord.VehicleId, User.Identity.Name, $"{(supplyRecord.Id == default ? "Created" : "Edited")} Supply Record - Description: {supplyRecord.Description}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -1856,6 +1977,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteSupplyRecordById(int supplyRecordId)
|
public IActionResult DeleteSupplyRecordById(int supplyRecordId)
|
||||||
{
|
{
|
||||||
var result = _supplyRecordDataAccess.DeleteSupplyRecordById(supplyRecordId);
|
var result = _supplyRecordDataAccess.DeleteSupplyRecordById(supplyRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Supply Record - Id: {supplyRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -1881,8 +2006,16 @@ namespace CarCareTracker.Controllers
|
|||||||
if (planRecord.Supplies.Any())
|
if (planRecord.Supplies.Any())
|
||||||
{
|
{
|
||||||
planRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(planRecord.Supplies, DateTime.Parse(planRecord.DateCreated), planRecord.Description);
|
planRecord.RequisitionHistory = RequisitionSupplyRecordsByUsage(planRecord.Supplies, DateTime.Parse(planRecord.DateCreated), planRecord.Description);
|
||||||
|
if (planRecord.CopySuppliesAttachment)
|
||||||
|
{
|
||||||
|
planRecord.Files.AddRange(GetSuppliesAttachments(planRecord.Supplies));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord());
|
var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), planRecord.VehicleId, User.Identity.Name, $"{(planRecord.Id == default ? "Created" : "Edited")} Plan Record - Description: {planRecord.Description}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -1895,6 +2028,10 @@ namespace CarCareTracker.Controllers
|
|||||||
return Json(new OperationResponse { Success = false, Message = "A template with that description already exists for this vehicle" });
|
return Json(new OperationResponse { Success = false, Message = "A template with that description already exists for this vehicle" });
|
||||||
}
|
}
|
||||||
planRecord.Files = planRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
planRecord.Files = planRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
||||||
|
if (planRecord.Supplies.Any() && planRecord.CopySuppliesAttachment)
|
||||||
|
{
|
||||||
|
planRecord.Files.AddRange(GetSuppliesAttachments(planRecord.Supplies));
|
||||||
|
}
|
||||||
var result = _planRecordTemplateDataAccess.SavePlanRecordTemplateToVehicle(planRecord);
|
var result = _planRecordTemplateDataAccess.SavePlanRecordTemplateToVehicle(planRecord);
|
||||||
return Json(new OperationResponse { Success = result, Message = result ? "Template Added" : StaticHelper.GenericErrorMessage });
|
return Json(new OperationResponse { Success = result, Message = result ? "Template Added" : StaticHelper.GenericErrorMessage });
|
||||||
}
|
}
|
||||||
@@ -2035,7 +2172,7 @@ namespace CarCareTracker.Controllers
|
|||||||
//push back any reminders
|
//push back any reminders
|
||||||
if (existingRecord.ReminderRecordId != default)
|
if (existingRecord.ReminderRecordId != default)
|
||||||
{
|
{
|
||||||
PushbackRecurringReminderRecordWithChecks(existingRecord.ReminderRecordId);
|
PushbackRecurringReminderRecordWithChecks(existingRecord.ReminderRecordId, DateTime.Now, odometer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
@@ -2068,6 +2205,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeletePlanRecordById(int planRecordId)
|
public IActionResult DeletePlanRecordById(int planRecordId)
|
||||||
{
|
{
|
||||||
var result = _planRecordDataAccess.DeletePlanRecordById(planRecordId);
|
var result = _planRecordDataAccess.DeletePlanRecordById(planRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Plan Record - Id: {planRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -2107,6 +2248,10 @@ namespace CarCareTracker.Controllers
|
|||||||
//move files from temp.
|
//move files from temp.
|
||||||
odometerRecord.Files = odometerRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
odometerRecord.Files = odometerRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
|
||||||
var result = _odometerRecordDataAccess.SaveOdometerRecordToVehicle(odometerRecord.ToOdometerRecord());
|
var result = _odometerRecordDataAccess.SaveOdometerRecordToVehicle(odometerRecord.ToOdometerRecord());
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), odometerRecord.VehicleId, User.Identity.Name, $"{(odometerRecord.Id == default ? "Created" : "Edited")} Odometer Record - Mileage: {odometerRecord.Mileage.ToString()}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
@@ -2187,6 +2332,10 @@ namespace CarCareTracker.Controllers
|
|||||||
public IActionResult DeleteOdometerRecordById(int odometerRecordId)
|
public IActionResult DeleteOdometerRecordById(int odometerRecordId)
|
||||||
{
|
{
|
||||||
var result = _odometerRecordDataAccess.DeleteOdometerRecordById(odometerRecordId);
|
var result = _odometerRecordDataAccess.DeleteOdometerRecordById(odometerRecordId);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted Odometer Record - Id: {odometerRecordId}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -2288,6 +2437,10 @@ namespace CarCareTracker.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Moved multiple {source.ToString()} to {destination.ToString()} - Ids: {string.Join(",", recordIds)}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
public IActionResult DeleteRecords(List<int> recordIds, ImportMode importMode)
|
public IActionResult DeleteRecords(List<int> recordIds, ImportMode importMode)
|
||||||
@@ -2326,6 +2479,69 @@ namespace CarCareTracker.Controllers
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Deleted multiple {importMode.ToString()} - Ids: {string.Join(",", recordIds)}");
|
||||||
|
}
|
||||||
|
return Json(result);
|
||||||
|
}
|
||||||
|
[TypeFilter(typeof(CollaboratorFilter))]
|
||||||
|
[HttpPost]
|
||||||
|
public IActionResult AdjustRecordsOdometer(List<int> recordIds, int vehicleId, ImportMode importMode)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
//get vehicle's odometer adjustments
|
||||||
|
var vehicleData = _dataAccess.GetVehicleById(vehicleId);
|
||||||
|
foreach (int recordId in recordIds)
|
||||||
|
{
|
||||||
|
switch (importMode)
|
||||||
|
{
|
||||||
|
case ImportMode.ServiceRecord:
|
||||||
|
{
|
||||||
|
var existingRecord = _serviceRecordDataAccess.GetServiceRecordById(recordId);
|
||||||
|
existingRecord.Mileage += int.Parse(vehicleData.OdometerDifference);
|
||||||
|
existingRecord.Mileage = decimal.ToInt32(existingRecord.Mileage * decimal.Parse(vehicleData.OdometerMultiplier, NumberStyles.Any));
|
||||||
|
result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(existingRecord);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.RepairRecord:
|
||||||
|
{
|
||||||
|
var existingRecord = _collisionRecordDataAccess.GetCollisionRecordById(recordId);
|
||||||
|
existingRecord.Mileage += int.Parse(vehicleData.OdometerDifference);
|
||||||
|
existingRecord.Mileage = decimal.ToInt32(existingRecord.Mileage * decimal.Parse(vehicleData.OdometerMultiplier, NumberStyles.Any));
|
||||||
|
result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(existingRecord);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.UpgradeRecord:
|
||||||
|
{
|
||||||
|
var existingRecord = _upgradeRecordDataAccess.GetUpgradeRecordById(recordId);
|
||||||
|
existingRecord.Mileage += int.Parse(vehicleData.OdometerDifference);
|
||||||
|
existingRecord.Mileage = decimal.ToInt32(existingRecord.Mileage * decimal.Parse(vehicleData.OdometerMultiplier, NumberStyles.Any));
|
||||||
|
result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(existingRecord);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.GasRecord:
|
||||||
|
{
|
||||||
|
var existingRecord = _gasRecordDataAccess.GetGasRecordById(recordId);
|
||||||
|
existingRecord.Mileage += int.Parse(vehicleData.OdometerDifference);
|
||||||
|
existingRecord.Mileage = decimal.ToInt32(existingRecord.Mileage * decimal.Parse(vehicleData.OdometerMultiplier, NumberStyles.Any));
|
||||||
|
result = _gasRecordDataAccess.SaveGasRecordToVehicle(existingRecord);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.OdometerRecord:
|
||||||
|
{
|
||||||
|
var existingRecord = _odometerRecordDataAccess.GetOdometerRecordById(recordId);
|
||||||
|
existingRecord.Mileage += int.Parse(vehicleData.OdometerDifference);
|
||||||
|
existingRecord.Mileage = decimal.ToInt32(existingRecord.Mileage * decimal.Parse(vehicleData.OdometerMultiplier, NumberStyles.Any));
|
||||||
|
result = _odometerRecordDataAccess.SaveOdometerRecordToVehicle(existingRecord);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Adjusted odometer for multiple {importMode.ToString()} - Ids: {string.Join(",", recordIds)}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
public IActionResult DuplicateRecords(List<int> recordIds, ImportMode importMode)
|
public IActionResult DuplicateRecords(List<int> recordIds, ImportMode importMode)
|
||||||
@@ -2400,6 +2616,10 @@ namespace CarCareTracker.Controllers
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
StaticHelper.NotifyAsync(_config.GetWebHookUrl(), 0, User.Identity.Name, $"Duplicated multiple {importMode.ToString()} - Ids: {string.Join(",", recordIds)}");
|
||||||
|
}
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
|
|||||||
@@ -7,51 +7,48 @@ namespace CarCareTracker.External.Implementations
|
|||||||
{
|
{
|
||||||
public class CollisionRecordDataAccess : ICollisionRecordDataAccess
|
public class CollisionRecordDataAccess : ICollisionRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "collisionrecords";
|
private static string tableName = "collisionrecords";
|
||||||
|
public CollisionRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<CollisionRecord> GetCollisionRecordsByVehicleId(int vehicleId)
|
public List<CollisionRecord> GetCollisionRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<CollisionRecord>(tableName);
|
var table = db.GetCollection<CollisionRecord>(tableName);
|
||||||
var collisionRecords = table.Find(Query.EQ(nameof(CollisionRecord.VehicleId), vehicleId));
|
var collisionRecords = table.Find(Query.EQ(nameof(CollisionRecord.VehicleId), vehicleId));
|
||||||
return collisionRecords.ToList() ?? new List<CollisionRecord>();
|
return collisionRecords.ToList() ?? new List<CollisionRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public CollisionRecord GetCollisionRecordById(int collisionRecordId)
|
public CollisionRecord GetCollisionRecordById(int collisionRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<CollisionRecord>(tableName);
|
var table = db.GetCollection<CollisionRecord>(tableName);
|
||||||
return table.FindById(collisionRecordId);
|
return table.FindById(collisionRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteCollisionRecordById(int collisionRecordId)
|
public bool DeleteCollisionRecordById(int collisionRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<CollisionRecord>(tableName);
|
var table = db.GetCollection<CollisionRecord>(tableName);
|
||||||
table.Delete(collisionRecordId);
|
table.Delete(collisionRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveCollisionRecordToVehicle(CollisionRecord collisionRecord)
|
public bool SaveCollisionRecordToVehicle(CollisionRecord collisionRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<CollisionRecord>(tableName);
|
var table = db.GetCollection<CollisionRecord>(tableName);
|
||||||
table.Upsert(collisionRecord);
|
table.Upsert(collisionRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllCollisionRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllCollisionRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<CollisionRecord>(tableName);
|
var table = db.GetCollection<CollisionRecord>(tableName);
|
||||||
var collisionRecords = table.DeleteMany(Query.EQ(nameof(CollisionRecord.VehicleId), vehicleId));
|
var collisionRecords = table.DeleteMany(Query.EQ(nameof(CollisionRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,30 +1,30 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
using CarCareTracker.Helper;
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
using LiteDB;
|
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class ExtraFieldDataAccess : IExtraFieldDataAccess
|
public class ExtraFieldDataAccess : IExtraFieldDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "extrafields";
|
private static string tableName = "extrafields";
|
||||||
|
public ExtraFieldDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public RecordExtraField GetExtraFieldsById(int importMode)
|
public RecordExtraField GetExtraFieldsById(int importMode)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<RecordExtraField>(tableName);
|
var table = db.GetCollection<RecordExtraField>(tableName);
|
||||||
return table.FindById(importMode) ?? new RecordExtraField();
|
return table.FindById(importMode) ?? new RecordExtraField();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveExtraFields(RecordExtraField record)
|
public bool SaveExtraFields(RecordExtraField record)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<RecordExtraField>(tableName);
|
var table = db.GetCollection<RecordExtraField>(tableName);
|
||||||
table.Upsert(record);
|
table.Upsert(record);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,51 +7,48 @@ namespace CarCareTracker.External.Implementations
|
|||||||
{
|
{
|
||||||
public class GasRecordDataAccess : IGasRecordDataAccess
|
public class GasRecordDataAccess : IGasRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "gasrecords";
|
private static string tableName = "gasrecords";
|
||||||
|
public GasRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<GasRecord> GetGasRecordsByVehicleId(int vehicleId)
|
public List<GasRecord> GetGasRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<GasRecord>(tableName);
|
var table = db.GetCollection<GasRecord>(tableName);
|
||||||
var gasRecords = table.Find(Query.EQ(nameof(GasRecord.VehicleId), vehicleId));
|
var gasRecords = table.Find(Query.EQ(nameof(GasRecord.VehicleId), vehicleId));
|
||||||
return gasRecords.ToList() ?? new List<GasRecord>();
|
return gasRecords.ToList() ?? new List<GasRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public GasRecord GetGasRecordById(int gasRecordId)
|
public GasRecord GetGasRecordById(int gasRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<GasRecord>(tableName);
|
var table = db.GetCollection<GasRecord>(tableName);
|
||||||
return table.FindById(gasRecordId);
|
return table.FindById(gasRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteGasRecordById(int gasRecordId)
|
public bool DeleteGasRecordById(int gasRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<GasRecord>(tableName);
|
var table = db.GetCollection<GasRecord>(tableName);
|
||||||
table.Delete(gasRecordId);
|
table.Delete(gasRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveGasRecordToVehicle(GasRecord gasRecord)
|
public bool SaveGasRecordToVehicle(GasRecord gasRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<GasRecord>(tableName);
|
var table = db.GetCollection<GasRecord>(tableName);
|
||||||
table.Upsert(gasRecord);
|
table.Upsert(gasRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllGasRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllGasRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<GasRecord>(tableName);
|
var table = db.GetCollection<GasRecord>(tableName);
|
||||||
var gasRecords = table.DeleteMany(Query.EQ(nameof(GasRecord.VehicleId), vehicleId));
|
var gasRecords = table.DeleteMany(Query.EQ(nameof(GasRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +1,54 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class NoteDataAccess : INoteDataAccess
|
public class NoteDataAccess : INoteDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "notes";
|
private static string tableName = "notes";
|
||||||
|
public NoteDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<Note> GetNotesByVehicleId(int vehicleId)
|
public List<Note> GetNotesByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Note>(tableName);
|
var table = db.GetCollection<Note>(tableName);
|
||||||
var noteToReturn = table.Find(Query.EQ(nameof(Note.VehicleId), vehicleId));
|
var noteToReturn = table.Find(Query.EQ(nameof(Note.VehicleId), vehicleId));
|
||||||
return noteToReturn.ToList() ?? new List<Note>();
|
return noteToReturn.ToList() ?? new List<Note>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public Note GetNoteById(int noteId)
|
public Note GetNoteById(int noteId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Note>(tableName);
|
var table = db.GetCollection<Note>(tableName);
|
||||||
return table.FindById(noteId);
|
return table.FindById(noteId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveNoteToVehicle(Note note)
|
public bool SaveNoteToVehicle(Note note)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Note>(tableName);
|
var table = db.GetCollection<Note>(tableName);
|
||||||
table.Upsert(note);
|
table.Upsert(note);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteNoteById(int noteId)
|
public bool DeleteNoteById(int noteId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Note>(tableName);
|
var table = db.GetCollection<Note>(tableName);
|
||||||
table.Delete(noteId);
|
table.Delete(noteId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllNotesByVehicleId(int vehicleId)
|
public bool DeleteAllNotesByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Note>(tableName);
|
var table = db.GetCollection<Note>(tableName);
|
||||||
var notes = table.DeleteMany(Query.EQ(nameof(Note.VehicleId), vehicleId));
|
var notes = table.DeleteMany(Query.EQ(nameof(Note.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +1,54 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class OdometerRecordDataAccess : IOdometerRecordDataAccess
|
public class OdometerRecordDataAccess : IOdometerRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "odometerrecords";
|
private static string tableName = "odometerrecords";
|
||||||
|
public OdometerRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<OdometerRecord> GetOdometerRecordsByVehicleId(int vehicleId)
|
public List<OdometerRecord> GetOdometerRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<OdometerRecord>(tableName);
|
var table = db.GetCollection<OdometerRecord>(tableName);
|
||||||
var odometerRecords = table.Find(Query.EQ(nameof(OdometerRecord.VehicleId), vehicleId));
|
var odometerRecords = table.Find(Query.EQ(nameof(OdometerRecord.VehicleId), vehicleId));
|
||||||
return odometerRecords.ToList() ?? new List<OdometerRecord>();
|
return odometerRecords.ToList() ?? new List<OdometerRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public OdometerRecord GetOdometerRecordById(int odometerRecordId)
|
public OdometerRecord GetOdometerRecordById(int odometerRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<OdometerRecord>(tableName);
|
var table = db.GetCollection<OdometerRecord>(tableName);
|
||||||
return table.FindById(odometerRecordId);
|
return table.FindById(odometerRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteOdometerRecordById(int odometerRecordId)
|
public bool DeleteOdometerRecordById(int odometerRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<OdometerRecord>(tableName);
|
var table = db.GetCollection<OdometerRecord>(tableName);
|
||||||
table.Delete(odometerRecordId);
|
table.Delete(odometerRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveOdometerRecordToVehicle(OdometerRecord odometerRecord)
|
public bool SaveOdometerRecordToVehicle(OdometerRecord odometerRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<OdometerRecord>(tableName);
|
var table = db.GetCollection<OdometerRecord>(tableName);
|
||||||
table.Upsert(odometerRecord);
|
table.Upsert(odometerRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllOdometerRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllOdometerRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<OdometerRecord>(tableName);
|
var table = db.GetCollection<OdometerRecord>(tableName);
|
||||||
var odometerRecords = table.DeleteMany(Query.EQ(nameof(OdometerRecord.VehicleId), vehicleId));
|
var odometerRecords = table.DeleteMany(Query.EQ(nameof(OdometerRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +1,54 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class PlanRecordDataAccess : IPlanRecordDataAccess
|
public class PlanRecordDataAccess : IPlanRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "planrecords";
|
private static string tableName = "planrecords";
|
||||||
|
public PlanRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<PlanRecord> GetPlanRecordsByVehicleId(int vehicleId)
|
public List<PlanRecord> GetPlanRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecord>(tableName);
|
var table = db.GetCollection<PlanRecord>(tableName);
|
||||||
var planRecords = table.Find(Query.EQ(nameof(PlanRecord.VehicleId), vehicleId));
|
var planRecords = table.Find(Query.EQ(nameof(PlanRecord.VehicleId), vehicleId));
|
||||||
return planRecords.ToList() ?? new List<PlanRecord>();
|
return planRecords.ToList() ?? new List<PlanRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public PlanRecord GetPlanRecordById(int planRecordId)
|
public PlanRecord GetPlanRecordById(int planRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecord>(tableName);
|
var table = db.GetCollection<PlanRecord>(tableName);
|
||||||
return table.FindById(planRecordId);
|
return table.FindById(planRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeletePlanRecordById(int planRecordId)
|
public bool DeletePlanRecordById(int planRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecord>(tableName);
|
var table = db.GetCollection<PlanRecord>(tableName);
|
||||||
table.Delete(planRecordId);
|
table.Delete(planRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SavePlanRecordToVehicle(PlanRecord planRecord)
|
public bool SavePlanRecordToVehicle(PlanRecord planRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecord>(tableName);
|
var table = db.GetCollection<PlanRecord>(tableName);
|
||||||
table.Upsert(planRecord);
|
table.Upsert(planRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllPlanRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllPlanRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecord>(tableName);
|
var table = db.GetCollection<PlanRecord>(tableName);
|
||||||
var planRecords = table.DeleteMany(Query.EQ(nameof(PlanRecord.VehicleId), vehicleId));
|
var planRecords = table.DeleteMany(Query.EQ(nameof(PlanRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +1,54 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class PlanRecordTemplateDataAccess : IPlanRecordTemplateDataAccess
|
public class PlanRecordTemplateDataAccess : IPlanRecordTemplateDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "planrecordtemplates";
|
private static string tableName = "planrecordtemplates";
|
||||||
|
public PlanRecordTemplateDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<PlanRecordInput> GetPlanRecordTemplatesByVehicleId(int vehicleId)
|
public List<PlanRecordInput> GetPlanRecordTemplatesByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecordInput>(tableName);
|
var table = db.GetCollection<PlanRecordInput>(tableName);
|
||||||
var planRecords = table.Find(Query.EQ(nameof(PlanRecordInput.VehicleId), vehicleId));
|
var planRecords = table.Find(Query.EQ(nameof(PlanRecordInput.VehicleId), vehicleId));
|
||||||
return planRecords.ToList() ?? new List<PlanRecordInput>();
|
return planRecords.ToList() ?? new List<PlanRecordInput>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public PlanRecordInput GetPlanRecordTemplateById(int planRecordId)
|
public PlanRecordInput GetPlanRecordTemplateById(int planRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecordInput>(tableName);
|
var table = db.GetCollection<PlanRecordInput>(tableName);
|
||||||
return table.FindById(planRecordId);
|
return table.FindById(planRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeletePlanRecordTemplateById(int planRecordId)
|
public bool DeletePlanRecordTemplateById(int planRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecordInput>(tableName);
|
var table = db.GetCollection<PlanRecordInput>(tableName);
|
||||||
table.Delete(planRecordId);
|
table.Delete(planRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SavePlanRecordTemplateToVehicle(PlanRecordInput planRecord)
|
public bool SavePlanRecordTemplateToVehicle(PlanRecordInput planRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecordInput>(tableName);
|
var table = db.GetCollection<PlanRecordInput>(tableName);
|
||||||
table.Upsert(planRecord);
|
table.Upsert(planRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllPlanRecordTemplatesByVehicleId(int vehicleId)
|
public bool DeleteAllPlanRecordTemplatesByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<PlanRecord>(tableName);
|
var table = db.GetCollection<PlanRecord>(tableName);
|
||||||
var planRecords = table.DeleteMany(Query.EQ(nameof(PlanRecordInput.VehicleId), vehicleId));
|
var planRecords = table.DeleteMany(Query.EQ(nameof(PlanRecordInput.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +1,54 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class ReminderRecordDataAccess : IReminderRecordDataAccess
|
public class ReminderRecordDataAccess : IReminderRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "reminderrecords";
|
private static string tableName = "reminderrecords";
|
||||||
|
public ReminderRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<ReminderRecord> GetReminderRecordsByVehicleId(int vehicleId)
|
public List<ReminderRecord> GetReminderRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ReminderRecord>(tableName);
|
var table = db.GetCollection<ReminderRecord>(tableName);
|
||||||
var reminderRecords = table.Find(Query.EQ(nameof(ReminderRecord.VehicleId), vehicleId));
|
var reminderRecords = table.Find(Query.EQ(nameof(ReminderRecord.VehicleId), vehicleId));
|
||||||
return reminderRecords.ToList() ?? new List<ReminderRecord>();
|
return reminderRecords.ToList() ?? new List<ReminderRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public ReminderRecord GetReminderRecordById(int reminderRecordId)
|
public ReminderRecord GetReminderRecordById(int reminderRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ReminderRecord>(tableName);
|
var table = db.GetCollection<ReminderRecord>(tableName);
|
||||||
return table.FindById(reminderRecordId);
|
return table.FindById(reminderRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteReminderRecordById(int reminderRecordId)
|
public bool DeleteReminderRecordById(int reminderRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ReminderRecord>(tableName);
|
var table = db.GetCollection<ReminderRecord>(tableName);
|
||||||
table.Delete(reminderRecordId);
|
table.Delete(reminderRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveReminderRecordToVehicle(ReminderRecord reminderRecord)
|
public bool SaveReminderRecordToVehicle(ReminderRecord reminderRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ReminderRecord>(tableName);
|
var table = db.GetCollection<ReminderRecord>(tableName);
|
||||||
table.Upsert(reminderRecord);
|
table.Upsert(reminderRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllReminderRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllReminderRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ReminderRecord>(tableName);
|
var table = db.GetCollection<ReminderRecord>(tableName);
|
||||||
var reminderRecords = table.DeleteMany(Query.EQ(nameof(ReminderRecord.VehicleId), vehicleId));
|
var reminderRecords = table.DeleteMany(Query.EQ(nameof(ReminderRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +1,54 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class ServiceRecordDataAccess : IServiceRecordDataAccess
|
public class ServiceRecordDataAccess : IServiceRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "servicerecords";
|
private static string tableName = "servicerecords";
|
||||||
|
public ServiceRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<ServiceRecord> GetServiceRecordsByVehicleId(int vehicleId)
|
public List<ServiceRecord> GetServiceRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ServiceRecord>(tableName);
|
var table = db.GetCollection<ServiceRecord>(tableName);
|
||||||
var serviceRecords = table.Find(Query.EQ(nameof(ServiceRecord.VehicleId), vehicleId));
|
var serviceRecords = table.Find(Query.EQ(nameof(ServiceRecord.VehicleId), vehicleId));
|
||||||
return serviceRecords.ToList() ?? new List<ServiceRecord>();
|
return serviceRecords.ToList() ?? new List<ServiceRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public ServiceRecord GetServiceRecordById(int serviceRecordId)
|
public ServiceRecord GetServiceRecordById(int serviceRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ServiceRecord>(tableName);
|
var table = db.GetCollection<ServiceRecord>(tableName);
|
||||||
return table.FindById(serviceRecordId);
|
return table.FindById(serviceRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteServiceRecordById(int serviceRecordId)
|
public bool DeleteServiceRecordById(int serviceRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ServiceRecord>(tableName);
|
var table = db.GetCollection<ServiceRecord>(tableName);
|
||||||
table.Delete(serviceRecordId);
|
table.Delete(serviceRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveServiceRecordToVehicle(ServiceRecord serviceRecord)
|
public bool SaveServiceRecordToVehicle(ServiceRecord serviceRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ServiceRecord>(tableName);
|
var table = db.GetCollection<ServiceRecord>(tableName);
|
||||||
table.Upsert(serviceRecord);
|
table.Upsert(serviceRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllServiceRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllServiceRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<ServiceRecord>(tableName);
|
var table = db.GetCollection<ServiceRecord>(tableName);
|
||||||
var serviceRecords = table.DeleteMany(Query.EQ(nameof(ServiceRecord.VehicleId), vehicleId));
|
var serviceRecords = table.DeleteMany(Query.EQ(nameof(ServiceRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,51 +7,48 @@ namespace CarCareTracker.External.Implementations
|
|||||||
{
|
{
|
||||||
public class SupplyRecordDataAccess : ISupplyRecordDataAccess
|
public class SupplyRecordDataAccess : ISupplyRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "supplyrecords";
|
private static string tableName = "supplyrecords";
|
||||||
|
public SupplyRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<SupplyRecord> GetSupplyRecordsByVehicleId(int vehicleId)
|
public List<SupplyRecord> GetSupplyRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<SupplyRecord>(tableName);
|
var table = db.GetCollection<SupplyRecord>(tableName);
|
||||||
var supplyRecords = table.Find(Query.EQ(nameof(SupplyRecord.VehicleId), vehicleId));
|
var supplyRecords = table.Find(Query.EQ(nameof(SupplyRecord.VehicleId), vehicleId));
|
||||||
return supplyRecords.ToList() ?? new List<SupplyRecord>();
|
return supplyRecords.ToList() ?? new List<SupplyRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public SupplyRecord GetSupplyRecordById(int supplyRecordId)
|
public SupplyRecord GetSupplyRecordById(int supplyRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<SupplyRecord>(tableName);
|
var table = db.GetCollection<SupplyRecord>(tableName);
|
||||||
return table.FindById(supplyRecordId);
|
return table.FindById(supplyRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteSupplyRecordById(int supplyRecordId)
|
public bool DeleteSupplyRecordById(int supplyRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<SupplyRecord>(tableName);
|
var table = db.GetCollection<SupplyRecord>(tableName);
|
||||||
table.Delete(supplyRecordId);
|
table.Delete(supplyRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveSupplyRecordToVehicle(SupplyRecord supplyRecord)
|
public bool SaveSupplyRecordToVehicle(SupplyRecord supplyRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<SupplyRecord>(tableName);
|
var table = db.GetCollection<SupplyRecord>(tableName);
|
||||||
table.Upsert(supplyRecord);
|
table.Upsert(supplyRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllSupplyRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllSupplyRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<SupplyRecord>(tableName);
|
var table = db.GetCollection<SupplyRecord>(tableName);
|
||||||
var supplyRecords = table.DeleteMany(Query.EQ(nameof(SupplyRecord.VehicleId), vehicleId));
|
var supplyRecords = table.DeleteMany(Query.EQ(nameof(SupplyRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,57 +1,54 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class TaxRecordDataAccess : ITaxRecordDataAccess
|
public class TaxRecordDataAccess : ITaxRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "taxrecords";
|
private static string tableName = "taxrecords";
|
||||||
|
public TaxRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<TaxRecord> GetTaxRecordsByVehicleId(int vehicleId)
|
public List<TaxRecord> GetTaxRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<TaxRecord>(tableName);
|
var table = db.GetCollection<TaxRecord>(tableName);
|
||||||
var taxRecords = table.Find(Query.EQ(nameof(TaxRecord.VehicleId), vehicleId));
|
var taxRecords = table.Find(Query.EQ(nameof(TaxRecord.VehicleId), vehicleId));
|
||||||
return taxRecords.ToList() ?? new List<TaxRecord>();
|
return taxRecords.ToList() ?? new List<TaxRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public TaxRecord GetTaxRecordById(int taxRecordId)
|
public TaxRecord GetTaxRecordById(int taxRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<TaxRecord>(tableName);
|
var table = db.GetCollection<TaxRecord>(tableName);
|
||||||
return table.FindById(taxRecordId);
|
return table.FindById(taxRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteTaxRecordById(int taxRecordId)
|
public bool DeleteTaxRecordById(int taxRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<TaxRecord>(tableName);
|
var table = db.GetCollection<TaxRecord>(tableName);
|
||||||
table.Delete(taxRecordId);
|
table.Delete(taxRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveTaxRecordToVehicle(TaxRecord taxRecord)
|
public bool SaveTaxRecordToVehicle(TaxRecord taxRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<TaxRecord>(tableName);
|
var table = db.GetCollection<TaxRecord>(tableName);
|
||||||
table.Upsert(taxRecord);
|
table.Upsert(taxRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllTaxRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllTaxRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<TaxRecord>(tableName);
|
var table = db.GetCollection<TaxRecord>(tableName);
|
||||||
var taxRecords = table.DeleteMany(Query.EQ(nameof(TaxRecord.VehicleId), vehicleId));
|
var taxRecords = table.DeleteMany(Query.EQ(nameof(TaxRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,51 +7,47 @@ namespace CarCareTracker.External.Implementations
|
|||||||
{
|
{
|
||||||
public class TokenRecordDataAccess : ITokenRecordDataAccess
|
public class TokenRecordDataAccess : ITokenRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "tokenrecords";
|
private static string tableName = "tokenrecords";
|
||||||
|
public TokenRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<Token> GetTokens()
|
public List<Token> GetTokens()
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Token>(tableName);
|
var table = db.GetCollection<Token>(tableName);
|
||||||
return table.FindAll().ToList();
|
return table.FindAll().ToList();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public Token GetTokenRecordByBody(string tokenBody)
|
public Token GetTokenRecordByBody(string tokenBody)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Token>(tableName);
|
var table = db.GetCollection<Token>(tableName);
|
||||||
var tokenRecord = table.FindOne(Query.EQ(nameof(Token.Body), tokenBody));
|
var tokenRecord = table.FindOne(Query.EQ(nameof(Token.Body), tokenBody));
|
||||||
return tokenRecord ?? new Token();
|
return tokenRecord ?? new Token();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public Token GetTokenRecordByEmailAddress(string emailAddress)
|
public Token GetTokenRecordByEmailAddress(string emailAddress)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Token>(tableName);
|
var table = db.GetCollection<Token>(tableName);
|
||||||
var tokenRecord = table.FindOne(Query.EQ(nameof(Token.EmailAddress), emailAddress));
|
var tokenRecord = table.FindOne(Query.EQ(nameof(Token.EmailAddress), emailAddress));
|
||||||
return tokenRecord ?? new Token();
|
return tokenRecord ?? new Token();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool CreateNewToken(Token token)
|
public bool CreateNewToken(Token token)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Token>(tableName);
|
var table = db.GetCollection<Token>(tableName);
|
||||||
table.Insert(token);
|
table.Insert(token);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteToken(int tokenId)
|
public bool DeleteToken(int tokenId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Token>(tableName);
|
var table = db.GetCollection<Token>(tableName);
|
||||||
table.Delete(tokenId);
|
table.Delete(tokenId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,51 +7,48 @@ namespace CarCareTracker.External.Implementations
|
|||||||
{
|
{
|
||||||
public class UpgradeRecordDataAccess : IUpgradeRecordDataAccess
|
public class UpgradeRecordDataAccess : IUpgradeRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
|
public UpgradeRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
private static string tableName = "upgraderecords";
|
private static string tableName = "upgraderecords";
|
||||||
public List<UpgradeRecord> GetUpgradeRecordsByVehicleId(int vehicleId)
|
public List<UpgradeRecord> GetUpgradeRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UpgradeRecord>(tableName);
|
var table = db.GetCollection<UpgradeRecord>(tableName);
|
||||||
var upgradeRecords = table.Find(Query.EQ(nameof(UpgradeRecord.VehicleId), vehicleId));
|
var upgradeRecords = table.Find(Query.EQ(nameof(UpgradeRecord.VehicleId), vehicleId));
|
||||||
return upgradeRecords.ToList() ?? new List<UpgradeRecord>();
|
return upgradeRecords.ToList() ?? new List<UpgradeRecord>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public UpgradeRecord GetUpgradeRecordById(int upgradeRecordId)
|
public UpgradeRecord GetUpgradeRecordById(int upgradeRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UpgradeRecord>(tableName);
|
var table = db.GetCollection<UpgradeRecord>(tableName);
|
||||||
return table.FindById(upgradeRecordId);
|
return table.FindById(upgradeRecordId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteUpgradeRecordById(int upgradeRecordId)
|
public bool DeleteUpgradeRecordById(int upgradeRecordId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UpgradeRecord>(tableName);
|
var table = db.GetCollection<UpgradeRecord>(tableName);
|
||||||
table.Delete(upgradeRecordId);
|
table.Delete(upgradeRecordId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveUpgradeRecordToVehicle(UpgradeRecord upgradeRecord)
|
public bool SaveUpgradeRecordToVehicle(UpgradeRecord upgradeRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UpgradeRecord>(tableName);
|
var table = db.GetCollection<UpgradeRecord>(tableName);
|
||||||
table.Upsert(upgradeRecord);
|
table.Upsert(upgradeRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteAllUpgradeRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllUpgradeRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UpgradeRecord>(tableName);
|
var table = db.GetCollection<UpgradeRecord>(tableName);
|
||||||
var upgradeRecords = table.DeleteMany(Query.EQ(nameof(UpgradeRecord.VehicleId), vehicleId));
|
var upgradeRecords = table.DeleteMany(Query.EQ(nameof(UpgradeRecord.VehicleId), vehicleId));
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,12 @@ namespace CarCareTracker.External.Implementations
|
|||||||
{
|
{
|
||||||
public class UserAccessDataAccess : IUserAccessDataAccess
|
public class UserAccessDataAccess : IUserAccessDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "useraccessrecords";
|
private static string tableName = "useraccessrecords";
|
||||||
|
public UserAccessDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a list of vehicles user have access to.
|
/// Gets a list of vehicles user have access to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -16,45 +20,37 @@ namespace CarCareTracker.External.Implementations
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public List<UserAccess> GetUserAccessByUserId(int userId)
|
public List<UserAccess> GetUserAccessByUserId(int userId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserAccess>(tableName);
|
var table = db.GetCollection<UserAccess>(tableName);
|
||||||
return table.Find(x => x.Id.UserId == userId).ToList();
|
return table.Find(x => x.Id.UserId == userId).ToList();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public UserAccess GetUserAccessByVehicleAndUserId(int userId, int vehicleId)
|
public UserAccess GetUserAccessByVehicleAndUserId(int userId, int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserAccess>(tableName);
|
var table = db.GetCollection<UserAccess>(tableName);
|
||||||
return table.Find(x => x.Id.UserId == userId && x.Id.VehicleId == vehicleId).FirstOrDefault();
|
return table.Find(x => x.Id.UserId == userId && x.Id.VehicleId == vehicleId).FirstOrDefault();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public List<UserAccess> GetUserAccessByVehicleId(int vehicleId)
|
public List<UserAccess> GetUserAccessByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserAccess>(tableName);
|
var table = db.GetCollection<UserAccess>(tableName);
|
||||||
return table.Find(x => x.Id.VehicleId == vehicleId).ToList();
|
return table.Find(x => x.Id.VehicleId == vehicleId).ToList();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveUserAccess(UserAccess userAccess)
|
public bool SaveUserAccess(UserAccess userAccess)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserAccess>(tableName);
|
var table = db.GetCollection<UserAccess>(tableName);
|
||||||
table.Upsert(userAccess);
|
table.Upsert(userAccess);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteUserAccess(int userId, int vehicleId)
|
public bool DeleteUserAccess(int userId, int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserAccess>(tableName);
|
var table = db.GetCollection<UserAccess>(tableName);
|
||||||
table.DeleteMany(x => x.Id.UserId == userId && x.Id.VehicleId == vehicleId);
|
table.DeleteMany(x => x.Id.UserId == userId && x.Id.VehicleId == vehicleId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Delete all access records when a vehicle is deleted.
|
/// Delete all access records when a vehicle is deleted.
|
||||||
@@ -63,12 +59,11 @@ namespace CarCareTracker.External.Implementations
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool DeleteAllAccessRecordsByVehicleId(int vehicleId)
|
public bool DeleteAllAccessRecordsByVehicleId(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserAccess>(tableName);
|
var table = db.GetCollection<UserAccess>(tableName);
|
||||||
table.DeleteMany(x => x.Id.VehicleId == vehicleId);
|
table.DeleteMany(x => x.Id.VehicleId == vehicleId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Delee all access records when a user is deleted.
|
/// Delee all access records when a user is deleted.
|
||||||
@@ -77,12 +72,11 @@ namespace CarCareTracker.External.Implementations
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool DeleteAllAccessRecordsByUserId(int userId)
|
public bool DeleteAllAccessRecordsByUserId(int userId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserAccess>(tableName);
|
var table = db.GetCollection<UserAccess>(tableName);
|
||||||
table.DeleteMany(x => x.Id.UserId == userId);
|
table.DeleteMany(x => x.Id.UserId == userId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,39 +1,38 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
using LiteDB;
|
using CarCareTracker.Helper;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class UserConfigDataAccess : IUserConfigDataAccess
|
public class UserConfigDataAccess : IUserConfigDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "userconfigrecords";
|
private static string tableName = "userconfigrecords";
|
||||||
|
public UserConfigDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public UserConfigData GetUserConfig(int userId)
|
public UserConfigData GetUserConfig(int userId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserConfigData>(tableName);
|
var table = db.GetCollection<UserConfigData>(tableName);
|
||||||
return table.FindById(userId);
|
return table.FindById(userId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveUserConfig(UserConfigData userConfigData)
|
public bool SaveUserConfig(UserConfigData userConfigData)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserConfigData>(tableName);
|
var table = db.GetCollection<UserConfigData>(tableName);
|
||||||
table.Upsert(userConfigData);
|
table.Upsert(userConfigData);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteUserConfig(int userId)
|
public bool DeleteUserConfig(int userId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserConfigData>(tableName);
|
var table = db.GetCollection<UserConfigData>(tableName);
|
||||||
table.Delete(userId);
|
table.Delete(userId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,66 +1,60 @@
|
|||||||
using CarCareTracker.External.Interfaces;
|
using CarCareTracker.External.Interfaces;
|
||||||
using CarCareTracker.Helper;
|
|
||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
|
|
||||||
namespace CarCareTracker.External.Implementations
|
namespace CarCareTracker.External.Implementations
|
||||||
{
|
{
|
||||||
public class UserRecordDataAccess : IUserRecordDataAccess
|
public class UserRecordDataAccess : IUserRecordDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "userrecords";
|
private static string tableName = "userrecords";
|
||||||
|
public UserRecordDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public List<UserData> GetUsers()
|
public List<UserData> GetUsers()
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserData>(tableName);
|
var table = db.GetCollection<UserData>(tableName);
|
||||||
return table.FindAll().ToList();
|
return table.FindAll().ToList();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public UserData GetUserRecordByUserName(string userName)
|
public UserData GetUserRecordByUserName(string userName)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserData>(tableName);
|
var table = db.GetCollection<UserData>(tableName);
|
||||||
var userRecord = table.FindOne(Query.EQ(nameof(UserData.UserName), userName));
|
var userRecord = table.FindOne(Query.EQ(nameof(UserData.UserName), userName));
|
||||||
return userRecord ?? new UserData();
|
return userRecord ?? new UserData();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public UserData GetUserRecordByEmailAddress(string emailAddress)
|
public UserData GetUserRecordByEmailAddress(string emailAddress)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserData>(tableName);
|
var table = db.GetCollection<UserData>(tableName);
|
||||||
var userRecord = table.FindOne(Query.EQ(nameof(UserData.EmailAddress), emailAddress));
|
var userRecord = table.FindOne(Query.EQ(nameof(UserData.EmailAddress), emailAddress));
|
||||||
return userRecord ?? new UserData();
|
return userRecord ?? new UserData();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public UserData GetUserRecordById(int userId)
|
public UserData GetUserRecordById(int userId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserData>(tableName);
|
var table = db.GetCollection<UserData>(tableName);
|
||||||
var userRecord = table.FindById(userId);
|
var userRecord = table.FindById(userId);
|
||||||
return userRecord ?? new UserData();
|
return userRecord ?? new UserData();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool SaveUserRecord(UserData userRecord)
|
public bool SaveUserRecord(UserData userRecord)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserData>(tableName);
|
var table = db.GetCollection<UserData>(tableName);
|
||||||
table.Upsert(userRecord);
|
table.Upsert(userRecord);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteUserRecord(int userId)
|
public bool DeleteUserRecord(int userId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<UserData>(tableName);
|
var table = db.GetCollection<UserData>(tableName);
|
||||||
table.Delete(userId);
|
table.Delete(userId);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,40 +7,39 @@ namespace CarCareTracker.External.Implementations
|
|||||||
{
|
{
|
||||||
public class VehicleDataAccess : IVehicleDataAccess
|
public class VehicleDataAccess : IVehicleDataAccess
|
||||||
{
|
{
|
||||||
private static string dbName = StaticHelper.DbName;
|
private ILiteDBHelper _liteDB { get; set; }
|
||||||
private static string tableName = "vehicles";
|
private static string tableName = "vehicles";
|
||||||
|
public VehicleDataAccess(ILiteDBHelper liteDB)
|
||||||
|
{
|
||||||
|
_liteDB = liteDB;
|
||||||
|
}
|
||||||
public bool SaveVehicle(Vehicle vehicle)
|
public bool SaveVehicle(Vehicle vehicle)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Vehicle>(tableName);
|
var table = db.GetCollection<Vehicle>(tableName);
|
||||||
var result = table.Upsert(vehicle);
|
var result = table.Upsert(vehicle);
|
||||||
|
db.Checkpoint();
|
||||||
return true;
|
return true;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public bool DeleteVehicle(int vehicleId)
|
public bool DeleteVehicle(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Vehicle>(tableName);
|
var table = db.GetCollection<Vehicle>(tableName);
|
||||||
return table.Delete(vehicleId);
|
var result = table.Delete(vehicleId);
|
||||||
};
|
db.Checkpoint();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
public List<Vehicle> GetVehicles()
|
public List<Vehicle> GetVehicles()
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Vehicle>(tableName);
|
var table = db.GetCollection<Vehicle>(tableName);
|
||||||
return table.FindAll().ToList();
|
return table.FindAll().ToList();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
public Vehicle GetVehicleById(int vehicleId)
|
public Vehicle GetVehicleById(int vehicleId)
|
||||||
{
|
{
|
||||||
using (var db = new LiteDatabase(dbName))
|
var db = _liteDB.GetLiteDB();
|
||||||
{
|
|
||||||
var table = db.GetCollection<Vehicle>(tableName);
|
var table = db.GetCollection<Vehicle>(tableName);
|
||||||
return table.FindById(vehicleId);
|
return table.FindById(vehicleId);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ namespace CarCareTracker.Helper
|
|||||||
UserConfig GetUserConfig(ClaimsPrincipal user);
|
UserConfig GetUserConfig(ClaimsPrincipal user);
|
||||||
bool SaveUserConfig(ClaimsPrincipal user, UserConfig configData);
|
bool SaveUserConfig(ClaimsPrincipal user, UserConfig configData);
|
||||||
bool AuthenticateRootUser(string username, string password);
|
bool AuthenticateRootUser(string username, string password);
|
||||||
|
string GetWebHookUrl();
|
||||||
string GetMOTD();
|
string GetMOTD();
|
||||||
string GetLogoUrl();
|
string GetLogoUrl();
|
||||||
string GetServerLanguage();
|
string GetServerLanguage();
|
||||||
@@ -33,6 +34,15 @@ namespace CarCareTracker.Helper
|
|||||||
_userConfig = userConfig;
|
_userConfig = userConfig;
|
||||||
_cache = memoryCache;
|
_cache = memoryCache;
|
||||||
}
|
}
|
||||||
|
public string GetWebHookUrl()
|
||||||
|
{
|
||||||
|
var webhook = _config["LUBELOGGER_WEBHOOK"];
|
||||||
|
if (string.IsNullOrWhiteSpace(webhook))
|
||||||
|
{
|
||||||
|
webhook = "";
|
||||||
|
}
|
||||||
|
return webhook;
|
||||||
|
}
|
||||||
public string GetMOTD()
|
public string GetMOTD()
|
||||||
{
|
{
|
||||||
var motd = _config["LUBELOGGER_MOTD"];
|
var motd = _config["LUBELOGGER_MOTD"];
|
||||||
|
|||||||
@@ -18,10 +18,12 @@ namespace CarCareTracker.Helper
|
|||||||
{
|
{
|
||||||
private readonly IWebHostEnvironment _webEnv;
|
private readonly IWebHostEnvironment _webEnv;
|
||||||
private readonly ILogger<IFileHelper> _logger;
|
private readonly ILogger<IFileHelper> _logger;
|
||||||
public FileHelper(IWebHostEnvironment webEnv, ILogger<IFileHelper> logger)
|
private ILiteDBHelper _liteDB;
|
||||||
|
public FileHelper(IWebHostEnvironment webEnv, ILogger<IFileHelper> logger, ILiteDBHelper liteDB)
|
||||||
{
|
{
|
||||||
_webEnv = webEnv;
|
_webEnv = webEnv;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_liteDB = liteDB;
|
||||||
}
|
}
|
||||||
public List<string> GetLanguages()
|
public List<string> GetLanguages()
|
||||||
{
|
{
|
||||||
@@ -93,6 +95,7 @@ namespace CarCareTracker.Helper
|
|||||||
//copy over images and documents.
|
//copy over images and documents.
|
||||||
var imagePath = Path.Combine(tempPath, "images");
|
var imagePath = Path.Combine(tempPath, "images");
|
||||||
var documentPath = Path.Combine(tempPath, "documents");
|
var documentPath = Path.Combine(tempPath, "documents");
|
||||||
|
var translationPath = Path.Combine(tempPath, "translations");
|
||||||
var dataPath = Path.Combine(tempPath, StaticHelper.DbName);
|
var dataPath = Path.Combine(tempPath, StaticHelper.DbName);
|
||||||
var configPath = Path.Combine(tempPath, StaticHelper.UserConfigPath);
|
var configPath = Path.Combine(tempPath, StaticHelper.UserConfigPath);
|
||||||
if (Directory.Exists(imagePath))
|
if (Directory.Exists(imagePath))
|
||||||
@@ -139,8 +142,32 @@ namespace CarCareTracker.Helper
|
|||||||
File.Copy(file, $"{existingPath}/{Path.GetFileName(file)}", true);
|
File.Copy(file, $"{existingPath}/{Path.GetFileName(file)}", true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (Directory.Exists(translationPath))
|
||||||
|
{
|
||||||
|
var existingPath = Path.Combine(_webEnv.WebRootPath, "translations");
|
||||||
|
if (!Directory.Exists(existingPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(existingPath);
|
||||||
|
}
|
||||||
|
else if (clearExisting)
|
||||||
|
{
|
||||||
|
var filesToDelete = Directory.GetFiles(existingPath);
|
||||||
|
foreach (string file in filesToDelete)
|
||||||
|
{
|
||||||
|
File.Delete(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//copy each files from temp folder to newPath
|
||||||
|
var filesToUpload = Directory.GetFiles(translationPath);
|
||||||
|
foreach (string file in filesToUpload)
|
||||||
|
{
|
||||||
|
File.Copy(file, $"{existingPath}/{Path.GetFileName(file)}", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (File.Exists(dataPath))
|
if (File.Exists(dataPath))
|
||||||
{
|
{
|
||||||
|
//Relinquish current DB file lock
|
||||||
|
_liteDB.DisposeLiteDB();
|
||||||
//data path will always exist as it is created on startup if not.
|
//data path will always exist as it is created on startup if not.
|
||||||
File.Move(dataPath, StaticHelper.DbName, true);
|
File.Move(dataPath, StaticHelper.DbName, true);
|
||||||
}
|
}
|
||||||
@@ -191,6 +218,7 @@ namespace CarCareTracker.Helper
|
|||||||
var tempPath = Path.Combine(_webEnv.WebRootPath, $"temp/{folderName}");
|
var tempPath = Path.Combine(_webEnv.WebRootPath, $"temp/{folderName}");
|
||||||
var imagePath = Path.Combine(_webEnv.WebRootPath, "images");
|
var imagePath = Path.Combine(_webEnv.WebRootPath, "images");
|
||||||
var documentPath = Path.Combine(_webEnv.WebRootPath, "documents");
|
var documentPath = Path.Combine(_webEnv.WebRootPath, "documents");
|
||||||
|
var translationPath = Path.Combine(_webEnv.WebRootPath, "translations");
|
||||||
var dataPath = StaticHelper.DbName;
|
var dataPath = StaticHelper.DbName;
|
||||||
var configPath = StaticHelper.UserConfigPath;
|
var configPath = StaticHelper.UserConfigPath;
|
||||||
if (!Directory.Exists(tempPath))
|
if (!Directory.Exists(tempPath))
|
||||||
@@ -215,6 +243,16 @@ namespace CarCareTracker.Helper
|
|||||||
File.Copy(file, $"{newPath}/{Path.GetFileName(file)}");
|
File.Copy(file, $"{newPath}/{Path.GetFileName(file)}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (Directory.Exists(translationPath))
|
||||||
|
{
|
||||||
|
var files = Directory.GetFiles(translationPath);
|
||||||
|
foreach(var file in files)
|
||||||
|
{
|
||||||
|
var newPath = Path.Combine(tempPath, "translations");
|
||||||
|
Directory.CreateDirectory(newPath);
|
||||||
|
File.Copy(file, $"{newPath}/{Path.GetFileName(file)}");
|
||||||
|
}
|
||||||
|
}
|
||||||
if (File.Exists(dataPath))
|
if (File.Exists(dataPath))
|
||||||
{
|
{
|
||||||
var newPath = Path.Combine(tempPath, "data");
|
var newPath = Path.Combine(tempPath, "data");
|
||||||
|
|||||||
36
Helper/LiteDBHelper.cs
Normal file
36
Helper/LiteDBHelper.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using LiteDB;
|
||||||
|
|
||||||
|
namespace CarCareTracker.Helper;
|
||||||
|
|
||||||
|
public interface ILiteDBHelper
|
||||||
|
{
|
||||||
|
LiteDatabase GetLiteDB();
|
||||||
|
void DisposeLiteDB();
|
||||||
|
}
|
||||||
|
public class LiteDBHelper: ILiteDBHelper
|
||||||
|
{
|
||||||
|
public LiteDatabase db { get; set; }
|
||||||
|
public LiteDBHelper()
|
||||||
|
{
|
||||||
|
if (db == null)
|
||||||
|
{
|
||||||
|
db = new LiteDatabase(StaticHelper.DbName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public LiteDatabase GetLiteDB()
|
||||||
|
{
|
||||||
|
if (db == null)
|
||||||
|
{
|
||||||
|
db = new LiteDatabase(StaticHelper.DbName);
|
||||||
|
}
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
public void DisposeLiteDB()
|
||||||
|
{
|
||||||
|
if (db != null)
|
||||||
|
{
|
||||||
|
db.Dispose();
|
||||||
|
db = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ namespace CarCareTracker.Helper
|
|||||||
{
|
{
|
||||||
public interface IReminderHelper
|
public interface IReminderHelper
|
||||||
{
|
{
|
||||||
ReminderRecord GetUpdatedRecurringReminderRecord(ReminderRecord existingReminder);
|
ReminderRecord GetUpdatedRecurringReminderRecord(ReminderRecord existingReminder, DateTime? currentDate, int? currentMileage);
|
||||||
List<ReminderRecordViewModel> GetReminderRecordViewModels(List<ReminderRecord> reminders, int currentMileage, DateTime dateCompare);
|
List<ReminderRecordViewModel> GetReminderRecordViewModels(List<ReminderRecord> reminders, int currentMileage, DateTime dateCompare);
|
||||||
}
|
}
|
||||||
public class ReminderHelper: IReminderHelper
|
public class ReminderHelper: IReminderHelper
|
||||||
@@ -14,46 +14,48 @@ namespace CarCareTracker.Helper
|
|||||||
{
|
{
|
||||||
_config = config;
|
_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.Metric == ReminderMetric.Both)
|
||||||
{
|
{
|
||||||
if (existingReminder.ReminderMonthInterval != ReminderMonthInterval.Other)
|
if (existingReminder.ReminderMonthInterval != ReminderMonthInterval.Other)
|
||||||
{
|
{
|
||||||
existingReminder.Date = existingReminder.Date.AddMonths((int)existingReminder.ReminderMonthInterval);
|
existingReminder.Date = newDate.AddMonths((int)existingReminder.ReminderMonthInterval);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
existingReminder.Date = existingReminder.Date.AddMonths(existingReminder.CustomMonthInterval);
|
existingReminder.Date = newDate.Date.AddMonths(existingReminder.CustomMonthInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (existingReminder.ReminderMileageInterval != ReminderMileageInterval.Other)
|
if (existingReminder.ReminderMileageInterval != ReminderMileageInterval.Other)
|
||||||
{
|
{
|
||||||
existingReminder.Mileage += (int)existingReminder.ReminderMileageInterval;
|
existingReminder.Mileage = newMileage + (int)existingReminder.ReminderMileageInterval;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
existingReminder.Mileage += existingReminder.CustomMileageInterval;
|
existingReminder.Mileage = newMileage + existingReminder.CustomMileageInterval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (existingReminder.Metric == ReminderMetric.Odometer)
|
else if (existingReminder.Metric == ReminderMetric.Odometer)
|
||||||
{
|
{
|
||||||
if (existingReminder.ReminderMileageInterval != ReminderMileageInterval.Other)
|
if (existingReminder.ReminderMileageInterval != ReminderMileageInterval.Other)
|
||||||
{
|
{
|
||||||
existingReminder.Mileage += (int)existingReminder.ReminderMileageInterval;
|
existingReminder.Mileage = newMileage + (int)existingReminder.ReminderMileageInterval;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
existingReminder.Mileage += existingReminder.CustomMileageInterval;
|
existingReminder.Mileage = newMileage + existingReminder.CustomMileageInterval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (existingReminder.Metric == ReminderMetric.Date)
|
else if (existingReminder.Metric == ReminderMetric.Date)
|
||||||
{
|
{
|
||||||
if (existingReminder.ReminderMonthInterval != ReminderMonthInterval.Other)
|
if (existingReminder.ReminderMonthInterval != ReminderMonthInterval.Other)
|
||||||
{
|
{
|
||||||
existingReminder.Date = existingReminder.Date.AddMonths((int)existingReminder.ReminderMonthInterval);
|
existingReminder.Date = newDate.AddMonths((int)existingReminder.ReminderMonthInterval);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
existingReminder.Date = existingReminder.Date.AddMonths(existingReminder.CustomMonthInterval);
|
existingReminder.Date = newDate.AddMonths(existingReminder.CustomMonthInterval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return existingReminder;
|
return existingReminder;
|
||||||
@@ -73,7 +75,8 @@ namespace CarCareTracker.Helper
|
|||||||
Description = reminder.Description,
|
Description = reminder.Description,
|
||||||
Notes = reminder.Notes,
|
Notes = reminder.Notes,
|
||||||
Metric = reminder.Metric,
|
Metric = reminder.Metric,
|
||||||
IsRecurring = reminder.IsRecurring
|
IsRecurring = reminder.IsRecurring,
|
||||||
|
Tags = reminder.Tags
|
||||||
};
|
};
|
||||||
if (reminder.Metric == ReminderMetric.Both)
|
if (reminder.Metric == ReminderMetric.Both)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace CarCareTracker.Helper
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class StaticHelper
|
public static class StaticHelper
|
||||||
{
|
{
|
||||||
public static string VersionNumber = "1.2.6";
|
public static string VersionNumber = "1.2.9";
|
||||||
public static string DbName = "data/cartracker.db";
|
public static string DbName = "data/cartracker.db";
|
||||||
public static string UserConfigPath = "config/userConfig.json";
|
public static string UserConfigPath = "config/userConfig.json";
|
||||||
public static string GenericErrorMessage = "An error occurred, please try again later";
|
public static string GenericErrorMessage = "An error occurred, please try again later";
|
||||||
@@ -244,5 +244,20 @@ namespace CarCareTracker.Helper
|
|||||||
var motd = config["LUBELOGGER_MOTD"] ?? "Not Configured";
|
var motd = config["LUBELOGGER_MOTD"] ?? "Not Configured";
|
||||||
Console.WriteLine($"Message Of The Day: {motd}");
|
Console.WriteLine($"Message Of The Day: {motd}");
|
||||||
}
|
}
|
||||||
|
public static async void NotifyAsync(string webhookURL, int vehicleId, string username, string action)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(webhookURL))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var httpClient = new HttpClient();
|
||||||
|
var httpParams = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "vehicleId", vehicleId.ToString() },
|
||||||
|
{ "username", username },
|
||||||
|
{ "action", action },
|
||||||
|
};
|
||||||
|
httpClient.PostAsJsonAsync(webhookURL, httpParams);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
107
Logic/VehicleLogic.cs
Normal file
107
Logic/VehicleLogic.cs
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
using CarCareTracker.External.Interfaces;
|
||||||
|
using CarCareTracker.Helper;
|
||||||
|
using CarCareTracker.Models;
|
||||||
|
|
||||||
|
namespace CarCareTracker.Logic
|
||||||
|
{
|
||||||
|
public interface IVehicleLogic
|
||||||
|
{
|
||||||
|
int GetMaxMileage(int vehicleId);
|
||||||
|
int GetMinMileage(int vehicleId);
|
||||||
|
bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId);
|
||||||
|
}
|
||||||
|
public class VehicleLogic: IVehicleLogic
|
||||||
|
{
|
||||||
|
private readonly IServiceRecordDataAccess _serviceRecordDataAccess;
|
||||||
|
private readonly IGasRecordDataAccess _gasRecordDataAccess;
|
||||||
|
private readonly ICollisionRecordDataAccess _collisionRecordDataAccess;
|
||||||
|
private readonly IUpgradeRecordDataAccess _upgradeRecordDataAccess;
|
||||||
|
private readonly IOdometerRecordDataAccess _odometerRecordDataAccess;
|
||||||
|
private readonly IReminderRecordDataAccess _reminderRecordDataAccess;
|
||||||
|
private readonly IReminderHelper _reminderHelper;
|
||||||
|
public VehicleLogic(
|
||||||
|
IServiceRecordDataAccess serviceRecordDataAccess,
|
||||||
|
IGasRecordDataAccess gasRecordDataAccess,
|
||||||
|
ICollisionRecordDataAccess collisionRecordDataAccess,
|
||||||
|
IUpgradeRecordDataAccess upgradeRecordDataAccess,
|
||||||
|
IOdometerRecordDataAccess odometerRecordDataAccess,
|
||||||
|
IReminderRecordDataAccess reminderRecordDataAccess,
|
||||||
|
IReminderHelper reminderHelper
|
||||||
|
) {
|
||||||
|
_serviceRecordDataAccess = serviceRecordDataAccess;
|
||||||
|
_gasRecordDataAccess = gasRecordDataAccess;
|
||||||
|
_collisionRecordDataAccess = collisionRecordDataAccess;
|
||||||
|
_upgradeRecordDataAccess = upgradeRecordDataAccess;
|
||||||
|
_odometerRecordDataAccess = odometerRecordDataAccess;
|
||||||
|
_reminderRecordDataAccess = reminderRecordDataAccess;
|
||||||
|
_reminderHelper = reminderHelper;
|
||||||
|
}
|
||||||
|
public int GetMaxMileage(int vehicleId)
|
||||||
|
{
|
||||||
|
var numbersArray = new List<int>();
|
||||||
|
var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId);
|
||||||
|
if (serviceRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(serviceRecords.Max(x => x.Mileage));
|
||||||
|
}
|
||||||
|
var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId);
|
||||||
|
if (repairRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(repairRecords.Max(x => x.Mileage));
|
||||||
|
}
|
||||||
|
var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId);
|
||||||
|
if (gasRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(gasRecords.Max(x => x.Mileage));
|
||||||
|
}
|
||||||
|
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId);
|
||||||
|
if (upgradeRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(upgradeRecords.Max(x => x.Mileage));
|
||||||
|
}
|
||||||
|
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId);
|
||||||
|
if (odometerRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(odometerRecords.Max(x => x.Mileage));
|
||||||
|
}
|
||||||
|
return numbersArray.Any() ? numbersArray.Max() : 0;
|
||||||
|
}
|
||||||
|
public int GetMinMileage(int vehicleId)
|
||||||
|
{
|
||||||
|
var numbersArray = new List<int>();
|
||||||
|
var serviceRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
||||||
|
if (serviceRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(serviceRecords.Min(x => x.Mileage));
|
||||||
|
}
|
||||||
|
var repairRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
||||||
|
if (repairRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(repairRecords.Min(x => x.Mileage));
|
||||||
|
}
|
||||||
|
var gasRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
||||||
|
if (gasRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(gasRecords.Min(x => x.Mileage));
|
||||||
|
}
|
||||||
|
var upgradeRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
||||||
|
if (upgradeRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(upgradeRecords.Min(x => x.Mileage));
|
||||||
|
}
|
||||||
|
var odometerRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId).Where(x => x.Mileage != default);
|
||||||
|
if (odometerRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(odometerRecords.Min(x => x.Mileage));
|
||||||
|
}
|
||||||
|
return numbersArray.Any() ? numbersArray.Min() : 0;
|
||||||
|
}
|
||||||
|
public bool GetVehicleHasUrgentOrPastDueReminders(int vehicleId)
|
||||||
|
{
|
||||||
|
var currentMileage = GetMaxMileage(vehicleId);
|
||||||
|
var reminders = _reminderRecordDataAccess.GetReminderRecordsByVehicleId(vehicleId);
|
||||||
|
var results = _reminderHelper.GetReminderRecordViewModels(reminders, currentMileage, DateTime.Now);
|
||||||
|
return results.Any(x => x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
public int VehicleId { get; set; }
|
public int VehicleId { get; set; }
|
||||||
public int ReminderRecordId { get; set; }
|
public List<int> ReminderRecordId { get; set; } = new List<int>();
|
||||||
public string Date { get; set; } = DateTime.Now.ToShortDateString();
|
public string Date { get; set; } = DateTime.Now.ToShortDateString();
|
||||||
public int Mileage { get; set; }
|
public int Mileage { get; set; }
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
public List<string> Tags { get; set; } = new List<string>();
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
||||||
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
|
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
|
||||||
|
public bool CopySuppliesAttachment { get; set; } = false;
|
||||||
public CollisionRecord ToCollisionRecord() { return new CollisionRecord {
|
public CollisionRecord ToCollisionRecord() { return new CollisionRecord {
|
||||||
Id = Id,
|
Id = Id,
|
||||||
VehicleId = VehicleId,
|
VehicleId = VehicleId,
|
||||||
|
|||||||
8
Models/GasRecord/GasRecordEditModel.cs
Normal file
8
Models/GasRecord/GasRecordEditModel.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
namespace CarCareTracker.Models
|
||||||
|
{
|
||||||
|
public class GasRecordEditModel
|
||||||
|
{
|
||||||
|
public List<int> RecordIds { get; set; } = new List<int>();
|
||||||
|
public GasRecord EditRecord { get; set; } = new GasRecord();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,8 @@
|
|||||||
public string Scope { get; set; }
|
public string Scope { get; set; }
|
||||||
public string State { get; set; }
|
public string State { get; set; }
|
||||||
public bool ValidateState { get; set; } = false;
|
public bool ValidateState { get; set; } = false;
|
||||||
|
public bool DisableRegularLogin { get; set; } = false;
|
||||||
|
public string LogOutURL { get; set; } = "";
|
||||||
public string RemoteAuthURL { get { return $"{AuthURL}?client_id={ClientId}&response_type=code&redirect_uri={RedirectURL}&scope={Scope}&state={State}"; } }
|
public string RemoteAuthURL { get { return $"{AuthURL}?client_id={ClientId}&response_type=code&redirect_uri={RedirectURL}&scope={Scope}&state={State}"; } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
public decimal Cost { get; set; }
|
public decimal Cost { get; set; }
|
||||||
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
||||||
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
|
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
|
||||||
|
public bool CopySuppliesAttachment { get; set; } = false;
|
||||||
public PlanRecord ToPlanRecord() { return new PlanRecord {
|
public PlanRecord ToPlanRecord() { return new PlanRecord {
|
||||||
Id = Id,
|
Id = Id,
|
||||||
VehicleId = VehicleId,
|
VehicleId = VehicleId,
|
||||||
|
|||||||
@@ -14,5 +14,6 @@
|
|||||||
public ReminderMileageInterval ReminderMileageInterval { get; set; } = ReminderMileageInterval.FiveThousandMiles;
|
public ReminderMileageInterval ReminderMileageInterval { get; set; } = ReminderMileageInterval.FiveThousandMiles;
|
||||||
public ReminderMonthInterval ReminderMonthInterval { get; set; } = ReminderMonthInterval.OneYear;
|
public ReminderMonthInterval ReminderMonthInterval { get; set; } = ReminderMonthInterval.OneYear;
|
||||||
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
||||||
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
public ReminderMileageInterval ReminderMileageInterval { get; set; } = ReminderMileageInterval.FiveThousandMiles;
|
public ReminderMileageInterval ReminderMileageInterval { get; set; } = ReminderMileageInterval.FiveThousandMiles;
|
||||||
public ReminderMonthInterval ReminderMonthInterval { get; set; } = ReminderMonthInterval.OneYear;
|
public ReminderMonthInterval ReminderMonthInterval { get; set; } = ReminderMonthInterval.OneYear;
|
||||||
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
public ReminderMetric Metric { get; set; } = ReminderMetric.Date;
|
||||||
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
public ReminderRecord ToReminderRecord()
|
public ReminderRecord ToReminderRecord()
|
||||||
{
|
{
|
||||||
return new ReminderRecord
|
return new ReminderRecord
|
||||||
@@ -29,7 +30,8 @@
|
|||||||
ReminderMonthInterval = ReminderMonthInterval,
|
ReminderMonthInterval = ReminderMonthInterval,
|
||||||
CustomMileageInterval = CustomMileageInterval,
|
CustomMileageInterval = CustomMileageInterval,
|
||||||
CustomMonthInterval = CustomMonthInterval,
|
CustomMonthInterval = CustomMonthInterval,
|
||||||
Notes = Notes
|
Notes = Notes,
|
||||||
|
Tags = Tags
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,5 +17,6 @@
|
|||||||
/// Recurring Reminders
|
/// Recurring Reminders
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsRecurring { get; set; } = false;
|
public bool IsRecurring { get; set; } = false;
|
||||||
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,5 +13,8 @@
|
|||||||
public decimal TotalCostPerMile { get; set; }
|
public decimal TotalCostPerMile { get; set; }
|
||||||
public decimal TotalGasCostPerMile { get; set; }
|
public decimal TotalGasCostPerMile { get; set; }
|
||||||
public string DistanceUnit { get; set; }
|
public string DistanceUnit { get; set; }
|
||||||
|
public decimal TotalDepreciation { get; set; }
|
||||||
|
public decimal DepreciationPerDay { get; set; }
|
||||||
|
public decimal DepreciationPerMile { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
public int VehicleId { get; set; }
|
public int VehicleId { get; set; }
|
||||||
public int ReminderRecordId { get; set; }
|
public List<int> ReminderRecordId { get; set; } = new List<int>();
|
||||||
public string Date { get; set; } = DateTime.Now.ToShortDateString();
|
public string Date { get; set; } = DateTime.Now.ToShortDateString();
|
||||||
public int Mileage { get; set; }
|
public int Mileage { get; set; }
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
public List<string> Tags { get; set; } = new List<string>();
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
||||||
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
|
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
|
||||||
|
public bool CopySuppliesAttachment { get; set; } = false;
|
||||||
public ServiceRecord ToServiceRecord() { return new ServiceRecord {
|
public ServiceRecord ToServiceRecord() { return new ServiceRecord {
|
||||||
Id = Id,
|
Id = Id,
|
||||||
VehicleId = VehicleId,
|
VehicleId = VehicleId,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
public int VehicleId { get; set; }
|
public int VehicleId { get; set; }
|
||||||
public int ReminderRecordId { get; set; }
|
public List<int> ReminderRecordId { get; set; } = new List<int>();
|
||||||
public string Date { get; set; } = DateTime.Now.ToShortDateString();
|
public string Date { get; set; } = DateTime.Now.ToShortDateString();
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
public decimal Cost { get; set; }
|
public decimal Cost { get; set; }
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
public int VehicleId { get; set; }
|
public int VehicleId { get; set; }
|
||||||
public int ReminderRecordId { get; set; }
|
public List<int> ReminderRecordId { get; set; } = new List<int>();
|
||||||
public string Date { get; set; } = DateTime.Now.ToShortDateString();
|
public string Date { get; set; } = DateTime.Now.ToShortDateString();
|
||||||
public int Mileage { get; set; }
|
public int Mileage { get; set; }
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
public List<string> Tags { get; set; } = new List<string>();
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
||||||
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
|
public List<SupplyUsageHistory> RequisitionHistory { get; set; } = new List<SupplyUsageHistory>();
|
||||||
|
public bool CopySuppliesAttachment { get; set; } = false;
|
||||||
public UpgradeRecord ToUpgradeRecord() { return new UpgradeRecord {
|
public UpgradeRecord ToUpgradeRecord() { return new UpgradeRecord {
|
||||||
Id = Id,
|
Id = Id,
|
||||||
VehicleId = VehicleId,
|
VehicleId = VehicleId,
|
||||||
|
|||||||
@@ -10,9 +10,20 @@
|
|||||||
public string LicensePlate { get; set; }
|
public string LicensePlate { get; set; }
|
||||||
public string PurchaseDate { get; set; }
|
public string PurchaseDate { get; set; }
|
||||||
public string SoldDate { 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 IsElectric { get; set; } = false;
|
||||||
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 bool HasOdometerAdjustment { get; set; } = false;
|
||||||
|
/// <summary>
|
||||||
|
/// Primarily used for vehicles with odometer units different from user's settings.
|
||||||
|
/// </summary>
|
||||||
|
public string OdometerMultiplier { get; set; } = "1";
|
||||||
|
/// <summary>
|
||||||
|
/// Primarily used for vehicles where the odometer does not reflect actual mileage.
|
||||||
|
/// </summary>
|
||||||
|
public string OdometerDifference { get; set; } = "0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
19
Models/VehicleViewModel.cs
Normal file
19
Models/VehicleViewModel.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
namespace CarCareTracker.Models
|
||||||
|
{
|
||||||
|
public class VehicleViewModel
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string ImageLocation { get; set; } = "/defaults/noimage.png";
|
||||||
|
public int Year { get; set; }
|
||||||
|
public string Make { get; set; }
|
||||||
|
public string Model { get; set; }
|
||||||
|
public string LicensePlate { get; set; }
|
||||||
|
public string SoldDate { get; set; }
|
||||||
|
public bool IsElectric { get; set; } = false;
|
||||||
|
public bool UseHours { get; set; } = false;
|
||||||
|
public List<ExtraField> ExtraFields { get; set; } = new List<ExtraField>();
|
||||||
|
public List<string> Tags { get; set; } = new List<string>();
|
||||||
|
public int LastReportedMileage;
|
||||||
|
public bool HasReminders = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
20
Program.cs
20
Program.cs
@@ -16,6 +16,9 @@ StaticHelper.InitMessage(builder.Configuration);
|
|||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddControllersWithViews();
|
builder.Services.AddControllersWithViews();
|
||||||
|
|
||||||
|
//LiteDB is always injected even if user uses Postgres.
|
||||||
|
builder.Services.AddSingleton<ILiteDBHelper, LiteDBHelper>();
|
||||||
|
|
||||||
//data access method
|
//data access method
|
||||||
if (!string.IsNullOrWhiteSpace(builder.Configuration["POSTGRES_CONNECTION"])){
|
if (!string.IsNullOrWhiteSpace(builder.Configuration["POSTGRES_CONNECTION"])){
|
||||||
builder.Services.AddSingleton<IVehicleDataAccess, PGVehicleDataAccess>();
|
builder.Services.AddSingleton<IVehicleDataAccess, PGVehicleDataAccess>();
|
||||||
@@ -70,6 +73,7 @@ builder.Services.AddSingleton<ITranslationHelper, TranslationHelper>();
|
|||||||
builder.Services.AddSingleton<ILoginLogic, LoginLogic>();
|
builder.Services.AddSingleton<ILoginLogic, LoginLogic>();
|
||||||
builder.Services.AddSingleton<IUserLogic, UserLogic>();
|
builder.Services.AddSingleton<IUserLogic, UserLogic>();
|
||||||
builder.Services.AddSingleton<IOdometerLogic, OdometerLogic>();
|
builder.Services.AddSingleton<IOdometerLogic, OdometerLogic>();
|
||||||
|
builder.Services.AddSingleton<IVehicleLogic, VehicleLogic>();
|
||||||
|
|
||||||
if (!Directory.Exists("data"))
|
if (!Directory.Exists("data"))
|
||||||
{
|
{
|
||||||
@@ -107,7 +111,21 @@ var app = builder.Build();
|
|||||||
|
|
||||||
// Configure the HTTP request pipeline.
|
// Configure the HTTP request pipeline.
|
||||||
app.UseExceptionHandler("/Home/Error");
|
app.UseExceptionHandler("/Home/Error");
|
||||||
app.UseStaticFiles();
|
|
||||||
|
app.UseStaticFiles(new StaticFileOptions
|
||||||
|
{
|
||||||
|
OnPrepareResponse = ctx =>
|
||||||
|
{
|
||||||
|
if (ctx.Context.Request.Path.StartsWithSegments("/images") || ctx.Context.Request.Path.StartsWithSegments("/documents"))
|
||||||
|
{
|
||||||
|
ctx.Context.Response.Headers.Add("Cache-Control", "no-store");
|
||||||
|
if (!ctx.Context.User.Identity.IsAuthenticated)
|
||||||
|
{
|
||||||
|
ctx.Context.Response.Redirect("/Login");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
app.UseRouting();
|
app.UseRouting();
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
ViewData["Title"] = "LubeLogger";
|
ViewData["Title"] = "LubeLogger";
|
||||||
}
|
}
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script src="~/js/garage.js"></script>
|
<script src="~/js/garage.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/supplyrecord.js"></script>
|
<script src="~/js/supplyrecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/lib/drawdown/drawdown.js"></script>
|
<script src="~/lib/drawdown/drawdown.js"></script>
|
||||||
}
|
}
|
||||||
<div class="lubelogger-mobile-nav" onclick="hideMobileNav()">
|
<div class="lubelogger-mobile-nav" onclick="hideMobileNav()">
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal fade" id="addVehicleModal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="addVehicleModal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content" id="addVehicleModalContent">
|
<div class="modal-content" id="addVehicleModalContent">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
@using CarCareTracker.Helper
|
@using CarCareTracker.Helper
|
||||||
@inject IConfigHelper config
|
@inject IConfigHelper config
|
||||||
@inject ITranslationHelper translator
|
@inject ITranslationHelper translator
|
||||||
@model List<Vehicle>
|
@model List<VehicleViewModel>
|
||||||
@{
|
@{
|
||||||
var userConfig = config.GetUserConfig(User);
|
var userConfig = config.GetUserConfig(User);
|
||||||
var userLanguage = userConfig.UserLanguage;
|
var userLanguage = userConfig.UserLanguage;
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
}
|
}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="row gy-3 align-items-stretch vehiclesContainer">
|
<div class="row gy-3 align-items-stretch vehiclesContainer">
|
||||||
@foreach (Vehicle vehicle in Model)
|
@foreach (VehicleViewModel vehicle in Model)
|
||||||
{
|
{
|
||||||
@if (!(userConfig.HideSoldVehicles && !string.IsNullOrWhiteSpace(vehicle.SoldDate)))
|
@if (!(userConfig.HideSoldVehicles && !string.IsNullOrWhiteSpace(vehicle.SoldDate)))
|
||||||
{
|
{
|
||||||
@@ -36,6 +36,22 @@
|
|||||||
@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)
|
||||||
|
{
|
||||||
|
<div class="vehicle-sold-banner">
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<div>
|
||||||
|
<span class="ms-2"><i class="bi bi-speedometer me-2"></i>@vehicle.LastReportedMileage.ToString("N0")</span>
|
||||||
|
</div>
|
||||||
|
@if (vehicle.HasReminders)
|
||||||
|
{
|
||||||
|
<div>
|
||||||
|
<span class="me-2"><i class="bi bi bi-bell-fill text-warning"></i></span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<span></span>
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5 class="card-title text-truncate garage-item-year" data-unit="@vehicle.Year">@($"{vehicle.Year}")</h5>
|
<h5 class="card-title text-truncate garage-item-year" data-unit="@vehicle.Year">@($"{vehicle.Year}")</h5>
|
||||||
|
|||||||
@@ -402,6 +402,7 @@
|
|||||||
function restoreBackup(event) {
|
function restoreBackup(event) {
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", event.files[0]);
|
formData.append("file", event.files[0]);
|
||||||
|
console.log('LubeLogger - DB Restoration Started');
|
||||||
sloader.show();
|
sloader.show();
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "/Files/HandleFileUpload",
|
url: "/Files/HandleFileUpload",
|
||||||
@@ -415,16 +416,21 @@
|
|||||||
$.post('/Files/RestoreBackup', { fileName: response }, function (data) {
|
$.post('/Files/RestoreBackup', { fileName: response }, function (data) {
|
||||||
sloader.hide();
|
sloader.hide();
|
||||||
if (data) {
|
if (data) {
|
||||||
|
console.log('LubeLogger - DB Restoration Completed');
|
||||||
successToast("Backup Restored");
|
successToast("Backup Restored");
|
||||||
setTimeout(function () { window.location.href = '/Home/Index' }, 500);
|
setTimeout(function () { window.location.href = '/Home/Index' }, 500);
|
||||||
} else {
|
} else {
|
||||||
errorToast(genericErrorMessage());
|
errorToast(genericErrorMessage());
|
||||||
|
console.log('LubeLogger - DB Restoration Failed - Failed to process backup file.');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
console.log('LubeLogger - DB Restoration Failed - Failed to upload backup file.');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error: function () {
|
error: function () {
|
||||||
sloader.hide();
|
sloader.hide();
|
||||||
|
console.log('LubeLogger - DB Restoration Failed - Request failed to reach backend, please check file size.');
|
||||||
errorToast("An error has occurred, please check the file size and try again later.");
|
errorToast("An error has occurred, please check the file size and try again later.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
ViewData["Title"] = "LubeLogger - Login";
|
ViewData["Title"] = "LubeLogger - Login";
|
||||||
}
|
}
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script src="~/js/login.js"></script>
|
<script src="~/js/login.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
}
|
}
|
||||||
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
ViewData["Title"] = "LubeLogger - Login";
|
ViewData["Title"] = "LubeLogger - Login";
|
||||||
}
|
}
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script src="~/js/login.js"></script>
|
<script src="~/js/login.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
}
|
}
|
||||||
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
ViewData["Title"] = "LubeLogger - Register";
|
ViewData["Title"] = "LubeLogger - Register";
|
||||||
}
|
}
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script src="~/js/login.js"></script>
|
<script src="~/js/login.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
}
|
}
|
||||||
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
ViewData["Title"] = "LubeLogger - Register";
|
ViewData["Title"] = "LubeLogger - Register";
|
||||||
}
|
}
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script src="~/js/login.js"></script>
|
<script src="~/js/login.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
}
|
}
|
||||||
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
ViewData["Title"] = "LubeLogger - Register";
|
ViewData["Title"] = "LubeLogger - Register";
|
||||||
}
|
}
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script src="~/js/login.js"></script>
|
<script src="~/js/login.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
}
|
}
|
||||||
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
<div class="container d-flex align-items-center justify-content-center" style="height:100vh">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -45,12 +45,12 @@
|
|||||||
<link rel="apple-touch-startup-image" href="~/defaults/lubelogger_launch.png" />
|
<link rel="apple-touch-startup-image" href="~/defaults/lubelogger_launch.png" />
|
||||||
<link rel="manifest" href="~/manifest.json">
|
<link rel="manifest" href="~/manifest.json">
|
||||||
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
||||||
<script src="~/js/shared.js"></script>
|
<script src="~/js/shared.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
<script src="~/lib/bootstrap-datepicker/js/bootstrap-datepicker.min.js"></script>
|
<script src="~/lib/bootstrap-datepicker/js/bootstrap-datepicker.min.js"></script>
|
||||||
<script src="~/lib/bootstrap-tagsinput/bootstrap-tagsinput.js"></script>
|
<script src="~/lib/bootstrap-tagsinput/bootstrap-tagsinput.js"></script>
|
||||||
<script src="~/sweetalert/sweetalert2.all.min.js"></script>
|
<script src="~/sweetalert/sweetalert2.all.min.js"></script>
|
||||||
<script src="~/js/loader.js"></script>
|
<script src="~/js/loader.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script>
|
<script>
|
||||||
function getGlobalConfig() {
|
function getGlobalConfig() {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -10,18 +10,18 @@
|
|||||||
}
|
}
|
||||||
@model Vehicle
|
@model Vehicle
|
||||||
@section Scripts {
|
@section Scripts {
|
||||||
<script src="~/js/vehicle.js"></script>
|
<script src="~/js/vehicle.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/servicerecord.js"></script>
|
<script src="~/js/servicerecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/gasrecord.js"></script>
|
<script src="~/js/gasrecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/collisionrecord.js"></script>
|
<script src="~/js/collisionrecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/taxrecord.js"></script>
|
<script src="~/js/taxrecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/reminderrecord.js"></script>
|
<script src="~/js/reminderrecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/upgraderecord.js"></script>
|
<script src="~/js/upgraderecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/note.js"></script>
|
<script src="~/js/note.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/reports.js"></script>
|
<script src="~/js/reports.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/supplyrecord.js"></script>
|
<script src="~/js/supplyrecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/planrecord.js"></script>
|
<script src="~/js/planrecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/js/odometerrecord.js"></script>
|
<script src="~/js/odometerrecord.js?v=@StaticHelper.VersionNumber"></script>
|
||||||
<script src="~/lib/chart-js/chart.umd.js"></script>
|
<script src="~/lib/chart-js/chart.umd.js"></script>
|
||||||
<script src="~/lib/drawdown/drawdown.js"></script>
|
<script src="~/lib/drawdown/drawdown.js"></script>
|
||||||
}
|
}
|
||||||
@@ -139,7 +139,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal fade" id="editVehicleModal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="editVehicleModal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content" id="editVehicleModalContent">
|
<div class="modal-content" id="editVehicleModalContent">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -169,7 +169,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
function GetVehicleId() {
|
function GetVehicleId() {
|
||||||
return { vehicleId: @Model.Id};
|
return {
|
||||||
|
vehicleId: @Model.Id,
|
||||||
|
hasOdometerAdjustment: @Model.HasOdometerAdjustment.ToString().ToLower(),
|
||||||
|
odometerDifference: decodeHTMLEntities('@Model.OdometerDifference'),
|
||||||
|
odometerMultiplier: decodeHTMLEntities('@Model.OdometerMultiplier')
|
||||||
|
};
|
||||||
}
|
}
|
||||||
function GetDefaultTab() {
|
function GetDefaultTab() {
|
||||||
return { tab: "@userConfig.DefaultTab" };
|
return { tab: "@userConfig.DefaultTab" };
|
||||||
|
|||||||
@@ -121,7 +121,8 @@
|
|||||||
<script>
|
<script>
|
||||||
var uploadedFiles = [];
|
var uploadedFiles = [];
|
||||||
var selectedSupplies = [];
|
var selectedSupplies = [];
|
||||||
var recurringReminderRecordId = 0;
|
var copySuppliesAttachments = false;
|
||||||
|
var recurringReminderRecordId = [];
|
||||||
getUploadedFilesFromModel();
|
getUploadedFilesFromModel();
|
||||||
function getUploadedFilesFromModel() {
|
function getUploadedFilesFromModel() {
|
||||||
@foreach (UploadedFiles filesUploaded in Model.Files)
|
@foreach (UploadedFiles filesUploaded in Model.Files)
|
||||||
|
|||||||
@@ -129,7 +129,19 @@
|
|||||||
<td class="col-3 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(collisionRecord.Notes)</td>
|
<td class="col-3 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(collisionRecord.Notes)</td>
|
||||||
@foreach (string extraFieldColumn in extraFields)
|
@foreach (string extraFieldColumn in extraFields)
|
||||||
{
|
{
|
||||||
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">@(collisionRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "")</td>
|
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">
|
||||||
|
@{
|
||||||
|
var extraFieldValue = collisionRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "";
|
||||||
|
if (!string.IsNullOrWhiteSpace(extraFieldValue) && Uri.IsWellFormedUriString(extraFieldValue, UriKind.Absolute))
|
||||||
|
{
|
||||||
|
<a href="@extraFieldValue" onclick="noPropagation()" target="_blank">@CarCareTracker.Helper.StaticHelper.TruncateStrings(extraFieldValue)</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@extraFieldValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
}
|
}
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@@ -159,6 +171,8 @@
|
|||||||
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'RepairRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'RepairRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
||||||
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
|
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
|
||||||
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>
|
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>
|
||||||
|
<li><hr class="context-menu-odometer-adjustment dropdown-divider"></li>
|
||||||
|
<li><a class="context-menu-odometer-adjustment dropdown-item" href="#" onclick="adjustRecordsOdometer(selectedRow, 'RepairRecord')">@translator.Translate(userLanguage, "Adjust Odometer")</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
@if (userColumnPreferences.Any())
|
@if (userColumnPreferences.Any())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -199,7 +199,19 @@
|
|||||||
<td class="col-3 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="notes">@StaticHelper.TruncateStrings(gasRecord.Notes)</td>
|
<td class="col-3 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="notes">@StaticHelper.TruncateStrings(gasRecord.Notes)</td>
|
||||||
@foreach (string extraFieldColumn in extraFields)
|
@foreach (string extraFieldColumn in extraFields)
|
||||||
{
|
{
|
||||||
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">@(gasRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "")</td>
|
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">
|
||||||
|
@{
|
||||||
|
var extraFieldValue = gasRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "";
|
||||||
|
if (!string.IsNullOrWhiteSpace(extraFieldValue) && Uri.IsWellFormedUriString(extraFieldValue, UriKind.Absolute))
|
||||||
|
{
|
||||||
|
<a href="@extraFieldValue" onclick="noPropagation()" target="_blank">@CarCareTracker.Helper.StaticHelper.TruncateStrings(extraFieldValue)</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@extraFieldValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
}
|
}
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@@ -219,9 +231,12 @@
|
|||||||
<ul class="table-context-menu dropdown-menu" style="display:none;">
|
<ul class="table-context-menu dropdown-menu" style="display:none;">
|
||||||
<li><a class="context-menu-multiple context-menu-select-all dropdown-item" href="#" onclick="selectAllRows()">@translator.Translate(userLanguage, "Select All")</a></li>
|
<li><a class="context-menu-multiple context-menu-select-all dropdown-item" href="#" onclick="selectAllRows()">@translator.Translate(userLanguage, "Select All")</a></li>
|
||||||
<li><a class="context-menu-multiple context-menu-deselect-all dropdown-item" href="#" onclick="clearSelectedRows()">@translator.Translate(userLanguage, "Deselect All")</a></li>
|
<li><a class="context-menu-multiple context-menu-deselect-all dropdown-item" href="#" onclick="clearSelectedRows()">@translator.Translate(userLanguage, "Deselect All")</a></li>
|
||||||
|
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="editMultipleGasRecords(selectedRow)">@translator.Translate(userLanguage, "Edit Multiple")</a></li>
|
||||||
<li><hr class="context-menu-multiple dropdown-divider"></li>
|
<li><hr class="context-menu-multiple dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
|
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
|
||||||
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
||||||
|
<li><hr class="context-menu-odometer-adjustment dropdown-divider"></li>
|
||||||
|
<li><a class="context-menu-odometer-adjustment dropdown-item" href="#" onclick="adjustRecordsOdometer(selectedRow, 'GasRecord')">@translator.Translate(userLanguage, "Adjust Odometer")</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
@if (userColumnPreferences.Any())
|
@if (userColumnPreferences.Any())
|
||||||
{
|
{
|
||||||
|
|||||||
50
Views/Vehicle/_GasRecordsModal.cshtml
Normal file
50
Views/Vehicle/_GasRecordsModal.cshtml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
@using CarCareTracker.Helper
|
||||||
|
@inject IConfigHelper config
|
||||||
|
@inject ITranslationHelper translator
|
||||||
|
@model GasRecordEditModel
|
||||||
|
@{
|
||||||
|
var userConfig = config.GetUserConfig(User);
|
||||||
|
var userLanguage = userConfig.UserLanguage;
|
||||||
|
}
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">@translator.Translate(userLanguage,"Edit Multiple Gas Records")</h5>
|
||||||
|
<button type="button" class="btn-close" onclick="hideAddGasRecordModal()" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<form>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 col-12">
|
||||||
|
<label for="gasRecordDate">@translator.Translate(userLanguage, "Date")</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" id="gasRecordDate" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
|
||||||
|
<span class="input-group-text"><i class="bi bi-calendar-event"></i></span>
|
||||||
|
</div>
|
||||||
|
<label for="gasRecordMileage">@translator.Translate(userLanguage, "Odometer")</label>
|
||||||
|
<input type="number" inputmode="numeric" id="gasRecordMileage" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
|
||||||
|
<label for="gasRecordConsumption">@translator.Translate(userLanguage, "Fuel Consumption")</label>
|
||||||
|
<input type="text" inputmode="decimal" id="gasRecordConsumption" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
|
||||||
|
<label for="gasRecordCost">@translator.Translate(userLanguage, "Cost")</label>
|
||||||
|
<input type="text" inputmode="decimal" id="gasRecordCost" class="form-control" placeholder="@translator.Translate(userLanguage,"(multiple)")">
|
||||||
|
<label for="gasRecordTag">@translator.Translate(userLanguage, "Tags(use --- to clear all existing tags)")</label>
|
||||||
|
<select multiple class="form-select" id="gasRecordTag"></select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 col-12">
|
||||||
|
<label for="gasRecordNotes">@translator.Translate(userLanguage, "Notes(use --- to clear all existing notes)")<a class="link-underline link-underline-opacity-0" onclick="showLinks(this)"><i class="bi bi-markdown ms-2"></i></a></label>
|
||||||
|
<textarea id="gasRecordNotes" class="form-control" rows="5"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" onclick="hideAddGasRecordModal()">@translator.Translate(userLanguage, "Cancel")</button>
|
||||||
|
<button type="button" class="btn btn-primary" onclick="saveMultipleGasRecordsToVehicle()">@translator.Translate(userLanguage, "Edit")</button>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
var recordsToEdit = [];
|
||||||
|
@foreach(int recordId in Model.RecordIds)
|
||||||
|
{
|
||||||
|
@:recordsToEdit.push(@recordId);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -129,7 +129,19 @@
|
|||||||
<td class="col-2 col-xl-3 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(odometerRecord.Notes, 75)</td>
|
<td class="col-2 col-xl-3 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(odometerRecord.Notes, 75)</td>
|
||||||
@foreach (string extraFieldColumn in extraFields)
|
@foreach (string extraFieldColumn in extraFields)
|
||||||
{
|
{
|
||||||
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">@(odometerRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "")</td>
|
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">
|
||||||
|
@{
|
||||||
|
var extraFieldValue = odometerRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "";
|
||||||
|
if (!string.IsNullOrWhiteSpace(extraFieldValue) && Uri.IsWellFormedUriString(extraFieldValue, UriKind.Absolute))
|
||||||
|
{
|
||||||
|
<a href="@extraFieldValue" onclick="noPropagation()" target="_blank">@CarCareTracker.Helper.StaticHelper.TruncateStrings(extraFieldValue)</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@extraFieldValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
}
|
}
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@@ -155,6 +167,8 @@
|
|||||||
<li><hr class="context-menu-multiple dropdown-divider"></li>
|
<li><hr class="context-menu-multiple dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
|
<li><a class="dropdown-item" href="#" onclick="duplicateRecords(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Duplicate")</a></li>
|
||||||
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
||||||
|
<li><hr class="context-menu-odometer-adjustment dropdown-divider"></li>
|
||||||
|
<li><a class="context-menu-odometer-adjustment dropdown-item" href="#" onclick="adjustRecordsOdometer(selectedRow, 'OdometerRecord')">@translator.Translate(userLanguage, "Adjust Odometer")</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
@if (userColumnPreferences.Any())
|
@if (userColumnPreferences.Any())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -117,6 +117,7 @@
|
|||||||
<script>
|
<script>
|
||||||
var uploadedFiles = [];
|
var uploadedFiles = [];
|
||||||
var selectedSupplies = [];
|
var selectedSupplies = [];
|
||||||
|
var copySuppliesAttachments = false;
|
||||||
getUploadedFilesFromModel();
|
getUploadedFilesFromModel();
|
||||||
function getUploadedFilesFromModel() {
|
function getUploadedFilesFromModel() {
|
||||||
@foreach (UploadedFiles filesUploaded in Model.Files)
|
@foreach (UploadedFiles filesUploaded in Model.Files)
|
||||||
|
|||||||
@@ -1,4 +1,18 @@
|
|||||||
@model List<ReminderRecord>
|
@using CarCareTracker.Helper
|
||||||
|
@inject IConfigHelper config
|
||||||
|
@inject ITranslationHelper translator
|
||||||
|
@{
|
||||||
|
var userConfig = config.GetUserConfig(User);
|
||||||
|
var userLanguage = userConfig.UserLanguage;
|
||||||
|
}
|
||||||
|
@model List<ReminderRecord>
|
||||||
|
@if (Model.Count() > 1)
|
||||||
|
{
|
||||||
|
<div class="mb-2">
|
||||||
|
<input class="form-check-input" type="checkbox" onchange="showMultipleRemindersSelector()" id="multipleRemindersCheck">
|
||||||
|
<label class="form-check-label" for="multipleRemindersCheck">@translator.Translate(userLanguage, "Multiple")</label>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
<select class="form-select" id="recurringReminderInput">
|
<select class="form-select" id="recurringReminderInput">
|
||||||
@if (Model.Any())
|
@if (Model.Any())
|
||||||
{
|
{
|
||||||
@@ -11,3 +25,14 @@
|
|||||||
<!option value="0">No Recurring Reminders Found</!option>
|
<!option value="0">No Recurring Reminders Found</!option>
|
||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
|
<div id="recurringMultipleReminders" style="display:none;">
|
||||||
|
<ul class="list-group">
|
||||||
|
@foreach (ReminderRecord reminderRecord in Model)
|
||||||
|
{
|
||||||
|
<li class="list-group-item text-start">
|
||||||
|
<input class="form-check-input" type="checkbox" value="@reminderRecord.Id" id="recurringReminder_@reminderRecord.Id">
|
||||||
|
<label class="form-check-label stretched-link" for="recurringReminder_@reminderRecord.Id">@reminderRecord.Description</label>
|
||||||
|
</li>
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
@@ -42,6 +42,14 @@
|
|||||||
<input class="form-check-input" type="radio" name="reminderMetricOptions" id="reminderMetricBoth" value="@(ReminderMetric.Both)" checked="@(Model.Metric == ReminderMetric.Both)">
|
<input class="form-check-input" type="radio" name="reminderMetricOptions" id="reminderMetricBoth" value="@(ReminderMetric.Both)" checked="@(Model.Metric == ReminderMetric.Both)">
|
||||||
<label class="form-check-label" for="reminderMetricBoth">@translator.Translate(userLanguage,"Whichever comes first")</label>
|
<label class="form-check-label" for="reminderMetricBoth">@translator.Translate(userLanguage,"Whichever comes first")</label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="d-grid"></div>
|
||||||
|
<label for="reminderRecordTag">@translator.Translate(userLanguage, "Tags(optional)")</label>
|
||||||
|
<select multiple class="form-select" id="reminderRecordTag">
|
||||||
|
@foreach (string tag in Model.Tags)
|
||||||
|
{
|
||||||
|
<!option value="@tag">@tag</!option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 col-12">
|
<div class="col-md-6 col-12">
|
||||||
<label for="reminderNotes">@translator.Translate(userLanguage,"Notes(optional)")<a class="link-underline link-underline-opacity-0" onclick="showLinks(this)"><i class="bi bi-markdown ms-2"></i></a></label>
|
<label for="reminderNotes">@translator.Translate(userLanguage,"Notes(optional)")<a class="link-underline link-underline-opacity-0" onclick="showLinks(this)"><i class="bi bi-markdown ms-2"></i></a></label>
|
||||||
|
|||||||
@@ -6,15 +6,26 @@
|
|||||||
var userConfig = config.GetUserConfig(User);
|
var userConfig = config.GetUserConfig(User);
|
||||||
var userLanguage = userConfig.UserLanguage;
|
var userLanguage = userConfig.UserLanguage;
|
||||||
var hasRefresh = Model.Where(x => (x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue) && x.IsRecurring).Any();
|
var hasRefresh = Model.Where(x => (x.Urgency == ReminderUrgency.VeryUrgent || x.Urgency == ReminderUrgency.PastDue) && x.IsRecurring).Any();
|
||||||
|
var recordTags = Model.SelectMany(x => x.Tags).Distinct();
|
||||||
}
|
}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex justify-content-between">
|
||||||
<div class="d-flex align-items-center flex-wrap">
|
<div class="d-flex align-items-center flex-wrap">
|
||||||
<span class="ms-2 badge bg-success">@($"{translator.Translate(userLanguage, "# of Reminders")}: {Model.Count()}")</span>
|
<span class="ms-2 badge bg-success" data-aggregate-type="count">@($"{translator.Translate(userLanguage, "# of Reminders")}: {Model.Count()}")</span>
|
||||||
<span class="ms-2 badge bg-secondary">@($"{translator.Translate(userLanguage, "Past Due")}: {Model.Where(x => x.Urgency == ReminderUrgency.PastDue).Count()}")</span>
|
<span class="ms-2 badge bg-secondary" data-aggregate-type="pastdue-count">@($"{translator.Translate(userLanguage, "Past Due")}: {Model.Where(x => x.Urgency == ReminderUrgency.PastDue).Count()}")</span>
|
||||||
<span class="ms-2 badge bg-danger">@($"{translator.Translate(userLanguage, "Very Urgent")}: {Model.Where(x=>x.Urgency == ReminderUrgency.VeryUrgent).Count()}")</span>
|
<span class="ms-2 badge bg-danger" data-aggregate-type="veryurgent-count">@($"{translator.Translate(userLanguage, "Very Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.VeryUrgent).Count()}")</span>
|
||||||
<span class="ms-2 badge bg-warning">@($"{translator.Translate(userLanguage, "Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.Urgent).Count()}")</span>
|
<span class="ms-2 badge text-bg-warning" data-aggregate-type="urgent-count">@($"{translator.Translate(userLanguage, "Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.Urgent).Count()}")</span>
|
||||||
<span class="ms-2 badge bg-success">@($"{translator.Translate(userLanguage, "Not Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.NotUrgent).Count()}")</span>
|
<span class="ms-2 badge bg-success" data-aggregate-type="noturgent-count">@($"{translator.Translate(userLanguage, "Not Urgent")}: {Model.Where(x => x.Urgency == ReminderUrgency.NotUrgent).Count()}")</span>
|
||||||
|
@foreach (string recordTag in recordTags)
|
||||||
|
{
|
||||||
|
<span onclick="filterReminderTable(this)" class="user-select-none ms-2 rounded-pill badge bg-secondary tagfilter" style="cursor:pointer;">@recordTag</span>
|
||||||
|
}
|
||||||
|
<datalist id="tagList">
|
||||||
|
@foreach (string recordTag in recordTags)
|
||||||
|
{
|
||||||
|
<!option value="@recordTag"></!option>
|
||||||
|
}
|
||||||
|
</datalist>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button onclick="showAddReminderModal()" class="btn btn-primary btn-md mt-1 mb-1"><i class="bi bi-pencil-square me-2"></i>@translator.Translate(userLanguage, "Add Reminder")</button>
|
<button onclick="showAddReminderModal()" class="btn btn-primary btn-md mt-1 mb-1"><i class="bi bi-pencil-square me-2"></i>@translator.Translate(userLanguage, "Add Reminder")</button>
|
||||||
@@ -33,19 +44,19 @@
|
|||||||
<tr class="d-flex">
|
<tr class="d-flex">
|
||||||
<th scope="col" class="col-1">@translator.Translate(userLanguage, "Urgency")</th>
|
<th scope="col" class="col-1">@translator.Translate(userLanguage, "Urgency")</th>
|
||||||
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Metric")</th>
|
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Metric")</th>
|
||||||
<th scope="col" class="@(hasRefresh ? "col-4" : "col-5")">@translator.Translate(userLanguage, "Description")</th>
|
<th scope="col" class="@(hasRefresh ? "col-3 col-md-4" : "col-5")">@translator.Translate(userLanguage, "Description")</th>
|
||||||
<th scope="col" class="col-3">@translator.Translate(userLanguage, "Notes")</th>
|
<th scope="col" class="col-2 col-md-3">@translator.Translate(userLanguage, "Notes")</th>
|
||||||
@if (hasRefresh)
|
@if (hasRefresh)
|
||||||
{
|
{
|
||||||
<th scope="col" class="col-1">@translator.Translate(userLanguage, "Done")</th>
|
<th scope="col" class="col-2 col-md-1">@translator.Translate(userLanguage, "Done")</th>
|
||||||
}
|
}
|
||||||
<th scope="col" class="col-1">@translator.Translate(userLanguage, "Delete")</th>
|
<th scope="col" class="col-2 col-md-1">@translator.Translate(userLanguage, "Delete")</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach (ReminderRecordViewModel reminderRecord in Model)
|
@foreach (ReminderRecordViewModel reminderRecord in Model)
|
||||||
{
|
{
|
||||||
<tr class="d-flex user-select-none" style="cursor:pointer;" onmouseup="stopEvent()" ontouchstart="detectRowLongTouch(this)" ontouchend="detectRowTouchEndPremature(this)" data-rowId="@reminderRecord.Id" oncontextmenu="showTableContextMenu(this)" onmousemove="rangeMouseMove(this)" onclick="handleTableRowClick(this, showEditReminderRecordModal,@reminderRecord.Id)">
|
<tr class="d-flex user-select-none" style="cursor:pointer;" onmouseup="stopEvent()" ontouchstart="detectRowLongTouch(this)" ontouchend="detectRowTouchEndPremature(this)" data-rowId="@reminderRecord.Id" oncontextmenu="showTableContextMenu(this)" onmousemove="rangeMouseMove(this)" onclick="handleTableRowClick(this, showEditReminderRecordModal,@reminderRecord.Id)" data-tags='@string.Join(" ", reminderRecord.Tags)'>
|
||||||
@if (reminderRecord.Urgency == ReminderUrgency.VeryUrgent)
|
@if (reminderRecord.Urgency == ReminderUrgency.VeryUrgent)
|
||||||
{
|
{
|
||||||
<td class="col-1"><span class="badge text-bg-danger">@translator.Translate(userLanguage, "Very Urgent")</span></td>
|
<td class="col-1"><span class="badge text-bg-danger">@translator.Translate(userLanguage, "Very Urgent")</span></td>
|
||||||
@@ -74,18 +85,18 @@
|
|||||||
{
|
{
|
||||||
<td class="col-2">@reminderRecord.Metric</td>
|
<td class="col-2">@reminderRecord.Metric</td>
|
||||||
}
|
}
|
||||||
<td class="@(hasRefresh ? "col-4" : "col-5")">@reminderRecord.Description</td>
|
<td class="@(hasRefresh ? "col-3 col-md-4" : "col-5")" data-record-type='cost'>@reminderRecord.Description</td>
|
||||||
<td class="col-3 text-truncate">@CarCareTracker.Helper.StaticHelper.TruncateStrings(reminderRecord.Notes)</td>
|
<td class="col-2 col-md-3 text-truncate">@CarCareTracker.Helper.StaticHelper.TruncateStrings(reminderRecord.Notes)</td>
|
||||||
@if (hasRefresh)
|
@if (hasRefresh)
|
||||||
{
|
{
|
||||||
<td class="col-1 text-truncate">
|
<td class="col-2 col-md-1 text-truncate">
|
||||||
@if((reminderRecord.Urgency == ReminderUrgency.VeryUrgent || reminderRecord.Urgency == ReminderUrgency.PastDue) && reminderRecord.IsRecurring)
|
@if((reminderRecord.Urgency == ReminderUrgency.VeryUrgent || reminderRecord.Urgency == ReminderUrgency.PastDue) && reminderRecord.IsRecurring)
|
||||||
{
|
{
|
||||||
<button type="button" class="btn btn-secondary" onclick="markDoneReminderRecord(@reminderRecord.Id, this)"><i class="bi bi-check-lg"></i></button>
|
<button type="button" class="btn btn-secondary" onclick="markDoneReminderRecord(@reminderRecord.Id, this)"><i class="bi bi-check-lg"></i></button>
|
||||||
}
|
}
|
||||||
</td>
|
</td>
|
||||||
}
|
}
|
||||||
<td class="col-1 text-truncate">
|
<td class="col-2 col-md-1 text-truncate">
|
||||||
<button type="button" class="btn btn-danger" onclick="deleteReminderRecord(@reminderRecord.Id, this)"><i class="bi bi-trash"></i></button>
|
<button type="button" class="btn btn-danger" onclick="deleteReminderRecord(@reminderRecord.Id, this)"><i class="bi bi-trash"></i></button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -121,7 +121,8 @@
|
|||||||
<script>
|
<script>
|
||||||
var uploadedFiles = [];
|
var uploadedFiles = [];
|
||||||
var selectedSupplies = [];
|
var selectedSupplies = [];
|
||||||
var recurringReminderRecordId = 0;
|
var recurringReminderRecordId = [];
|
||||||
|
var copySuppliesAttachments = false;
|
||||||
getUploadedFilesFromModel();
|
getUploadedFilesFromModel();
|
||||||
function getUploadedFilesFromModel() {
|
function getUploadedFilesFromModel() {
|
||||||
@foreach (UploadedFiles filesUploaded in Model.Files)
|
@foreach (UploadedFiles filesUploaded in Model.Files)
|
||||||
|
|||||||
@@ -129,7 +129,17 @@
|
|||||||
<td class="col-3 text-truncate flex-grow-1 flex-shrink-1" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(serviceRecord.Notes)</td>
|
<td class="col-3 text-truncate flex-grow-1 flex-shrink-1" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(serviceRecord.Notes)</td>
|
||||||
@foreach (string extraFieldColumn in extraFields)
|
@foreach (string extraFieldColumn in extraFields)
|
||||||
{
|
{
|
||||||
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">@(serviceRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "")</td>
|
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">
|
||||||
|
@{
|
||||||
|
var extraFieldValue = serviceRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "";
|
||||||
|
if (!string.IsNullOrWhiteSpace(extraFieldValue) && Uri.IsWellFormedUriString(extraFieldValue, UriKind.Absolute)){
|
||||||
|
<a href="@extraFieldValue" onclick="noPropagation()" target="_blank">@CarCareTracker.Helper.StaticHelper.TruncateStrings(extraFieldValue)</a>
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
@extraFieldValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
}
|
}
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@@ -159,6 +169,8 @@
|
|||||||
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'ServiceRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'ServiceRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
||||||
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
|
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
|
||||||
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>
|
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>
|
||||||
|
<li><hr class="context-menu-odometer-adjustment dropdown-divider"></li>
|
||||||
|
<li><a class="context-menu-odometer-adjustment dropdown-item" href="#" onclick="adjustRecordsOdometer(selectedRow, 'ServiceRecord')">@translator.Translate(userLanguage, "Adjust Odometer")</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
@if (userColumnPreferences.Any())
|
@if (userColumnPreferences.Any())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -145,7 +145,19 @@
|
|||||||
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(supplyRecord.Notes)</td>
|
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(supplyRecord.Notes)</td>
|
||||||
@foreach (string extraFieldColumn in extraFields)
|
@foreach (string extraFieldColumn in extraFields)
|
||||||
{
|
{
|
||||||
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">@(supplyRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "")</td>
|
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">
|
||||||
|
@{
|
||||||
|
var extraFieldValue = supplyRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "";
|
||||||
|
if (!string.IsNullOrWhiteSpace(extraFieldValue) && Uri.IsWellFormedUriString(extraFieldValue, UriKind.Absolute))
|
||||||
|
{
|
||||||
|
<a href="@extraFieldValue" onclick="noPropagation()" target="_blank">@CarCareTracker.Helper.StaticHelper.TruncateStrings(extraFieldValue)</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@extraFieldValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
}
|
}
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
selectedSupplies = getSuppliesAndQuantity().selectedSupplies;
|
selectedSupplies = getSuppliesAndQuantity().selectedSupplies;
|
||||||
|
copySuppliesAttachments = $("#inputCopySuppliesAttachments").is(':checked');
|
||||||
hideSuppliesModal();
|
hideSuppliesModal();
|
||||||
}
|
}
|
||||||
function hideParentModal(){
|
function hideParentModal(){
|
||||||
|
|||||||
@@ -66,6 +66,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<span id="supplySumLabel" style="margin-right:auto;">Total: 0.00</span>
|
<span id="supplySumLabel" style="margin-right:auto;">Total: 0.00</span>
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" role="switch" id="inputCopySuppliesAttachments">
|
||||||
|
<label class="form-check-label" for="inputCopySuppliesAttachments">@translator.Translate(userLanguage, "Copy Attachments")</label>
|
||||||
|
</div>
|
||||||
<button type="button" class="btn btn-secondary" onclick="hideSuppliesModal()">@translator.Translate(userLanguage, "Cancel")</button>
|
<button type="button" class="btn btn-secondary" onclick="hideSuppliesModal()">@translator.Translate(userLanguage, "Cancel")</button>
|
||||||
<button type="button" class="btn btn-primary" disabled id="selectSuppliesButton" onclick="selectSupplies()">@translator.Translate(userLanguage, "Select")</button>
|
<button type="button" class="btn btn-primary" disabled id="selectSuppliesButton" onclick="selectSupplies()">@translator.Translate(userLanguage, "Select")</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -115,7 +115,7 @@
|
|||||||
<script>
|
<script>
|
||||||
var uploadedFiles = [];
|
var uploadedFiles = [];
|
||||||
var customMonthInterval = @Model.CustomMonthInterval;
|
var customMonthInterval = @Model.CustomMonthInterval;
|
||||||
var recurringReminderRecordId = 0;
|
var recurringReminderRecordId = [];
|
||||||
getUploadedFilesFromModel();
|
getUploadedFilesFromModel();
|
||||||
function getUploadedFilesFromModel() {
|
function getUploadedFilesFromModel() {
|
||||||
@foreach (UploadedFiles filesUploaded in Model.Files)
|
@foreach (UploadedFiles filesUploaded in Model.Files)
|
||||||
|
|||||||
@@ -121,7 +121,19 @@
|
|||||||
<td class="col-3 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(taxRecord.Notes)</td>
|
<td class="col-3 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(taxRecord.Notes)</td>
|
||||||
@foreach (string extraFieldColumn in extraFields)
|
@foreach (string extraFieldColumn in extraFields)
|
||||||
{
|
{
|
||||||
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">@(taxRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "")</td>
|
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">
|
||||||
|
@{
|
||||||
|
var extraFieldValue = taxRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "";
|
||||||
|
if (!string.IsNullOrWhiteSpace(extraFieldValue) && Uri.IsWellFormedUriString(extraFieldValue, UriKind.Absolute))
|
||||||
|
{
|
||||||
|
<a href="@extraFieldValue" onclick="noPropagation()" target="_blank">@CarCareTracker.Helper.StaticHelper.TruncateStrings(extraFieldValue)</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@extraFieldValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
}
|
}
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,8 @@
|
|||||||
<script>
|
<script>
|
||||||
var uploadedFiles = [];
|
var uploadedFiles = [];
|
||||||
var selectedSupplies = [];
|
var selectedSupplies = [];
|
||||||
var recurringReminderRecordId = 0;
|
var recurringReminderRecordId = [];
|
||||||
|
var copySuppliesAttachments = false;
|
||||||
getUploadedFilesFromModel();
|
getUploadedFilesFromModel();
|
||||||
function getUploadedFilesFromModel() {
|
function getUploadedFilesFromModel() {
|
||||||
@foreach (UploadedFiles filesUploaded in Model.Files)
|
@foreach (UploadedFiles filesUploaded in Model.Files)
|
||||||
|
|||||||
@@ -129,7 +129,19 @@
|
|||||||
<td class="col-3 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(upgradeRecord.Notes)</td>
|
<td class="col-3 flex-grow-1 flex-shrink-1 text-truncate" data-column="notes">@CarCareTracker.Helper.StaticHelper.TruncateStrings(upgradeRecord.Notes)</td>
|
||||||
@foreach (string extraFieldColumn in extraFields)
|
@foreach (string extraFieldColumn in extraFields)
|
||||||
{
|
{
|
||||||
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">@(upgradeRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "")</td>
|
<td class="col-2 flex-grow-1 flex-shrink-1 text-truncate" style='display:none;' data-column="@extraFieldColumn">
|
||||||
|
@{
|
||||||
|
var extraFieldValue = upgradeRecord.ExtraFields.Where(x => x.Name == extraFieldColumn)?.FirstOrDefault()?.Value ?? "";
|
||||||
|
if (!string.IsNullOrWhiteSpace(extraFieldValue) && Uri.IsWellFormedUriString(extraFieldValue, UriKind.Absolute))
|
||||||
|
{
|
||||||
|
<a href="@extraFieldValue" onclick="noPropagation()" target="_blank">@CarCareTracker.Helper.StaticHelper.TruncateStrings(extraFieldValue)</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@extraFieldValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
}
|
}
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@@ -158,6 +170,8 @@
|
|||||||
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'UpgradeRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
<li><a class="dropdown-item" href="#" onclick="deleteRecords(selectedRow, 'UpgradeRecord')">@translator.Translate(userLanguage, "Delete")</a></li>
|
||||||
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
|
<li><hr class="context-menu-active-multiple dropdown-divider"></li>
|
||||||
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>
|
<li><a class="context-menu-active-multiple dropdown-item" href="#" onclick="getRecordsDeltaStats(selectedRow)">@translator.Translate(userLanguage, "Statistics")</a></li>
|
||||||
|
<li><hr class="context-menu-odometer-adjustment dropdown-divider"></li>
|
||||||
|
<li><a class="context-menu-odometer-adjustment dropdown-item" href="#" onclick="adjustRecordsOdometer(selectedRow, 'UpgradeRecord')">@translator.Translate(userLanguage, "Adjust Odometer")</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
@if (userColumnPreferences.Any())
|
@if (userColumnPreferences.Any())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -62,6 +62,30 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
|
@if (Model.TotalDepreciation != default)
|
||||||
|
{
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-3">
|
||||||
|
@(Model.TotalDepreciation > 0 ? translator.Translate(userLanguage, "Depreciation") : translator.Translate(userLanguage, "Appreciation"))
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<span><i class="bi @(Model.TotalDepreciation > 0 ? "bi-graph-down-arrow" : "bi-graph-up-arrow") me-2"></i>@Math.Abs(Model.TotalDepreciation).ToString("C")</span>
|
||||||
|
</div>
|
||||||
|
@if (Model.DepreciationPerDay != default)
|
||||||
|
{
|
||||||
|
<div class="col-3">
|
||||||
|
<span><i class="bi bi-calendar-event me-2"></i>@($"{Model.DepreciationPerDay.ToString("C")}/{translator.Translate(userLanguage, "day")}")</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@if (Model.DepreciationPerMile != default)
|
||||||
|
{
|
||||||
|
<div class="col-3">
|
||||||
|
<span><i class="bi bi-speedometer me-2"></i>@($"{Model.DepreciationPerMile.ToString("C")}/{Model.DistanceUnit}")</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<table class="table table-hover">
|
<table class="table table-hover">
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<form class="form-inline">
|
<form class="form-inline">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 col-md-6">
|
||||||
<label for="inputYear">@translator.Translate(userLanguage, "Year")</label>
|
<label for="inputYear">@translator.Translate(userLanguage, "Year")</label>
|
||||||
<input type="number" inputmode="numeric" id="inputYear" class="form-control" placeholder="@translator.Translate(userLanguage, "Year(must be after 1900)")" value="@(isNew ? "" : Model.Year)">
|
<input type="number" inputmode="numeric" id="inputYear" class="form-control" placeholder="@translator.Translate(userLanguage, "Year(must be after 1900)")" value="@(isNew ? "" : Model.Year)">
|
||||||
<label for="inputMake">@translator.Translate(userLanguage, "Make")</label>
|
<label for="inputMake">@translator.Translate(userLanguage, "Make")</label>
|
||||||
@@ -34,25 +36,6 @@
|
|||||||
<input type="text" id="inputModel" class="form-control" placeholder="@translator.Translate(userLanguage, "Model")" value="@Model.Model">
|
<input type="text" id="inputModel" class="form-control" placeholder="@translator.Translate(userLanguage, "Model")" value="@Model.Model">
|
||||||
<label for="inputLicensePlate">@translator.Translate(userLanguage, "License Plate")</label>
|
<label for="inputLicensePlate">@translator.Translate(userLanguage, "License Plate")</label>
|
||||||
<input type="text" id="inputLicensePlate" class="form-control" placeholder="@translator.Translate(userLanguage, "License Plate")" value="@Model.LicensePlate">
|
<input type="text" id="inputLicensePlate" class="form-control" placeholder="@translator.Translate(userLanguage, "License Plate")" value="@Model.LicensePlate">
|
||||||
<label for="inputPurchaseDate">@translator.Translate(userLanguage, "Purchased Date(optional)")</label>
|
|
||||||
<input type="text" id="inputPurchaseDate" class="form-control" placeholder="@translator.Translate(userLanguage, "Purchased Date")" value="@Model.PurchaseDate">
|
|
||||||
<label for="inputSoldDate">@translator.Translate(userLanguage, "Sold Date(optional)")</label>
|
|
||||||
<input type="text" id="inputSoldDate" class="form-control" placeholder="@translator.Translate(userLanguage, "Sold Date")" value="@Model.SoldDate">
|
|
||||||
<div class="form-check form-switch">
|
|
||||||
<input class="form-check-input" type="checkbox" role="switch" id="inputIsElectric" checked="@Model.IsElectric">
|
|
||||||
<label class="form-check-label" for="inputIsElectric">@translator.Translate(userLanguage, "Electric Vehicle")</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check form-switch">
|
|
||||||
<input class="form-check-input" type="checkbox" role="switch" id="inputUseHours" checked="@Model.UseHours">
|
|
||||||
<label class="form-check-label" for="inputUseHours">@translator.Translate(userLanguage, "Use Engine Hours")</label>
|
|
||||||
</div>
|
|
||||||
<label for="inputTag">@translator.Translate(userLanguage, "Tags(optional)")</label>
|
|
||||||
<select multiple class="form-select" id="inputTag">
|
|
||||||
@foreach (string tag in Model.Tags)
|
|
||||||
{
|
|
||||||
<!option value="@tag">@tag</!option>
|
|
||||||
}
|
|
||||||
</select>
|
|
||||||
@foreach (ExtraField field in Model.ExtraFields)
|
@foreach (ExtraField field in Model.ExtraFields)
|
||||||
{
|
{
|
||||||
var elementId = Guid.NewGuid();
|
var elementId = Guid.NewGuid();
|
||||||
@@ -61,16 +44,67 @@
|
|||||||
<input type="text" id="@elementId" class="form-control @(field.IsRequired ? "extra-field-required" : "")" placeholder="@field.Name" value="@field.Value">
|
<input type="text" id="@elementId" class="form-control @(field.IsRequired ? "extra-field-required" : "")" placeholder="@field.Name" value="@field.Value">
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-6">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" role="switch" id="inputIsElectric" checked="@Model.IsElectric">
|
||||||
|
<label class="form-check-label" for="inputIsElectric">@translator.Translate(userLanguage, "Electric Vehicle")</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" role="switch" id="inputUseHours" checked="@Model.UseHours">
|
||||||
|
<label class="form-check-label" for="inputUseHours">@translator.Translate(userLanguage, "Use Engine Hours")</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" role="switch" onchange="toggleOdometerAdjustment()" id="inputHasOdometerAdjustment" checked="@Model.HasOdometerAdjustment">
|
||||||
|
<label class="form-check-label" for="inputHasOdometerAdjustment">@translator.Translate(userLanguage, "Odometer Adjustments")</label>
|
||||||
|
</div>
|
||||||
|
<div class="collapse @(Model.HasOdometerAdjustment ? "show" : "")" id="odometerAdjustments">
|
||||||
|
<div>
|
||||||
|
<label for="inputOdometerMultiplier">@translator.Translate(userLanguage, "Odometer Multiplier")</label>
|
||||||
|
<input type="text" id="inputOdometerMultiplier" class="form-control" placeholder="@translator.Translate(userLanguage, "Odometer Multiplier")" value="@Model.OdometerMultiplier">
|
||||||
|
<label for="inputOdometerDifference">@translator.Translate(userLanguage, "Odometer Difference")</label>
|
||||||
|
<input type="text" id="inputOdometerDifference" class="form-control" placeholder="@translator.Translate(userLanguage, "Odometer Difference")" value="@Model.OdometerDifference">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="accordion accordion-flush" id="vehicleModalAccordion">
|
||||||
|
<div class="accordion-item">
|
||||||
|
<div class="accordion-header">
|
||||||
|
<button class="accordion-button skinny collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapsePurchaseInfo">
|
||||||
|
@translator.Translate(userLanguage, "Purchase/Sold Information(optional)")
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div id="collapsePurchaseInfo" class="accordion-collapse collapse" data-bs-parent="#vehicleModalAccordion">
|
||||||
|
<label for="inputPurchaseDate">@translator.Translate(userLanguage, "Purchased Date(optional)")</label>
|
||||||
|
<input type="text" id="inputPurchaseDate" class="form-control" placeholder="@translator.Translate(userLanguage, "Purchased Date")" value="@Model.PurchaseDate">
|
||||||
|
<label for="inputSoldDate">@translator.Translate(userLanguage, "Sold Date(optional)")</label>
|
||||||
|
<input type="text" id="inputSoldDate" class="form-control" placeholder="@translator.Translate(userLanguage, "Sold Date")" value="@Model.SoldDate">
|
||||||
|
<label for="inputPurchasePrice">@translator.Translate(userLanguage, "Purchased Price(optional)")</label>
|
||||||
|
<input type="text" inputmode="decimal" id="inputPurchasePrice" class="form-control" placeholder="@translator.Translate(userLanguage, "Purchased Price")" value="@(Model.PurchasePrice == default ? "" : Model.PurchasePrice)">
|
||||||
|
<label for="inputSoldPrice">@translator.Translate(userLanguage, "Sold Price(optional)")</label>
|
||||||
|
<input type="text" inputmode="decimal" id="inputSoldPrice" class="form-control" placeholder="@translator.Translate(userLanguage, "Sold Price")" value="@(Model.SoldPrice == default ? "" : Model.SoldPrice)">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<label for="inputTag">@translator.Translate(userLanguage, "Tags(optional)")</label>
|
||||||
|
<select multiple class="form-select" id="inputTag">
|
||||||
|
@foreach (string tag in Model.Tags)
|
||||||
|
{
|
||||||
|
<!option value="@tag">@tag</!option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
@if (!string.IsNullOrWhiteSpace(Model.ImageLocation))
|
@if (!string.IsNullOrWhiteSpace(Model.ImageLocation))
|
||||||
{
|
{
|
||||||
<label for="inputImage">@translator.Translate(userLanguage, "Replace picture(optional)")</label>
|
<label for="inputImage">@translator.Translate(userLanguage, "Replace picture(optional)")</label>
|
||||||
<input onChange="uploadFileAsync(this)" type="file" accept=".png,.jpg,.jpeg" class="form-control-file" id="inputImage">
|
<input onChange="uploadFileAsync(this)" type="file" accept=".png,.jpg,.jpeg" class="form-control-file" id="inputImage">
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
<label for="inputImage">@translator.Translate(userLanguage, "Upload a picture(optional)")</label>
|
<label for="inputImage">@translator.Translate(userLanguage, "Upload a picture(optional)")</label>
|
||||||
<input onChange="uploadFileAsync(this)" type="file" accept=".png,.jpg,.jpeg" class="form-control-file" id="inputImage">
|
<input onChange="uploadFileAsync(this)" type="file" accept=".png,.jpg,.jpeg" class="form-control-file" id="inputImage">
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
|
|||||||
@@ -374,3 +374,7 @@ input[type="file"] {
|
|||||||
.copyable{
|
.copyable{
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
.accordion-button.skinny {
|
||||||
|
padding: 0.438rem 0rem !important;
|
||||||
|
background-color: inherit !important;
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -86,6 +86,8 @@ function getAndValidateCollisionRecordValues() {
|
|||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
var collisionRecordId = getCollisionRecordModelData().id;
|
var collisionRecordId = getCollisionRecordModelData().id;
|
||||||
var addReminderRecord = $("#addReminderCheck").is(":checked");
|
var addReminderRecord = $("#addReminderCheck").is(":checked");
|
||||||
|
//Odometer Adjustments
|
||||||
|
collisionMileage = GetAdjustedOdometer(collisionRecordId, collisionMileage);
|
||||||
//validation
|
//validation
|
||||||
var hasError = false;
|
var hasError = false;
|
||||||
var extraFields = getAndValidateExtraFields();
|
var extraFields = getAndValidateExtraFields();
|
||||||
@@ -131,6 +133,7 @@ function getAndValidateCollisionRecordValues() {
|
|||||||
addReminderRecord: addReminderRecord,
|
addReminderRecord: addReminderRecord,
|
||||||
extraFields: extraFields.extraFields,
|
extraFields: extraFields.extraFields,
|
||||||
requisitionHistory: supplyUsageHistory,
|
requisitionHistory: supplyUsageHistory,
|
||||||
reminderRecordId: recurringReminderRecordId
|
reminderRecordId: recurringReminderRecordId,
|
||||||
|
copySuppliesAttachment: copySuppliesAttachments
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -35,7 +35,7 @@ function getVehicleSupplyRecords() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
function GetVehicleId() {
|
function GetVehicleId() {
|
||||||
return { vehicleId: 0 };
|
return { vehicleId: 0, hasOdometerAdjustment: false };
|
||||||
}
|
}
|
||||||
function bindTabEvent() {
|
function bindTabEvent() {
|
||||||
$('button[data-bs-toggle="tab"]').on('show.bs.tab', function (e) {
|
$('button[data-bs-toggle="tab"]').on('show.bs.tab', function (e) {
|
||||||
@@ -91,7 +91,7 @@ function generateReminderItem(id, urgency, description) {
|
|||||||
case "PastDue":
|
case "PastDue":
|
||||||
return `<p class="badge text-wrap bg-secondary reminder-calendar-item mb-2" onclick='showCalendarReminderModal(${id})'>${encodeHTMLInput(description)}</p>`;
|
return `<p class="badge text-wrap bg-secondary reminder-calendar-item mb-2" onclick='showCalendarReminderModal(${id})'>${encodeHTMLInput(description)}</p>`;
|
||||||
case "Urgent":
|
case "Urgent":
|
||||||
return `<p class="badge text-wrap bg-warning reminder-calendar-item mb-2" onclick='showCalendarReminderModal(${id})'>${encodeHTMLInput(description)}</p>`;
|
return `<p class="badge text-wrap text-bg-warning reminder-calendar-item mb-2" onclick='showCalendarReminderModal(${id})'>${encodeHTMLInput(description)}</p>`;
|
||||||
case "NotUrgent":
|
case "NotUrgent":
|
||||||
return `<p class="badge text-wrap bg-success reminder-calendar-item mb-2" onclick='showCalendarReminderModal(${id})'>${encodeHTMLInput(description)}</p>`;
|
return `<p class="badge text-wrap bg-success reminder-calendar-item mb-2" onclick='showCalendarReminderModal(${id})'>${encodeHTMLInput(description)}</p>`;
|
||||||
}
|
}
|
||||||
@@ -167,7 +167,7 @@ function initCalendar() {
|
|||||||
function performLogOut() {
|
function performLogOut() {
|
||||||
$.post('/Login/LogOut', function (data) {
|
$.post('/Login/LogOut', function (data) {
|
||||||
if (data) {
|
if (data) {
|
||||||
window.location.href = '/Login';
|
window.location.href = data;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,8 @@ function getAndValidateGasRecordValues() {
|
|||||||
var gasTags = $("#gasRecordTag").val();
|
var gasTags = $("#gasRecordTag").val();
|
||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
var gasRecordId = getGasRecordModelData().id;
|
var gasRecordId = getGasRecordModelData().id;
|
||||||
|
//Odometer Adjustments
|
||||||
|
gasMileage = GetAdjustedOdometer(gasRecordId, gasMileage);
|
||||||
//validation
|
//validation
|
||||||
var hasError = false;
|
var hasError = false;
|
||||||
var extraFields = getAndValidateExtraFields();
|
var extraFields = getAndValidateExtraFields();
|
||||||
@@ -425,3 +427,68 @@ function searchGasTableRows() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function editMultipleGasRecords(ids) {
|
||||||
|
$.post('/Vehicle/GetGasRecordsEditModal', { recordIds: ids }, function (data) {
|
||||||
|
if (data) {
|
||||||
|
$("#gasRecordModalContent").html(data);
|
||||||
|
//initiate datepicker
|
||||||
|
initDatePicker($('#gasRecordDate'));
|
||||||
|
initTagSelector($("#gasRecordTag"));
|
||||||
|
$('#gasRecordModal').modal('show');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function saveMultipleGasRecordsToVehicle() {
|
||||||
|
var gasDate = $("#gasRecordDate").val();
|
||||||
|
var gasMileage = $("#gasRecordMileage").val();
|
||||||
|
var gasMileageToParse = parseInt(globalParseFloat($("#gasRecordMileage").val())).toString();
|
||||||
|
var gasConsumption = $("#gasRecordConsumption").val();
|
||||||
|
var gasCost = $("#gasRecordCost").val();
|
||||||
|
var gasNotes = $("#gasRecordNotes").val();
|
||||||
|
var gasTags = $("#gasRecordTag").val();
|
||||||
|
//validation
|
||||||
|
var hasError = false;
|
||||||
|
if (gasMileage.trim() != '' && (isNaN(gasMileageToParse) || parseInt(gasMileageToParse) < 0)) {
|
||||||
|
hasError = true;
|
||||||
|
$("#gasRecordMileage").addClass("is-invalid");
|
||||||
|
} else {
|
||||||
|
$("#gasRecordMileage").removeClass("is-invalid");
|
||||||
|
}
|
||||||
|
if (gasConsumption.trim() != '' && !isValidMoney(gasConsumption)) {
|
||||||
|
hasError = true;
|
||||||
|
$("#gasRecordConsumption").addClass("is-invalid");
|
||||||
|
} else {
|
||||||
|
$("#gasRecordConsumption").removeClass("is-invalid");
|
||||||
|
}
|
||||||
|
if (gasCost.trim() != '' && !isValidMoney(gasCost)) {
|
||||||
|
hasError = true;
|
||||||
|
$("#gasRecordCost").addClass("is-invalid");
|
||||||
|
} else {
|
||||||
|
$("#gasRecordCost").removeClass("is-invalid");
|
||||||
|
}
|
||||||
|
if (hasError) {
|
||||||
|
errorToast("Please check the form data");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var formValues = {
|
||||||
|
recordIds: recordsToEdit,
|
||||||
|
editRecord: {
|
||||||
|
date: gasDate,
|
||||||
|
mileage: gasMileageToParse,
|
||||||
|
gallons: gasConsumption,
|
||||||
|
cost: gasCost,
|
||||||
|
notes: gasNotes,
|
||||||
|
tags: gasTags
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$.post('/Vehicle/SaveMultipleGasRecords', { editModel: formValues }, function (data) {
|
||||||
|
if (data) {
|
||||||
|
successToast("Gas Records Updated");
|
||||||
|
hideAddGasRecordModal();
|
||||||
|
saveScrollPosition();
|
||||||
|
getVehicleGasRecords(GetVehicleId().vehicleId);
|
||||||
|
} else {
|
||||||
|
errorToast(genericErrorMessage());
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -84,6 +84,8 @@ function getAndValidateOdometerRecordValues() {
|
|||||||
var serviceTags = $("#odometerRecordTag").val();
|
var serviceTags = $("#odometerRecordTag").val();
|
||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
var odometerRecordId = getOdometerRecordModelData().id;
|
var odometerRecordId = getOdometerRecordModelData().id;
|
||||||
|
//Odometer Adjustments
|
||||||
|
serviceMileage = GetAdjustedOdometer(odometerRecordId, serviceMileage);
|
||||||
//validation
|
//validation
|
||||||
var hasError = false;
|
var hasError = false;
|
||||||
var extraFields = getAndValidateExtraFields();
|
var extraFields = getAndValidateExtraFields();
|
||||||
|
|||||||
@@ -194,7 +194,8 @@ function getAndValidatePlanRecordValues() {
|
|||||||
importMode: planType,
|
importMode: planType,
|
||||||
extraFields: extraFields.extraFields,
|
extraFields: extraFields.extraFields,
|
||||||
requisitionHistory: supplyUsageHistory,
|
requisitionHistory: supplyUsageHistory,
|
||||||
reminderRecordId: reminderRecordId
|
reminderRecordId: reminderRecordId,
|
||||||
|
copySuppliesAttachment: copySuppliesAttachments
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//drag and drop stuff.
|
//drag and drop stuff.
|
||||||
@@ -241,7 +242,9 @@ function updatePlanRecordProgress(newProgress) {
|
|||||||
},
|
},
|
||||||
}).then(function (result) {
|
}).then(function (result) {
|
||||||
if (result.isConfirmed) {
|
if (result.isConfirmed) {
|
||||||
$.post('/Vehicle/UpdatePlanRecordProgress', { planRecordId: draggedId, planProgress: newProgress, odometer: result.value.odometer }, function (data) {
|
//Odometer Adjustments
|
||||||
|
var adjustedOdometer = GetAdjustedOdometer(0, result.value.odometer);
|
||||||
|
$.post('/Vehicle/UpdatePlanRecordProgress', { planRecordId: draggedId, planProgress: newProgress, odometer: adjustedOdometer }, function (data) {
|
||||||
if (data) {
|
if (data) {
|
||||||
successToast("Plan Progress Updated");
|
successToast("Plan Progress Updated");
|
||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
if (data) {
|
if (data) {
|
||||||
$("#reminderRecordModalContent").html(data);
|
$("#reminderRecordModalContent").html(data);
|
||||||
initDatePicker($('#reminderDate'), true);
|
initDatePicker($('#reminderDate'), true);
|
||||||
|
initTagSelector($("#reminderRecordTag"));
|
||||||
$("#reminderRecordModal").modal("show");
|
$("#reminderRecordModal").modal("show");
|
||||||
$('#reminderRecordModal').off('shown.bs.modal').on('shown.bs.modal', function () {
|
$('#reminderRecordModal').off('shown.bs.modal').on('shown.bs.modal', function () {
|
||||||
if (getGlobalConfig().useMarkDown) {
|
if (getGlobalConfig().useMarkDown) {
|
||||||
@@ -166,6 +167,7 @@ function getAndValidateReminderRecordValues() {
|
|||||||
var reminderIsRecurring = $("#reminderIsRecurring").is(":checked");
|
var reminderIsRecurring = $("#reminderIsRecurring").is(":checked");
|
||||||
var reminderRecurringMonth = $("#reminderRecurringMonth").val();
|
var reminderRecurringMonth = $("#reminderRecurringMonth").val();
|
||||||
var reminderRecurringMileage = $("#reminderRecurringMileage").val();
|
var reminderRecurringMileage = $("#reminderRecurringMileage").val();
|
||||||
|
var reminderTags = $("#reminderRecordTag").val();
|
||||||
var reminderCustomMileageInterval = customMileageInterval;
|
var reminderCustomMileageInterval = customMileageInterval;
|
||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
var reminderId = getReminderRecordModelData().id;
|
var reminderId = getReminderRecordModelData().id;
|
||||||
@@ -215,7 +217,8 @@ function getAndValidateReminderRecordValues() {
|
|||||||
reminderMileageInterval: reminderRecurringMileage,
|
reminderMileageInterval: reminderRecurringMileage,
|
||||||
reminderMonthInterval: reminderRecurringMonth,
|
reminderMonthInterval: reminderRecurringMonth,
|
||||||
customMileageInterval: customMileageInterval,
|
customMileageInterval: customMileageInterval,
|
||||||
customMonthInterval: customMonthInterval
|
customMonthInterval: customMonthInterval,
|
||||||
|
tags: reminderTags
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function createPlanRecordFromReminder(reminderRecordId) {
|
function createPlanRecordFromReminder(reminderRecordId) {
|
||||||
@@ -240,3 +243,54 @@ function createPlanRecordFromReminder(reminderRecordId) {
|
|||||||
$("#planRecordModal").modal("show");
|
$("#planRecordModal").modal("show");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function filterReminderTable(sender) {
|
||||||
|
var rowData = $(`#reminder-tab-pane table tbody tr`);
|
||||||
|
if (sender == undefined) {
|
||||||
|
rowData.removeClass('override-hide');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var tagName = sender.textContent;
|
||||||
|
//check for other applied filters
|
||||||
|
if ($(sender).hasClass("bg-primary")) {
|
||||||
|
rowData.removeClass('override-hide');
|
||||||
|
$(sender).removeClass('bg-primary');
|
||||||
|
$(sender).addClass('bg-secondary');
|
||||||
|
updateReminderAggregateLabels();
|
||||||
|
} else {
|
||||||
|
//hide table rows.
|
||||||
|
rowData.addClass('override-hide');
|
||||||
|
$(`[data-tags~='${tagName}']`).removeClass('override-hide');
|
||||||
|
updateReminderAggregateLabels();
|
||||||
|
if ($(".tagfilter.bg-primary").length > 0) {
|
||||||
|
//disabling other filters
|
||||||
|
$(".tagfilter.bg-primary").addClass('bg-secondary');
|
||||||
|
$(".tagfilter.bg-primary").removeClass('bg-primary');
|
||||||
|
}
|
||||||
|
$(sender).addClass('bg-primary');
|
||||||
|
$(sender).removeClass('bg-secondary');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function updateReminderAggregateLabels() {
|
||||||
|
//update main count
|
||||||
|
var newCount = $("[data-record-type='cost']").parent(":not('.override-hide')").length;
|
||||||
|
var countLabel = $("[data-aggregate-type='count']");
|
||||||
|
countLabel.text(`${countLabel.text().split(':')[0]}: ${newCount}`);
|
||||||
|
//update labels
|
||||||
|
//paste due
|
||||||
|
var pastDueCount = $("tr td span.badge.text-bg-secondary").parents("tr:not('.override-hide')").length;
|
||||||
|
var pastDueLabel = $('[data-aggregate-type="pastdue-count"]');
|
||||||
|
pastDueLabel.text(`${pastDueLabel.text().split(':')[0]}: ${pastDueCount}`);
|
||||||
|
//very urgent
|
||||||
|
var veryUrgentCount = $("tr td span.badge.text-bg-danger").parents("tr:not('.override-hide')").length;
|
||||||
|
var veryUrgentLabel = $('[data-aggregate-type="veryurgent-count"]');
|
||||||
|
veryUrgentLabel.text(`${veryUrgentLabel.text().split(':')[0]}: ${veryUrgentCount}`);
|
||||||
|
//urgent
|
||||||
|
var urgentCount = $("tr td span.badge.text-bg-warning").parents("tr:not('.override-hide')").length;
|
||||||
|
var urgentLabel = $('[data-aggregate-type="urgent-count"]');
|
||||||
|
urgentLabel.text(`${urgentLabel.text().split(':')[0]}: ${urgentCount}`);
|
||||||
|
//not urgent
|
||||||
|
var notUrgentCount = $("tr td span.badge.text-bg-success").parents("tr:not('.override-hide')").length;
|
||||||
|
var notUrgentLabel = $('[data-aggregate-type="noturgent-count"]');
|
||||||
|
notUrgentLabel.text(`${notUrgentLabel.text().split(':')[0]}: ${notUrgentCount}`);
|
||||||
|
}
|
||||||
@@ -86,6 +86,8 @@ function getAndValidateServiceRecordValues() {
|
|||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
var serviceRecordId = getServiceRecordModelData().id;
|
var serviceRecordId = getServiceRecordModelData().id;
|
||||||
var addReminderRecord = $("#addReminderCheck").is(":checked");
|
var addReminderRecord = $("#addReminderCheck").is(":checked");
|
||||||
|
//Odometer Adjustments
|
||||||
|
serviceMileage = GetAdjustedOdometer(serviceRecordId, serviceMileage);
|
||||||
//validation
|
//validation
|
||||||
var hasError = false;
|
var hasError = false;
|
||||||
var extraFields = getAndValidateExtraFields();
|
var extraFields = getAndValidateExtraFields();
|
||||||
@@ -131,6 +133,7 @@ function getAndValidateServiceRecordValues() {
|
|||||||
addReminderRecord: addReminderRecord,
|
addReminderRecord: addReminderRecord,
|
||||||
extraFields: extraFields.extraFields,
|
extraFields: extraFields.extraFields,
|
||||||
requisitionHistory: supplyUsageHistory,
|
requisitionHistory: supplyUsageHistory,
|
||||||
reminderRecordId: recurringReminderRecordId
|
reminderRecordId: recurringReminderRecordId,
|
||||||
|
copySuppliesAttachment: copySuppliesAttachments
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,6 +42,11 @@ function saveVehicle(isEdit) {
|
|||||||
var vehicleLicensePlate = $("#inputLicensePlate").val();
|
var vehicleLicensePlate = $("#inputLicensePlate").val();
|
||||||
var vehicleIsElectric = $("#inputIsElectric").is(":checked");
|
var vehicleIsElectric = $("#inputIsElectric").is(":checked");
|
||||||
var vehicleUseHours = $("#inputUseHours").is(":checked");
|
var vehicleUseHours = $("#inputUseHours").is(":checked");
|
||||||
|
var vehicleHasOdometerAdjustment = $("#inputHasOdometerAdjustment").is(':checked');
|
||||||
|
var vehicleOdometerMultiplier = $("#inputOdometerMultiplier").val();
|
||||||
|
var vehicleOdometerDifference = parseInt(globalParseFloat($("#inputOdometerDifference").val())).toString();
|
||||||
|
var vehiclePurchasePrice = $("#inputPurchasePrice").val();
|
||||||
|
var vehicleSoldPrice = $("#inputSoldPrice").val();
|
||||||
var extraFields = getAndValidateExtraFields(true);
|
var extraFields = getAndValidateExtraFields(true);
|
||||||
//validate
|
//validate
|
||||||
var hasError = false;
|
var hasError = false;
|
||||||
@@ -72,6 +77,37 @@ function saveVehicle(isEdit) {
|
|||||||
} else {
|
} else {
|
||||||
$("#inputLicensePlate").removeClass("is-invalid");
|
$("#inputLicensePlate").removeClass("is-invalid");
|
||||||
}
|
}
|
||||||
|
if (vehicleHasOdometerAdjustment) {
|
||||||
|
//validate odometer adjustments
|
||||||
|
//validate multiplier
|
||||||
|
if (vehicleOdometerMultiplier.trim() == '' || !isValidMoney(vehicleOdometerMultiplier)) {
|
||||||
|
hasError = true;
|
||||||
|
$("#inputOdometerMultiplier").addClass("is-invalid");
|
||||||
|
} else {
|
||||||
|
$("#inputOdometerMultiplier").removeClass("is-invalid");
|
||||||
|
}
|
||||||
|
//validate difference
|
||||||
|
if (vehicleOdometerDifference.trim() == '' || isNaN(vehicleOdometerDifference)) {
|
||||||
|
hasError = true;
|
||||||
|
$("#inputOdometerDifference").addClass("is-invalid");
|
||||||
|
} else {
|
||||||
|
$("#inputOdometerDifference").removeClass("is-invalid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vehiclePurchasePrice.trim() != '' && !isValidMoney(vehiclePurchasePrice)) {
|
||||||
|
hasError = true;
|
||||||
|
$("#inputPurchasePrice").addClass("is-invalid");
|
||||||
|
$("#collapsePurchaseInfo").collapse('show');
|
||||||
|
} else {
|
||||||
|
$("#inputPurchasePrice").removeClass("is-invalid");
|
||||||
|
}
|
||||||
|
if (vehicleSoldPrice.trim() != '' && !isValidMoney(vehicleSoldPrice)) {
|
||||||
|
hasError = true;
|
||||||
|
$("#inputSoldPrice").addClass("is-invalid");
|
||||||
|
$("#collapsePurchaseInfo").collapse('show');
|
||||||
|
} else {
|
||||||
|
$("#inputSoldPrice").removeClass("is-invalid");
|
||||||
|
}
|
||||||
if (hasError) {
|
if (hasError) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -87,7 +123,12 @@ function saveVehicle(isEdit) {
|
|||||||
useHours: vehicleUseHours,
|
useHours: vehicleUseHours,
|
||||||
extraFields: extraFields.extraFields,
|
extraFields: extraFields.extraFields,
|
||||||
purchaseDate: vehiclePurchaseDate,
|
purchaseDate: vehiclePurchaseDate,
|
||||||
soldDate: vehicleSoldDate
|
soldDate: vehicleSoldDate,
|
||||||
|
hasOdometerAdjustment: vehicleHasOdometerAdjustment,
|
||||||
|
odometerMultiplier: vehicleOdometerMultiplier,
|
||||||
|
odometerDifference: vehicleOdometerDifference,
|
||||||
|
purchasePrice: vehiclePurchasePrice,
|
||||||
|
soldPrice: vehicleSoldPrice
|
||||||
}, function (data) {
|
}, function (data) {
|
||||||
if (data) {
|
if (data) {
|
||||||
if (!isEdit) {
|
if (!isEdit) {
|
||||||
@@ -105,6 +146,14 @@ function saveVehicle(isEdit) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function toggleOdometerAdjustment() {
|
||||||
|
var isChecked = $("#inputHasOdometerAdjustment").is(':checked');
|
||||||
|
if (isChecked) {
|
||||||
|
$("#odometerAdjustments").collapse('show');
|
||||||
|
} else {
|
||||||
|
$("#odometerAdjustments").collapse('hide');
|
||||||
|
}
|
||||||
|
}
|
||||||
function uploadFileAsync(event) {
|
function uploadFileAsync(event) {
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", event.files[0]);
|
formData.append("file", event.files[0]);
|
||||||
@@ -305,7 +354,7 @@ function updateAggregateLabels() {
|
|||||||
//Count
|
//Count
|
||||||
var newCount = $("[data-record-type='cost']").parent(":not('.override-hide')").length;
|
var newCount = $("[data-record-type='cost']").parent(":not('.override-hide')").length;
|
||||||
var countLabel = $("[data-aggregate-type='count']");
|
var countLabel = $("[data-aggregate-type='count']");
|
||||||
countLabel.text(`${countLabel.text().split(':')[0]}: ${newCount}`)
|
countLabel.text(`${countLabel.text().split(':')[0]}: ${newCount}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function uploadVehicleFilesAsync(event) {
|
function uploadVehicleFilesAsync(event) {
|
||||||
@@ -783,6 +832,11 @@ function determineContextMenuItems() {
|
|||||||
} else {
|
} else {
|
||||||
$(".context-menu-multiple").hide();
|
$(".context-menu-multiple").hide();
|
||||||
}
|
}
|
||||||
|
if (GetVehicleId().hasOdometerAdjustment) {
|
||||||
|
$(".context-menu-odometer-adjustment").show();
|
||||||
|
} else {
|
||||||
|
$(".context-menu-odometer-adjustment").hide();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function getMenuPosition(mouse, direction, scrollDir) {
|
function getMenuPosition(mouse, direction, scrollDir) {
|
||||||
var win = $(window)[direction](),
|
var win = $(window)[direction](),
|
||||||
@@ -975,3 +1029,6 @@ function copyToClipboard(e) {
|
|||||||
navigator.clipboard.writeText(textToCopy);
|
navigator.clipboard.writeText(textToCopy);
|
||||||
successToast("Copied to Clipboard");
|
successToast("Copied to Clipboard");
|
||||||
}
|
}
|
||||||
|
function noPropagation() {
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
@@ -86,6 +86,8 @@ function getAndValidateUpgradeRecordValues() {
|
|||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
var upgradeRecordId = getUpgradeRecordModelData().id;
|
var upgradeRecordId = getUpgradeRecordModelData().id;
|
||||||
var addReminderRecord = $("#addReminderCheck").is(":checked");
|
var addReminderRecord = $("#addReminderCheck").is(":checked");
|
||||||
|
//Odometer Adjustments
|
||||||
|
upgradeMileage = GetAdjustedOdometer(upgradeRecordId, upgradeMileage);
|
||||||
//validation
|
//validation
|
||||||
var hasError = false;
|
var hasError = false;
|
||||||
var extraFields = getAndValidateExtraFields();
|
var extraFields = getAndValidateExtraFields();
|
||||||
@@ -131,6 +133,7 @@ function getAndValidateUpgradeRecordValues() {
|
|||||||
addReminderRecord: addReminderRecord,
|
addReminderRecord: addReminderRecord,
|
||||||
extraFields: extraFields.extraFields,
|
extraFields: extraFields.extraFields,
|
||||||
requisitionHistory: supplyUsageHistory,
|
requisitionHistory: supplyUsageHistory,
|
||||||
reminderRecordId: recurringReminderRecordId
|
reminderRecordId: recurringReminderRecordId,
|
||||||
|
copySuppliesAttachment: copySuppliesAttachments
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -246,12 +246,14 @@ function showAddReminderModal(reminderModalInput) {
|
|||||||
$.post('/Vehicle/GetAddReminderRecordPartialView', { reminderModel: reminderModalInput }, function (data) {
|
$.post('/Vehicle/GetAddReminderRecordPartialView', { reminderModel: reminderModalInput }, function (data) {
|
||||||
$("#reminderRecordModalContent").html(data);
|
$("#reminderRecordModalContent").html(data);
|
||||||
initDatePicker($('#reminderDate'), true);
|
initDatePicker($('#reminderDate'), true);
|
||||||
|
initTagSelector($("#reminderRecordTag"));
|
||||||
$("#reminderRecordModal").modal("show");
|
$("#reminderRecordModal").modal("show");
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
$.post('/Vehicle/GetAddReminderRecordPartialView', function (data) {
|
$.post('/Vehicle/GetAddReminderRecordPartialView', function (data) {
|
||||||
$("#reminderRecordModalContent").html(data);
|
$("#reminderRecordModalContent").html(data);
|
||||||
initDatePicker($('#reminderDate'), true);
|
initDatePicker($('#reminderDate'), true);
|
||||||
|
initTagSelector($("#reminderRecordTag"));
|
||||||
$("#reminderRecordModal").modal("show");
|
$("#reminderRecordModal").modal("show");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -340,19 +342,19 @@ function showRecurringReminderSelector(descriptionFieldName) {
|
|||||||
confirmButtonText: 'Select',
|
confirmButtonText: 'Select',
|
||||||
focusConfirm: false,
|
focusConfirm: false,
|
||||||
preConfirm: () => {
|
preConfirm: () => {
|
||||||
const selectedRecurringReminder = $("#recurringReminderInput").val();
|
//validate
|
||||||
const selectedRecurringReminderText = $("#recurringReminderInput option:selected").text();
|
var selectedRecurringReminderData = getAndValidateSelectedRecurringReminder();
|
||||||
if (!selectedRecurringReminder || parseInt(selectedRecurringReminder) == 0) {
|
if (selectedRecurringReminderData.hasError) {
|
||||||
Swal.showValidationMessage(`You must select a recurring reminder`);
|
Swal.showValidationMessage(`You must select a recurring reminder`);
|
||||||
}
|
}
|
||||||
return { selectedRecurringReminder, selectedRecurringReminderText }
|
return { selectedRecurringReminderData }
|
||||||
},
|
},
|
||||||
}).then(function (result) {
|
}).then(function (result) {
|
||||||
if (result.isConfirmed) {
|
if (result.isConfirmed) {
|
||||||
recurringReminderRecordId = result.value.selectedRecurringReminder;
|
recurringReminderRecordId = result.value.selectedRecurringReminderData.ids;
|
||||||
var descriptionField = $(`#${descriptionFieldName}`);
|
var descriptionField = $(`#${descriptionFieldName}`);
|
||||||
if (descriptionField.length > 0) {
|
if (descriptionField.length > 0) {
|
||||||
descriptionField.val(result.value.selectedRecurringReminderText.trim());
|
descriptionField.val(result.value.selectedRecurringReminderData.text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -476,7 +478,7 @@ function getRecordsDeltaStats(recordIds) {
|
|||||||
var divisibleCount = recordIds.length - 1;
|
var divisibleCount = recordIds.length - 1;
|
||||||
var averageOdo = diffOdo > 0 ? (diffOdo / divisibleCount).toFixed(2) : 0;
|
var averageOdo = diffOdo > 0 ? (diffOdo / divisibleCount).toFixed(2) : 0;
|
||||||
var averageDays = diffDate > 0 ? Math.floor((diffDate / divisibleCount) / 8.64e7) : 0;
|
var averageDays = diffDate > 0 ? Math.floor((diffDate / divisibleCount) / 8.64e7) : 0;
|
||||||
var averageSum = costSum > 0 ? (costSum / divisibleCount).toFixed(2) : 0;
|
var averageSum = costSum > 0 ? (costSum / recordIds.length).toFixed(2) : 0;
|
||||||
costSum = costSum.toFixed(2);
|
costSum = costSum.toFixed(2);
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: "Record Statistics",
|
title: "Record Statistics",
|
||||||
@@ -491,3 +493,118 @@ function getRecordsDeltaStats(recordIds) {
|
|||||||
icon: "info"
|
icon: "info"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function GetAdjustedOdometer(id, odometerInput) {
|
||||||
|
//if editing an existing record or vehicle does not have odometer adjustment or input is NaN then just return the original input.
|
||||||
|
if (id > 0 || !GetVehicleId().hasOdometerAdjustment || isNaN(odometerInput)) {
|
||||||
|
return odometerInput;
|
||||||
|
}
|
||||||
|
//apply odometer adjustments first.
|
||||||
|
var adjustedOdometer = parseInt(odometerInput) + parseInt(GetVehicleId().odometerDifference);
|
||||||
|
//apply odometer multiplier.
|
||||||
|
adjustedOdometer *= globalParseFloat(GetVehicleId().odometerMultiplier);
|
||||||
|
return adjustedOdometer.toFixed(0);
|
||||||
|
}
|
||||||
|
function adjustRecordsOdometer(ids, source) {
|
||||||
|
if (ids.length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$("#workAroundInput").show();
|
||||||
|
var friendlySource = "";
|
||||||
|
var refreshDataCallBack;
|
||||||
|
var recordVerbiage = ids.length > 1 ? `these ${ids.length} records` : "this record";
|
||||||
|
switch (source) {
|
||||||
|
case "ServiceRecord":
|
||||||
|
friendlySource = "Service Records";
|
||||||
|
refreshDataCallBack = getVehicleServiceRecords;
|
||||||
|
break;
|
||||||
|
case "RepairRecord":
|
||||||
|
friendlySource = "Repairs";
|
||||||
|
refreshDataCallBack = getVehicleCollisionRecords;
|
||||||
|
break;
|
||||||
|
case "UpgradeRecord":
|
||||||
|
friendlySource = "Upgrades";
|
||||||
|
refreshDataCallBack = getVehicleUpgradeRecords;
|
||||||
|
break;
|
||||||
|
case "OdometerRecord":
|
||||||
|
friendlySource = "Odometer Records";
|
||||||
|
refreshDataCallBack = getVehicleOdometerRecords;
|
||||||
|
break;
|
||||||
|
case "GasRecord":
|
||||||
|
friendlySource = "Fuel Records";
|
||||||
|
refreshDataCallBack = getVehicleGasRecords;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: "Adjust Odometer?",
|
||||||
|
text: `Apply Odometer Adjustments to ${recordVerbiage}?`,
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonText: "Adjust",
|
||||||
|
confirmButtonColor: "#dc3545"
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
$.post('/Vehicle/AdjustRecordsOdometer', { recordIds: ids, vehicleId: GetVehicleId().vehicleId, importMode: source }, function (data) {
|
||||||
|
if (data) {
|
||||||
|
successToast(`${ids.length} Record(s) Updated`);
|
||||||
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
|
refreshDataCallBack(vehicleId);
|
||||||
|
} else {
|
||||||
|
errorToast(genericErrorMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$("#workAroundInput").hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function showMultipleRemindersSelector() {
|
||||||
|
if ($("#multipleRemindersCheck").is(":checked")) {
|
||||||
|
$("#recurringMultipleReminders").show();
|
||||||
|
$("#recurringReminderInput").hide();
|
||||||
|
} else {
|
||||||
|
$("#recurringMultipleReminders").hide();
|
||||||
|
$("#recurringReminderInput").show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function getAndValidateSelectedRecurringReminder() {
|
||||||
|
if ($("#multipleRemindersCheck").is(":checked")) {
|
||||||
|
//validate multiple reminders
|
||||||
|
var selectedRecurringRemindersArray = [];
|
||||||
|
$("#recurringMultipleReminders :checked").map(function () {
|
||||||
|
selectedRecurringRemindersArray.push({
|
||||||
|
value: this.value,
|
||||||
|
text: $(this).parent().find('.form-check-label').text()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
if (selectedRecurringRemindersArray.length == 0) {
|
||||||
|
return {
|
||||||
|
hasError: true,
|
||||||
|
ids: [],
|
||||||
|
text: ''
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
hasError: false,
|
||||||
|
ids: selectedRecurringRemindersArray.map(x=>x.value),
|
||||||
|
text: selectedRecurringRemindersArray.map(x=>x.text).join(', ')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//validate single reminder
|
||||||
|
var selectedRecurringReminder = $("#recurringReminderInput").val();
|
||||||
|
var selectedRecurringReminderText = $("#recurringReminderInput option:selected").text();
|
||||||
|
if (!selectedRecurringReminder || parseInt(selectedRecurringReminder) == 0) {
|
||||||
|
return {
|
||||||
|
hasError: true,
|
||||||
|
ids: [],
|
||||||
|
text: ''
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
hasError: false,
|
||||||
|
ids: [selectedRecurringReminder],
|
||||||
|
text: selectedRecurringReminderText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user