| | | 1 | | namespace Services.BitrixStockServices; |
| | | 2 | | |
| | | 3 | | /// <summary> |
| | | 4 | | /// Выбирает строку складского снимка только для того же производителя, что указан в Ozon offer_id. |
| | | 5 | | /// Поиск по одному артикулу намеренно запрещён: это могло накатить остаток другого бренда. |
| | | 6 | | /// </summary> |
| | | 7 | | public static class BitrixStockWarehouseSnapshotMatching |
| | | 8 | | { |
| | 14 | 9 | | public sealed record SnapshotRow<T>(string Manufacturer, string? MarketPrefix, T Value); |
| | | 10 | | |
| | 10 | 11 | | public sealed record MatchResult<T>(bool IsMatch, T? Value, string Note); |
| | | 12 | | |
| | | 13 | | public static MatchResult<T> Match<T>( |
| | | 14 | | string offerId, |
| | | 15 | | IEnumerable<SnapshotRow<T>> snapshots) |
| | | 16 | | { |
| | 3 | 17 | | var article = BitrixStockOrphanOfferMatching.ExtractArticle(offerId); |
| | 3 | 18 | | var prefix = BitrixStockOrphanOfferMatching.ExtractMarketPrefix(offerId); |
| | 3 | 19 | | if (string.IsNullOrWhiteSpace(prefix)) |
| | 0 | 20 | | return new MatchResult<T>(false, default, |
| | 0 | 21 | | $"Остаток → 0: в Ozon offer_id «{offerId}» нет MarketPrefix; fallback по артикулу «{article}» запрещён." |
| | | 22 | | |
| | 3 | 23 | | var rows = snapshots.ToList(); |
| | 6 | 24 | | var match = rows.FirstOrDefault(s => string.Equals(s.MarketPrefix, prefix, StringComparison.OrdinalIgnoreCase)); |
| | 3 | 25 | | if (match != null) |
| | 1 | 26 | | return new MatchResult<T>(true, match.Value, string.Empty); |
| | | 27 | | |
| | 2 | 28 | | var knownManufacturers = rows |
| | 2 | 29 | | .Select(s => string.IsNullOrWhiteSpace(s.MarketPrefix) |
| | 2 | 30 | | ? $"{s.Manufacturer} (без кода)" |
| | 2 | 31 | | : $"{s.Manufacturer} ({s.MarketPrefix})") |
| | 2 | 32 | | .Distinct(StringComparer.OrdinalIgnoreCase) |
| | 2 | 33 | | .ToList(); |
| | 2 | 34 | | var source = knownManufacturers.Count == 0 ? "нет строк 1С" : string.Join(", ", knownManufacturers); |
| | 2 | 35 | | return new MatchResult<T>(false, default, |
| | 2 | 36 | | $"Остаток → 0: Ozon={prefix}, snapshot={source}; fallback по артикулу «{article}» запрещён."); |
| | | 37 | | } |
| | | 38 | | } |