using AutoMapper; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using System.Data; using SytelineSaAppEfDataModel.Dtos; using SytelineSaAppEfDataModel.Entities; namespace SytelineSaAppEfDataModel.Services { public class EdiCustomerOrderService(SytelineSaAppDbContext context, IMapper mapper) : IEdiCustomerOrderService { public async Task GetLastOrderNumber() { var lastOrderNumber = (await context.EdiCustomerOrders.OrderByDescending(x => x.CustomerOrderNumber).FirstOrDefaultAsync()) ?.CustomerOrderNumber[3..] ?? "0"; return int.Parse(lastOrderNumber); } public async Task> GetAll() { IList ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates .Select(x => mapper.Map(x)).ToListAsync(); IList ediCustomerOrders = await context.EdiCustomerOrders.Select(x => mapper.Map(x)).ToListAsync(); IDictionary> ediTranslatesByCoNumber = ediCustomerOrderTranslates .GroupBy(x => x.EdiCoCoNum).ToDictionary(x => x.Key, y => y.ToList()); foreach (EdiCustomerOrderDto ediCustomerOrder in ediCustomerOrders) { if (!ediTranslatesByCoNumber.TryGetValue(ediCustomerOrder.CustomerOrderNumber, out List? customerOrderTranslates)) continue; customerOrderTranslates = customerOrderTranslates.OrderByDescending(x => x.CreatedDate).ToList(); ediCustomerOrder.EdiCustomerOrderTranslates = customerOrderTranslates; } return ediCustomerOrders; } public async Task> GetByDate(DateTime date) { IList customerOrders = new List(); IList orderNumbers = await context.EdiCustomerOrders.Where(x => x.CreateDate > date) .Select(x => x.RowPointer).ToListAsync(); foreach (Guid orderNumber in orderNumbers) { customerOrders.Add(await GetByOrderNumber(orderNumber)); } return customerOrders; } public async Task GetByOrderNumber(Guid customerOrderNumber) { EdiCustomerOrderDto ediCustomerOrder = mapper.Map( await context.EdiCustomerOrders.FirstOrDefaultAsync(x => x.RowPointer == customerOrderNumber)); if (ediCustomerOrder == null) { return null; } IList ediCustomerOrderLines = await context.EdiCustomerOrderLines .Where(x => x.CustomerOrderNumber == ediCustomerOrder.CustomerOrderNumber) .Select(x => mapper.Map(x)).ToListAsync(); foreach (EdiCustomerOrderLineDto ediCustomerOrderLine in ediCustomerOrderLines) { ediCustomerOrderLine.EdiCustomerOrderLineItems = await context.EdiCustomerOrderLineItems .Where(x => x.CustomerOrderNumber == ediCustomerOrder.CustomerOrderNumber && x.CustomerOrderLine == ediCustomerOrderLine.CustomerOrderLine) .Select(x => mapper.Map(x)).ToListAsync(); } IList ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates .Where(x => x.EdiCoCoNum == ediCustomerOrder.CustomerOrderNumber) .Select(x => mapper.Map(x)).ToListAsync(); ediCustomerOrder.EdiCustomerOrderLines = ediCustomerOrderLines; ediCustomerOrder.EdiCustomerOrderTranslates = ediCustomerOrderTranslates; return ediCustomerOrder; } public async Task> FindMissingOrders(DateTime startDate) { IList ediCustomerOrderTranslates = await context.EdiCustomerOrderTranslates .Where(x => x.CreatedDate >= startDate).ToListAsync(); var ediOrderNumbers = ediCustomerOrderTranslates.Select(x => x.EdiCoCoNum).ToList(); var ediOrderNumbersFromEdiCo = (await context.EdiCustomerOrders.ToListAsync()) .Where(x => ediOrderNumbers.Contains(x.CustomerOrderNumber)).Select(x => x.CustomerOrderNumber) .ToList(); ISet missingNumbers = ediOrderNumbers.Except(ediOrderNumbersFromEdiCo).ToHashSet(); IEnumerable missingOrders = (await context.EdiCustomerOrderTranslates.ToListAsync()) .Where(x => missingNumbers.Contains(x.EdiCoCoNum)).Select(mapper.Map); return missingOrders; } public async Task SendOrderToSyteline(Guid customerOrderNumber) { EdiCustomerOrder? ediCustomerOrder = await context.EdiCustomerOrders.FirstOrDefaultAsync(x => x.RowPointer == customerOrderNumber); if (ediCustomerOrder == null) return 0; var ediCoNum = new SqlParameter("@PEdiCoNum", SqlDbType.NVarChar, 50) { Value = ediCustomerOrder.CustomerOrderNumber }; var ediCoCount = new SqlParameter("@PEdiCoCount", SqlDbType.Int) { Value = 0, Direction = ParameterDirection.Output }; var postedCount = new SqlParameter("@PPostedCount", SqlDbType.Int) { Value = 0, Direction = ParameterDirection.Output }; var infoBar = new SqlParameter("@Infobar", SqlDbType.NVarChar, 2800) { Value = "", Direction = ParameterDirection.Output }; var autoPost = new SqlParameter("@AutoPost", SqlDbType.Int) { Value = 0 }; var processId = new SqlParameter("@ProcessId", SqlDbType.Int) { Value = 423456 }; await context.Database.ExecuteSqlRawAsync( "EXEC [dbo].[FKR_EDI_EXTGEN_EdiInOrderPSp] @PEdiCoNum, @PEdiCoCount OUT, @PPostedCount OUT, @Infobar OUT, @AutoPost, @ProcessId", ediCoNum, ediCoCount, postedCount, infoBar, autoPost, processId); string? infoBarResult = infoBar.Value?.ToString(); int ediCoCountResult = Convert.ToInt32(ediCoCount.Value); int postedCountResult = Convert.ToInt32(postedCount.Value); Console.WriteLine($"EDI Co Num: {infoBarResult}"); Console.WriteLine($"EDI Co Count: {ediCoCountResult}"); Console.WriteLine($"Posted Count: {postedCountResult}"); return postedCountResult; } public async Task<(bool, string)> SaveOrdersWithDetails(List ediCustomerOrders) { if (ediCustomerOrders.Count == 0) { return (false, string.Empty); } try { IList customerOrders = ediCustomerOrders.Select(mapper.Map).ToList(); IList ediCustomerOrderLines = ediCustomerOrders .SelectMany(x => x.EdiCustomerOrderLines).Select(mapper.Map).ToList(); IList ediCustomerOrderLineItems = ediCustomerOrders .SelectMany(x => x.EdiCustomerOrderLines).SelectMany(y => y.EdiCustomerOrderLineItems) .Select(mapper.Map).ToList(); await context.EdiCustomerOrders.AddRangeAsync(customerOrders); await context.EdiCustomerOrderLines.AddRangeAsync(ediCustomerOrderLines); await context.EdiCustomerOrderLineItems.AddRangeAsync(ediCustomerOrderLineItems); await context.EdiCustomerOrderTranslates.AddRangeAsync(ediCustomerOrders .SelectMany(x => x.EdiCustomerOrderTranslates) .Select(mapper.Map)); await context.SaveChangesAsync(); return (true, string.Empty); } catch (Exception ex) { return (false, ex.Message); } } } }