< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.SupplierVerificationDto
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/SupplierVerificationDto.cs
Line coverage
10%
Covered lines: 3
Uncovered lines: 27
Coverable lines: 30
Total lines: 128
Line coverage: 10%
Branch coverage
9%
Covered branches: 2
Total branches: 22
Branch coverage: 9%
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_HasProblems()100%210%
get_Confirmed()100%210%
get_Problems()100%210%
get_NotVerifiable()100%210%
get_ShortText()100%210%
get_Rows()100%11100%
From(...)50%15411.11%
ToHtmlBlock(...)0%156120%
Tone(...)0%4260%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/SupplierVerificationDto.cs

#LineLine coverage
 1using System.Net;
 2using System.Text.Json;
 3using OzonOrdersWeb.WebServices.OrderHistory;
 4using Services.SupplierStatusServices;
 5
 6namespace OzonOrdersWeb.WebServices.Transactions;
 7
 8/// <summary>Строка сводки проверки заказа у поставщика для клиента (диалог на /Studio2/OrdersGrid).</summary>
 9public sealed record SupplierVerificationRowDto(
 10    int OrderId,
 11    string? ShipmentNumber,
 12    string? Article,
 13    string? ProductName,
 14    string ProviderKey,
 15    string ProviderName,
 16    string? LogoUrl,
 17    string StageName,
 18    string Status,
 19    string StatusTitle,
 20    string Tone,
 21    string Summary,
 22    string? SupplierOrderNumber,
 23    string? SupplierStatusName,
 24    IReadOnlyList<string> Checks);
 25
 26/// <summary>Сводка проверки поставщиков после проведения: считается на сервере, клиент только рисует.</summary>
 227public sealed record SupplierVerificationDto(
 028    bool HasProblems,
 029    int Confirmed,
 030    int Problems,
 031    int NotVerifiable,
 032    string ShortText,
 433    IReadOnlyList<SupplierVerificationRowDto> Rows)
 34{
 35    public static SupplierVerificationDto? From(SupplierVerificationSummary? summary)
 36    {
 2637        if (summary is null || summary.IsEmpty) return null;
 038        var rows = summary.Rows.Select(row => new SupplierVerificationRowDto(
 039            row.OrderId, row.ShipmentNumber, row.Article, row.ProductName, row.ProviderKey, row.ProviderName,
 040            OrderHistoryGridRows.SupplierProviderLogoUrl(row.ProviderKey),
 041            OrderHistoryGridRows.SupplierStageName(row.Stage), row.Status,
 042            SupplierVerificationStatus.Title(row.Status), Tone(row.Status), row.Summary,
 043            row.SupplierOrderNumber, row.SupplierStatusName, row.Checks)).ToList();
 044        return new SupplierVerificationDto(summary.HasProblems, summary.ConfirmedCount, summary.ProblemCount,
 045            summary.NotVerifiableCount, summary.ToShortText(), rows);
 46    }
 47
 48    /// <summary>HTML-блок для карточки результата проведения (toast классического потока и SummaryHtml нового).</summar
 49    public static string? ToHtmlBlock(SupplierVerificationSummary? summary)
 50    {
 051        if (summary is null || summary.IsEmpty) return null;
 052        var cls = summary.HasProblems ? "alert-danger" : "alert-success";
 053        var icon = summary.HasProblems ? "fa-triangle-exclamation" : "fa-circle-check";
 054        var problemRows = summary.Rows.Where(x => x.IsProblem).Take(10)
 055            .Select(x => $"<li><b>{WebUtility.HtmlEncode(x.ProviderName)}</b> · {WebUtility.HtmlEncode(x.ShipmentNumber 
 056        var list = summary.HasProblems ? $"<ul class='mb-0 small'>{string.Join(string.Empty, problemRows)}</ul>" : strin
 057        return $"<div class='alert {cls} mb-0'><div class='fw-semibold'><i class='fas {icon} me-1'></i>{WebUtility.HtmlE
 58    }
 59
 060    public static string Tone(string status) => status switch
 061    {
 062        SupplierVerificationStatus.Confirmed => "success",
 063        SupplierVerificationStatus.NotVerifiable => "muted",
 064        SupplierVerificationStatus.ApiError => "warning",
 065        _ => "danger"
 066    };
 67}
 68
 69/// <summary>Достаёт Id заказов Studio2 из клиентских очередей поставщиков (JSON-массивы с полем OrderId).</summary>
 70public static class SupplierQueueOrderIds
 71{
 72    private static readonly string[] QueueSuffixes = { "BasketQueueJson", "CheckoutQueueJson" };
 73
 74    /// <summary>Заказ → поставщик по ключам очередей (<c>NikeiCheckoutQueueJson</c> → <c>Nikei</c>), для заказов без за
 75    public static Dictionary<int, string> ExtractProviderByOrder(IReadOnlyDictionary<string, string> queues)
 76    {
 77        var result = new Dictionary<int, string>();
 78        foreach (var (key, json) in queues)
 79        {
 80            var suffix = QueueSuffixes.FirstOrDefault(x => key.EndsWith(x, StringComparison.OrdinalIgnoreCase));
 81            if (suffix is null) continue;
 82            var providerKey = ProviderKeyFromQueuePrefix(key[..^suffix.Length]);
 83            foreach (var id in Extract(new[] { json })) result.TryAdd(id, providerKey);
 84        }
 85
 86        return result;
 87    }
 88
 89    public static string ProviderKeyFromQueuePrefix(string prefix) => prefix.ToLowerInvariant() switch
 90    {
 91        "mikado" => "MikadoMskHod20",
 92        "moskvorechie" => "MoskvorechieIstra",
 93        _ => prefix.Length == 0 ? prefix : char.ToUpperInvariant(prefix[0]) + prefix[1..]
 94    };
 95
 96    public static HashSet<int> Extract(IEnumerable<string?> queueJsons)
 97    {
 98        var ids = new HashSet<int>();
 99        foreach (var json in queueJsons)
 100        {
 101            if (string.IsNullOrWhiteSpace(json)) continue;
 102            try
 103            {
 104                using var document = JsonDocument.Parse(json);
 105                if (document.RootElement.ValueKind != JsonValueKind.Array) continue;
 106                foreach (var item in document.RootElement.EnumerateArray())
 107                {
 108                    if (item.ValueKind != JsonValueKind.Object) continue;
 109                    foreach (var property in item.EnumerateObject())
 110                    {
 111                        if (string.Equals(property.Name, "OrderId", StringComparison.OrdinalIgnoreCase)
 112                            && property.Value.ValueKind == JsonValueKind.Number
 113                            && property.Value.TryGetInt32(out var id) && id > 0)
 114                        {
 115                            ids.Add(id);
 116                        }
 117                    }
 118                }
 119            }
 120            catch (JsonException)
 121            {
 122                // Битая очередь уже отклонена при разборе в процессоре корзин; для проверки она просто пуста.
 123            }
 124        }
 125
 126        return ids;
 127    }
 128}