< Summary

Information
Class: Services.ApiServices.MlAutoApi.MlAutoOrderItemInfo
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/MlAutoApi/MlAutoOrderModels.cs
Line coverage
85%
Covered lines: 12
Uncovered lines: 2
Coverable lines: 14
Total lines: 56
Line coverage: 85.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_Pin()100%11100%
get_Brand()100%11100%
get_Quantity()100%11100%
get_StatusCode()100%11100%
get_Price()100%11100%
get_Sum()100%210%
get_Cashless()100%11100%
get_Confirmed()100%11100%
get_Shipped()100%11100%
get_Rejected()100%11100%
get_EstimatedDelivery()100%11100%
get_ItemComment()100%210%
get_OrderComment()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/MlAutoApi/MlAutoOrderModels.cs

#LineLine coverage
 1using System.Globalization;
 2
 3namespace Services.ApiServices.MlAutoApi;
 4
 5/// <summary>Строка списка <c>GetMyOrders</c>: API отдаёт только номер и дату создания.</summary>
 6public sealed record MlAutoOrderSummary(string Number, DateTime? CreatedAt);
 7
 8/// <summary>Позиция заказа из <c>GetOrderByNumber</c>; статус приходит числовым кодом без справочника.</summary>
 229public sealed record MlAutoOrderItemInfo(
 4510    string Pin,
 2011    string Brand,
 2112    decimal Quantity,
 4213    string StatusCode,
 114    decimal? Price,
 015    decimal? Sum,
 116    bool Cashless,
 3517    bool Confirmed,
 3918    bool Shipped,
 4019    bool Rejected,
 2020    DateTime? EstimatedDelivery,
 021    string ItemComment,
 2222    string OrderComment);
 23
 24/// <summary>Разбор скалярных значений ML-Auto: все поля приходят строками, даты — в формате yyyyMMddHHmmss.</summary>
 25public static class MlAutoValueParser
 26{
 27    private static readonly string[] DateFormats = ["yyyyMMddHHmmss", "yyyyMMddHHmm", "yyyyMMdd"];
 28
 29    public static DateTime? ParseDate(string? value)
 30    {
 31        if (string.IsNullOrWhiteSpace(value)) return null;
 32        var trimmed = value.Trim();
 33        return DateTime.TryParseExact(trimmed, DateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var e
 34            ? exact
 35            : DateTime.TryParse(trimmed, CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsed) ? parsed : n
 36    }
 37
 38    public static decimal? ParseDecimal(string? value) =>
 39        decimal.TryParse((value ?? string.Empty).Replace(',', '.'), NumberStyles.Any, CultureInfo.InvariantCulture, out 
 40            ? result
 41            : null;
 42
 43    public static bool ParseFlag(string? value) =>
 44        value is not null && value.Trim() is "1" or "Y" or "true" or "True";
 45
 46    /// <summary>Наличие приходит в разных форматах в зависимости от склада: «2», «&gt;10», «20&gt;», « 219,00».
 47    /// Знаки сравнения означают «не менее указанного» и отбрасываются с обеих сторон, дробная часть — с запятой или точ
 48    public static decimal? ParseQuantity(string? value)
 49    {
 50        if (string.IsNullOrWhiteSpace(value)) return null;
 51        var cleaned = new string(value.Where(character => !char.IsWhiteSpace(character)).ToArray())
 52            .Trim('>', '<', '=', '~', '+')
 53            .Replace(',', '.');
 54        return decimal.TryParse(cleaned, NumberStyles.Number, CultureInfo.InvariantCulture, out var result) ? result : n
 55    }
 56}