| | | 1 | | using OzonDomains.Models; |
| | | 2 | | |
| | | 3 | | namespace Services.ApiServices._1CApi.Nomenclature; |
| | | 4 | | |
| | | 5 | | /// <summary>Итог разрешения номенклатуры одной позиции.</summary> |
| | | 6 | | /// <param name="RefKey">Карточка 1С; null — карточки нет (для «только найти» или при неоднозначности).</param> |
| | | 7 | | /// <param name="Created">Карточка создана этим вызовом.</param> |
| | | 8 | | /// <param name="DisplayName">Название и артикул созданной карточки (для сообщения «создана номенклатура»).</param> |
| | | 9 | | /// <param name="Reason">Причина, почему карточки нет или как она найдена (вариант артикула, бренд по названию).</param> |
| | | 10 | | /// <param name="Status">Статус нового поиска; null, когда решал прежний поиск.</param> |
| | | 11 | | /// <param name="FoundByVariant">Найдена по «похожему» артикулу — показываем с пометкой.</param> |
| | 23 | 12 | | public sealed record NomenclatureResolution( |
| | 25 | 13 | | Guid? RefKey, |
| | 23 | 14 | | bool Created, |
| | 1 | 15 | | string DisplayName, |
| | 4 | 16 | | string? Reason, |
| | 9 | 17 | | NomenclatureMatchStatus? Status, |
| | 24 | 18 | | bool FoundByVariant) |
| | | 19 | | { |
| | | 20 | | /// <summary> |
| | | 21 | | /// Артикул для поиска, как его выбирал <c>OneCTransferManager</c> до модуля: часть ключа товара до «=», если в ней |
| | | 22 | | /// есть разделители (иначе очищенный артикул заказа). Нужен реализации по умолчанию, чтобы поведение не менялось. |
| | | 23 | | /// </summary> |
| | | 24 | | public static string LegacySearchArticle(Order order) |
| | | 25 | | { |
| | 7 | 26 | | var productKeyArticle = order.ProductKey?.Split('=', 2)[0]?.Trim(); |
| | 39 | 27 | | if (!string.IsNullOrWhiteSpace(productKeyArticle) && productKeyArticle.Any(ch => !char.IsLetterOrDigit(ch))) |
| | 2 | 28 | | return productKeyArticle; |
| | | 29 | | |
| | 5 | 30 | | return order.Article?.Trim() ?? string.Empty; |
| | | 31 | | } |
| | | 32 | | |
| | | 33 | | /// <summary>Запомнить причину для позиции без карточки (ключ — артикул); пустую причину не пишем.</summary> |
| | | 34 | | public static void NoteReason(IDictionary<string, string> reasons, string article, string? reason) |
| | | 35 | | { |
| | 3 | 36 | | if (!string.IsNullOrWhiteSpace(reason)) |
| | 1 | 37 | | reasons[article] = reason; |
| | 3 | 38 | | } |
| | | 39 | | |
| | | 40 | | /// <summary>« — причина» для строки «не найдена номенклатура»; без причины (прежний поиск) пусто, текст не меняется |
| | | 41 | | public static string ReasonSuffix(IReadOnlyDictionary<string, string> reasons, string article) |
| | 5 | 42 | | => reasons.TryGetValue(article, out var reason) ? $" — {reason}" : string.Empty; |
| | | 43 | | } |