< Summary

Information
Class: Services.SupplierStatusServices.OrderSupplierStateRef
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/SupplierStatusServices/SupplierStatusContracts.cs
Line coverage
100%
Covered lines: 11
Uncovered lines: 0
Coverable lines: 11
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
.ctor(...)100%11100%
get_StateId()100%11100%
get_OrderId()100%11100%
get_ProviderKey()100%11100%
get_Stage()100%11100%
get_CartItemId()100%11100%
get_ExternalBasketItemId()100%11100%
get_ExternalOrderNumber()100%11100%
get_ExternalOrderId()100%11100%
get_ExternalLineId()100%11100%
get_CurrentSupplierStatusId()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>
 8209public sealed record OrderSupplierStateRef(
 3010    long StateId,
 158911    int OrderId,
 56112    string ProviderKey,
 55813    string Stage,
 114    long? CartItemId,
 1015    string? ExternalBasketItemId,
 11316    string? ExternalOrderNumber,
 8617    string? ExternalOrderId,
 118    string? ExternalLineId,
 82119    int? CurrentSupplierStatusId);
 20
 21/// <summary>Результат опроса поставщика по одной строке состояния.</summary>
 22public sealed record SupplierStatusSnapshot
 23{
 24    public required int OrderId { get; init; }
 25
 26    /// <summary><see cref="SupplierStatusKind.Cart"/> или <see cref="SupplierStatusKind.Order"/>.</summary>
 27    public required string Kind { get; init; }
 28
 29    /// <summary>Код статуса у поставщика. Может отсутствовать — тогда статус ищется по имени.</summary>
 30    public string? ExternalCode { get; init; }
 31
 32    public required string StatusName { get; init; }
 33
 34    public string? ExternalOrderNumber { get; init; }
 35
 36    public string? ExternalOrderId { get; init; }
 37
 38    public string? ExternalLineId { get; init; }
 39
 40    public decimal? QuantityConfirmed { get; init; }
 41
 42    public decimal? QuantityShipped { get; init; }
 43
 44    public decimal? QuantityRejected { get; init; }
 45
 46    public DateTime? ExpectedDeliveryAt { get; init; }
 47
 48    public DateTime? StatusChangedAt { get; init; }
 49
 50    /// <summary>
 51    /// Ошибка опроса именно по этой строке. Записывается в SyncError, статус при этом
 52    /// не меняется: недоступность API не должна выглядеть как смена состояния заказа.
 53    /// </summary>
 54    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}