using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Data.SqlClient; using Microsoft.Extensions.Configuration; using PartSource.Automation.Models.Configuration; using PartSource.Automation.Models.Ftp; using PartSource.Automation.Services; using Ratermania.Automation.Interfaces; namespace PartSource.Automation.Jobs.POC { public class PartialInventoryUpdate : IAutomationJob { private readonly FtpService _ftpService; public PartialInventoryUpdate(IConfiguration configuration) { FtpConfiguration ftpConfiguration = configuration.GetSection("FtpServers:AzureConfiguration").Get(); _ftpService = new FtpService(ftpConfiguration); } public async Task Run(CancellationToken token, params string[] arguments) { FtpFileInfo lastUploadedFile = _ftpService.ListFilesExtended("") .Where(f => f.FileType == FtpFileType.File && f.Filename.IndexOf("Availability") > -1) .OrderByDescending(f => f.Modified) .First(); string file = _ftpService.Download(lastUploadedFile.Filename, Path.GetTempPath()); DataTable dataTable = GetDataTable(file); using SqlConnection connection = new SqlConnection("Server=tcp:ps-automation-stage.eastus2.cloudapp.azure.com,1433;Initial Catalog=ps-whi-stage;Persist Security Info=False;User ID=stageuser;Password=]FXepK^cFYS|[H<;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;"); connection.Open(); using SqlBulkCopy bulk = new SqlBulkCopy(connection) { DestinationTableName = $"PartAvailability", BulkCopyTimeout = 14400 }; bulk.WriteToServer(dataTable); return; } private DataTable GetDataTable(string filename) { using DataTable dataTable = new DataTable(); dataTable.Columns.Add("Store", typeof(int)); dataTable.Columns.Add("SKU", typeof(int)); dataTable.Columns.Add("QTY", typeof(int)); using StreamReader reader = new StreamReader(filename); string line = reader.ReadLine(); // Burn the header row while (reader.Peek() > 0) { line = reader.ReadLine(); string[] columns = line.Split("|"); for (int i = 0; i < columns.Length; i++) { columns[i] = columns[i].Replace("\"", string.Empty); } if (int.TryParse(columns[0], out int store) && int.TryParse(columns[1], out int sku) && int.TryParse(columns[2], out int quantity)) { dataTable.Rows.Add(new object[] { store, sku, quantity }); } } return dataTable; } } }