diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index 0d91b77..dae6b74 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -615,6 +615,10 @@ namespace CarCareTracker.Controllers //move files from temp. serviceRecord.Files = serviceRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord()); + if (result && serviceRecord.Supplies.Any()) + { + RequisitionSupplyRecordsByUsage(serviceRecord.Supplies); + } return Json(result); } [HttpGet] @@ -670,6 +674,10 @@ namespace CarCareTracker.Controllers //move files from temp. collisionRecord.Files = collisionRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord()); + if (result && collisionRecord.Supplies.Any()) + { + RequisitionSupplyRecordsByUsage(collisionRecord.Supplies); + } return Json(result); } [HttpGet] @@ -1172,6 +1180,10 @@ namespace CarCareTracker.Controllers //move files from temp. upgradeRecord.Files = upgradeRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord()); + if (result && upgradeRecord.Supplies.Any()) + { + RequisitionSupplyRecordsByUsage(upgradeRecord.Supplies); + } return Json(result); } [HttpGet] @@ -1237,6 +1249,21 @@ namespace CarCareTracker.Controllers } #endregion #region "Supply Records" + private void RequisitionSupplyRecordsByUsage(List supplyUsage) + { + foreach(SupplyUsage supply in supplyUsage) + { + //get supply record. + var result = _supplyRecordDataAccess.GetSupplyRecordById(supply.SupplyId); + var unitCost = (result.Quantity != 0 ) ? result.Cost / result.Quantity : 0; + //deduct quantity used. + result.Quantity -= supply.Quantity; + //deduct cost. + result.Cost -= (supply.Quantity * unitCost); + //save + _supplyRecordDataAccess.SaveSupplyRecordToVehicle(result); + } + } [TypeFilter(typeof(CollaboratorFilter))] [HttpGet] public IActionResult GetSupplyRecordsByVehicleId(int vehicleId) @@ -1253,6 +1280,23 @@ namespace CarCareTracker.Controllers } return PartialView("_SupplyRecords", result); } + [TypeFilter(typeof(CollaboratorFilter))] + [HttpGet] + public IActionResult GetSupplyRecordsForRecordsByVehicleId(int vehicleId) + { + var result = _supplyRecordDataAccess.GetSupplyRecordsByVehicleId(vehicleId); + result.RemoveAll(x => x.Quantity <= 0); + bool _useDescending = _config.GetUserConfig(User).UseDescending; + if (_useDescending) + { + result = result.OrderByDescending(x => x.Date).ToList(); + } + else + { + result = result.OrderBy(x => x.Date).ToList(); + } + return PartialView("_SupplyUsage", result); + } [HttpPost] public IActionResult SaveSupplyRecordToVehicleId(SupplyRecordInput supplyRecord) { @@ -1313,6 +1357,10 @@ namespace CarCareTracker.Controllers //move files from temp. planRecord.Files = planRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord()); + if (result && planRecord.Supplies.Any()) + { + RequisitionSupplyRecordsByUsage(planRecord.Supplies); + } return Json(result); } [HttpGet] diff --git a/Models/Collision/CollisionRecordInput.cs b/Models/Collision/CollisionRecordInput.cs index a07cb17..c8b336e 100644 --- a/Models/Collision/CollisionRecordInput.cs +++ b/Models/Collision/CollisionRecordInput.cs @@ -10,6 +10,7 @@ public decimal Cost { get; set; } public string Notes { get; set; } public List Files { get; set; } = new List(); + public List Supplies { get; set; } = new List(); public CollisionRecord ToCollisionRecord() { return new CollisionRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; } } } diff --git a/Models/PlanRecord/PlanRecordInput.cs b/Models/PlanRecord/PlanRecordInput.cs index 19772e2..ff713d9 100644 --- a/Models/PlanRecord/PlanRecordInput.cs +++ b/Models/PlanRecord/PlanRecordInput.cs @@ -9,6 +9,7 @@ public string Description { get; set; } public string Notes { get; set; } public List Files { get; set; } = new List(); + public List Supplies { get; set; } = new List(); public ImportMode ImportMode { get; set; } public PlanPriority Priority { get; set; } public PlanProgress Progress { get; set; } diff --git a/Models/ServiceRecord/ServiceRecordInput.cs b/Models/ServiceRecord/ServiceRecordInput.cs index f904ab1..2a3191e 100644 --- a/Models/ServiceRecord/ServiceRecordInput.cs +++ b/Models/ServiceRecord/ServiceRecordInput.cs @@ -10,6 +10,7 @@ public decimal Cost { get; set; } public string Notes { get; set; } public List Files { get; set; } = new List(); + public List Supplies { get; set; } = new List(); public ServiceRecord ToServiceRecord() { return new ServiceRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; } } } diff --git a/Models/Supply/SupplyUsage.cs b/Models/Supply/SupplyUsage.cs new file mode 100644 index 0000000..283a9c9 --- /dev/null +++ b/Models/Supply/SupplyUsage.cs @@ -0,0 +1,7 @@ +namespace CarCareTracker.Models +{ + public class SupplyUsage { + public int SupplyId { get; set; } + public decimal Quantity { get; set; } + } +} diff --git a/Models/UpgradeRecord/UpgradeReportInput.cs b/Models/UpgradeRecord/UpgradeReportInput.cs index b3e11b3..62353b9 100644 --- a/Models/UpgradeRecord/UpgradeReportInput.cs +++ b/Models/UpgradeRecord/UpgradeReportInput.cs @@ -10,6 +10,7 @@ public decimal Cost { get; set; } public string Notes { get; set; } public List Files { get; set; } = new List(); + public List Supplies { get; set; } = new List(); public UpgradeRecord ToUpgradeRecord() { return new UpgradeRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; } } } diff --git a/Views/Shared/_Layout.cshtml b/Views/Shared/_Layout.cshtml index 5694d37..c31e772 100644 --- a/Views/Shared/_Layout.cshtml +++ b/Views/Shared/_Layout.cshtml @@ -6,6 +6,7 @@ var useDarkMode = userConfig.UseDarkMode; var enableCsvImports = userConfig.EnableCsvImports; var shortDatePattern = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern; + var numberFormat = System.Globalization.CultureInfo.CurrentCulture.NumberFormat; shortDatePattern = shortDatePattern.ToLower(); if (!shortDatePattern.Contains("dd")) { @@ -54,6 +55,21 @@ pattern: "@shortDatePattern" } } + function globalParseFloat(input){ + //remove thousands separator. + var thousandSeparator = "@numberFormat.NumberGroupSeparator"; + var decimalSeparator = "@numberFormat.NumberDecimalSeparator"; + //strip thousands from input. + input = input.replace(thousandSeparator, ""); + //convert to JS format where decimal is only separated by . + input = input.replace(decimalSeparator, "."); + return parseFloat(input); + } + function globalFloatToString(input) { + var decimalSeparator = "@numberFormat.NumberDecimalSeparator"; + input = input.replace(".", decimalSeparator); + return input; + } @await RenderSectionAsync("Scripts", required: false) diff --git a/Views/Vehicle/Index.cshtml b/Views/Vehicle/Index.cshtml index 0d7f3a5..3a3e42a 100644 --- a/Views/Vehicle/Index.cshtml +++ b/Views/Vehicle/Index.cshtml @@ -153,6 +153,11 @@ + \ No newline at end of file diff --git a/Views/Vehicle/_SupplyUsage.cshtml b/Views/Vehicle/_SupplyUsage.cshtml new file mode 100644 index 0000000..ea5eba9 --- /dev/null +++ b/Views/Vehicle/_SupplyUsage.cshtml @@ -0,0 +1,127 @@ +@model List + + + + \ No newline at end of file diff --git a/Views/Vehicle/_UpgradeRecordModal.cshtml b/Views/Vehicle/_UpgradeRecordModal.cshtml index a8b0e8e..1cdd7fb 100644 --- a/Views/Vehicle/_UpgradeRecordModal.cshtml +++ b/Views/Vehicle/_UpgradeRecordModal.cshtml @@ -23,6 +23,10 @@ + @if (isNew) + { + @await Html.PartialAsync("_SupplyStore", "UpgradeRecord") + }
@@ -71,6 +75,7 @@