using AyCode.Core.Loggers; using AyCode.Services.SignalRs; using FruitBank.Common.Dtos; using FruitBank.Common.Entities; using FruitBank.Common.Interfaces; using FruitBank.Common.Server.Interfaces; using FruitBank.Common.Server.Services.SignalRs; using FruitBank.Common.SignalRs; using Mango.Nop.Core.Loggers; using Nop.Core; using Nop.Core.Domain.Orders; using Nop.Core.Events; using Nop.Plugin.Misc.FruitBankPlugin.Controllers; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; using Nop.Plugin.Misc.FruitBankPlugin.Services; using Nop.Services.Catalog; namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers; public class CustomOrderSignalREndpoint(FruitBankDbContext ctx, SignalRSendToClientService sendToClient, IPriceCalculationService customPriceCalculationService,IEventPublisher eventPublisher, IWorkContext workContext, IEnumerable logWriters) : ICustomOrderSignalREndpointServer { private readonly ILogger _logger = new Logger(logWriters.ToArray()); [SignalR(SignalRTags.GetAllOrderDtos)] public async Task> GetAllOrderDtos() { return await ctx.OrderDtos.GetAll(true).ToListAsync(); } [SignalR(SignalRTags.GetOrderDtoById)] public async Task GetOrderDtoById(int orderId) { return await ctx.OrderDtos.GetByIdAsync(orderId, true); } [SignalR(SignalRTags.GetPendingOrderDtos)] public async Task> GetPendingOrderDtos() { return await ctx.OrderDtos.GetAllByOrderStatus(OrderStatus.Pending).ToListAsync(); } [SignalR(SignalRTags.GetPendingOrderDtosForMeasuring)] public async Task> GetPendingOrderDtosForMeasuring() { return await ctx.OrderDtos.GetAllForMeasuring().ToListAsync(); } [SignalR(SignalRTags.GetAllOrderDtoByIds)] public async Task> GetAllOrderDtoByIds(int[] orderIds) { return await ctx.OrderDtos.GetAllByIds(orderIds).ToListAsync(); } [SignalR(SignalRTags.GetAllOrderDtoByProductId)] public async Task> GetAllOrderDtoByProductId(int productId) { return await ctx.OrderDtos.GetAllByProductId(productId, true).ToListAsync(); } [SignalR(SignalRTags.GetOrderItemDtoById)] public async Task GetOrderItemDtoById(int orderItemId) { return await ctx.OrderItemDtos.GetByIdAsync(orderItemId, true); } [SignalR(SignalRTags.GetAllOrderItemDtos)] public async Task> GetAllOrderItemDtos() { return await ctx.OrderItemDtos.GetAll(true).ToListAsync(); } [SignalR(SignalRTags.GetAllOrderItemDtoByOrderId)] public async Task> GetAllOrderItemDtoByOrderId(int orderId) { return await ctx.OrderItemDtos.GetAllByOrderId(orderId, true).ToListAsync(); } [SignalR(SignalRTags.GetAllOrderItemDtoByProductId)] public async Task> GetAllOrderItemDtoByProductId(int productId) { return await ctx.OrderItemDtos.GetAllByProductId(productId, true).ToListAsync(); } [SignalR(SignalRTags.GetOrderItemPalletById)] public async Task GetOrderItemPalletById(int orderItemPalletId) { return await ctx.OrderItemPallets.GetByIdAsync(orderItemPalletId, true); } [SignalR(SignalRTags.GetAllOrderItemPallets)] public async Task> GetAllOrderItemPallets() { return await ctx.OrderItemPallets.GetAll(true).ToListAsync(); } [SignalR(SignalRTags.GetAllOrderItemPalletByOrderItemId)] public async Task> GetAllOrderItemPalletByOrderItemId(int orderItemId) { return await ctx.OrderItemPallets.GetAllByOrderItemId(orderItemId, true).ToListAsync(); } [SignalR(SignalRTags.GetAllOrderItemPalletByOrderId)] public async Task> GetAllOrderItemPalletByOrderId(int orderId) { return await ctx.OrderItemPallets.GetAllByOrderId(orderId).ToListAsync(); } [SignalR(SignalRTags.GetAllOrderItemPalletByProductId)] public async Task> GetAllOrderItemPalletByProductId(int productId) { return await ctx.OrderItemPallets.GetAllByProductId(productId).ToListAsync(); } [SignalR(SignalRTags.StartMeasuring, SignalRTags.SendOrderChanged, SendToClientType.Others)] public async Task StartMeasuring(int orderId, int userId) { _logger.Detail($"StartMeasuring invoked; orderId: {orderId}; userId: {userId}"); if (!await ctx.StartMeasuringSafeAsync(orderId, userId)) return null; return await ctx.OrderDtos.GetByIdAsync(orderId, true); } [SignalR(SignalRTags.SetOrderStatusToComplete, SignalRTags.SendOrderChanged, SendToClientType.Others)] public async Task SetOrderStatusToComplete(int orderId, int revisorId) { _logger.Detail($"SetOrderStatusToComplete invoked; orderId: {orderId}; revisorId: {revisorId}"); //TODO: Ez egész nagyon kusza, átgondolni és refaktorálni! - J. var order = ctx.Orders.GetById(orderId); var prevOrderStatus = order.OrderStatus; if (order.OrderStatus == OrderStatus.Complete || !await ctx.SetOrderStatusToCompleteSafeAsync(orderId, revisorId)) return null; order.OrderStatus = OrderStatus.Complete; await ((CustomPriceCalculationService)customPriceCalculationService).CheckAndUpdateOrderTotalPrice(order); if (prevOrderStatus != order.OrderStatus) await eventPublisher.PublishAsync(new OrderStatusChangedEvent(order, prevOrderStatus)); return await ctx.OrderDtos.GetByIdAsync(orderId, true); } [SignalR(SignalRTags.AddOrUpdateMeasuredOrderItemPallet, SignalRTags.SendOrderItemPalletChanged, SendToClientType.Others)] public async Task AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet) { ArgumentNullException.ThrowIfNull(orderItemPallet); _logger.Detail($"AddOrUpdateMeasuredOrderItemPallet invoked; {orderItemPallet}"); if (!await ctx.AddOrUpdateOrderItemPalletSafeAsync(orderItemPallet)) return null; var isMeasurable = orderItemPallet.GrossWeight > 0; if (isMeasurable) { var orderItemDto = await ctx.OrderItemDtos.GetByIdAsync(orderItemPallet.OrderItemId, true); if (orderItemDto.IsAudited && orderItemDto.IsMeasurable) { var orderItem = ctx.OrderItems.GetById(orderItemDto.Id); await ((CustomPriceCalculationService)customPriceCalculationService).CheckAndUpdateOrderItemFinalPricesAsync (orderItem, orderItemDto.IsMeasurable, orderItemDto.NetWeight); } } return await ctx.OrderItemPallets.GetByIdAsync(orderItemPallet.Id, false); } //[SignalR(SignalRTags.AddOrderItemPallet)] //public async Task AddOrderItemPallet(OrderItemPallet orderItemPallet) //{ // ArgumentNullException.ThrowIfNull(orderItemPallet); // _logger.Detail($"AddOrderItemPallet invoked; {orderItemPallet}"); // if (!await ctx.AddOrderItemPalletSafeAsync(orderItemPallet)) return null; // return await ctx.OrderItemPallets.GetByIdAsync(orderItemPallet.Id, false); //} //[SignalR(SignalRTags.UpdateOrderItemPallet)] //public async Task UpdateOrderItemPallet(OrderItemPallet orderItemPallet) //{ // ArgumentNullException.ThrowIfNull(orderItemPallet); // _logger.Detail($"UpdateOrderItemPallet invoked; {orderItemPallet}"); // if (!await ctx.UpdateOrderItemPalletSafeAsync(orderItemPallet)) return null; // return await ctx.OrderItemPallets.GetByIdAsync(orderItemPallet.Id, false); //} //[SignalR(SignalRTags.AddOrUpdateMeasuredOrderItemPallets)] //public async Task AddOrUpdateMeasuredOrderItemPallets(List orderItemPallets) //{ // // ArgumentNullException.ThrowIfNull(orderItemPallets); // // _logger.Detail($"AddOrUpdateMeasuredOrderItemPallets invoked; count: {orderItemPallets.Count}"); // // if (orderItemPallets.Count == 0) return null; // // var shippingItemId = orderItemPallets.FirstOrDefault()!.ShippingItemId; // // if (shippingItemId <= 0 || orderItemPallets.Any(x => x.ShippingItemId != shippingItemId)) return null; // // var shippingItem = await ctx.ShippingItems.GetByIdAsync(shippingItemId, false); // // shippingItem.orderItemPallets = orderItemPallets.Where(sip => sip.IsValidMeasuringValues(shippingItem.IsMeasurable)).ToList(); // // return await UpdateMeasuredShippingItem(shippingItem); // return null; //} //[SignalR(SignalRTags.AddOrUpdateMeasuredOrderItemPallet)] //public async Task AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet) //{ // ArgumentNullException.ThrowIfNull(orderItemPallet); // _logger.Detail($"AddOrUpdateMeasuredOrderItemPallet invoked; {orderItemPallet}"); // if (!await ctx.AddOrUpdateOrderItemPalletSafeAsync(orderItemPallet)) return null; // return await ctx.OrderItemPallets.GetByIdAsync(orderItemPallet.Id, false); //} }