< Summary

Information
Class: Services.ApiServices._1CApi.Stock.WarehouseStockPosition
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/Stock/OneCWarehouseStockModels.cs
Line coverage
100%
Covered lines: 5
Uncovered lines: 0
Coverable lines: 5
Total lines: 114
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_NomenclatureKey()100%11100%
get_Quantity()100%11100%
get_ArticleNorm()100%11100%
get_Producer()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/Stock/OneCWarehouseStockModels.cs

#LineLine coverage
 1namespace Services.ApiServices._1CApi.Stock;
 2
 3/// <summary>Режим фильтра по сроку поступления на склад.</summary>
 4public enum StockAgeFilterMode
 5{
 6    /// <summary>Без ограничения по дате прихода.</summary>
 7    None,
 8
 9    /// <summary>Позиции, по которым не было прихода за последние N дней.</summary>
 10    OlderThanDays,
 11
 12    /// <summary>Позиции, приходившие на склад в заданном диапазоне дат.</summary>
 13    ReceiptBetween
 14}
 15
 16/// <summary>
 17/// Корзина давности — самое свежее окно оборотов, в котором был приход на склад.
 18/// Точной даты регистр не отдаёт (параметр Periodicity в 1С Fresh не поддерживается),
 19/// поэтому для сортировки всего склада используется именно она.
 20/// </summary>
 21public enum StockAgeBucket
 22{
 23    Upto30 = 0,
 24    Upto90 = 1,
 25    Upto180 = 2,
 26    Upto365 = 3,
 27    Upto730 = 4,
 28    Over730 = 5
 29}
 30
 31/// <summary>Источник прихода, по которому ограничивается набор позиций склада.</summary>
 32public enum ReceiptDocumentFilter
 33{
 34    All,
 35    ReceiptInvoice,
 36    StockTransfer
 37}
 38
 39/// <summary>Параметры выборки остатков склада.</summary>
 40public sealed record OneCWarehouseStockQuery(
 41    Guid WarehouseKey,
 42    StockAgeFilterMode Mode = StockAgeFilterMode.None,
 43    int? OlderThanDays = null,
 44    DateTime? ReceiptFrom = null,
 45    DateTime? ReceiptTo = null,
 46    string? ArticleSearch = null,
 47    string? ProducerSearch = null,
 48    decimal MinQuantity = 0m,
 49    string Sort = "article",
 50    bool Desc = false,
 51    int Page = 1,
 52    int PageSize = 25,
 53    bool ForceRefresh = false,
 54    ReceiptDocumentFilter DocumentFilter = ReceiptDocumentFilter.All,
 55    Guid? SupplierKey = null);
 56
 57/// <summary>
 58/// Позиция склада до обогащения — то, что кэшируется целиком по складу.
 59/// Производитель и нормализованный артикул берутся из локальной карты соответствий, без обращения
 60/// к 1С: их достаточно для поиска и сортировки по всем позициям склада. Артикул в исходном
 61/// написании и наименование в карте не хранятся — они догружаются из 1С только для видимой страницы.
 62/// </summary>
 11963public sealed record WarehouseStockPosition(
 42864    Guid NomenclatureKey,
 13865    decimal Quantity,
 6766    string? ArticleNorm,
 19067    string? Producer);
 68
 69/// <summary>Снимок остатков склада на момент загрузки.</summary>
 70public sealed record WarehouseStockSnapshot(
 71    Guid WarehouseKey,
 72    IReadOnlyList<WarehouseStockPosition> Positions,
 73    DateTime LoadedAtUtc);
 74
 75/// <summary>Последний приход позиции на конкретный склад.</summary>
 76public sealed record LastReceiptInfo(
 77    DateTime Date,
 78    string? Number,
 79    Guid RefKey,
 80    string Kind,
 81    Guid? SupplierKey = null);
 82
 83/// <summary>Строка таблицы раздела.</summary>
 84public sealed record OneCWarehouseStockRow(
 85    Guid NomenclatureKey,
 86    string? Article,
 87    string? Name,
 88    string? Producer,
 89    decimal Quantity,
 90    DateTime? LastReceiptDate,
 91    int? DaysOnStock,
 92    string? LastReceiptDocNumber,
 93    string? LastReceiptDocKind,
 94    StockAgeBucket? AgeBucket,
 95    string? LastReceiptSupplier = null);
 96
 97/// <summary>Результат выборки: страница строк плюс сводка по всему отфильтрованному набору.</summary>
 98public sealed record OneCWarehouseStockResult(
 99    Guid WarehouseKey,
 100    string WarehouseName,
 101    IReadOnlyList<OneCWarehouseStockRow> Rows,
 102    int TotalCount,
 103    int TotalPositions,
 104    decimal TotalQuantityFiltered,
 105    int Page,
 106    int PageSize,
 107    DateTime SnapshotAtUtc,
 108    bool Failed,
 109    string? Warning)
 110{
 111    /// <summary>1С недоступна или запрос не удался — таблица пустая, причина в Warning.</summary>
 112    public static OneCWarehouseStockResult Failure(Guid warehouseKey, string warehouseName, string error)
 113        => new(warehouseKey, warehouseName, [], 0, 0, 0m, 1, 0, DateTime.UtcNow, true, error);
 114}