using CAPI.Custom; using CAPI.Custom.Entities; using NLog; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CEP._123 { public class CSVImportConfig { public string FilePath { get; set; } public string[] Headers { get; set; } public bool HasHeaderRow { get; set; } } public class ItemReadEventArgs : EventArgs { public int LineNumber { get; set; } public InventoryManagement Item { get; set; } } public class InventoryItemCsvReader { private readonly CSVImportConfig Config; public event EventHandler ItemRead; public event EventHandler Done; private bool Cancel = false; List headers = new List() { //"Parts Master Number", //"Alternate / Other Number", //"Brand", //"Condition", //"Available", //"Committed", //"On Hand", //"On Order", //"Average Cost", //"Warehouse Name", //"Bin Location(s)" //test 2 //"Part Number", //"Brand", //"Condition", //"On Hand", //"Bin Location", //"Average Cost Price", //test 3 "Part Number", "Brand", "Condition", "Unique Number", "Wharehouse", "Bin Location", "On Hand", "Average Cost Price" }; public InventoryItemCsvReader(CSVImportConfig config) { Config = config; } public void StopRead() => Cancel = true; public void StartRead() { Cancel = false; using (var reader = new StreamReader(Config.FilePath)) { // skip headers line if (Config.HasHeaderRow) { reader.ReadLine(); } int lineNumber = 1; while (!reader.EndOfStream && !Cancel) { var line = reader.ReadLine().Split(','); if (line.IsNotEmpty()) { // masterNumber same as partNumber var partNumber = line[headers.IndexOf("Part Number")]?.Trim().ToUpper(); var brand = line[headers.IndexOf("Brand")]?.Trim(); var condition = line[headers.IndexOf("Condition")]?.Trim(); var uniqueNumber = line[headers.IndexOf("Unique Number")]?.Trim().ToUpper(); var warehouseName = line[headers.IndexOf("Wharehouse")]?.Trim(); var binLocation = line[headers.IndexOf("Bin Location")]?.Trim(); var onHand = line[headers.IndexOf("On Hand")]?.Trim(); var averageCost = line[headers.IndexOf("Average Cost Price")]?.Trim(); var uniqueNumberConfirmation = $"{partNumber}-{brand}-{condition}".ToUpper(); var uniqueManagementNumber = $"{uniqueNumber}-{binLocation}"; var totalOnHandValue = (onHand.TryParseDecimal().GetValueOrDefault() * averageCost.TryParseDecimal().GetValueOrDefault()); var scanned_item = new InventoryManagement() { AverageUnitCost = averageCost.TryParseDecimal(), BinLocation = binLocation, Brand = brand, Condition = condition, PartNumber = partNumber, WarehouseLocationName = warehouseName, OnHand = onHand.TryParseInt(), UniqueNumber = uniqueNumber, TotalOnHandValue = totalOnHandValue }; scanned_item.Available = scanned_item.OnHand.GetValueOrDefault() - scanned_item.Committed.GetValueOrDefault(); ItemRead?.Invoke(this, new ItemReadEventArgs() { Item = scanned_item, LineNumber = lineNumber }); lineNumber++; } } Done?.Invoke(this, EventArgs.Empty); } } } }