< Summary

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

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

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

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc;
 2using Newtonsoft.Json;
 3using OServices.FiltersServices.FilterModels;
 4using OzonDomains;
 5using OzonDomains.Models;
 6using OzonOrdersWeb.Areas.Studio2.Controllers.Base;
 7using OzonOrdersWeb.Areas.Studio2.Models.Transactions;
 8using Services.BackgroundJobsServices;
 9using OzonOrdersWeb.ViewModels.OrderViewModels;
 10using OzonRepositories.Context;
 11using Services.ApiServices;
 12using Services.ApiServices._1CApi;
 13using Services.ApiServices.OzonApi;
 14using Services.Authorization.Services;
 15using Services.CacheServices.Cache.OzonOrdersCache;
 16using Services.CacheServices.Cache.UserCacheService;
 17using Services.DataServices;
 18using OzonOrdersWeb.WebServices.Currency;
 19using Services.TransactionUtilsServices;
 20using Services.CacheServices.Cache;
 21
 22namespace OzonOrdersWeb.Areas.Studio2.Controllers.Transactions;
 23
 24/// <summary>
 25/// Контроллер транзакции "Возврат покупателя"
 26/// </summary>
 27public class CustomerReturnTransactionController : BaseTransactionController
 28{
 29    private readonly WarehouseSelectionResolver _warehouseSelectionResolver;
 30
 31    public CustomerReturnTransactionController(
 32        ApplicationDbContext context,
 33        AppStatusDataServices appStatusServices,
 34        OrdersDataServices orderServices,
 35        TransactionManager transactionManager,
 36        TransactionCache transactionCache,
 37        SupplierDataServices supplierDataServices,
 38        IUserCacheService userCacheService,
 39        ICurrencyRatesViewBagService currencyRatesViewBagService,
 40        CacheUpdater<Order> cacheUpdater,
 41        OrderCache orderCache,
 42        WarehouseDataServices warehouseDataServices,
 43        ExpenseTypeDataServices expenseTypeDataServices,
 44        OrderExtraExpenseDataServices orderExtraExpenseDataServices,
 45        StatusTransitionDataServices statusTransitionDataServices,
 46        OneCDataManager oneCDataManager,
 47        OneCTransferManager oneCTransferManager,
 48        IScopeFilterValuesService scopeFilterValuesService,
 49        WarehouseSelectionResolver warehouseSelectionResolver,
 50        OzonOrderCancellationService? ozonCancellationService = null)
 051        : base(context, appStatusServices, orderServices, transactionManager, transactionCache,
 052               supplierDataServices, userCacheService, currencyRatesViewBagService, cacheUpdater, orderCache,
 053               warehouseDataServices: warehouseDataServices, expenseTypeDataServices: expenseTypeDataServices,
 054               orderExtraExpenseDataServices: orderExtraExpenseDataServices,
 055               statusTransitionDataServices: statusTransitionDataServices,
 056               oneCDataManager: oneCDataManager,
 057               oneCTransferManager: oneCTransferManager,
 058               scopeFilterValuesService: scopeFilterValuesService,
 059               ozonCancellationService: ozonCancellationService)
 60    {
 061        _warehouseSelectionResolver = warehouseSelectionResolver;
 062    }
 63
 64    protected override TransactionConfig GetTransactionConfig()
 65    {
 066        if (Request.HasFormContentType &&
 067            string.Equals(Request.Form["bulkFromFile"].FirstOrDefault(), "true", StringComparison.OrdinalIgnoreCase))
 68        {
 069            return GetCustomerReturnFromFileTransactionConfig();
 70        }
 71
 072        return GetStandardCustomerReturnTransactionConfig();
 73    }
 74
 075    private static TransactionConfig GetStandardCustomerReturnTransactionConfig() => new()
 076    {
 077        TransactionType = TransactionType.CustomerReturn,
 078        PrimaryStatusName = "Возврат покупателя",
 079        UseStatusTransitions = false,
 080        ViewName = "CreateCustomerReturnTransaction",
 081        IncludeCancelledOrders = true,
 082        SupportsOzonCancelPanel = true,
 083        LoadWarehouseListForSelector = true,
 084        UseCustomWarehousesFor1C = true,
 085        OrderFilter = order =>
 086            IsMarketplaceCancelled(order) ||
 087            order.AppStatus?.Name is "Отгружен клиенту" or "Отгружен комиссионеру" or "Отменен",
 088        CreateTransactionMethod = (tm, orders, userName, createAt, comment) =>
 089            tm.CreateCustomerReturnTransaction(orders, userName, createAt, comment)
 090    };
 91
 92    /// <summary>Массовый сценарий из отчёта UploadFile: без фильтра по статусу, без складов и без 1С.</summary>
 093    private static TransactionConfig GetCustomerReturnFromFileTransactionConfig() => new()
 094    {
 095        TransactionType = TransactionType.CustomerReturn,
 096        PrimaryStatusName = "Возврат покупателя",
 097        UseStatusTransitions = false,
 098        ViewName = "CreateCustomerReturnTransaction",
 099        IncludeCancelledOrders = true,
 0100        SupportsOzonCancelPanel = true,
 0101        LoadWarehouseListForSelector = false,
 0102        UseCustomWarehousesFor1C = false,
 0103        OrderFilter = _ => true,
 0104        SuccessMessageBuilder = (changeCount, cancelCount, dateTime, userName, comment, orders) =>
 0105        {
 0106            var numbers = orders
 0107                .Select(o => o.ShipmentNumber)
 0108                .Where(x => !string.IsNullOrWhiteSpace(x))
 0109                .Select(x => x!.Trim())
 0110                .Distinct(StringComparer.OrdinalIgnoreCase)
 0111                .ToList();
 0112
 0113            var ordersHtml = numbers.Count > 0
 0114                ? $"<div class='small mt-2'><strong>Проведённые заказы:</strong> {string.Join(", ", numbers)}</div>"
 0115                : "<div class='small mt-2 text-muted'>Проведённые заказы не определены.</div>";
 0116
 0117            return TransactionConfig.BuildStandardSuccessMessage(
 0118                changeCount,
 0119                cancelCount,
 0120                dateTime,
 0121                userName,
 0122                comment,
 0123                orders,
 0124                "Возврат покупателя",
 0125                additionalHtml: ordersHtml,
 0126                explicitOrderNumbers: numbers);
 0127        },
 0128        CreateTransactionMethod = (tm, orders, userName, createAt, comment) =>
 0129            tm.CreateCustomerReturnTransaction(orders, userName, createAt, comment)
 0130    };
 131
 132    private static bool IsMarketplaceCancelled(Order order)
 133    {
 0134        if (order == null)
 135        {
 0136            return false;
 137        }
 138
 0139        var status = (order.Status ?? string.Empty).Trim();
 0140        var clientStatus = (order.ClientStatus?.Name ?? string.Empty).Trim();
 141
 0142        bool cancelledInStatus =
 0143            status.Equals("Отменён", StringComparison.OrdinalIgnoreCase) ||
 0144            status.Equals("Отменен", StringComparison.OrdinalIgnoreCase);
 145
 0146        bool cancelledInClientStatus =
 0147            clientStatus.Equals("Отменён", StringComparison.OrdinalIgnoreCase) ||
 0148            clientStatus.Equals("Отменен", StringComparison.OrdinalIgnoreCase);
 149
 0150        return cancelledInStatus || cancelledInClientStatus;
 151    }
 152
 153    /// <summary>Возврат покупателя после загрузки отчёта (UploadFile): все заказы одним списком, только смена статуса.<
 154    public async Task<IActionResult> CreateCustomerReturnTransactionFromFile(string ids, int page)
 155    {
 0156        ViewData["CustomerReturnBulkFromFile"] = true;
 0157        var result = await CreateTransactionBase(ids, page, GetCustomerReturnFromFileTransactionConfig());
 0158        return ApplyAlreadyReturnedOrdersWarning(result);
 0159    }
 160
 161    public async Task<IActionResult> CreateCustomerReturnTransaction(string ids, int page)
 162    {
 0163        var result = await CreateTransactionBase(ids, page);
 0164        if (result is not ViewResult { Model: MultiplayEditOrderViewModel pageViewModel } || pageViewModel.Orders.Count 
 165        {
 0166            return result;
 167        }
 168
 0169        result = ApplyAlreadyReturnedOrdersWarning(result);
 0170        if (result is not ViewResult { Model: MultiplayEditOrderViewModel filteredModel } || filteredModel.Orders.Count 
 171        {
 0172            return result;
 173        }
 0174        pageViewModel = filteredModel;
 175
 0176        var isAdmin = User.IsInRole("Admin");
 0177        ViewData["WarehouseSelectorTitle"] = "Укажите склады для проведения возврата";
 0178        ViewData["ForceSenderWarehouse"] = !isAdmin;
 179
 0180        var bitrixWarehouseNames = (ViewData["BitrixWarehousesList"] as List<string>) ?? new List<string>();
 0181        var senderResolution = await _warehouseSelectionResolver.ResolveSenderWarehouseAsync(pageViewModel.Orders);
 0182        var warehouseBlockingErrors = new List<string>();
 183
 0184        if (!string.IsNullOrWhiteSpace(senderResolution.SenderWarehouseName))
 185        {
 0186            ViewData["FixedSenderWarehouse"] = senderResolution.SenderWarehouseName;
 0187            ViewData["PreferredSenderWarehouse"] = senderResolution.SenderWarehouseName;
 188
 0189            if (!bitrixWarehouseNames.Contains(senderResolution.SenderWarehouseName, StringComparer.OrdinalIgnoreCase) &
 190            {
 0191                warehouseBlockingErrors.Add(
 0192                    $"Склад отправителя '{senderResolution.SenderWarehouseName}', полученный из настроек клиента Ozon, н
 193            }
 194        }
 0195        else if (senderResolution.HasErrors && !isAdmin)
 196        {
 0197            warehouseBlockingErrors.AddRange(senderResolution.Errors);
 198        }
 199
 0200        var recipientByOrderResolution =
 0201            await _warehouseSelectionResolver.ResolveCustomerReturnRecipientByOrderAsync(pageViewModel.Orders);
 202        // Для CustomerReturn ошибки автоподстановки по заказам не блокируют форму:
 203        // пользователь может выбрать конечный склад вручную из доступного списка.
 0204        if (recipientByOrderResolution.HasBlockingErrors)
 205        {
 0206            ViewData["WarehouseRecipientRuleInfo"] = string.Join(" ", recipientByOrderResolution.BlockingErrors);
 207        }
 208
 0209        var preferredSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
 0210        if (recipientByOrderResolution.RecipientByOrderId.Count > 0)
 211        {
 0212            preferredSet = recipientByOrderResolution.RecipientByOrderId.Values.ToHashSet(StringComparer.OrdinalIgnoreCa
 0213            bitrixWarehouseNames = bitrixWarehouseNames
 0214                .OrderBy(n => preferredSet.Contains(n) ? 0 : 1)
 215                .ThenBy(n => n)
 0216                .ToList();
 217        }
 218
 0219        if (!isAdmin)
 220        {
 0221            if (senderResolution.HasErrors)
 222            {
 0223                ViewData["WarehouseSenderRuleError"] = string.Join("<br/>", senderResolution.Errors);
 224            }
 225
 0226            if (!string.IsNullOrWhiteSpace(senderResolution.SenderWarehouseName))
 227            {
 0228                bitrixWarehouseNames = bitrixWarehouseNames
 0229                    .Where(n => !string.Equals(n, senderResolution.SenderWarehouseName, StringComparison.OrdinalIgnoreCa
 230                    .OrderBy(n => n)
 0231                    .ToList();
 232            }
 233        }
 234
 0235        var preferredRecipient = bitrixWarehouseNames.FirstOrDefault(n => preferredSet.Contains(n));
 0236        if (!string.IsNullOrWhiteSpace(preferredRecipient))
 237        {
 0238            ViewData["PreferredRecipientWarehouse"] = preferredRecipient;
 239        }
 240
 0241        if (warehouseBlockingErrors.Count > 0)
 242        {
 0243            ViewData["WarehouseSelectionBlocked"] = true;
 0244            ViewData["WarehouseSenderRuleError"] = string.Join("<br/>",
 0245                warehouseBlockingErrors.Distinct(StringComparer.OrdinalIgnoreCase));
 246        }
 247
 0248        ViewData["BitrixWarehousesList"] = bitrixWarehouseNames;
 0249        ViewData["RecipientByOrder"] = recipientByOrderResolution.RecipientByOrderId;
 0250        ViewData["RecipientExplanationByOrder"] = recipientByOrderResolution.RecipientExplanationByOrderId;
 0251        ViewData["ReturnWarehouseOrderIds"] = recipientByOrderResolution.ReturnWarehouseOrderIds;
 0252        return result;
 0253    }
 254
 255    private IActionResult ApplyAlreadyReturnedOrdersWarning(IActionResult result)
 256    {
 0257        if (result is not ViewResult { Model: MultiplayEditOrderViewModel pageViewModel } || pageViewModel.Orders.Count 
 0258            return result;
 259
 0260        var alreadyReturned = pageViewModel.Orders
 0261            .Where(o => string.Equals(o.AppStatus?.Name, "Возврат покупателя", StringComparison.OrdinalIgnoreCase))
 0262            .ToList();
 0263        if (!alreadyReturned.Any())
 0264            return result;
 265
 0266        var alreadyReturnedIds = alreadyReturned.Select(o => o.Id).ToHashSet();
 0267        pageViewModel.Orders = pageViewModel.Orders
 0268            .Where(o => !alreadyReturnedIds.Contains(o.Id))
 0269            .ToList();
 270
 0271        var numbers = alreadyReturned
 0272            .Select(o => o.ShipmentNumber)
 0273            .Where(x => !string.IsNullOrWhiteSpace(x))
 0274            .Select(x => x!.Trim())
 0275            .Distinct(StringComparer.OrdinalIgnoreCase)
 0276            .ToList();
 277
 0278        if (numbers.Count > 0)
 279        {
 0280            ViewData["TransactionWarningMessage"] =
 0281                "<div class='alert alert-warning mb-2'><strong>Часть заказов пропущена</strong><br/>" +
 0282                "Уже находятся в статусе «Возврат покупателя» и не будут перепроведены.<br/>" +
 0283                $"Заказы: {string.Join(", ", numbers)}</div>";
 284        }
 285        else
 286        {
 0287            ViewData["TransactionWarningMessage"] =
 0288                "<div class='alert alert-warning mb-2'><strong>Часть заказов пропущена</strong><br/>" +
 0289                "Уже находятся в статусе «Возврат покупателя» и не будут перепроведены.</div>";
 290        }
 291
 0292        return result;
 293    }
 294
 295    [HttpPost]
 296    [ValidateAntiForgeryToken]
 297    public Task<IActionResult> CreateCustomerReturnTransaction(
 298        List<Order>? orders, string? userName, string? comment,
 299        int page, string? deletedOrders, Dictionary<int, string?>? orderSupplierMap,
 300        string? warehouseSender, string? warehouseRecipient, Dictionary<int, string>? recipientByOrder,
 301        bool processIn1C = false, bool bulkFromFile = false)
 302    {
 0303        if (bulkFromFile)
 304        {
 0305            processIn1C = false;
 306        }
 307
 0308        var safeOrders = orders ?? new List<Order>();
 0309        var safeUserName = userName ?? (User.Identity?.Name ?? "unknown");
 0310        var safeComment = comment ?? string.Empty;
 0311        var safeDeletedOrders = deletedOrders ?? string.Empty;
 0312        var safeOrderSupplierMap = orderSupplierMap ?? new Dictionary<int, string?>();
 313
 0314        if (!processIn1C)
 315        {
 0316            return CreateTransactionPostBase(
 0317                safeOrders, safeUserName, safeComment, page, safeDeletedOrders, safeOrderSupplierMap, false, null, null)
 318        }
 319
 0320        return CreateCustomerReturnTransactionWithWarehouseValidation(
 0321            safeOrders, safeUserName, safeComment, page, safeDeletedOrders, safeOrderSupplierMap, warehouseSender, wareh
 322    }
 323
 324    /// <summary>
 325    /// Упрощённый POST для сценария UploadFile (возвраты): только смена статуса без 1С/складов.
 326    /// </summary>
 327    [HttpPost]
 328    [ValidateAntiForgeryToken]
 329    public Task<IActionResult> CreateCustomerReturnTransactionFromFileStatusOnly(
 330        List<Order>? orders,
 331        string? userName,
 332        string? comment,
 333        int page,
 334        string? deletedOrders)
 335    {
 0336        var safeOrders = orders ?? new List<Order>();
 0337        var safeUserName = userName ?? (User.Identity?.Name ?? "unknown");
 0338        var safeComment = comment ?? string.Empty;
 0339        var safeDeletedOrders = deletedOrders ?? string.Empty;
 0340        var deletedIds = DeletedOrderIds.Parse(safeDeletedOrders);
 0341        var ordersForFilter = deletedIds.Count == 0
 0342            ? safeOrders
 0343            : safeOrders.Where(o => !deletedIds.Contains(o.Id)).ToList();
 344
 0345        ApplyShipmentFilterCookie(ordersForFilter);
 346
 0347        return CreateTransactionPostBase(
 0348            safeOrders,
 0349            safeUserName,
 0350            safeComment,
 0351            page,
 0352            safeDeletedOrders,
 0353            new Dictionary<int, string?>(),
 0354            processIn1C: false,
 0355            warehouseSender: null,
 0356            warehouseRecipient: null);
 357    }
 358
 359    private void ApplyShipmentFilterCookie(IEnumerable<Order>? orders)
 360    {
 0361        var shipmentNumbers = orders?
 0362            .Select(o => o.ShipmentNumber?.Trim())
 0363            .Where(n => !string.IsNullOrWhiteSpace(n))
 0364            .Select(n => n!)
 0365            .Distinct(StringComparer.OrdinalIgnoreCase)
 0366            .ToList() ?? new List<string>();
 367
 0368        var filterData = new OrderFilterModel
 0369        {
 0370            ShipmentNumber = shipmentNumbers.Any() ? string.Join(",", shipmentNumbers) : null,
 0371            GroupByShipment = true,
 0372            IncludeArchived = false,
 0373            SyncClientStatusesOnLoad = false,
 0374            OnlyWithZasyl = false
 0375        };
 376
 0377        Response.Cookies.Append("FilterData", JsonConvert.SerializeObject(filterData));
 0378    }
 379
 380    private async Task<IActionResult> CreateCustomerReturnTransactionWithWarehouseValidation(
 381        List<Order> orders,
 382        string userName,
 383        string? comment,
 384        int page,
 385        string? deletedOrders,
 386        Dictionary<int, string?>? orderSupplierMap,
 387        string? warehouseSender,
 388        string? warehouseRecipient,
 389        Dictionary<int, string>? recipientByOrder)
 390    {
 391        try
 392        {
 0393            if (OneCDataManager == null)
 0394                throw new TransactionException(TransactionErrorCode.OneCUnavailable, "Интеграция с 1С недоступна.");
 395
 0396            var candidateOrders = orders ?? new List<Order>();
 0397            if (!string.IsNullOrWhiteSpace(deletedOrders))
 398            {
 0399                var deletedOrderIds = DeletedOrderIds.Parse(deletedOrders);
 0400                candidateOrders = candidateOrders.Where(o => !deletedOrderIds.Contains(o.Id)).ToList();
 401            }
 402
 0403            var bitrixWarehouses = await OneCDataManager.GetWarehouseListAsync();
 0404            var bitrixWarehouseNames = bitrixWarehouses
 405                .Select(w => w.Name)
 406                .Where(n => !string.IsNullOrWhiteSpace(n))
 407                .Select(n => n!)
 408                .OrderBy(n => n)
 0409                .ToList();
 0410            bitrixWarehouseNames = await FilterBitrixWarehouseNamesByScope(bitrixWarehouseNames);
 411
 0412            var isAdmin = User.IsInRole("Admin");
 0413            var senderResolution = await _warehouseSelectionResolver.ResolveSenderWarehouseAsync(candidateOrders);
 0414            var blockingErrors = new List<string>();
 415
 0416            if (!isAdmin && (senderResolution.HasErrors || string.IsNullOrWhiteSpace(senderResolution.SenderWarehouseNam
 417            {
 0418                blockingErrors.AddRange(senderResolution.Errors);
 0419                if (!senderResolution.HasErrors)
 0420                    blockingErrors.Add("Не удалось определить склад отправителя по правилу 'склад покупателя'.");
 421            }
 0422            else if (!isAdmin && !bitrixWarehouseNames.Contains(senderResolution.SenderWarehouseName, StringComparer.Ord
 423            {
 0424                blockingErrors.Add($"Склад отправителя '{senderResolution.SenderWarehouseName}', полученный из настроек 
 425            }
 426
 0427            if (blockingErrors.Count > 0)
 0428                throw new TransactionException(TransactionErrorCode.OneCSenderWarehouseMissing, string.Join("<br/>", blo
 429
 0430            if (!isAdmin)
 0431                warehouseSender = senderResolution.SenderWarehouseName;
 432
 0433            if (string.IsNullOrWhiteSpace(warehouseSender))
 0434                throw new TransactionException(TransactionErrorCode.OneCSenderWarehouseMissing, "Не указан склад отправи
 435
 0436            if (!bitrixWarehouseNames.Contains(warehouseSender.Trim(), StringComparer.OrdinalIgnoreCase))
 0437                throw new TransactionException(TransactionErrorCode.OneCSenderWarehouseMissing, "Склад отправителя недос
 438
 0439            var postedRecipientByOrder = recipientByOrder ?? new Dictionary<int, string>();
 440            var candidateOrderIds = candidateOrders.Select(o => o.Id).ToHashSet();
 0441            var invalidOrderIds = postedRecipientByOrder.Keys.Where(id => !candidateOrderIds.Contains(id)).ToList();
 0442            if (invalidOrderIds.Count > 0)
 0443                throw new TransactionException(TransactionErrorCode.OneCRecipientWarehouseMissing, "Переданы некорректны
 444
 0445            foreach (var order in candidateOrders)
 446            {
 0447                if (!postedRecipientByOrder.TryGetValue(order.Id, out var recipient) || string.IsNullOrWhiteSpace(recipi
 0448                    throw new TransactionException(TransactionErrorCode.OneCRecipientWarehouseMissing, $"Не указан склад
 449
 0450                if (!bitrixWarehouseNames.Contains(recipient, StringComparer.OrdinalIgnoreCase))
 0451                    throw new TransactionException(TransactionErrorCode.OneCRecipientWarehouseMissing, $"Склад получател
 452
 0453                if (string.Equals(warehouseSender.Trim(), recipient.Trim(), StringComparison.OrdinalIgnoreCase))
 0454                    throw new TransactionException(TransactionErrorCode.OneCWarehousesMustDiffer, $"Склад отправителя и 
 455            }
 456
 0457            return await CreateTransactionPostBase(
 0458                orders ?? new List<Order>(),
 0459                userName,
 0460                comment,
 0461                page,
 0462                deletedOrders,
 0463                orderSupplierMap,
 0464                processIn1C: true,
 0465                warehouseSender: warehouseSender.Trim(),
 0466                warehouseRecipient: warehouseRecipient?.Trim(),
 0467                recipientWarehouseByOrder: postedRecipientByOrder);
 468        }
 0469        catch (TransactionException ex)
 470        {
 0471            TempData["TransactionErrorCode"] = ex.Code.ToString();
 0472            TempData["ErorrResult"] = ex.Message;
 0473            return Json(new { redirectTo = Url.Action("Index", "Orders", new { sortOrder = GetSortStateCookie(), page })
 474        }
 0475    }
 476}

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.DataServices.StatusTransitionDataServices,Services.ApiServices.OneCDataManager,Services.ApiServices._1CApi.OneCTransferManager,Services.Authorization.Services.IScopeFilterValuesService,Services.BackgroundJobsServices.WarehouseSelectionResolver,Services.ApiServices.OzonApi.OzonOrderCancellationService)
GetTransactionConfig()
GetStandardCustomerReturnTransactionConfig()
GetCustomerReturnFromFileTransactionConfig()
IsMarketplaceCancelled(OzonDomains.Models.Order)
CreateCustomerReturnTransactionFromFile()
CreateCustomerReturnTransaction()
ApplyAlreadyReturnedOrdersWarning(Microsoft.AspNetCore.Mvc.IActionResult)
CreateCustomerReturnTransaction(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.String,System.String,System.Collections.Generic.Dictionary`2<System.Int32,System.String>,System.Boolean,System.Boolean)
CreateCustomerReturnTransactionFromFileStatusOnly(System.Collections.Generic.List`1<OzonDomains.Models.Order>,System.String,System.String,System.Int32,System.String)
ApplyShipmentFilterCookie(System.Collections.Generic.IEnumerable`1<OzonDomains.Models.Order>)
CreateCustomerReturnTransactionWithWarehouseValidation()