diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index 1f1a6f0..39a6587 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -981,6 +981,84 @@ namespace CarCareTracker.Controllers return PartialView("_ReminderMakeUpReport", viewModel); } [TypeFilter(typeof(CollaboratorFilter))] + [HttpPost] + public IActionResult GetVehicleAttachments(int vehicleId, List exportTabs) + { + List attachmentData = new List(); + if (exportTabs.Contains(ImportMode.ServiceRecord)){ + var records = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId).Where(x=>x.Files.Any()); + attachmentData.AddRange(records.Select(x => new GenericReportModel + { + Date = x.Date, + Odometer = x.Mileage, + Files = x.Files + })); + } + if (exportTabs.Contains(ImportMode.RepairRecord)) + { + var records = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId).Where(x => x.Files.Any()); + attachmentData.AddRange(records.Select(x => new GenericReportModel + { + Date = x.Date, + Odometer = x.Mileage, + Files = x.Files + })); + } + if (exportTabs.Contains(ImportMode.UpgradeRecord)) + { + var records = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId).Where(x => x.Files.Any()); + attachmentData.AddRange(records.Select(x => new GenericReportModel + { + Date = x.Date, + Odometer = x.Mileage, + Files = x.Files + })); + } + if (exportTabs.Contains(ImportMode.GasRecord)) + { + var records = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId).Where(x => x.Files.Any()); + attachmentData.AddRange(records.Select(x => new GenericReportModel + { + Date = x.Date, + Odometer = x.Mileage, + Files = x.Files + })); + } + if (exportTabs.Contains(ImportMode.TaxRecord)) + { + var records = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId).Where(x => x.Files.Any()); + attachmentData.AddRange(records.Select(x => new GenericReportModel + { + Date = x.Date, + Odometer = 0, + Files = x.Files + })); + } + if (exportTabs.Contains(ImportMode.OdometerRecord)) + { + var records = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId).Where(x => x.Files.Any()); + attachmentData.AddRange(records.Select(x => new GenericReportModel + { + Date = x.Date, + Odometer = x.Mileage, + Files = x.Files + })); + } + if (attachmentData.Any()) + { + attachmentData = attachmentData.OrderBy(x => x.Date).ThenBy(x => x.Odometer).ToList(); + var result = _fileHelper.MakeAttachmentsExport(attachmentData); + if (string.IsNullOrWhiteSpace(result)) + { + return Json(new OperationResponse { Success = false, Message = StaticHelper.GenericErrorMessage }); + } + return Json(new OperationResponse { Success = true, Message = result }); + } else + { + return Json(new OperationResponse { Success = false, Message = "No Attachments Found" }); + } + } + [TypeFilter(typeof(CollaboratorFilter))] public IActionResult GetVehicleHistory(int vehicleId) { var vehicleHistory = new VehicleHistoryViewModel(); diff --git a/Helper/FileHelper.cs b/Helper/FileHelper.cs index 4b96eeb..4b26727 100644 --- a/Helper/FileHelper.cs +++ b/Helper/FileHelper.cs @@ -1,4 +1,5 @@ -using System.IO.Compression; +using CarCareTracker.Models; +using System.IO.Compression; namespace CarCareTracker.Helper { @@ -9,6 +10,7 @@ namespace CarCareTracker.Helper bool DeleteFile(string currentFilePath); string MakeBackup(); bool RestoreBackup(string fileName, bool clearExisting = false); + string MakeAttachmentsExport(List exportData); } public class FileHelper : IFileHelper { @@ -123,6 +125,30 @@ namespace CarCareTracker.Helper return false; } } + public string MakeAttachmentsExport(List exportData) + { + var folderName = Guid.NewGuid(); + var tempPath = Path.Combine(_webEnv.WebRootPath, $"temp/{folderName}"); + if (!Directory.Exists(tempPath)) + Directory.CreateDirectory(tempPath); + int fileIndex = 0; + foreach(GenericReportModel reportModel in exportData) + { + foreach(UploadedFiles file in reportModel.Files) + { + var fileToCopy = GetFullFilePath(file.Location); + var destFileName = $"{tempPath}/{fileIndex}{Path.GetExtension(file.Location)}"; + File.Copy(fileToCopy, destFileName); + fileIndex++; + } + } + var destFilePath = $"{tempPath}.zip"; + ZipFile.CreateFromDirectory(tempPath, destFilePath); + //delete temp directory + Directory.Delete(tempPath, true); + var zipFileName = $"/temp/{folderName}.zip"; + return zipFileName; + } public string MakeBackup() { var folderName = $"db_backup_{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}"; diff --git a/Models/Report/GenericReportModel.cs b/Models/Report/GenericReportModel.cs index c3dcd76..1d8683f 100644 --- a/Models/Report/GenericReportModel.cs +++ b/Models/Report/GenericReportModel.cs @@ -11,5 +11,6 @@ public string Description { get; set; } public string Notes { get; set; } public decimal Cost { get; set; } + public List Files { get; set; } = new List(); } } diff --git a/Views/Vehicle/_Report.cshtml b/Views/Vehicle/_Report.cshtml index 809c3b3..fbd878d 100644 --- a/Views/Vehicle/_Report.cshtml +++ b/Views/Vehicle/_Report.cshtml @@ -1,90 +1,93 @@ @model ReportViewModel
-
-
-
-
- +
+
+
+
+ +
+
+
+
+ @await Html.PartialAsync("_CostMakeUpReport", Model.CostMakeUpForVehicle) +
-
-
- @await Html.PartialAsync("_CostMakeUpReport", Model.CostMakeUpForVehicle) -
-
-
-
-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+ @await Html.PartialAsync("_GasCostByMonthReport", Model.CostForVehicleByMonth) +
+
-
-
- @await Html.PartialAsync("_GasCostByMonthReport", Model.CostForVehicleByMonth) +
+
+
+ +
+
+
+
+ @await Html.PartialAsync("_ReminderMakeUpReport", Model.ReminderMakeUpForVehicle) +
-
-
-
- +
+
+
+ @await Html.PartialAsync("_Collaborators", Model.Collaborators) +
+
+
+ @await Html.PartialAsync("_MPGByMonthReport", Model.FuelMileageForVehicleByMonth)
-
-
- @await Html.PartialAsync("_ReminderMakeUpReport", Model.ReminderMakeUpForVehicle) +
+
+ +
+
+
-
-
-
- @await Html.PartialAsync("_Collaborators", Model.Collaborators) -
-
-
- @await Html.PartialAsync("_MPGByMonthReport", Model.FuelMileageForVehicleByMonth) -
-
-
-
- -
-
-
-
\ No newline at end of file diff --git a/wwwroot/js/reports.js b/wwwroot/js/reports.js index 1c5bcbb..ecebf70 100644 --- a/wwwroot/js/reports.js +++ b/wwwroot/js/reports.js @@ -74,4 +74,60 @@ function refreshCollaborators() { $.get(`/Vehicle/GetCollaboratorsForVehicle?vehicleId=${vehicleId}`, function (data) { $("#collaboratorContent").html(data); }); +} +function exportAttachments() { + Swal.fire({ + title: 'Export Attachments', + html: ` +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ `, + confirmButtonText: 'Export', + showCancelButton: true, + focusConfirm: false, + preConfirm: () => { + var selectedExportTabs = $("#attachmentTabs :checked").map(function () { + return this.value; + }); + if (selectedExportTabs.toArray().length == 0) { + Swal.showValidationMessage(`Please make at least one selection`) + } + return { selectedTabs: selectedExportTabs.toArray() } + }, + }).then(function (result) { + if (result.isConfirmed) { + var vehicleId = GetVehicleId().vehicleId; + $.post('/Vehicle/GetVehicleAttachments', { vehicleId: vehicleId, exportTabs: result.value.selectedTabs }, function (data) { + if (data.success) { + window.location.href = data.message; + } else { + errorToast(data.message); + } + }) + } + }); } \ No newline at end of file