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 { public class PartialInventoryUpdate : IAutomationJob { private readonly FtpService _ftpService; private readonly ILogger _logger; private readonly string _connectionString; public PartialInventoryUpdate(IConfiguration configuration, ILogger logger) { FtpConfiguration ftpConfiguration = configuration.GetSection("FtpServers:AutomationConfiguration").Get(); _ftpService = new FtpService(ftpConfiguration); _connectionString = _connectionString = configuration.GetConnectionString("PartSourceDatabase"); _logger = logger; } public async Task Run(CancellationToken token, params string[] arguments) { FtpFileInfo lastUploadedFile = _ftpService.ListFilesExtended() .Where(f => f.FileType == FtpFileType.File && f.Filename.IndexOf("Availability Partial") > -1) .OrderByDescending(f => f.Modified) .FirstOrDefault(); if (lastUploadedFile == null) { _logger.LogInformation($"No partial inventory file available."); return; } _logger.LogInformation("Processing {filename}", lastUploadedFile.Filename); string file = _ftpService.Download($"{lastUploadedFile.Filename}"); using SqlConnection connection = new SqlConnection(_connectionString); 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 sku) && int.TryParse(columns[2], out int quantity)) { using SqlCommand sqlCommand = new SqlCommand("UPDATE PartAvailability 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(); } } _ftpService.Delete(lastUploadedFile.Filename); return; } } }