< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.Grid.Preview.ShipToSellerPlanRequest
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Preview/ShipToSellerOneCPlanner.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 6
Coverable lines: 6
Total lines: 127
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
get_MainOrderIds()100%210%
get_Quantities()100%210%
get_ZasylRaw()100%210%
get_ZeroOrderIds()100%210%
get_ManufacturerByOrderId()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Preview/ShipToSellerOneCPlanner.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonDomains.Models;
 3using OzonOrdersWeb.Areas.Studio2.Helpers;
 4using OzonRepositories.Context;
 5using Services.ApiServices._1CApi;
 6using Services.ApiServices._1CApi.Stock;
 7using Services.DataServices;
 8using Services.StockSyncServices;
 9
 10namespace OzonOrdersWeb.WebServices.Transactions.Grid.Preview;
 11
 12/// <summary>Исходные данные проверки «Отгружен реализатору»: количества в штуках заказа, засыл и транзитные (qty = 0) з
 013public sealed record ShipToSellerPlanRequest(
 014    IReadOnlyCollection<int> MainOrderIds,
 015    IReadOnlyDictionary<int, decimal> Quantities,
 016    IReadOnlyDictionary<int, string?> ZasylRaw,
 017    IReadOnlyCollection<int> ZeroOrderIds,
 018    IReadOnlyDictionary<int, string>? ManufacturerByOrderId);
 19
 20/// <summary>Результат построения плана: строки проверки остатков 1С и всё, что нужно показать на панели.</summary>
 21public sealed class ShipToSellerPlan
 22{
 23    public List<Order> MainOrders { get; init; } = new();
 24
 25    /// <summary>Перечитанные из БД заказы с qty = 0 (транзит «Утерян реализатором»).</summary>
 26    public List<Order> ZeroOrders { get; init; } = new();
 27
 28    public List<WarehouseMapping>? Mappings { get; init; }
 29
 30    /// <summary>Заказ → склад 1С по засылу (заказы без засыла не попадают в карту).</summary>
 31    public Dictionary<int, string> SenderMap { get; init; } = new();
 32
 33    /// <summary>Остаток WS, который уйдёт в транзит, по заказу.</summary>
 34    public Dictionary<int, decimal> ZeroOverrides { get; init; } = new();
 35
 36    /// <summary>Транзитные заказы без остатка WS — получат «Утерян (без транзита)», в 1С не идут.</summary>
 37    public HashSet<int> ZeroStockIds { get; init; } = new();
 38
 39    public List<StockCheckLine> Lines { get; init; } = new();
 40}
 41
 42/// <summary>
 43/// Общий для предпросмотра панели и шага проведения расчёт «что и с какого склада проверять в 1С» для
 44/// «Отгружен реализатору». Повторяет классический <c>ShippedToSellerTransactionController</c>:
 45/// склад основных строк — по засылу и связям складов (<see cref="ShippedToSellerZasylResolver"/>),
 46/// транзитные строки (qty = 0) — остаток WS на транзитное перемещение.
 47/// </summary>
 48public sealed class ShipToSellerOneCPlanner
 49{
 50    private readonly ApplicationDbContext _context;
 51    private readonly WarehouseMappingDataServices _mappings;
 52    private readonly AppStatusDataServices _appStatuses;
 53    private readonly IWarehouseStockLookupService _stockLookup;
 54    private readonly OneCTransferManager? _transfer;
 55    private readonly IOneCStockAvailabilityService? _availability;
 56
 57    public ShipToSellerOneCPlanner(
 58        ApplicationDbContext context,
 59        WarehouseMappingDataServices mappings,
 60        AppStatusDataServices appStatuses,
 61        IWarehouseStockLookupService stockLookup,
 62        OneCTransferManager? transfer = null,
 63        IOneCStockAvailabilityService? availability = null)
 64    {
 65        _context = context;
 66        _mappings = mappings;
 67        _appStatuses = appStatuses;
 68        _stockLookup = stockLookup;
 69        _transfer = transfer;
 70        _availability = availability;
 71    }
 72
 73    public LostByCommissionerTransitHelper CreateTransitHelper()
 74        => new(_context, _appStatuses, _mappings, _transfer, _stockLookup);
 75
 76    public async Task<ShipToSellerPlan> BuildAsync(ShipToSellerPlanRequest request, CancellationToken ct = default)
 77    {
 78        var mappings = await _mappings.GetWarehouseMappings();
 79
 80        var mainOrders = request.MainOrderIds.Count > 0
 81            ? await TransactionStockCheckLineBuilder.LoadForStockCheckAsync(_context, request.MainOrderIds)
 82            : new List<Order>();
 83        var senderMap = ShippedToSellerZasylResolver.BuildSenderMap(mainOrders, mappings, request.ZasylRaw);
 84        var senderOrNull = senderMap.Count > 0 ? new Dictionary<int, string>(senderMap) : null;
 85
 86        var lines = TransactionStockCheckLineBuilder
 87            .FromWarehouseMappings(mainOrders, mappings, senderOrNull, request.Quantities)
 88            .ToList();
 89
 90        var zeroOrders = new List<Order>();
 91        var zeroOverrides = new Dictionary<int, decimal>();
 92        var zeroStockIds = new HashSet<int>();
 93        if (request.ZeroOrderIds.Count > 0)
 94        {
 95            var zeroIds = request.ZeroOrderIds.ToList();
 96            zeroOrders = await _context.Orders.AsNoTracking()
 97                .Include(o => o.OzonClient)
 98                .Include(o => o.ShipmentWarehouse)
 99                .Include(o => o.OrderExtensions)
 100                .Include(o => o.EtProducer)
 101                .Include(o => o.Manufacturer)
 102                .Where(o => zeroIds.Contains(o.Id))
 103                .ToListAsync(ct);
 104
 105            var helper = CreateTransitHelper();
 106            var manufacturers = request.ManufacturerByOrderId?.ToDictionary(kv => kv.Key, kv => kv.Value);
 107            (zeroOverrides, zeroStockIds) = await helper.BuildStockQtyAsync(zeroOrders, manufacturers);
 108
 109            var transitOrders = zeroOrders.Where(o => !zeroStockIds.Contains(o.Id));
 110            lines.AddRange(await helper.BuildTransitStockCheckLinesAsync(transitOrders, zeroOverrides));
 111        }
 112
 113        return new ShipToSellerPlan
 114        {
 115            MainOrders = mainOrders,
 116            ZeroOrders = zeroOrders,
 117            Mappings = mappings,
 118            SenderMap = senderMap,
 119            ZeroOverrides = zeroOverrides,
 120            ZeroStockIds = zeroStockIds,
 121            Lines = lines
 122        };
 123    }
 124
 125    public Task<StockCheckResult> CheckStockAsync(ShipToSellerPlan plan)
 126        => OneCStockGate.RunAsync(_availability, plan.Lines);
 127}