< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.Transactions.ReturnToSupplierTransactionController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Transactions/ReturnToSupplierTransactionController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 110
Coverable lines: 110
Total lines: 229
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 46
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
GetTransactionConfig()100%210%
CreateReturnToSupplierTransaction()0%342180%
CreateReturnToSupplierTransaction(...)0%620%
CreateReturnToSupplierTransactionWithWarehouseValidation()0%930300%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Transactions/ReturnToSupplierTransactionController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc;
 2using OzonDomains;
 3using OzonDomains.Models;
 4using OzonOrdersWeb.Areas.Studio2.Controllers.Base;
 5using OzonOrdersWeb.Areas.Studio2.Models.Transactions;
 6using OzonRepositories.Context;
 7using Services.BackgroundJobsServices;
 8using Services.ApiServices;
 9using Services.ApiServices._1CApi;
 10using Services.ApiServices.OzonApi;
 11using Services.Authorization.Services;
 12using Services.CacheServices.Cache.OzonOrdersCache;
 13using Services.CacheServices.Cache.UserCacheService;
 14using Services.DataServices;
 15using OzonOrdersWeb.WebServices.Currency;
 16using Services.TransactionUtilsServices;
 17using Services.CacheServices.Cache;
 18
 19namespace OzonOrdersWeb.Areas.Studio2.Controllers.Transactions;
 20
 21/// <summary>
 22/// Контроллер транзакции "Возвращено поставщику"
 23/// </summary>
 24public class ReturnToSupplierTransactionController : BaseTransactionController
 25{
 26    private readonly WarehouseSelectionResolver _warehouseSelectionResolver;
 27    private readonly OneCReceiptWarehouseHistoryResolver _receiptWarehouseHistoryResolver;
 28
 29    public ReturnToSupplierTransactionController(
 30        ApplicationDbContext context,
 31        AppStatusDataServices appStatusServices,
 32        OrdersDataServices orderServices,
 33        TransactionManager transactionManager,
 34        TransactionCache transactionCache,
 35        SupplierDataServices supplierDataServices,
 36        IUserCacheService userCacheService,
 37        ICurrencyRatesViewBagService currencyRatesViewBagService,
 38        CacheUpdater<Order> cacheUpdater,
 39        OrderCache orderCache,
 40        WarehouseDataServices warehouseDataServices,
 41        ExpenseTypeDataServices expenseTypeDataServices,
 42        OrderExtraExpenseDataServices orderExtraExpenseDataServices,
 43        OneCDataManager oneCDataManager,
 44        OneCTransferManager oneCTransferManager,
 45        StatusTransitionDataServices statusTransitionDataServices,
 46        IScopeFilterValuesService scopeFilterValuesService,
 47        WarehouseSelectionResolver warehouseSelectionResolver,
 48        OneCReceiptWarehouseHistoryResolver receiptWarehouseHistoryResolver,
 49        OzonOrderCancellationService? ozonCancellationService = null)
 050        : base(context, appStatusServices, orderServices, transactionManager, transactionCache,
 051               supplierDataServices, userCacheService, currencyRatesViewBagService, cacheUpdater, orderCache,
 052               oneCDataManager, warehouseDataServices, bitrixStockRepository: null, proxyHttpClientService: null,
 053               oneCTransferManager, orderCartServices: null, warehouseMappingDataServices: null,
 054               expenseTypeDataServices, orderExtraExpenseDataServices, statusTransitionDataServices,
 055               scopeFilterValuesService, ozonCancellationService: ozonCancellationService)
 56    {
 057        _warehouseSelectionResolver = warehouseSelectionResolver;
 058        _receiptWarehouseHistoryResolver = receiptWarehouseHistoryResolver;
 059    }
 60
 061    protected override TransactionConfig GetTransactionConfig() => new()
 062    {
 063        TransactionType = TransactionType.ReturnToSupplier,
 064        PrimaryStatusName = "Возвращено поставщику",
 065        ViewName = "CreateReturnToSupplierTransaction",
 066        RequiredSourceStatuses = new List<string> { "Заказан поставщику", "ПринятНаСкладе", "Возврат поставщику", "Возвр
 067        IncludeCancelledOrders = true,
 068        SupportsOzonCancelPanel = true,
 069        LoadWarehouseListForSelector = true,
 070        UseCustomWarehousesFor1C = true,
 071        CheckStockBefore1C = true,
 072        CreateTransactionMethod = (tm, orders, userName, createAt, comment) =>
 073            tm.CreateReturnToSupplierTransaction(orders, userName, createAt, comment)
 074    };
 75
 76    public async Task<IActionResult> CreateReturnToSupplierTransaction(string ids, int page)
 77    {
 078        var result = await CreateTransactionBase(ids, page);
 079        if (result is not ViewResult { Model: OzonOrdersWeb.ViewModels.OrderViewModels.MultiplayEditOrderViewModel viewM
 080            viewModel.Orders.Count == 0)
 81        {
 082            return result;
 83        }
 84
 085        var senderResolution = await _warehouseSelectionResolver
 086            .ResolveCustomerReturnRecipientByOrderAsync(viewModel.Orders);
 87
 88        // Ошибка автоподстановки не блокирует ручной выбор: пользователь может указать склад сам.
 089        if (senderResolution.HasBlockingErrors)
 090            ViewData["ReturnSupplierSenderRuleInfo"] = string.Join(" ", senderResolution.BlockingErrors);
 91
 092        ViewData["ReturnSupplierSenderByOrder"] = senderResolution.RecipientByOrderId;
 093        ViewData["ReturnSupplierSenderExplanationByOrder"] = senderResolution.RecipientExplanationByOrderId;
 094        ViewData["ReturnSupplierSenderReturnWarehouseOrderIds"] = senderResolution.ReturnWarehouseOrderIds;
 095        ViewData["ReturnSupplierZasylOptionsByOrderId"] = await _warehouseSelectionResolver
 096            .BuildCustomerReturnZasylOptionsAsync(viewModel.Orders, viewModel.Warehouses.Select(warehouse => warehouse.N
 97
 098        var receiptHistoryByArticle = await _receiptWarehouseHistoryResolver.ResolveByArticlesAsync(
 099            viewModel.Orders.Select(order => order.Article),
 0100            viewModel.Warehouses.Select(warehouse => warehouse.Name));
 0101        var recipientHistoryByOrder = new Dictionary<int, IReadOnlyList<OneCReceiptWarehouseSuggestion>>();
 0102        var recipientByOrder = new Dictionary<int, string>();
 0103        var recipientExplanationByOrder = new Dictionary<int, string>();
 104
 0105        foreach (var order in viewModel.Orders)
 106        {
 0107            var article = order.Article?.Trim();
 0108            var history = !string.IsNullOrWhiteSpace(article) && receiptHistoryByArticle.TryGetValue(article, out var fo
 0109                ? foundHistory
 0110                : [];
 0111            recipientHistoryByOrder[order.Id] = history;
 112
 0113            if (history.FirstOrDefault() is { } latestReceipt)
 114            {
 0115                recipientByOrder[order.Id] = latestReceipt.Warehouse;
 0116                recipientExplanationByOrder[order.Id] =
 0117                    $"Последний проведённый приход: {latestReceipt.Warehouse}, {latestReceipt.Date:dd.MM.yyyy}, №{latest
 118            }
 119            else
 120            {
 0121                recipientExplanationByOrder[order.Id] =
 0122                    "Проведённых приходов по товару на доступные склады 1С не найдено — выберите склад получателя вручну
 123            }
 124        }
 125
 0126        ViewData["ReturnSupplierRecipientByOrder"] = recipientByOrder;
 0127        ViewData["ReturnSupplierRecipientHistoryByOrder"] = recipientHistoryByOrder;
 0128        ViewData["ReturnSupplierRecipientExplanationByOrder"] = recipientExplanationByOrder;
 0129        return result;
 0130    }
 131
 132    [HttpPost]
 133    [ValidateAntiForgeryToken]
 134    public Task<IActionResult> CreateReturnToSupplierTransaction(
 135        List<Order> orders,
 136        string userName,
 137        string? comment,
 138        int page,
 139        string? deletedOrders,
 140        Dictionary<int, string?>? orderSupplierMap,
 141        bool processIn1C = false,
 142        string? warehouseSender = null,
 143        string? warehouseRecipient = null,
 144        Dictionary<int, string>? senderWarehouseByOrder = null,
 145        Dictionary<int, string>? recipientWarehouseByOrder = null)
 146    {
 0147        if (!processIn1C)
 0148            return CreateTransactionPostBase(orders, userName, comment, page, deletedOrders, orderSupplierMap);
 149
 0150        return CreateReturnToSupplierTransactionWithWarehouseValidation(
 0151            orders, userName, comment, page, deletedOrders, orderSupplierMap,
 0152            senderWarehouseByOrder, recipientWarehouseByOrder);
 153    }
 154
 155    private async Task<IActionResult> CreateReturnToSupplierTransactionWithWarehouseValidation(
 156        List<Order> orders,
 157        string userName,
 158        string? comment,
 159        int page,
 160        string? deletedOrders,
 161        Dictionary<int, string?>? orderSupplierMap,
 162        Dictionary<int, string>? senderWarehouseByOrder,
 163        Dictionary<int, string>? recipientWarehouseByOrder)
 164    {
 165        try
 166        {
 0167            var candidateOrders = orders ?? [];
 0168            if (!string.IsNullOrWhiteSpace(deletedOrders))
 169            {
 0170                var deletedOrderIds = DeletedOrderIds.Parse(deletedOrders);
 0171                candidateOrders = candidateOrders.Where(o => !deletedOrderIds.Contains(o.Id)).ToList();
 172            }
 173
 0174            var oneCDataManager = OneCDataManager ?? throw new TransactionException(
 0175                TransactionErrorCode.OneCUnavailable, "Интеграция с 1С недоступна.");
 0176            var availableWarehouses = (await oneCDataManager.GetWarehouseListAsync())
 0177                .Select(w => w.Name)
 0178                .Where(name => !string.IsNullOrWhiteSpace(name))
 0179                .Select(name => name!)
 0180                .OrderBy(name => name)
 0181                .ToList();
 0182            availableWarehouses = await FilterBitrixWarehouseNamesByScope(availableWarehouses);
 183
 0184            var senders = senderWarehouseByOrder ?? [];
 0185            var recipients = recipientWarehouseByOrder ?? [];
 0186            var candidateOrderIds = candidateOrders.Select(o => o.Id).ToHashSet();
 0187            if (senders.Keys.Any(id => !candidateOrderIds.Contains(id)) ||
 0188                recipients.Keys.Any(id => !candidateOrderIds.Contains(id)))
 189            {
 0190                throw new TransactionException(TransactionErrorCode.OneCSenderWarehouseMissing,
 0191                    "Переданы некорректные данные по маршрутам складов.");
 192            }
 193
 0194            foreach (var order in candidateOrders)
 195            {
 0196                if (!senders.TryGetValue(order.Id, out var sender) || string.IsNullOrWhiteSpace(sender))
 0197                    throw new TransactionException(TransactionErrorCode.OneCSenderWarehouseMissing,
 0198                        $"Не указан склад отправителя для заказа {order.ShipmentNumber}.");
 0199                if (!recipients.TryGetValue(order.Id, out var recipient) || string.IsNullOrWhiteSpace(recipient))
 0200                    throw new TransactionException(TransactionErrorCode.OneCRecipientWarehouseMissing,
 0201                        $"Не указан склад получателя для заказа {order.ShipmentNumber}.");
 0202                if (!availableWarehouses.Contains(sender.Trim(), StringComparer.OrdinalIgnoreCase) ||
 0203                    !availableWarehouses.Contains(recipient.Trim(), StringComparer.OrdinalIgnoreCase))
 204                {
 0205                    throw new TransactionException(TransactionErrorCode.OneCSenderWarehouseMissing,
 0206                        $"Склад маршрута для заказа {order.ShipmentNumber} недоступен в списке складов 1С или по текущим
 207                }
 0208                if (string.Equals(sender.Trim(), recipient.Trim(), StringComparison.OrdinalIgnoreCase))
 0209                    throw new TransactionException(TransactionErrorCode.OneCWarehousesMustDiffer,
 0210                        $"Склад отправителя и получателя не могут совпадать (заказ {order.ShipmentNumber}).");
 211            }
 212
 0213            var normalizedSenders = senders.ToDictionary(pair => pair.Key, pair => pair.Value.Trim());
 0214            var normalizedRecipients = recipients.ToDictionary(pair => pair.Key, pair => pair.Value.Trim());
 215
 0216            return await CreateTransactionPostBase(
 0217                candidateOrders, userName, comment, page, string.Empty, orderSupplierMap,
 0218                processIn1C: true,
 0219                recipientWarehouseByOrder: normalizedRecipients,
 0220                senderWarehouseByOrder: normalizedSenders);
 221        }
 0222        catch (TransactionException ex)
 223        {
 0224            TempData["TransactionErrorCode"] = ex.Code.ToString();
 0225            TempData["ErorrResult"] = ex.Message;
 0226            return Json(new { redirectTo = Url.Action("Index", "Orders", new { sortOrder = GetSortStateCookie(), page })
 227        }
 0228    }
 229}

Methods/Properties

.ctor(OzonRepositories.Context.ApplicationDbContext,Services.DataServices.AppStatusDataServices,Services.DataServices.OrdersDataServices,Services.TransactionUtilsServices.TransactionManager,Services.CacheServices.Cache.OzonOrdersCache.TransactionCache,Services.DataServices.SupplierDataServices,Services.CacheServices.Cache.UserCacheService.IUserCacheService,OzonOrdersWeb.WebServices.Currency.ICurrencyRatesViewBagService,Services.CacheServices.Cache.CacheUpdater`1<OzonDomains.Models.Order>,Services.CacheServices.Cache.OzonOrdersCache.OrderCache,Services.DataServices.WarehouseDataServices,Services.DataServices.ExpenseTypeDataServices,Services.DataServices.OrderExtraExpenseDataServices,Services.ApiServices.OneCDataManager,Services.ApiServices._1CApi.OneCTransferManager,Services.DataServices.StatusTransitionDataServices,Services.Authorization.Services.IScopeFilterValuesService,Services.BackgroundJobsServices.WarehouseSelectionResolver,Services.ApiServices._1CApi.OneCReceiptWarehouseHistoryResolver,Services.ApiServices.OzonApi.OzonOrderCancellationService)
GetTransactionConfig()
CreateReturnToSupplierTransaction()
CreateReturnToSupplierTransaction(System.Collections.Generic.List`1<OzonDomains.Models.Order>,System.String,System.String,System.Int32,System.String,System.Collections.Generic.Dictionary`2<System.Int32,System.String>,System.Boolean,System.String,System.String,System.Collections.Generic.Dictionary`2<System.Int32,System.String>,System.Collections.Generic.Dictionary`2<System.Int32,System.String>)
CreateReturnToSupplierTransactionWithWarehouseValidation()