< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.SupplierVerificationRowDto
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/SupplierVerificationDto.cs
Line coverage
68%
Covered lines: 11
Uncovered lines: 5
Coverable lines: 16
Total lines: 128
Line coverage: 68.7%
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_OrderId()100%11100%
get_ShipmentNumber()100%11100%
get_Article()100%210%
get_ProductName()100%210%
get_ProviderKey()100%11100%
get_ProviderName()100%210%
get_LogoUrl()100%210%
get_StageName()100%210%
get_Status()100%11100%
get_StatusTitle()100%11100%
get_Tone()100%11100%
get_Summary()100%11100%
get_SupplierOrderNumber()100%11100%
get_SupplierStatusName()100%11100%
get_Checks()100%11100%

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>
 29public sealed record SupplierVerificationRowDto(
 510    int OrderId,
 211    string? ShipmentNumber,
 012    string? Article,
 013    string? ProductName,
 214    string ProviderKey,
 015    string ProviderName,
 016    string? LogoUrl,
 017    string StageName,
 218    string Status,
 219    string StatusTitle,
 220    string Tone,
 221    string Summary,
 322    string? SupplierOrderNumber,
 323    string? SupplierStatusName,
 624    IReadOnlyList<string> Checks);
 25
 26/// <summary>Сводка проверки поставщиков после проведения: считается на сервере, клиент только рисует.</summary>
 27public sealed record SupplierVerificationDto(
 28    bool HasProblems,
 29    int Confirmed,
 30    int Problems,
 31    int NotVerifiable,
 32    string ShortText,
 33    IReadOnlyList<SupplierVerificationRowDto> Rows)
 34{
 35    public static SupplierVerificationDto? From(SupplierVerificationSummary? summary)
 36    {
 37        if (summary is null || summary.IsEmpty) return null;
 38        var rows = summary.Rows.Select(row => new SupplierVerificationRowDto(
 39            row.OrderId, row.ShipmentNumber, row.Article, row.ProductName, row.ProviderKey, row.ProviderName,
 40            OrderHistoryGridRows.SupplierProviderLogoUrl(row.ProviderKey),
 41            OrderHistoryGridRows.SupplierStageName(row.Stage), row.Status,
 42            SupplierVerificationStatus.Title(row.Status), Tone(row.Status), row.Summary,
 43            row.SupplierOrderNumber, row.SupplierStatusName, row.Checks)).ToList();
 44        return new SupplierVerificationDto(summary.HasProblems, summary.ConfirmedCount, summary.ProblemCount,
 45            summary.NotVerifiableCount, summary.ToShortText(), rows);
 46    }
 47
 48    /// <summary>HTML-блок для карточки результата проведения (toast классического потока и SummaryHtml нового).</summar
 49    public static string? ToHtmlBlock(SupplierVerificationSummary? summary)
 50    {
 51        if (summary is null || summary.IsEmpty) return null;
 52        var cls = summary.HasProblems ? "alert-danger" : "alert-success";
 53        var icon = summary.HasProblems ? "fa-triangle-exclamation" : "fa-circle-check";
 54        var problemRows = summary.Rows.Where(x => x.IsProblem).Take(10)
 55            .Select(x => $"<li><b>{WebUtility.HtmlEncode(x.ProviderName)}</b> · {WebUtility.HtmlEncode(x.ShipmentNumber 
 56        var list = summary.HasProblems ? $"<ul class='mb-0 small'>{string.Join(string.Empty, problemRows)}</ul>" : strin
 57        return $"<div class='alert {cls} mb-0'><div class='fw-semibold'><i class='fas {icon} me-1'></i>{WebUtility.HtmlE
 58    }
 59
 60    public static string Tone(string status) => status switch
 61    {
 62        SupplierVerificationStatus.Confirmed => "success",
 63        SupplierVerificationStatus.NotVerifiable => "muted",
 64        SupplierVerificationStatus.ApiError => "warning",
 65        _ => "danger"
 66    };
 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}