diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index 7be9f77..79592b2 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -258,6 +258,32 @@ namespace CarCareTracker.Controllers return Json($"/{fileNameToExport}"); } } + else if (mode == ImportMode.PlanRecord) + { + var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; + var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); + var vehicleRecords = _planRecordDataAccess.GetPlanRecordsByVehicleId(vehicleId); + if (vehicleRecords.Any()) + { + var exportData = vehicleRecords.Select(x => new PlanRecordExportModel { + DateCreated = x.DateCreated.ToString("G"), + DateModified = x.DateModified.ToString("G"), + Description = x.Description, + Cost = x.Cost.ToString("C"), + Type = x.ImportMode.ToString(), + Priority = x.Priority.ToString(), + Progress = x.Progress.ToString(), + Notes = x.Notes }); + using (var writer = new StreamWriter(fullExportFilePath)) + { + using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) + { + csv.WriteRecords(exportData); + } + } + return Json($"/{fileNameToExport}"); + } + } else if (mode == ImportMode.GasRecord) { var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; @@ -376,6 +402,25 @@ namespace CarCareTracker.Controllers }; _serviceRecordDataAccess.SaveServiceRecordToVehicle(convertedRecord); } + else if (mode == ImportMode.PlanRecord) + { + var progressIsEnum = Enum.TryParse(importModel.Progress, out PlanProgress parsedProgress); + var typeIsEnum = Enum.TryParse(importModel.Type, out ImportMode parsedType); + var priorityIsEnum = Enum.TryParse(importModel.Priority, out PlanPriority parsedPriority); + var convertedRecord = new PlanRecord() + { + VehicleId = vehicleId, + DateCreated = DateTime.Parse(importModel.DateCreated), + DateModified = DateTime.Parse(importModel.DateModified), + Progress = parsedProgress, + ImportMode = parsedType, + Priority = parsedPriority, + Description = string.IsNullOrWhiteSpace(importModel.Description) ? $"Plan Record on {importModel.DateCreated}" : importModel.Description, + Notes = string.IsNullOrWhiteSpace(importModel.Notes) ? "" : importModel.Notes, + Cost = decimal.Parse(importModel.Cost, NumberStyles.Any) + }; + _planRecordDataAccess.SavePlanRecordToVehicle(convertedRecord); + } else if (mode == ImportMode.RepairRecord) { var convertedRecord = new CollisionRecord() diff --git a/Enum/ImportMode.cs b/Enum/ImportMode.cs index 845f54f..f7fc5ed 100644 --- a/Enum/ImportMode.cs +++ b/Enum/ImportMode.cs @@ -11,6 +11,7 @@ NoteRecord = 6, SupplyRecord = 7, Dashboard = 8, - PlanRecord = 9 + PlanRecord = 9, + OdometerRecord = 10 } } diff --git a/Helper/FileHelper.cs b/Helper/FileHelper.cs index 823e579..ac9dfa8 100644 --- a/Helper/FileHelper.cs +++ b/Helper/FileHelper.cs @@ -68,7 +68,7 @@ namespace CarCareTracker.Helper var filesToUpload = Directory.GetFiles(imagePath); foreach(string file in filesToUpload) { - File.Copy(file, $"{existingPath}/{Path.GetFileName(file)}"); + File.Copy(file, $"{existingPath}/{Path.GetFileName(file)}", true); } } if (Directory.Exists(documentPath)) @@ -82,7 +82,7 @@ namespace CarCareTracker.Helper var filesToUpload = Directory.GetFiles(documentPath); foreach (string file in filesToUpload) { - File.Copy(file, $"{existingPath}/{Path.GetFileName(file)}"); + File.Copy(file, $"{existingPath}/{Path.GetFileName(file)}", true); } } if (File.Exists(dataPath)) diff --git a/MapProfile/ImportMappers.cs b/MapProfile/ImportMappers.cs index 258cdcd..93017ec 100644 --- a/MapProfile/ImportMappers.cs +++ b/MapProfile/ImportMappers.cs @@ -8,6 +8,8 @@ namespace CarCareTracker.MapProfile public ImportMapper() { Map(m => m.Date).Name(["date", "fuelup_date"]); + Map(m => m.DateCreated).Name(["datecreated"]); + Map(m => m.DateModified).Name(["datemodified"]); Map(m => m.Odometer).Name(["odometer"]); Map(m => m.FuelConsumed).Name(["gallons", "liters", "litres", "consumption", "quantity", "fuelconsumed"]); Map(m => m.Cost).Name(["cost", "total cost", "totalcost", "total price"]); @@ -20,6 +22,9 @@ namespace CarCareTracker.MapProfile Map(m => m.PartSupplier).Name(["partsupplier"]); Map(m => m.PartQuantity).Name(["partquantity"]); Map(m => m.PartNumber).Name(["partnumber"]); + Map(m => m.Progress).Name(["progress"]); + Map(m => m.Type).Name(["type"]); + Map(m => m.Priority).Name(["priority"]); } } } diff --git a/Models/ImportModel.cs b/Models/ImportModel.cs index 87270d8..0406846 100644 --- a/Models/ImportModel.cs +++ b/Models/ImportModel.cs @@ -6,6 +6,11 @@ public class ImportModel { public string Date { get; set; } + public string DateCreated { get; set; } + public string DateModified { get; set; } + public string Type { get; set; } + public string Priority { get; set; } + public string Progress { get; set; } public string Odometer { get; set; } public string Description { get; set; } public string Notes { get; set; } @@ -65,4 +70,16 @@ public string Metric { get; set; } public string Notes { get; set; } } + public class PlanRecordExportModel + { + public string DateCreated { get; set; } + public string DateModified { get; set; } + public string Description { get; set; } + public string Notes { get; set; } + public string Type { get; set; } + public string Priority { get; set; } + public string Progress { get; set; } + public string Cost { get; set; } + } + } diff --git a/Views/Home/_Settings.cshtml b/Views/Home/_Settings.cshtml index 522d89c..1795d29 100644 --- a/Views/Home/_Settings.cshtml +++ b/Views/Home/_Settings.cshtml @@ -50,14 +50,14 @@
@@ -111,6 +115,7 @@ Reminders Supplies Planner + Odometer
@if (User.IsInRole(nameof(UserData.IsRootUser))) diff --git a/Views/Vehicle/_BulkDataImporter.cshtml b/Views/Vehicle/_BulkDataImporter.cshtml index 65d8839..8769344 100644 --- a/Views/Vehicle/_BulkDataImporter.cshtml +++ b/Views/Vehicle/_BulkDataImporter.cshtml @@ -28,6 +28,9 @@ } else if (Model == ImportMode.SupplyRecord) { Download Sample + } else if (Model == ImportMode.PlanRecord) + { + Download Sample } @@ -67,6 +70,8 @@ getVehicleUpgradeRecords(vehicleId); } else if (mode == "SupplyRecord") { getVehicleSupplyRecords(vehicleId); + } else if (mode == "PlanRecord"){ + getVehiclePlanRecords(vehicleId); } } else { errorToast("An error has occurred, please double check the data and try again."); diff --git a/Views/Vehicle/_PlanRecordItem.cshtml b/Views/Vehicle/_PlanRecordItem.cshtml index 677d29d..9315cc9 100644 --- a/Views/Vehicle/_PlanRecordItem.cshtml +++ b/Views/Vehicle/_PlanRecordItem.cshtml @@ -1,12 +1,12 @@ @model PlanRecord -
+
@Model.Description
- @Model.Cost.ToString("C2") + @Model.Cost.ToString("C2")
diff --git a/Views/Vehicle/_PlanRecords.cshtml b/Views/Vehicle/_PlanRecords.cshtml index c57ccd8..e291e2a 100644 --- a/Views/Vehicle/_PlanRecords.cshtml +++ b/Views/Vehicle/_PlanRecords.cshtml @@ -46,7 +46,7 @@
- Planned + Planned
@foreach (PlanRecord planRecord in backLogItems) @@ -57,7 +57,7 @@
- Doing + Doing
@foreach (PlanRecord planRecord in inProgressItems) @@ -68,7 +68,7 @@
- Testing + Testing
@foreach (PlanRecord planRecord in testingItems) @@ -79,7 +79,7 @@
- Done + Done
@foreach (PlanRecord planRecord in doneItems) diff --git a/wwwroot/css/site.css b/wwwroot/css/site.css index a6e63f8..d257562 100644 --- a/wwwroot/css/site.css +++ b/wwwroot/css/site.css @@ -286,10 +286,8 @@ input[type="file"] { max-height:10vh; } [data-bs-theme=dark] .taskCard { - color: #000; background-color: rgba(255,255,255,0.5); } [data-bs-theme=light] .taskCard { - color: #000; background-color: rgba(80,80,80,0.25); } \ No newline at end of file diff --git a/wwwroot/defaults/plansample.csv b/wwwroot/defaults/plansample.csv new file mode 100644 index 0000000..cb9db53 --- /dev/null +++ b/wwwroot/defaults/plansample.csv @@ -0,0 +1,2 @@ +DateCreated,DateModified,Description,Notes,Type,Priority,Progress,Cost +1/19/2024 6:01:02 PM,1/19/2024 7:32:58 PM,Repair Exhaust,,RepairRecord,Normal,Testing,$50.00