Import FuelLog
This commit is contained in:
@@ -447,6 +447,7 @@ namespace MileageTraker.Web.DAL
|
||||
let existingOdometer = log.EndOdometer
|
||||
where
|
||||
log.VehicleId == vehicleId &&
|
||||
// this is also in Utility.Algorithms, but doesn't get emitted to DB as SQL if used in method call
|
||||
!(existingDate == date
|
||||
|| existingOdometer == odometer
|
||||
|| existingDate < date && existingOdometer < odometer
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using CsvHelper;
|
||||
using CsvHelper.Configuration;
|
||||
using MileageTraker.Web.Models;
|
||||
using MileageTraker.Web.Utility;
|
||||
|
||||
namespace MileageTraker.Web.DAL
|
||||
{
|
||||
public class FuelmanCsvImporter
|
||||
{
|
||||
private sealed class FuelmanCsvClassMap : CsvClassMap<FuelLog>
|
||||
{
|
||||
public FuelmanCsvClassMap()
|
||||
{
|
||||
Map(m => m.Date).ConvertUsing(row =>
|
||||
{
|
||||
var date = row.GetField("CEDATE");
|
||||
var time = row.GetField<int>("CETIME");
|
||||
var dttm = string.Format(@"{0} {1:00:00}", date, time);
|
||||
return DateTime.ParseExact(dttm, @"M/d/yyyy HH:mm", CultureInfo.InvariantCulture);
|
||||
});
|
||||
Map(m => m.DriverFullName).ConvertUsing(row =>
|
||||
{
|
||||
var name = row.GetField("CEEMNAME");
|
||||
return NameNormalizer.Normalize(name);
|
||||
});
|
||||
|
||||
Map(m => m.TagNumber).Name("CEVEHNO");
|
||||
Map(m => m.Odometer).Name("CEODOMETER");
|
||||
Map(m => m.CityName).ConvertUsing(row =>
|
||||
{
|
||||
var city = row.GetField("CESITCTY");
|
||||
return city.ToLower().ToTitleCase();
|
||||
});
|
||||
Map(m => m.MPG).Name("CEMPG");
|
||||
Map(m => m.GasPurchased).Name("CEQTY");
|
||||
Map(m => m.TotalPrice).Name("CECUSAMT");
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<FuelLog> Import(string filename)
|
||||
{
|
||||
var fileInfo = new FileInfo(filename);
|
||||
if (!fileInfo.Exists)
|
||||
throw new ImportException("Cannot find file '" + filename + "'");
|
||||
|
||||
using (var tr = File.OpenText(fileInfo.FullName))
|
||||
{
|
||||
var csv = new CsvReader(tr);
|
||||
csv.Configuration.RegisterClassMap<FuelmanCsvClassMap>();
|
||||
|
||||
var fuelLogs = new List<FuelLog>();
|
||||
while (csv.Read())
|
||||
{
|
||||
try
|
||||
{
|
||||
// Skip non-FUEL entries
|
||||
if (csv.GetField<string>("CEPRDTYPE") != "FUEL")
|
||||
continue;
|
||||
|
||||
fuelLogs.Add(csv.GetRecord<FuelLog>());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new ImportException("Problem with document encountered on row " + csv.Row + ". " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
return fuelLogs;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using System;
|
||||
|
||||
namespace MileageTraker.Web.DAL
|
||||
{
|
||||
public class ImportException : Exception
|
||||
{
|
||||
public ImportException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace MileageTraker.Web.DAL
|
||||
{
|
||||
public class LogImportException : Exception
|
||||
{
|
||||
public LogImportException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ namespace MileageTraker.Web.DAL
|
||||
var missingHeaderColumns = GetMissingHeaderColumns(columnIndex.Keys);
|
||||
if (missingHeaderColumns.Any())
|
||||
{
|
||||
throw new LogImportException(string.Format("Excel document missing columns: {0}", string.Join(", ", missingHeaderColumns)));
|
||||
throw new ImportException(string.Format("Excel document missing columns: {0}", string.Join(", ", missingHeaderColumns)));
|
||||
}
|
||||
|
||||
for (var r = 1; r <= sheet.Cells.LastRowIndex; r++)
|
||||
|
||||
Reference in New Issue
Block a user