< Summary

Information
Class: Services.BitrixStockServices.BitrixStockApplyBatchMatcher
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/BitrixStockServices/BitrixStockApplyBatchMatcher.cs
Line coverage
100%
Covered lines: 11
Uncovered lines: 0
Coverable lines: 11
Total lines: 35
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
FindItem(...)100%1010100%
IsTooFrequentError(...)100%22100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/BitrixStockServices/BitrixStockApplyBatchMatcher.cs

#LineLine coverage
 1using Services.ApiServices.OzonApi.Filters;
 2
 3namespace Services.BitrixStockServices;
 4
 5/// <summary>Сопоставление ответа Ozon на пакетное обновление остатков со строками отчёта.</summary>
 6internal static class BitrixStockApplyBatchMatcher
 7{
 8    /// <summary>
 9    /// Находит отправленную позицию для строки ответа Ozon. Сначала по <c>offer_id + warehouse_id</c>: Ozon
 10    /// принимает обновление по offer_id и возвращает свой product_id, а в отчёте он может быть устаревшим
 11    /// (карточку пересоздали или удалили). Раньше строка ответа искалась только по <c>product_id</c>: при
 12    /// несовпадении она терялась, позиция считалась необработанной и повторялась по одной, а Ozon отвечал
 13    /// «слишком часто» (на деле остаток уже был обновлён пакетом). Запасной вариант — <c>product_id + warehouse_id</c>.
 14    /// </summary>
 15    public static BitrixStockPushItemDto? FindItem(IReadOnlyList<BitrixStockPushItemDto> items, UpdateStockResult row)
 16    {
 817        if (!string.IsNullOrWhiteSpace(row.OfferId))
 18        {
 619            var byOffer = items.FirstOrDefault(i =>
 1320                i.WarehouseId == row.WarehouseId &&
 1321                string.Equals(i.OfferId, row.OfferId, StringComparison.OrdinalIgnoreCase));
 622            if (byOffer != null)
 423                return byOffer;
 24        }
 25
 426        return row.ProductId > 0
 327            ? items.FirstOrDefault(i => i.ProductId == row.ProductId && i.WarehouseId == row.WarehouseId)
 428            : null;
 29    }
 30
 31    /// <summary>Ошибка частоты обновления остатка у Ozon: помогает повтор через 1–2 минуты (текст — из <see cref="Bitri
 32    public static bool IsTooFrequentError(string? error) =>
 733        !string.IsNullOrWhiteSpace(error) &&
 734        error.Contains("слишком часто", StringComparison.OrdinalIgnoreCase);
 35}