From 190484762d35557bd9c1a8763d684a7afc9ba5c3 Mon Sep 17 00:00:00 2001 From: "DESKTOP-T0O5CDB\\DESK-555BD" Date: Fri, 23 Aug 2024 13:39:08 -0600 Subject: [PATCH] Add functionality to export extra fields in CSV exports. --- Controllers/VehicleController.cs | 118 ++++++++++------ Helper/StaticHelper.cs | 199 +++++++++++++++++++++++++++ MapProfile/ImportMappers.cs | 2 +- Models/Shared/ImportModel.cs | 26 +++- Views/Vehicle/_UpgradeRecords.cshtml | 4 +- 5 files changed, 300 insertions(+), 49 deletions(-) diff --git a/Controllers/VehicleController.cs b/Controllers/VehicleController.cs index 1a32697..4826abe 100644 --- a/Controllers/VehicleController.cs +++ b/Controllers/VehicleController.cs @@ -219,37 +219,53 @@ namespace CarCareTracker.Controllers string uploadPath = Path.Combine(_webEnv.WebRootPath, uploadDirectory); if (!Directory.Exists(uploadPath)) Directory.CreateDirectory(uploadPath); + var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; + var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); if (mode == ImportMode.ServiceRecord) { - var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; - var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); var vehicleRecords = _serviceRecordDataAccess.GetServiceRecordsByVehicleId(vehicleId); if (vehicleRecords.Any()) { - var exportData = vehicleRecords.Select(x => new ServiceRecordExportModel { Date = x.Date.ToShortDateString(), Description = x.Description, Cost = x.Cost.ToString("C"), Notes = x.Notes, Odometer = x.Mileage.ToString(), Tags = string.Join(" ", x.Tags) }); + var exportData = vehicleRecords.Select(x => new GenericRecordExportModel { + Date = x.Date.ToShortDateString(), + Description = x.Description, + Cost = x.Cost.ToString("C"), + Notes = x.Notes, + Odometer = x.Mileage.ToString(), + Tags = string.Join(" ", x.Tags), + ExtraFields = x.ExtraFields + }); using (var writer = new StreamWriter(fullExportFilePath)) { using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { - csv.WriteRecords(exportData); + //custom writer + StaticHelper.WriteGenericRecordExportModel(csv, exportData); } + writer.Dispose(); } return Json($"/{fileNameToExport}"); } } else if (mode == ImportMode.RepairRecord) { - var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; - var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); var vehicleRecords = _collisionRecordDataAccess.GetCollisionRecordsByVehicleId(vehicleId); if (vehicleRecords.Any()) { - var exportData = vehicleRecords.Select(x => new ServiceRecordExportModel { Date = x.Date.ToShortDateString(), Description = x.Description, Cost = x.Cost.ToString("C"), Notes = x.Notes, Odometer = x.Mileage.ToString(), Tags = string.Join(" ", x.Tags) }); + var exportData = vehicleRecords.Select(x => new GenericRecordExportModel { + Date = x.Date.ToShortDateString(), + Description = x.Description, + Cost = x.Cost.ToString("C"), + Notes = x.Notes, + Odometer = x.Mileage.ToString(), + Tags = string.Join(" ", x.Tags), + ExtraFields = x.ExtraFields + }); using (var writer = new StreamWriter(fullExportFilePath)) { using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { - csv.WriteRecords(exportData); + StaticHelper.WriteGenericRecordExportModel(csv, exportData); } } return Json($"/{fileNameToExport}"); @@ -257,17 +273,23 @@ namespace CarCareTracker.Controllers } else if (mode == ImportMode.UpgradeRecord) { - var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; - var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); var vehicleRecords = _upgradeRecordDataAccess.GetUpgradeRecordsByVehicleId(vehicleId); if (vehicleRecords.Any()) { - var exportData = vehicleRecords.Select(x => new ServiceRecordExportModel { Date = x.Date.ToShortDateString(), Description = x.Description, Cost = x.Cost.ToString("C"), Notes = x.Notes, Odometer = x.Mileage.ToString(), Tags = string.Join(" ", x.Tags) }); + var exportData = vehicleRecords.Select(x => new GenericRecordExportModel { + Date = x.Date.ToShortDateString(), + Description = x.Description, + Cost = x.Cost.ToString("C"), + Notes = x.Notes, + Odometer = x.Mileage.ToString(), + Tags = string.Join(" ", x.Tags), + ExtraFields = x.ExtraFields + }); using (var writer = new StreamWriter(fullExportFilePath)) { using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { - csv.WriteRecords(exportData); + StaticHelper.WriteGenericRecordExportModel(csv, exportData); } } return Json($"/{fileNameToExport}"); @@ -275,17 +297,22 @@ namespace CarCareTracker.Controllers } else if (mode == ImportMode.OdometerRecord) { - var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; - var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); var vehicleRecords = _odometerRecordDataAccess.GetOdometerRecordsByVehicleId(vehicleId); if (vehicleRecords.Any()) { - var exportData = vehicleRecords.Select(x => new OdometerRecordExportModel { Date = x.Date.ToShortDateString(), Notes = x.Notes, InitialOdometer = x.InitialMileage.ToString(), Odometer = x.Mileage.ToString(), Tags = string.Join(" ", x.Tags) }); + var exportData = vehicleRecords.Select(x => new OdometerRecordCsvExportModel { + Date = x.Date.ToShortDateString(), + Notes = x.Notes, + InitialOdometer = x.InitialMileage.ToString(), + Odometer = x.Mileage.ToString(), + Tags = string.Join(" ", x.Tags), + ExtraFields = x.ExtraFields + }); using (var writer = new StreamWriter(fullExportFilePath)) { using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { - csv.WriteRecords(exportData); + StaticHelper.WriteOdometerRecordExportModel(csv, exportData); } } return Json($"/{fileNameToExport}"); @@ -293,12 +320,10 @@ namespace CarCareTracker.Controllers } else if (mode == ImportMode.SupplyRecord) { - var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; - var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); var vehicleRecords = _supplyRecordDataAccess.GetSupplyRecordsByVehicleId(vehicleId); if (vehicleRecords.Any()) { - var exportData = vehicleRecords.Select(x => new SupplyRecordExportModel + var exportData = vehicleRecords.Select(x => new SupplyRecordCsvExportModel { Date = x.Date.ToShortDateString(), Description = x.Description, @@ -307,13 +332,14 @@ namespace CarCareTracker.Controllers PartQuantity = x.Quantity.ToString(), PartSupplier = x.PartSupplier, Notes = x.Notes, - Tags = string.Join(" ", x.Tags) + Tags = string.Join(" ", x.Tags), + ExtraFields = x.ExtraFields }); using (var writer = new StreamWriter(fullExportFilePath)) { using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { - csv.WriteRecords(exportData); + StaticHelper.WriteSupplyRecordExportModel(csv, exportData); } } return Json($"/{fileNameToExport}"); @@ -321,17 +347,22 @@ namespace CarCareTracker.Controllers } else if (mode == ImportMode.TaxRecord) { - var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; - var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); var vehicleRecords = _taxRecordDataAccess.GetTaxRecordsByVehicleId(vehicleId); if (vehicleRecords.Any()) { - var exportData = vehicleRecords.Select(x => new TaxRecordExportModel { Date = x.Date.ToShortDateString(), Description = x.Description, Cost = x.Cost.ToString("C"), Notes = x.Notes, Tags = string.Join(" ", x.Tags) }); + var exportData = vehicleRecords.Select(x => new TaxRecordCsvExportModel { + Date = x.Date.ToShortDateString(), + Description = x.Description, + Cost = x.Cost.ToString("C"), + Notes = x.Notes, + Tags = string.Join(" ", x.Tags), + ExtraFields = x.ExtraFields + }); using (var writer = new StreamWriter(fullExportFilePath)) { using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { - csv.WriteRecords(exportData); + StaticHelper.WriteTaxRecordExportModel(csv, exportData); } } return Json($"/{fileNameToExport}"); @@ -339,12 +370,10 @@ namespace CarCareTracker.Controllers } 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 + var exportData = vehicleRecords.Select(x => new PlanRecordCsvExportModel { DateCreated = x.DateCreated.ToString("G"), DateModified = x.DateModified.ToString("G"), @@ -353,13 +382,14 @@ namespace CarCareTracker.Controllers Type = x.ImportMode.ToString(), Priority = x.Priority.ToString(), Progress = x.Progress.ToString(), - Notes = x.Notes + Notes = x.Notes, + ExtraFields = x.ExtraFields }); using (var writer = new StreamWriter(fullExportFilePath)) { using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { - csv.WriteRecords(exportData); + StaticHelper.WritePlanRecordExportModel(csv, exportData); } } return Json($"/{fileNameToExport}"); @@ -367,13 +397,11 @@ namespace CarCareTracker.Controllers } else if (mode == ImportMode.GasRecord) { - var fileNameToExport = $"temp/{Guid.NewGuid()}.csv"; - var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false); var vehicleRecords = _gasRecordDataAccess.GetGasRecordsByVehicleId(vehicleId); bool useMPG = _config.GetUserConfig(User).UseMPG; bool useUKMPG = _config.GetUserConfig(User).UseUKMPG; var convertedRecords = _gasHelper.GetGasRecordViewModels(vehicleRecords, useMPG, useUKMPG); - var exportData = convertedRecords.Select(x => new GasRecordExportModel + var exportData = convertedRecords.Select(x => new GasRecordCsvExportModel { Date = x.Date.ToString(), Cost = x.Cost.ToString(), @@ -383,13 +411,14 @@ namespace CarCareTracker.Controllers IsFillToFull = x.IsFillToFull.ToString(), MissedFuelUp = x.MissedFuelUp.ToString(), Notes = x.Notes, - Tags = string.Join(" ", x.Tags) + Tags = string.Join(" ", x.Tags), + ExtraFields = x.ExtraFields }); using (var writer = new StreamWriter(fullExportFilePath)) { using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { - csv.WriteRecords(exportData); + StaticHelper.WriteGasRecordExportModel(csv, exportData); } } return Json($"/{fileNameToExport}"); @@ -417,7 +446,7 @@ namespace CarCareTracker.Controllers { using (var reader = new StreamReader(fullFileName)) { - var config = new CsvHelper.Configuration.CsvConfiguration(System.Globalization.CultureInfo.InvariantCulture); + var config = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture); config.MissingFieldFound = null; config.HeaderValidated = null; config.PrepareHeaderForMatch = args => { return args.Header.Trim().ToLower(); }; @@ -427,6 +456,7 @@ namespace CarCareTracker.Controllers var records = csv.GetRecords().ToList(); if (records.Any()) { + var requiredExtraFields = _extraFieldDataAccess.GetExtraFieldsById((int)mode).ExtraFields.Where(x=>x.IsRequired).Select(y=>y.Name); foreach (ImportModel importModel in records) { if (mode == ImportMode.GasRecord) @@ -440,7 +470,7 @@ namespace CarCareTracker.Controllers Gallons = decimal.Parse(importModel.FuelConsumed, NumberStyles.Any), Notes = string.IsNullOrWhiteSpace(importModel.Notes) ? "" : importModel.Notes, Tags = string.IsNullOrWhiteSpace(importModel.Tags) ? [] : importModel.Tags.Split(" ").ToList(), - ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value }).ToList() : new List() + ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List() }; if (string.IsNullOrWhiteSpace(importModel.Cost) && !string.IsNullOrWhiteSpace(importModel.Price)) { @@ -497,7 +527,7 @@ namespace CarCareTracker.Controllers Notes = string.IsNullOrWhiteSpace(importModel.Notes) ? "" : importModel.Notes, Cost = decimal.Parse(importModel.Cost, NumberStyles.Any), Tags = string.IsNullOrWhiteSpace(importModel.Tags) ? [] : importModel.Tags.Split(" ").ToList(), - ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value }).ToList() : new List() + ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List() }; _serviceRecordDataAccess.SaveServiceRecordToVehicle(convertedRecord); if (_config.GetUserConfig(User).EnableAutoOdometerInsert) @@ -521,7 +551,7 @@ namespace CarCareTracker.Controllers Mileage = decimal.ToInt32(decimal.Parse(importModel.Odometer, NumberStyles.Any)), Notes = string.IsNullOrWhiteSpace(importModel.Notes) ? "" : importModel.Notes, Tags = string.IsNullOrWhiteSpace(importModel.Tags) ? [] : importModel.Tags.Split(" ").ToList(), - ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value }).ToList() : new List() + ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List() }; _odometerRecordDataAccess.SaveOdometerRecordToVehicle(convertedRecord); } @@ -541,7 +571,7 @@ namespace CarCareTracker.Controllers 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), - ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value }).ToList() : new List() + ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List() }; _planRecordDataAccess.SavePlanRecordToVehicle(convertedRecord); } @@ -556,7 +586,7 @@ namespace CarCareTracker.Controllers Notes = string.IsNullOrWhiteSpace(importModel.Notes) ? "" : importModel.Notes, Cost = decimal.Parse(importModel.Cost, NumberStyles.Any), Tags = string.IsNullOrWhiteSpace(importModel.Tags) ? [] : importModel.Tags.Split(" ").ToList(), - ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value }).ToList() : new List() + ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List() }; _collisionRecordDataAccess.SaveCollisionRecordToVehicle(convertedRecord); if (_config.GetUserConfig(User).EnableAutoOdometerInsert) @@ -581,7 +611,7 @@ namespace CarCareTracker.Controllers Notes = string.IsNullOrWhiteSpace(importModel.Notes) ? "" : importModel.Notes, Cost = decimal.Parse(importModel.Cost, NumberStyles.Any), Tags = string.IsNullOrWhiteSpace(importModel.Tags) ? [] : importModel.Tags.Split(" ").ToList(), - ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value }).ToList() : new List() + ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List() }; _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(convertedRecord); if (_config.GetUserConfig(User).EnableAutoOdometerInsert) @@ -608,7 +638,7 @@ namespace CarCareTracker.Controllers Cost = decimal.Parse(importModel.Cost, NumberStyles.Any), Notes = importModel.Notes, Tags = string.IsNullOrWhiteSpace(importModel.Tags) ? [] : importModel.Tags.Split(" ").ToList(), - ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value }).ToList() : new List() + ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List() }; _supplyRecordDataAccess.SaveSupplyRecordToVehicle(convertedRecord); } @@ -622,7 +652,7 @@ namespace CarCareTracker.Controllers Notes = string.IsNullOrWhiteSpace(importModel.Notes) ? "" : importModel.Notes, Cost = decimal.Parse(importModel.Cost, NumberStyles.Any), Tags = string.IsNullOrWhiteSpace(importModel.Tags) ? [] : importModel.Tags.Split(" ").ToList(), - ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value }).ToList() : new List() + ExtraFields = importModel.ExtraFields.Any() ? importModel.ExtraFields.Select(x => new ExtraField { Name = x.Key, Value = x.Value, IsRequired = requiredExtraFields.Contains(x.Key) }).ToList() : new List() }; _taxRecordDataAccess.SaveTaxRecordToVehicle(convertedRecord); } diff --git a/Helper/StaticHelper.cs b/Helper/StaticHelper.cs index 9d2cfc8..ecd52cb 100644 --- a/Helper/StaticHelper.cs +++ b/Helper/StaticHelper.cs @@ -1,4 +1,5 @@ using CarCareTracker.Models; +using CsvHelper; using System.Globalization; namespace CarCareTracker.Helper @@ -287,5 +288,203 @@ namespace CarCareTracker.Helper return "bi-file-bar-graph"; } } + //CSV Write Methods + public static void WriteGenericRecordExportModel(CsvWriter _csv, IEnumerable genericRecords) + { + bool headerWritten = false; + var extraHeaders = genericRecords.SelectMany(x => x.ExtraFields).Select(y => y.Name).OrderBy(x => x).Distinct(); + //write headers + _csv.WriteField(nameof(GenericRecordExportModel.Date)); + _csv.WriteField(nameof(GenericRecordExportModel.Description)); + _csv.WriteField(nameof(GenericRecordExportModel.Cost)); + _csv.WriteField(nameof(GenericRecordExportModel.Notes)); + _csv.WriteField(nameof(GenericRecordExportModel.Odometer)); + _csv.WriteField(nameof(GenericRecordExportModel.Tags)); + foreach (string extraHeader in extraHeaders) + { + _csv.WriteField($"extrafield_{extraHeader}"); + } + _csv.NextRecord(); + foreach (GenericRecordExportModel genericRecord in genericRecords) + { + _csv.WriteField(genericRecord.Date); + _csv.WriteField(genericRecord.Description); + _csv.WriteField(genericRecord.Cost); + _csv.WriteField(genericRecord.Notes); + _csv.WriteField(genericRecord.Odometer); + _csv.WriteField(genericRecord.Tags); + foreach (string extraHeader in extraHeaders) + { + var extraField = genericRecord.ExtraFields.Where(x => x.Name == extraHeader).FirstOrDefault(); + _csv.WriteField(extraField != null ? extraField.Value : string.Empty); + } + _csv.NextRecord(); + } + } + public static void WriteOdometerRecordExportModel(CsvWriter _csv, IEnumerable genericRecords) + { + var extraHeaders = genericRecords.SelectMany(x => x.ExtraFields).Select(y => y.Name).OrderBy(x => x).Distinct(); + //write headers + _csv.WriteField(nameof(OdometerRecordCsvExportModel.Date)); + _csv.WriteField(nameof(OdometerRecordCsvExportModel.InitialOdometer)); + _csv.WriteField(nameof(OdometerRecordCsvExportModel.Odometer)); + _csv.WriteField(nameof(OdometerRecordCsvExportModel.Notes)); + _csv.WriteField(nameof(OdometerRecordCsvExportModel.Tags)); + foreach (string extraHeader in extraHeaders) + { + _csv.WriteField($"extrafield_{extraHeader}"); + } + _csv.NextRecord(); + foreach (OdometerRecordCsvExportModel genericRecord in genericRecords) + { + _csv.WriteField(genericRecord.Date); + _csv.WriteField(genericRecord.InitialOdometer); + _csv.WriteField(genericRecord.Odometer); + _csv.WriteField(genericRecord.Notes); + _csv.WriteField(genericRecord.Tags); + foreach (string extraHeader in extraHeaders) + { + var extraField = genericRecord.ExtraFields.Where(x => x.Name == extraHeader).FirstOrDefault(); + _csv.WriteField(extraField != null ? extraField.Value : string.Empty); + } + _csv.NextRecord(); + } + } + public static void WriteTaxRecordExportModel(CsvWriter _csv, IEnumerable genericRecords) + { + var extraHeaders = genericRecords.SelectMany(x => x.ExtraFields).Select(y => y.Name).OrderBy(x => x).Distinct(); + //write headers + _csv.WriteField(nameof(TaxRecordCsvExportModel.Date)); + _csv.WriteField(nameof(TaxRecordCsvExportModel.Description)); + _csv.WriteField(nameof(TaxRecordCsvExportModel.Cost)); + _csv.WriteField(nameof(TaxRecordCsvExportModel.Notes)); + _csv.WriteField(nameof(TaxRecordCsvExportModel.Tags)); + foreach (string extraHeader in extraHeaders) + { + _csv.WriteField($"extrafield_{extraHeader}"); + } + _csv.NextRecord(); + foreach (TaxRecordCsvExportModel genericRecord in genericRecords) + { + _csv.WriteField(genericRecord.Date); + _csv.WriteField(genericRecord.Description); + _csv.WriteField(genericRecord.Cost); + _csv.WriteField(genericRecord.Notes); + _csv.WriteField(genericRecord.Tags); + foreach (string extraHeader in extraHeaders) + { + var extraField = genericRecord.ExtraFields.Where(x => x.Name == extraHeader).FirstOrDefault(); + _csv.WriteField(extraField != null ? extraField.Value : string.Empty); + } + _csv.NextRecord(); + } + } + public static void WriteSupplyRecordExportModel(CsvWriter _csv, IEnumerable genericRecords) + { + var extraHeaders = genericRecords.SelectMany(x => x.ExtraFields).Select(y => y.Name).OrderBy(x => x).Distinct(); + //write headers + _csv.WriteField(nameof(SupplyRecordCsvExportModel.Date)); + _csv.WriteField(nameof(SupplyRecordCsvExportModel.PartNumber)); + _csv.WriteField(nameof(SupplyRecordCsvExportModel.PartSupplier)); + _csv.WriteField(nameof(SupplyRecordCsvExportModel.PartQuantity)); + _csv.WriteField(nameof(TaxRecordCsvExportModel.Description)); + _csv.WriteField(nameof(TaxRecordCsvExportModel.Notes)); + _csv.WriteField(nameof(TaxRecordCsvExportModel.Cost)); + _csv.WriteField(nameof(TaxRecordCsvExportModel.Tags)); + foreach (string extraHeader in extraHeaders) + { + _csv.WriteField($"extrafield_{extraHeader}"); + } + _csv.NextRecord(); + foreach (SupplyRecordCsvExportModel genericRecord in genericRecords) + { + _csv.WriteField(genericRecord.Date); + _csv.WriteField(genericRecord.PartNumber); + _csv.WriteField(genericRecord.PartSupplier); + _csv.WriteField(genericRecord.PartQuantity); + _csv.WriteField(genericRecord.Description); + _csv.WriteField(genericRecord.Notes); + _csv.WriteField(genericRecord.Cost); + _csv.WriteField(genericRecord.Tags); + foreach (string extraHeader in extraHeaders) + { + var extraField = genericRecord.ExtraFields.Where(x => x.Name == extraHeader).FirstOrDefault(); + _csv.WriteField(extraField != null ? extraField.Value : string.Empty); + } + _csv.NextRecord(); + } + } + public static void WritePlanRecordExportModel(CsvWriter _csv, IEnumerable genericRecords) + { + var extraHeaders = genericRecords.SelectMany(x => x.ExtraFields).Select(y => y.Name).OrderBy(x => x).Distinct(); + //write headers + _csv.WriteField(nameof(PlanRecordCsvExportModel.DateCreated)); + _csv.WriteField(nameof(PlanRecordCsvExportModel.DateModified)); + _csv.WriteField(nameof(PlanRecordCsvExportModel.Description)); + _csv.WriteField(nameof(PlanRecordCsvExportModel.Notes)); + _csv.WriteField(nameof(PlanRecordCsvExportModel.Type)); + _csv.WriteField(nameof(PlanRecordCsvExportModel.Priority)); + _csv.WriteField(nameof(PlanRecordCsvExportModel.Progress)); + _csv.WriteField(nameof(PlanRecordCsvExportModel.Cost)); + foreach (string extraHeader in extraHeaders) + { + _csv.WriteField($"extrafield_{extraHeader}"); + } + _csv.NextRecord(); + foreach (PlanRecordCsvExportModel genericRecord in genericRecords) + { + _csv.WriteField(genericRecord.DateCreated); + _csv.WriteField(genericRecord.DateModified); + _csv.WriteField(genericRecord.Description); + _csv.WriteField(genericRecord.Notes); + _csv.WriteField(genericRecord.Type); + _csv.WriteField(genericRecord.Priority); + _csv.WriteField(genericRecord.Progress); + _csv.WriteField(genericRecord.Cost); + foreach (string extraHeader in extraHeaders) + { + var extraField = genericRecord.ExtraFields.Where(x => x.Name == extraHeader).FirstOrDefault(); + _csv.WriteField(extraField != null ? extraField.Value : string.Empty); + } + _csv.NextRecord(); + } + } + public static void WriteGasRecordExportModel(CsvWriter _csv, IEnumerable genericRecords) + { + var extraHeaders = genericRecords.SelectMany(x => x.ExtraFields).Select(y => y.Name).OrderBy(x => x).Distinct(); + //write headers + _csv.WriteField(nameof(GasRecordCsvExportModel.Date)); + _csv.WriteField(nameof(GasRecordCsvExportModel.Odometer)); + _csv.WriteField(nameof(GasRecordCsvExportModel.FuelConsumed)); + _csv.WriteField(nameof(GasRecordCsvExportModel.Cost)); + _csv.WriteField(nameof(GasRecordCsvExportModel.FuelEconomy)); + _csv.WriteField(nameof(GasRecordCsvExportModel.IsFillToFull)); + _csv.WriteField(nameof(GasRecordCsvExportModel.MissedFuelUp)); + _csv.WriteField(nameof(GasRecordCsvExportModel.Notes)); + _csv.WriteField(nameof(GasRecordCsvExportModel.Tags)); + foreach (string extraHeader in extraHeaders) + { + _csv.WriteField($"extrafield_{extraHeader}"); + } + _csv.NextRecord(); + foreach (GasRecordCsvExportModel genericRecord in genericRecords) + { + _csv.WriteField(genericRecord.Date); + _csv.WriteField(genericRecord.Odometer); + _csv.WriteField(genericRecord.FuelConsumed); + _csv.WriteField(genericRecord.Cost); + _csv.WriteField(genericRecord.FuelEconomy); + _csv.WriteField(genericRecord.IsFillToFull); + _csv.WriteField(genericRecord.MissedFuelUp); + _csv.WriteField(genericRecord.Notes); + _csv.WriteField(genericRecord.Tags); + foreach (string extraHeader in extraHeaders) + { + var extraField = genericRecord.ExtraFields.Where(x => x.Name == extraHeader).FirstOrDefault(); + _csv.WriteField(extraField != null ? extraField.Value : string.Empty); + } + _csv.NextRecord(); + } + } } } diff --git a/MapProfile/ImportMappers.cs b/MapProfile/ImportMappers.cs index 2f9940b..bc23959 100644 --- a/MapProfile/ImportMappers.cs +++ b/MapProfile/ImportMappers.cs @@ -38,7 +38,7 @@ namespace CarCareTracker.MapProfile } } return attributes; - }); ; + }); } } } diff --git a/Models/Shared/ImportModel.cs b/Models/Shared/ImportModel.cs index ea1fdfe..f2c42fe 100644 --- a/Models/Shared/ImportModel.cs +++ b/Models/Shared/ImportModel.cs @@ -39,7 +39,10 @@ public string Notes { get; set; } public string Tags { get; set; } } - + public class SupplyRecordCsvExportModel: SupplyRecordExportModel + { + public List ExtraFields { get; set; } + } public class ServiceRecordExportModel { public string Date { get; set; } @@ -49,6 +52,10 @@ public string Cost { get; set; } public string Tags { get; set; } } + public class GenericRecordExportModel: ServiceRecordExportModel + { + public List ExtraFields { get; set; } + } public class OdometerRecordExportModel { public string Date { get; set; } @@ -57,6 +64,10 @@ public string Notes { get; set; } public string Tags { get; set; } } + public class OdometerRecordCsvExportModel: OdometerRecordExportModel + { + public List ExtraFields { get; set; } + } public class TaxRecordExportModel { public string Date { get; set; } @@ -65,6 +76,10 @@ public string Cost { get; set; } public string Tags { get; set; } } + public class TaxRecordCsvExportModel: TaxRecordExportModel + { + public List ExtraFields { get; set; } + } public class GasRecordExportModel { public string Date { get; set; } @@ -77,6 +92,10 @@ public string Notes { get; set; } public string Tags { get; set; } } + public class GasRecordCsvExportModel: GasRecordExportModel + { + public List ExtraFields { get; set; } + } public class ReminderExportModel { public string Description { get; set; } @@ -95,5 +114,8 @@ public string Progress { get; set; } public string Cost { get; set; } } - + public class PlanRecordCsvExportModel: PlanRecordExportModel + { + public List ExtraFields { get; set; } + } } diff --git a/Views/Vehicle/_UpgradeRecords.cshtml b/Views/Vehicle/_UpgradeRecords.cshtml index 5c931aa..461a3a8 100644 --- a/Views/Vehicle/_UpgradeRecords.cshtml +++ b/Views/Vehicle/_UpgradeRecords.cshtml @@ -109,7 +109,7 @@ @translator.Translate(userLanguage, "Date") @translator.Translate(userLanguage, "Odometer") - @translator.Translate(userLanguage, "Description") + @translator.Translate(userLanguage, "Description") @translator.Translate(userLanguage, "Cost") @translator.Translate(userLanguage, "Notes") @foreach (string extraFieldColumn in extraFields) @@ -124,7 +124,7 @@ @upgradeRecord.Date.ToShortDateString() @upgradeRecord.Mileage - @upgradeRecord.Description + @upgradeRecord.Description @((hideZero && upgradeRecord.Cost == default) ? "---" : upgradeRecord.Cost.ToString("C")) @CarCareTracker.Helper.StaticHelper.TruncateStrings(upgradeRecord.Notes) @foreach (string extraFieldColumn in extraFields)