< Summary

Information
Class: Services.LabelServices.OzonLabelPrintErrorHelper
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/LabelServices/OzonLabelPrintErrorHelper.cs
Line coverage
72%
Covered lines: 40
Uncovered lines: 15
Coverable lines: 55
Total lines: 98
Line coverage: 72.7%
Branch coverage
45%
Covered branches: 18
Total branches: 40
Branch coverage: 45%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
TryGetOzonErrorCode(...)83.33%6688.88%
NeedsCurrentOzonStatus(...)0%7280%
FormatShipmentError(...)50%542665.38%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/LabelServices/OzonLabelPrintErrorHelper.cs

#LineLine coverage
 1namespace Services.LabelServices;
 2
 3public static class OzonLabelPrintErrorHelper
 4{
 15    private static readonly Dictionary<string, string> ShipErrorMessages = new(StringComparer.OrdinalIgnoreCase)
 16    {
 17        ["POSTING_ALREADY_CANCELLED"] = "Отправление отменено на Ozon (заказ отменён покупателем). Печать этикетки невоз
 18        ["POSTING_NOT_FOUND"] = "Отправление не найдено на Ozon. Печать этикетки невозможна.",
 19        ["HAS_INCORRECT_STATUS"] = "Статус отправления на Ozon не позволяет отгрузить заказ и распечатать этикетку.",
 110        ["HAS_INCORRECT_PRODUCT_QUANTITY"] = "Количество товара в системе не совпадает с количеством в отправлении Ozon.
 111        ["UNKNOWN_PRODUCT_DEFINED"] = "Указан неверный идентификатор товара в системе продавца.",
 112        ["UNKNOW_PRODUCT"] = "Указан неверный идентификатор товара в системе продавца.",
 113        ["POSTING_IN_ARBITRATION"] = "Отправление на Ozon в арбитраже. Сначала завершите спор с покупателем.",
 114        ["DELIVERY_METHOD_NOT_FOUND"] = "Способ доставки не найден на Ozon.",
 115        ["POSTING_ALREADY_SHIPPED"] = "Отправление уже отгружено на Ozon.",
 116        ["EXEMPLAR_INFO_NOT_FILLED_COMPLETELY"] =
 117            "Не заполнены данные экземпляров товара. Повторите печать — система запросит код маркировки «Честный Знак», 
 118            "Если форма не появляется, откройте это FBS-отправление в личном кабинете Ozon и заполните данные там.",
 119    };
 20
 21    public static bool TryGetOzonErrorCode(string? rawError, out string code)
 22    {
 923        code = string.Empty;
 924        if (string.IsNullOrWhiteSpace(rawError))
 25        {
 026            return false;
 27        }
 28
 8629        foreach (var knownCode in ShipErrorMessages.Keys)
 30        {
 3831            if (rawError.Contains(knownCode, StringComparison.OrdinalIgnoreCase))
 32            {
 833                code = knownCode;
 834                return true;
 35            }
 36        }
 37
 138        return false;
 839    }
 40
 41    public static bool NeedsCurrentOzonStatus(string? rawError) =>
 042        (TryGetOzonErrorCode(rawError, out var code) &&
 043         code.Equals("HAS_INCORRECT_STATUS", StringComparison.OrdinalIgnoreCase)) ||
 044        (!string.IsNullOrWhiteSpace(rawError) &&
 045         rawError.Contains("BadRequest", StringComparison.OrdinalIgnoreCase) &&
 046         !TryGetOzonErrorCode(rawError, out _));
 47
 48    public static string FormatShipmentError(string shipmentNumber, string? rawError, string? ozonStatusName = null)
 49    {
 650        var shipmentLabel = string.IsNullOrWhiteSpace(shipmentNumber) ? "заказ" : shipmentNumber;
 51
 652        if (TryGetOzonErrorCode(rawError, out var code))
 53        {
 554            if (code.Equals("HAS_INCORRECT_STATUS", StringComparison.OrdinalIgnoreCase))
 55            {
 256                return string.IsNullOrWhiteSpace(ozonStatusName)
 257                    ? $"{shipmentLabel}: Статус отправления на Ozon не позволяет отгрузить заказ и распечатать этикетку.
 258                    : $"{shipmentLabel}: Статус Ozon «{ozonStatusName}» не позволяет отгрузить отправление и распечатать
 59            }
 60
 361            if (ShipErrorMessages.TryGetValue(code, out var friendly))
 62            {
 363                return $"{shipmentLabel}: {friendly}";
 64            }
 65        }
 66
 167        if (!string.IsNullOrWhiteSpace(rawError) &&
 168            rawError.Contains("Unknown posting number", StringComparison.OrdinalIgnoreCase))
 69        {
 070            return $"{shipmentLabel}: Ozon временно не нашёл отправление — статус ещё обновляется. " +
 071                   "Подождите 1–2 минуты и повторите печать.";
 72        }
 73
 174        if (!string.IsNullOrWhiteSpace(rawError) &&
 175            rawError.Contains("missing a required role", StringComparison.OrdinalIgnoreCase))
 76        {
 77            // Ozon отдаёт этот текст и для настоящей нехватки роли, и (чаще) как временную
 78            // задержку сразу после отгрузки — наравне с NO_POSTINGS_FOR_BATCH_DOWNLOAD для той
 79            // же ситуации. Поэтому сначала предполагаем задержку, а роль — как запасной вариант.
 180            return $"{shipmentLabel}: Ozon пока не может сформировать этикетку сразу после отгрузки " +
 181                   "— это частая временная задержка на стороне Ozon, не обязательно проблема ключа. " +
 182                   "Подождите 1-2 минуты и повторите печать. Если ошибка повторяется постоянно, " +
 183                   "проверьте роли ключа: Настройки → API-ключи → редактировать ключ → раздел «Роли» " +
 184                   $"(см. https://docs.ozon.ru/api/seller/). Ответ Ozon: «{rawError}».";
 85        }
 86
 087        if (!string.IsNullOrWhiteSpace(rawError) &&
 088            rawError.Contains("BadRequest", StringComparison.OrdinalIgnoreCase))
 89        {
 090            var statusSuffix = string.IsNullOrWhiteSpace(ozonStatusName)
 091                ? "Проверьте статус заказа в личном кабинете Ozon."
 092                : $"Текущий статус: «{ozonStatusName}».";
 093            return $"{shipmentLabel}: Ozon отклонил отгрузку отправления. {statusSuffix} Ответ Ozon: «{rawError}».";
 94        }
 95
 096        return $"{shipmentLabel}: {(string.IsNullOrWhiteSpace(rawError) ? "неизвестная ошибка" : rawError)}";
 97    }
 98}