< Summary

Information
Class: Services.DataServices.OrderCartServices
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/DataServices/OrderCartServices.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 80
Coverable lines: 80
Total lines: 161
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 24
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%210%
.ctor(...)100%210%
CreateCartItem()0%342180%
ProcessMaxiPartsOrderAsync()0%4260%
GetCartItemStatuses()100%210%
GetStatusColors()100%210%
UpdateStatusColor(...)100%210%
SaveChanges()100%210%
ResetStatusColor(...)100%210%
DeleteByOrder()100%210%
DeleteByOrderIds()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/DataServices/OrderCartServices.cs

#LineLine coverage
 1using OzonDomains;
 2using OzonDomains.Models;
 3using OzonDomains.Models.OrderCarts;
 4using OzonDomains.Models.OrderCarts.Cart;
 5using OzonRepositories.Data;
 6using Services.Builders;
 7using Services.CacheServices.Cache.OrderSummaryCache;
 8using Services.SignalRServices;
 9
 10namespace Services.DataServices;
 11
 12public class OrderCartServices : IDataServices
 13{
 14    private readonly OrderCartRepository _orderCartRepository;
 15    private readonly OrdersDataServices _ordersDataServices;
 16    private readonly OrderItemRepository _orderItemRepository;
 17    private readonly IOrderSummaryCache _orderSummaryCache;
 18
 19
 020    public static readonly Dictionary<string, string> Statuses = new()
 021    {
 022        { "MakeOrderError", "Заказ не создан" },
 023        { "MakeOrderProgress", "Заказ в стадии оформления" }
 024    };
 25
 026    public OrderCartServices(OrderCartRepository orderCartRepository,
 027        OrdersDataServices ordersDataServices,
 028        OrderItemRepository orderItemRepository,
 029        IOrderSummaryCache orderSummaryCache)
 30    {
 031        _orderCartRepository = orderCartRepository;
 032        _ordersDataServices = ordersDataServices;
 033        _orderItemRepository = orderItemRepository;
 034        _orderSummaryCache = orderSummaryCache;
 035    }
 36
 37    public async Task<List<int>> CreateCartItem(List<StockItem>? selectedStocks)
 38    {
 039        if (selectedStocks == null || selectedStocks.Count == 0)
 040            return new List<int>();
 41
 042        List<OrderItem> orderItems = new List<OrderItem>();
 043        var ordersToUpdate = new List<Order>();
 44
 045        foreach (var item in selectedStocks)
 46        {
 047            var orderToCart = await _ordersDataServices.GetOrder(item.OrderId);
 048            if (orderToCart == null)
 49                continue;
 50
 051            OrderItem newOrderItem = new OrderItem()
 052            {
 053                ItemId = item.StokId ?? "",
 054                Quantity = orderToCart.Quantity ?? 0,
 055                StudioOrderId = orderToCart.Id,
 056                StudioOrder = orderToCart,
 057                ItemStatus = new ItemStatus()
 058                {
 059                    Name = "Добавлен в корзину"
 060                }
 061            };
 062            orderItems.Add(newOrderItem);
 063            ordersToUpdate.Add(orderToCart);
 064        }
 65
 066        OrderCart newCart = new OrderCart()
 067        {
 068            Provider = "maxi_parts",
 069            OrderItems = orderItems,
 070            CartStatus = new CartStatus()
 071            {
 072                Name = "Новый элемент"
 073            }
 074        };
 75
 076        var result = await _orderCartRepository.Add(newCart);
 77
 078        foreach (var order in ordersToUpdate)
 79        {
 080            var correspondingItem = orderItems.FirstOrDefault(oi => oi.StudioOrderId == order.Id);
 081            if (correspondingItem != null)
 82            {
 083                order.CartItemId = correspondingItem.Id;
 84            }
 85        }
 86
 087        await _ordersDataServices.SaveChanges();
 088        var failedOrderIds = await ProcessMaxiPartsOrderAsync(newCart.OrderItems.ToList(), newCart.Id);
 89
 090        foreach (var failedId in failedOrderIds)
 91        {
 092            var failedItem = newCart.OrderItems.FirstOrDefault(oi => oi.StudioOrderId == failedId);
 093            if (failedItem != null)
 94            {
 095                await _orderItemRepository.Delete(failedItem);
 96            }
 97        }
 98
 099        return failedOrderIds;
 0100    }
 101
 102    public async Task<List<int>> ProcessMaxiPartsOrderAsync(List<OrderItem> cartItems, int newCartId)
 103    {
 0104        var summaryBuilder = new OrderSummaryTableBuilder();
 0105        var failedOrderIds = new List<int>();
 106        const string reason = "Интеграция MaxiParts/Tradesoft отключена";
 0107        foreach (var item in cartItems)
 108        {
 0109            if (item.StudioOrder == null)
 110                continue;
 111
 0112            string shipmentNumber = item.StudioOrder.ShipmentNumber ?? "N/A";
 0113            summaryBuilder.AddRow(shipmentNumber, false, reason);
 0114            failedOrderIds.Add(item.StudioOrder.Id);
 115        }
 116
 0117        var htmlTable = summaryBuilder.Build();
 0118        await NotificationService.NotifyAllAsync(htmlTable);
 0119        _orderSummaryCache.Set(cartId: newCartId, htmlTable);
 120
 0121        return failedOrderIds;
 0122    }
 123
 124    public List<ItemStatus> GetCartItemStatuses()
 125    {
 0126        return _orderItemRepository.GetCartItemStatuses();
 127    }
 128
 129    public List<StatusColor> GetStatusColors()
 130    {
 0131        return _orderItemRepository.GetStatusColors();
 132    }
 133
 134    public void UpdateStatusColor(int statusId, string colorCode)
 135    {
 0136        _orderItemRepository.UpdateStatusColor(statusId, colorCode);
 0137    }
 138
 139    public Task<int> SaveChanges()
 140    {
 0141        throw new NotImplementedException();
 142    }
 143
 144    public void ResetStatusColor(int statusId)
 145    {
 0146        _orderItemRepository.ResetStatusColor(statusId);
 0147    }
 148
 149    public async Task<int> DeleteByOrder(int orderId)
 150    {
 0151        return await _orderCartRepository.DeleteByOrder(orderId);
 0152    }
 153
 154    /// <summary>
 155    /// Удаляет элементы корзины для нескольких заказов одним запросом (ускорение страницы транзакций).
 156    /// </summary>
 157    public async Task<int> DeleteByOrderIds(int[] orderIds)
 158    {
 0159        return await _orderCartRepository.DeleteByOrderIds(orderIds);
 0160    }
 161}