< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Helpers.ZasylOrderOptions
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Helpers/ShippedToSellerZasylResolver.cs
Line coverage
80%
Covered lines: 4
Uncovered lines: 1
Coverable lines: 5
Total lines: 117
Line coverage: 80%
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%11100%
get_ClientId()100%210%
get_ClientName()100%11100%
get_DeliveryType()100%11100%
get_Options()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Helpers/ShippedToSellerZasylResolver.cs

#LineLine coverage
 1using OzonDomains.Models;
 2using Services.BackgroundJobsServices;
 3
 4namespace OzonOrdersWeb.Areas.Studio2.Helpers;
 5
 6/// <summary>Склад 1С для одного значения засыла и признак «связь складов найдена».</summary>
 7public sealed record ZasylSenderOption(string Warehouse, bool Mapped);
 8
 9/// <summary>
 10/// Варианты склада-отправителя для одного заказа. Клиент и тип доставки нужны странице, чтобы
 11/// предложить создать недостающую связь складов с уже заполненными полями.
 12/// </summary>
 513public sealed record ZasylOrderOptions(
 014    int? ClientId,
 115    string? ClientName,
 216    string? DeliveryType,
 1117    Dictionary<string, ZasylSenderOption> Options);
 18
 19/// <summary>
 20/// Засыл на странице «Отгружен реализатору» задаёт склад списания, но в 1С уходит не сам засыл, а
 21/// склад из WarehouseMapping. Резолв здесь общий для страницы (предпросмотр остатков, панель
 22/// «склад списания») и для отправки документа, чтобы проверялся ровно тот склад, с которого спишут.
 23/// </summary>
 24public static class ShippedToSellerZasylResolver
 25{
 26    /// <summary>
 27    /// Заказ → склад 1С по засылу из формы. Заказы без засыла не попадают в карту: для них склад
 28    /// резолвится обычным путём (склад отгрузки + связи складов).
 29    /// </summary>
 30    public static Dictionary<int, string> BuildSenderMap(
 31        IEnumerable<Order>? orders,
 32        List<WarehouseMapping>? mappings,
 33        IReadOnlyDictionary<int, string?>? rawZasylMap)
 34    {
 35        var result = new Dictionary<int, string>();
 36        if (orders == null || rawZasylMap == null || rawZasylMap.Count == 0)
 37            return result;
 38
 39        var mappingList = (IReadOnlyList<WarehouseMapping>?)mappings ?? Array.Empty<WarehouseMapping>();
 40
 41        foreach (var order in orders)
 42        {
 43            if (order == null)
 44                continue;
 45            if (!rawZasylMap.TryGetValue(order.Id, out var zasyl) || string.IsNullOrWhiteSpace(zasyl))
 46                continue;
 47
 48            var resolved = ShippedToCommissionerWarehouseResolver.ResolveSender(order, mappingList, zasyl).Warehouse;
 49            if (!string.IsNullOrWhiteSpace(resolved))
 50                result[order.Id] = resolved;
 51        }
 52
 53        return result;
 54    }
 55
 56    /// <summary>
 57    /// Карта «заказ → (значение засыла → склад 1С)» для страницы: перечисляем все склады из
 58    /// выпадающего списка засыла и уже проставленные значения, чтобы пересчёт при выборе
 59    /// происходил без запроса к серверу.
 60    /// </summary>
 61    public static Dictionary<string, ZasylOrderOptions> BuildSenderOptions(
 62        IReadOnlyList<Order>? orders,
 63        List<WarehouseMapping>? mappings,
 64        IEnumerable<string?>? warehouseNames)
 65    {
 66        var result = new Dictionary<string, ZasylOrderOptions>();
 67        if (orders == null || orders.Count == 0)
 68            return result;
 69
 70        var mappingList = (IReadOnlyList<WarehouseMapping>?)mappings ?? Array.Empty<WarehouseMapping>();
 71        var names = (warehouseNames ?? Enumerable.Empty<string?>())
 72            .Where(name => !string.IsNullOrWhiteSpace(name))
 73            .Select(name => name!.Trim())
 74            .ToList();
 75
 76        foreach (var order in orders)
 77        {
 78            if (order == null)
 79                continue;
 80
 81            var orderNames = names.ToList();
 82            var currentZasyl = order.OrderExtensions?
 83                .FirstOrDefault(e => string.Equals(e.Key, ShippedToCommissionerWarehouseResolver.ZasylKey,
 84                    StringComparison.OrdinalIgnoreCase))
 85                ?.Value?
 86                .Trim();
 87            if (!string.IsNullOrWhiteSpace(currentZasyl))
 88                orderNames.Add(currentZasyl);
 89
 90            var options = new Dictionary<string, ZasylSenderOption>(StringComparer.OrdinalIgnoreCase);
 91            foreach (var name in orderNames)
 92            {
 93                var key = OptionKey(name);
 94                if (key == null || options.ContainsKey(key))
 95                    continue;
 96
 97                var resolution = ShippedToCommissionerWarehouseResolver.ResolveSender(order, mappingList, name);
 98                if (string.IsNullOrWhiteSpace(resolution.Warehouse))
 99                    continue;
 100
 101                options[key] = new ZasylSenderOption(resolution.Warehouse!, resolution.FromMapping);
 102            }
 103
 104            result[order.Id.ToString()] = new ZasylOrderOptions(
 105                order.OzonClientId,
 106                order.OzonClient?.Name?.Trim(),
 107                ShippedToCommissionerWarehouseResolver.GetMappingDeliveryType(order),
 108                options);
 109        }
 110
 111        return result;
 112    }
 113
 114    /// <summary>Ключ варианта: то же приведение кириллических кодов, что и в резолвере («М2» → «m2»).</summary>
 115    public static string? OptionKey(string? warehouseName)
 116        => WarehouseNameNormalizer.Normalize(warehouseName)?.ToLowerInvariant();
 117}