< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.Transactions.LostByCommissionerTransactionController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Transactions/LostByCommissionerTransactionController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 106
Coverable lines: 106
Total lines: 207
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 28
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%
CreateTransitHelper()100%210%
CreateLostByCommissionerTransaction()0%110100%
CreateLostByCommissionerTransaction()0%420200%
GetPostTransactionSuccessAppendix()0%620%

File(s)

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

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using Microsoft.EntityFrameworkCore;
 4using Microsoft.Extensions.DependencyInjection;
 5using OzonDomains;
 6using OzonDomains.Models;
 7using OzonOrdersWeb.Areas.Studio2.Controllers.Base;
 8using OzonOrdersWeb.Areas.Studio2.Helpers;
 9using OzonOrdersWeb.ViewModels.OrderViewModels;
 10using OzonRepositories.Context;
 11using Services.ApiServices;
 12using Services.ApiServices._1CApi;
 13using Services.Authorization.Services;
 14using Services.CacheServices.Cache.OzonOrdersCache;
 15using Services.CacheServices.Cache.UserCacheService;
 16using Services.DataServices;
 17using OzonOrdersWeb.WebServices.Currency;
 18using Services.TransactionUtilsServices;
 19using Services.CacheServices.Cache;
 20using Services.StockSyncServices;
 21using Services.ApiServices._1CApi.Stock;
 22
 23namespace OzonOrdersWeb.Areas.Studio2.Controllers.Transactions;
 24
 25[Authorize(Roles = "User,Admin")]
 26[Area("Studio2")]
 27public class LostByCommissionerTransactionController : BaseTransactionController
 28{
 029    private string _oneCSuccessHtml = string.Empty;
 030    private string _skippedOrdersHtml = string.Empty;
 31
 32    public LostByCommissionerTransactionController(
 33        ApplicationDbContext context,
 34        AppStatusDataServices appStatusServices,
 35        OrdersDataServices orderServices,
 36        TransactionManager transactionManager,
 37        TransactionCache transactionCache,
 38        SupplierDataServices supplierDataServices,
 39        IUserCacheService userCacheService,
 40        ICurrencyRatesViewBagService currencyRatesViewBagService,
 41        CacheUpdater<Order> cacheUpdater,
 42        OrderCache orderCache,
 43        WarehouseDataServices warehouseDataServices,
 44        ExpenseTypeDataServices expenseTypeDataServices,
 45        OrderExtraExpenseDataServices orderExtraExpenseDataServices,
 46        OneCDataManager oneCDataManager,
 47        OneCTransferManager oneCTransferManager,
 48        WarehouseMappingDataServices warehouseMappingDataServices,
 49        StatusTransitionDataServices statusTransitionDataServices,
 50        IScopeFilterValuesService scopeFilterValuesService)
 051        : base(context, appStatusServices, orderServices, transactionManager, transactionCache,
 052               supplierDataServices, userCacheService, currencyRatesViewBagService, cacheUpdater, orderCache,
 053               oneCDataManager, warehouseDataServices, bitrixStockRepository: null,
 054               proxyHttpClientService: null, oneCTransferManager,
 055               orderCartServices: null, warehouseMappingDataServices,
 056               expenseTypeDataServices, orderExtraExpenseDataServices,
 057               statusTransitionDataServices, scopeFilterValuesService)
 58    {
 059    }
 60
 61    protected override TransactionConfig GetTransactionConfig()
 62    {
 063        var config = LostByCommissionerTransitHelper.CreateLostTransactionConfig(TransactionManager);
 064        config.ViewName = "CreateLostByCommissionerTransaction";
 065        config.ConfigureViewModelAsync = async vm =>
 066        {
 067            var targetStatus = await AppStatusServices.GetAppStatusAsync(
 068                new AppStatus { Name = LostByCommissionerTransitHelper.LostStatusName });
 069            if (targetStatus == null)
 070            {
 071                targetStatus = new AppStatus { Name = LostByCommissionerTransitHelper.LostStatusName };
 072                Context.AppStatuses.Add(targetStatus);
 073                await Context.SaveChangesAsync();
 074            }
 075            foreach (var order in vm.Orders)
 076            {
 077                order.AppStatus = targetStatus;
 078                order.AppStatusId = targetStatus.Id;
 079            }
 080        };
 081        return config;
 82    }
 83
 84    private LostByCommissionerTransitHelper CreateTransitHelper() =>
 085        new(Context, AppStatusServices, WarehouseMappingDataServices, OneCTransferManager,
 086            HttpContext.RequestServices.GetRequiredService<IWarehouseStockLookupService>());
 87
 88    [HttpGet]
 89    public async Task<IActionResult> CreateLostByCommissionerTransaction(string ids, int page)
 90    {
 091        var result = await CreateTransactionBase(ids, page);
 92
 093        if (result is ViewResult viewResult
 094            && viewResult.Model is MultiplayEditOrderViewModel vm
 095            && vm.Orders.Any()
 096            && WarehouseMappingDataServices != null
 097            && OneCTransferManager != null)
 98        {
 099            var helper = CreateTransitHelper();
 0100            var transitGroups = await helper.GetTransitWarehouseGroupsAsync(vm.Orders);
 0101            viewResult.ViewData["TransitWarehouseGroups"] = transitGroups;
 0102            viewResult.ViewData["OrderInfoMap"] = await helper.BuildOrderInfoMapAsync(vm.Orders);
 0103            viewResult.ViewData["StockCheckSenderByOrderId"] = await helper.BuildStockCheckSenderMapAsync(vm.Orders);
 0104        }
 105
 0106        return result;
 0107    }
 108
 109    [HttpPost]
 110    [ValidateAntiForgeryToken]
 111    public async Task<IActionResult> CreateLostByCommissionerTransaction(
 112        List<Order> orders,
 113        string userName,
 114        string? comment,
 115        int page,
 116        string? deletedOrders,
 117        Dictionary<int, string?>? orderSupplierMap,
 118        Dictionary<int, string>? manufacturerByOrderId = null,
 119        bool processIn1C = false)
 120    {
 0121        var oneCOrganizationInn = Request.Form["oneCOrganizationInn"].FirstOrDefault();
 0122        var incomingIds = orders?.Select(o => o.Id).ToList() ?? new();
 0123        var ordersReloaded = await Context.Orders
 0124            .AsNoTracking()
 0125            .Include(o => o.OzonClient)
 0126            .Include(o => o.ShipmentWarehouse)
 0127            .Include(o => o.OrderExtensions)
 0128            .Include(o => o.EtProducer)
 0129            .Where(o => incomingIds.Contains(o.Id))
 0130            .ToListAsync();
 131
 0132        var helper = CreateTransitHelper();
 0133        var stockQty = await helper.BuildStockQtyAsync(ordersReloaded, manufacturerByOrderId);
 134
 135        // Остатки спрашиваем до PrepareLostOrdersAsync: он уже меняет статусы и создаёт документ 1С.
 0136        var stockCheck = StockCheckResult.Empty;
 0137        if (processIn1C)
 138        {
 0139            var participating = ordersReloaded.Where(o => !stockQty.zeroStockIds.Contains(o.Id));
 0140            stockCheck = await OneCStockGate.RunAsync(
 0141                HttpContext,
 0142                await helper.BuildTransitStockCheckLinesAsync(participating, stockQty.overrides));
 0143            await OneCStockGate.ReportAsync(HttpContext, stockCheck, "Утерян реализатором");
 144
 145        }
 146
 0147        var prep = await helper.PrepareLostOrdersAsync(
 0148            orders, ordersReloaded, manufacturerByOrderId, processIn1C, oneCOrganizationInn, userName,
 0149            OneCStockGate.GetBlockingOrderIds(stockCheck),
 0150            precomputedStock: stockQty);
 151
 0152        _skippedOrdersHtml = prep.SkippedOrdersHtml;
 153
 0154        if (!string.IsNullOrWhiteSpace(prep.Fatal1CErrorHtml))
 155        {
 0156            TempData["TransactionResult"] = prep.Fatal1CErrorHtml + prep.SkippedOrdersHtml;
 0157            return Json(new { redirectTo = Url.Action("Index", "Orders", new { page }) });
 158        }
 159
 0160        if (prep.AllOrdersSkipped)
 161        {
 0162            var resultHtml = string.IsNullOrWhiteSpace(prep.SkippedOrdersHtml)
 0163                ? "<div class='alert alert-warning'><i class='fas fa-exclamation-triangle me-1'></i>" +
 0164                  "<strong>Транзакция не создана</strong> — все заказы не имеют остатков в WS.</div>"
 0165                : prep.SkippedOrdersHtml;
 0166            TempData["TransactionResult"] = resultHtml;
 0167            return Json(new { redirectTo = Url.Action("Index", "Orders", new { page }) });
 168        }
 169
 0170        _oneCSuccessHtml = prep.OneCSuccessHtml;
 0171        comment += prep.CommentAppendix;
 172
 0173        var baseResult = await CreateTransactionPostBase(
 0174            prep.OrdersToProcess, userName, comment, page, deletedOrders, orderSupplierMap,
 0175            processIn1C: false);
 176
 0177        if (prep.TransferResultForHistory != null && prep.OrdersForHistory is { Count: > 0 })
 178        {
 0179            var orderIdsForHistory = prep.OrdersForHistory.Select(o => o.Id).ToList();
 0180            var transactionId = await Context.Orders
 0181                .AsNoTracking()
 0182                .Where(o => orderIdsForHistory.Contains(o.Id))
 0183                .Select(o => o.TransactionId)
 0184                .FirstOrDefaultAsync();
 185
 0186            await OrderHistoryOneCPostingRecorder.TryRecordMovementAsync(
 0187                HttpContext.RequestServices,
 0188                prep.OrdersForHistory,
 0189                prep.TransferResultForHistory,
 0190                userName,
 0191                transactionId,
 0192                prep.HistoryWindowStart,
 0193                prep.HistorySender,
 0194                prep.HistoryRecipient);
 195        }
 196
 0197        return baseResult ?? Json(new { redirectTo = Url.Action("Index", "Orders", new { page }) });
 0198    }
 199
 200    protected override string? GetPostTransactionSuccessAppendix()
 201    {
 0202        var parts = new[] { _oneCSuccessHtml, _skippedOrdersHtml }
 0203            .Where(s => !string.IsNullOrWhiteSpace(s));
 0204        var combined = string.Concat(parts);
 0205        return string.IsNullOrWhiteSpace(combined) ? null : combined;
 206    }
 207}