< Summary

Information
Class: Services.ApiServices.MlAutoApi.MlAutoValueParser
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/MlAutoApi/MlAutoOrderModels.cs
Line coverage
100%
Covered lines: 15
Uncovered lines: 0
Coverable lines: 15
Total lines: 56
Line coverage: 100%
Branch coverage
95%
Covered branches: 23
Total branches: 24
Branch coverage: 95.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
ParseDate(...)83.33%66100%
ParseDecimal(...)100%44100%
ParseFlag(...)100%1010100%
ParseQuantity(...)100%44100%

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>
 9public sealed record MlAutoOrderItemInfo(
 10    string Pin,
 11    string Brand,
 12    decimal Quantity,
 13    string StatusCode,
 14    decimal? Price,
 15    decimal? Sum,
 16    bool Cashless,
 17    bool Confirmed,
 18    bool Shipped,
 19    bool Rejected,
 20    DateTime? EstimatedDelivery,
 21    string ItemComment,
 22    string OrderComment);
 23
 24/// <summary>Разбор скалярных значений ML-Auto: все поля приходят строками, даты — в формате yyyyMMddHHmmss.</summary>
 25public static class MlAutoValueParser
 26{
 127    private static readonly string[] DateFormats = ["yyyyMMddHHmmss", "yyyyMMddHHmm", "yyyyMMdd"];
 28
 29    public static DateTime? ParseDate(string? value)
 30    {
 7131        if (string.IsNullOrWhiteSpace(value)) return null;
 2932        var trimmed = value.Trim();
 2933        return DateTime.TryParseExact(trimmed, DateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var e
 2934            ? exact
 2935            : DateTime.TryParse(trimmed, CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsed) ? parsed : n
 36    }
 37
 38    public static decimal? ParseDecimal(string? value) =>
 12839        decimal.TryParse((value ?? string.Empty).Replace(',', '.'), NumberStyles.Any, CultureInfo.InvariantCulture, out 
 12840            ? result
 12841            : null;
 42
 43    public static bool ParseFlag(string? value) =>
 8844        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    {
 4150        if (string.IsNullOrWhiteSpace(value)) return null;
 11151        var cleaned = new string(value.Where(character => !char.IsWhiteSpace(character)).ToArray())
 3552            .Trim('>', '<', '=', '~', '+')
 3553            .Replace(',', '.');
 3554        return decimal.TryParse(cleaned, NumberStyles.Number, CultureInfo.InvariantCulture, out var result) ? result : n
 55    }
 56}