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 Microsoft.Extensions.Logging; 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; private readonly ILogger _logger; public PartialInventoryUpdate(IConfiguration configuration, ILogger logger) { FtpConfiguration ftpConfiguration = configuration.GetSection("FtpServers:AutomationConfiguration").Get(); _ftpService = new FtpService(ftpConfiguration); _logger = logger; } public async Task Run(CancellationToken token, params string[] arguments) { FtpFileInfo lastUploadedFile = _ftpService.ListFilesExtended() .Where(f => f.FileType == FtpFileType.File && f.Modified >= DateTime.Now.AddHours(-24) && f.Filename.IndexOf("Availability Partial") > -1) .OrderByDescending(f => f.Modified) .FirstOrDefault(); if (lastUploadedFile == null) { _logger.LogInformation($"No partial inventory file available for the time period {DateTime.Now.AddHours(-24)} - {DateTime.Now}"); return; } string file = _ftpService.Download($"{lastUploadedFile.Filename}", "C:\\Users\\Tom\\Desktop"); 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 StreamReader reader = new StreamReader(file); 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 quantity) && int.TryParse(columns[2], out int sku)) { using SqlCommand sqlCommand = new SqlCommand("UPDATE Inventory SET QTY = @qty WHERE SKU = @sku AND Store = @store", connection); sqlCommand.Parameters.Add(new SqlParameter("qty", quantity)); sqlCommand.Parameters.Add(new SqlParameter("sku", sku)); sqlCommand.Parameters.Add(new SqlParameter("store", store)); await sqlCommand.ExecuteNonQueryAsync(); } } return; } } }