Merge pull request #852 from hargata/Hargata/dynamic.csv
dynamically generate locale-sensitive CSV samples
This commit is contained in:
@@ -16,6 +16,176 @@ namespace CarCareTracker.Controllers
|
|||||||
{
|
{
|
||||||
return PartialView("_BulkDataImporter", mode);
|
return PartialView("_BulkDataImporter", mode);
|
||||||
}
|
}
|
||||||
|
[HttpGet]
|
||||||
|
public IActionResult GenerateCsvSample(ImportMode mode)
|
||||||
|
{
|
||||||
|
string uploadDirectory = "temp/";
|
||||||
|
string uploadPath = Path.Combine(_webEnv.ContentRootPath, "data", uploadDirectory);
|
||||||
|
if (!Directory.Exists(uploadPath))
|
||||||
|
Directory.CreateDirectory(uploadPath);
|
||||||
|
var fileNameToExport = $"temp/{Guid.NewGuid()}.csv";
|
||||||
|
var fullExportFilePath = _fileHelper.GetFullFilePath(fileNameToExport, false);
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case ImportMode.ServiceRecord:
|
||||||
|
case ImportMode.RepairRecord:
|
||||||
|
case ImportMode.UpgradeRecord:
|
||||||
|
{
|
||||||
|
var exportData = new List<GenericRecordExportModel> { new GenericRecordExportModel
|
||||||
|
{
|
||||||
|
Date = DateTime.Now.ToShortDateString(),
|
||||||
|
Description = "Test",
|
||||||
|
Cost = 123.45M.ToString("C"),
|
||||||
|
Notes = "Test Note",
|
||||||
|
Odometer = 12345.ToString(),
|
||||||
|
Tags = "test1 test2"
|
||||||
|
} };
|
||||||
|
using (var writer = new StreamWriter(fullExportFilePath))
|
||||||
|
{
|
||||||
|
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
||||||
|
{
|
||||||
|
//custom writer
|
||||||
|
StaticHelper.WriteGenericRecordExportModel(csv, exportData);
|
||||||
|
}
|
||||||
|
writer.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.GasRecord:
|
||||||
|
{
|
||||||
|
var exportData = new List<GasRecordExportModel> { new GasRecordExportModel
|
||||||
|
{
|
||||||
|
Date = DateTime.Now.ToShortDateString(),
|
||||||
|
Odometer = 12345.ToString(),
|
||||||
|
FuelConsumed = 12.34M.ToString(),
|
||||||
|
Cost = 45.67M.ToString("C"),
|
||||||
|
IsFillToFull = true.ToString(),
|
||||||
|
MissedFuelUp = false.ToString(),
|
||||||
|
Notes = "Test Note",
|
||||||
|
Tags = "test1 test2"
|
||||||
|
} };
|
||||||
|
using (var writer = new StreamWriter(fullExportFilePath))
|
||||||
|
{
|
||||||
|
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
||||||
|
{
|
||||||
|
//custom writer
|
||||||
|
StaticHelper.WriteGasRecordExportModel(csv, exportData);
|
||||||
|
}
|
||||||
|
writer.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.OdometerRecord:
|
||||||
|
{
|
||||||
|
var exportData = new List<OdometerRecordExportModel> { new OdometerRecordExportModel
|
||||||
|
{
|
||||||
|
Date = DateTime.Now.ToShortDateString(),
|
||||||
|
InitialOdometer = 12345.ToString(),
|
||||||
|
Odometer = 12345.ToString(),
|
||||||
|
Notes = "Test Note",
|
||||||
|
Tags = "test1 test2"
|
||||||
|
} };
|
||||||
|
using (var writer = new StreamWriter(fullExportFilePath))
|
||||||
|
{
|
||||||
|
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
||||||
|
{
|
||||||
|
//custom writer
|
||||||
|
StaticHelper.WriteOdometerRecordExportModel(csv, exportData);
|
||||||
|
}
|
||||||
|
writer.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.TaxRecord:
|
||||||
|
{
|
||||||
|
var exportData = new List<TaxRecordExportModel> { new TaxRecordExportModel
|
||||||
|
{
|
||||||
|
Date = DateTime.Now.ToShortDateString(),
|
||||||
|
Description = "Test",
|
||||||
|
Cost = 123.45M.ToString("C"),
|
||||||
|
Notes = "Test Note",
|
||||||
|
Tags = "test1 test2"
|
||||||
|
} };
|
||||||
|
using (var writer = new StreamWriter(fullExportFilePath))
|
||||||
|
{
|
||||||
|
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
||||||
|
{
|
||||||
|
//custom writer
|
||||||
|
StaticHelper.WriteTaxRecordExportModel(csv, exportData);
|
||||||
|
}
|
||||||
|
writer.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.SupplyRecord:
|
||||||
|
{
|
||||||
|
var exportData = new List<SupplyRecordExportModel> { new SupplyRecordExportModel
|
||||||
|
{
|
||||||
|
Date = DateTime.Now.ToShortDateString(),
|
||||||
|
PartNumber = "TEST-123456",
|
||||||
|
PartSupplier = "Test Supplier",
|
||||||
|
PartQuantity = 1.5M.ToString(),
|
||||||
|
Description = "Test",
|
||||||
|
Cost = 123.45M.ToString("C"),
|
||||||
|
Notes = "Test Note",
|
||||||
|
Tags = "test1 test2"
|
||||||
|
} };
|
||||||
|
using (var writer = new StreamWriter(fullExportFilePath))
|
||||||
|
{
|
||||||
|
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
||||||
|
{
|
||||||
|
//custom writer
|
||||||
|
StaticHelper.WriteSupplyRecordExportModel(csv, exportData);
|
||||||
|
}
|
||||||
|
writer.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ImportMode.PlanRecord:
|
||||||
|
{
|
||||||
|
var exportData = new List<PlanRecordExportModel> { new PlanRecordExportModel
|
||||||
|
{
|
||||||
|
DateCreated = DateTime.Now.ToString(),
|
||||||
|
DateModified = DateTime.Now.ToString(),
|
||||||
|
Description = "Test",
|
||||||
|
Type = ImportMode.RepairRecord.ToString(),
|
||||||
|
Priority = PlanPriority.Normal.ToString(),
|
||||||
|
Progress = PlanProgress.Testing.ToString(),
|
||||||
|
Cost = 123.45M.ToString("C"),
|
||||||
|
Notes = "Test Note"
|
||||||
|
} };
|
||||||
|
using (var writer = new StreamWriter(fullExportFilePath))
|
||||||
|
{
|
||||||
|
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
|
||||||
|
{
|
||||||
|
//custom writer
|
||||||
|
StaticHelper.WritePlanRecordExportModel(csv, exportData);
|
||||||
|
}
|
||||||
|
writer.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return Json(OperationResponse.Failed("No parameters"));
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var fileBytes = _fileHelper.GetFileBytes(fullExportFilePath, true);
|
||||||
|
if (fileBytes.Length > 0)
|
||||||
|
{
|
||||||
|
return File(fileBytes, "text/csv", $"{mode.ToString().ToLower()}sample.csv");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Json(OperationResponse.Failed("An error has occurred while generating CSV sample: file has zero bytes"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex.Message);
|
||||||
|
return Json(OperationResponse.Failed($"An error has occurred while generating CSV sample: {ex.Message}"));
|
||||||
|
}
|
||||||
|
}
|
||||||
[TypeFilter(typeof(CollaboratorFilter))]
|
[TypeFilter(typeof(CollaboratorFilter))]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult ExportFromVehicleToCsv(int vehicleId, ImportMode mode)
|
public IActionResult ExportFromVehicleToCsv(int vehicleId, ImportMode mode)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ namespace CarCareTracker.Helper
|
|||||||
public interface IFileHelper
|
public interface IFileHelper
|
||||||
{
|
{
|
||||||
string GetFullFilePath(string currentFilePath, bool mustExist = true);
|
string GetFullFilePath(string currentFilePath, bool mustExist = true);
|
||||||
|
byte[] GetFileBytes(string fullFilePath, bool deleteFile = false);
|
||||||
string MoveFileFromTemp(string currentFilePath, string newFolder);
|
string MoveFileFromTemp(string currentFilePath, string newFolder);
|
||||||
bool RenameFile(string currentFilePath, string newName);
|
bool RenameFile(string currentFilePath, string newName);
|
||||||
bool DeleteFile(string currentFilePath);
|
bool DeleteFile(string currentFilePath);
|
||||||
@@ -85,6 +86,19 @@ namespace CarCareTracker.Helper
|
|||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public byte[] GetFileBytes(string fullFilePath, bool deleteFile = false)
|
||||||
|
{
|
||||||
|
if (File.Exists(fullFilePath))
|
||||||
|
{
|
||||||
|
var fileBytes = File.ReadAllBytes(fullFilePath);
|
||||||
|
if (deleteFile)
|
||||||
|
{
|
||||||
|
File.Delete(fullFilePath);
|
||||||
|
}
|
||||||
|
return fileBytes;
|
||||||
|
}
|
||||||
|
return Array.Empty<byte>();
|
||||||
|
}
|
||||||
public bool RestoreBackup(string fileName, bool clearExisting = false)
|
public bool RestoreBackup(string fileName, bool clearExisting = false)
|
||||||
{
|
{
|
||||||
var fullFilePath = GetFullFilePath(fileName);
|
var fullFilePath = GetFullFilePath(fileName);
|
||||||
|
|||||||
@@ -21,30 +21,7 @@
|
|||||||
<div class="alert alert-danger" role="alert">
|
<div class="alert alert-danger" role="alert">
|
||||||
@translator.Translate(userLanguage, "Failure to format the data correctly can cause data corruption. Please make sure you make a copy of the local database before proceeding.")
|
@translator.Translate(userLanguage, "Failure to format the data correctly can cause data corruption. Please make sure you make a copy of the local database before proceeding.")
|
||||||
</div>
|
</div>
|
||||||
@if (Model == ImportMode.GasRecord)
|
<a class="btn btn-link" href="@($"/Vehicle/GenerateCsvSample?mode={Model.ToString()}")" target="_blank">@translator.Translate(userLanguage, "Download Sample")</a>
|
||||||
{
|
|
||||||
<a class="btn btn-link" href="/defaults/gassample.csv" target="_blank">@translator.Translate(userLanguage, "Download Sample")</a>
|
|
||||||
}
|
|
||||||
else if (Model == ImportMode.ServiceRecord || Model == ImportMode.RepairRecord || Model == ImportMode.UpgradeRecord)
|
|
||||||
{
|
|
||||||
<a class="btn btn-link" href="/defaults/servicerecordsample.csv" target="_blank">@translator.Translate(userLanguage, "Download Sample")</a>
|
|
||||||
}
|
|
||||||
else if (Model == ImportMode.TaxRecord)
|
|
||||||
{
|
|
||||||
<a class="btn btn-link" href="/defaults/taxrecordsample.csv" target="_blank">@translator.Translate(userLanguage, "Download Sample")</a>
|
|
||||||
}
|
|
||||||
else if (Model == ImportMode.SupplyRecord)
|
|
||||||
{
|
|
||||||
<a class="btn btn-link" href="/defaults/supplysample.csv" target="_blank">@translator.Translate(userLanguage, "Download Sample")</a>
|
|
||||||
}
|
|
||||||
else if (Model == ImportMode.PlanRecord)
|
|
||||||
{
|
|
||||||
<a class="btn btn-link" href="/defaults/plansample.csv" target="_blank">@translator.Translate(userLanguage, "Download Sample")</a>
|
|
||||||
}
|
|
||||||
else if (Model == ImportMode.OdometerRecord)
|
|
||||||
{
|
|
||||||
<a class="btn btn-link" href="/defaults/odometersample.csv" target="_blank">@translator.Translate(userLanguage, "Download Sample")</a>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-2">
|
<div class="row mt-2">
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
Date,Odometer,FuelConsumed,Cost,IsFillToFull,MissedFuelUp,Notes
|
|
||||||
5/8/2020,204836,8.331,16.24,True,False,
|
|
||||||
5/30/2020,205056,11.913,25.72,True,False,
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,Odometer,Notes
|
|
||||||
1/1/2024,260001,test test
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
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
|
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
Date,Odometer,Description,Notes,Cost
|
|
||||||
01/01/2020,45000,Test Description 1,Test Note 1,20.60
|
|
||||||
01/02/2020,47000,Test Description 2,Test Note 2,40.45
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
Date,PartNumber,PartSupplier,PartQuantity,Description,Cost,Notes
|
|
||||||
1/16/2024,EVA17872045551,Evan Fischer,1,Front Bumper,$95.14,Altima Activities
|
|
||||||
|
@@ -1,3 +0,0 @@
|
|||||||
Date,Description,Notes,Cost
|
|
||||||
01/01/2020,Test Description 1,Test Note 1,20.60
|
|
||||||
01/02/2020,Test Description 2,Test Note 2,40.45
|
|
||||||
|
Reference in New Issue
Block a user