< Summary

Information
Class: Services.SupplierStatusServices.SupplierStatusSnapshot
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/SupplierStatusServices/SupplierStatusContracts.cs
Line coverage
100%
Covered lines: 13
Uncovered lines: 0
Coverable lines: 13
Total lines: 73
Line coverage: 100%
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
get_OrderId()100%11100%
get_Kind()100%11100%
get_ExternalCode()100%11100%
get_StatusName()100%11100%
get_ExternalOrderNumber()100%11100%
get_ExternalOrderId()100%11100%
get_ExternalLineId()100%11100%
get_QuantityConfirmed()100%11100%
get_QuantityShipped()100%11100%
get_QuantityRejected()100%11100%
get_ExpectedDeliveryAt()100%11100%
get_StatusChangedAt()100%11100%
get_Error()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/SupplierStatusServices/SupplierStatusContracts.cs

#LineLine coverage
 1using OzonDomains.Models.SupplierStatuses;
 2
 3namespace Services.SupplierStatusServices;
 4
 5/// <summary>
 6/// Минимум данных о строке состояния, который нужен провайдеру для опроса поставщика.
 7/// Провайдер не получает саму сущность, чтобы не тащить трекинг EF в HTTP-вызовы.
 8/// </summary>
 9public sealed record OrderSupplierStateRef(
 10    long StateId,
 11    int OrderId,
 12    string ProviderKey,
 13    string Stage,
 14    long? CartItemId,
 15    string? ExternalBasketItemId,
 16    string? ExternalOrderNumber,
 17    string? ExternalOrderId,
 18    string? ExternalLineId,
 19    int? CurrentSupplierStatusId);
 20
 21/// <summary>Результат опроса поставщика по одной строке состояния.</summary>
 22public sealed record SupplierStatusSnapshot
 23{
 148824    public required int OrderId { get; init; }
 25
 26    /// <summary><see cref="SupplierStatusKind.Cart"/> или <see cref="SupplierStatusKind.Order"/>.</summary>
 89127    public required string Kind { get; init; }
 28
 29    /// <summary>Код статуса у поставщика. Может отсутствовать — тогда статус ищется по имени.</summary>
 84130    public string? ExternalCode { get; init; }
 31
 100432    public required string StatusName { get; init; }
 33
 19534    public string? ExternalOrderNumber { get; init; }
 35
 11436    public string? ExternalOrderId { get; init; }
 37
 9138    public string? ExternalLineId { get; init; }
 39
 14540    public decimal? QuantityConfirmed { get; init; }
 41
 5042    public decimal? QuantityShipped { get; init; }
 43
 7944    public decimal? QuantityRejected { get; init; }
 45
 10246    public DateTime? ExpectedDeliveryAt { get; init; }
 47
 7848    public DateTime? StatusChangedAt { get; init; }
 49
 50    /// <summary>
 51    /// Ошибка опроса именно по этой строке. Записывается в SyncError, статус при этом
 52    /// не меняется: недоступность API не должна выглядеть как смена состояния заказа.
 53    /// </summary>
 16054    public string? Error { get; init; }
 55}
 56
 57/// <summary>
 58/// Провайдер статусов одного API-поставщика. Закрывает обе стадии: состояние позиции
 59/// в корзине и состояние оформленного заказа.
 60/// </summary>
 61public interface ISupplierStatusProvider
 62{
 63    /// <summary>Ключ провайдера — см. ApiSupplierSettings.*ProviderKey.</summary>
 64    string ProviderKey { get; }
 65
 66    /// <summary>Актуальное состояние позиций в корзине поставщика.</summary>
 67    Task<IReadOnlyList<SupplierStatusSnapshot>> FetchCartAsync(
 68        IReadOnlyList<OrderSupplierStateRef> states, CancellationToken ct);
 69
 70    /// <summary>Статусы оформленных заказов у поставщика.</summary>
 71    Task<IReadOnlyList<SupplierStatusSnapshot>> FetchOrderAsync(
 72        IReadOnlyList<OrderSupplierStateRef> states, CancellationToken ct);
 73}