OD.WebApplication/OD.WebApplication/Controllers/HomeController.cs

97 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using AutoMapper;
using CsvHelper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using OD.WebApplication.Models;
namespace OD.WebApplication.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IMapper _mapper;
public HomeController(ILogger<HomeController> logger, IMapper mapper)
{
_logger = logger;
_mapper = mapper;
}
public IActionResult Index()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult UploadCSV(HomeViewModel model)
{
try
{
if (ModelState.IsValid)
{
using var reader = new StreamReader(model.FileAttach.OpenReadStream());
using var csvReader = new CsvReader(reader, CultureInfo.GetCultureInfo("es-ES"));
csvReader.Configuration.BadDataFound = null;
csvReader.Configuration.HeaderValidated = null;
csvReader.Configuration.MissingFieldFound = null;
csvReader.Configuration.Delimiter = ";";
var originDto = new List<OriginDataModel>();
csvReader.Read();
csvReader.ReadHeader();
while (csvReader.Read())
{
var record = new OriginDataModel
{
Id = csvReader.GetField("ID"),
Categories = csvReader.GetField<string>("Categorías"),
Manufacturer = csvReader.GetField<string>("Fabricante"),
PriceListingWithoutVAT = decimal.Parse(csvReader.GetField("Precio tiendas sin IVA")),
PricePublicWithoutVAT = decimal.Parse(csvReader.GetField("PVP sin IVA")),
PriceRecommendedWithoutVAT = decimal.Parse(csvReader.GetField("PVR sin IVA")),
Stock = decimal.Parse(csvReader.GetField("Stock")),
Volume = float.Parse(csvReader.GetField("Volumen")),
Name = csvReader.GetField("Nombre"),
LongDesc = csvReader.GetField("Descripción larga"),
ShortDesc = csvReader.GetField("Descripción breve"),
ImageUrls = csvReader.GetField("Imagen"),
Ean13 = csvReader.GetField("EAN13"),
Sda = csvReader.GetField("SDA")
};
originDto.Add(record);
}
var destinationDto = _mapper.Map<List<OriginDataModel>, List<DestinationDataModel>>(originDto);
var ms = new MemoryStream();
var sw = new StreamWriter(ms);
using var csvWriter = new CsvWriter(sw, CultureInfo.GetCultureInfo("es-ES"));
csvWriter.Configuration.Delimiter = ",";
csvWriter.WriteRecords(destinationDto);
sw.Flush();
ms.Position = 0;
return File(ms.ToArray(), "text/csv", "result.csv");
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Attempted to perform an invalid conversion");
return new ErrorMessageResult(new ErrorResult { Exception = ex });
}
return RedirectToAction("Index");
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel {RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier});
}
}
}