| | | 1 | | using OzonDomains.Models; |
| | | 2 | | |
| | | 3 | | namespace OzonOrdersWeb.WebServices.Directories; |
| | | 4 | | |
| | | 5 | | /// <summary>Строка грида «Поставщики по API» на странице поставщиков: карточка интеграции и ссылки на её разделы.</summ |
| | | 6 | | public sealed record ApiSupplierCatalogRow( |
| | | 7 | | string Key, |
| | | 8 | | string Name, |
| | | 9 | | string LogoUrl, |
| | | 10 | | string? LogoMark, |
| | | 11 | | string? LogoClass, |
| | | 12 | | string Description, |
| | | 13 | | string? CurrencyCode, |
| | | 14 | | bool? QuotationEnabled, |
| | | 15 | | string ConsoleUrl, |
| | | 16 | | string? CartUrl, |
| | | 17 | | string? SettingsUrl, |
| | | 18 | | IReadOnlyList<string> LinkedSuppliers); |
| | | 19 | | |
| | | 20 | | /// <summary>Каталог API-интеграций: что умеет каждая, где её консоль, корзина и настройки.</summary> |
| | | 21 | | public static class ApiSupplierCatalog |
| | | 22 | | { |
| | | 23 | | /// <summary>Описание интеграции. CartProvider — значение <c>provider</c> общей корзины SupplierCart; |
| | | 24 | | /// CartController — отдельная корзина (Japarts).</summary> |
| | 0 | 25 | | public sealed record Entry( |
| | 0 | 26 | | string Key, |
| | 0 | 27 | | string Name, |
| | 0 | 28 | | string LogoUrl, |
| | 0 | 29 | | string Description, |
| | 0 | 30 | | string? CartProvider = null, |
| | 0 | 31 | | string? CartController = null, |
| | 0 | 32 | | string? LogoMark = null, |
| | 0 | 33 | | string? LogoClass = null, |
| | 0 | 34 | | string? FixedCurrency = null); |
| | | 35 | | |
| | 0 | 36 | | public static readonly IReadOnlyList<Entry> Entries = |
| | 0 | 37 | | [ |
| | 0 | 38 | | new("Armtek", "Армтек", "/images/armtek-logo.svg", "Проценка, заказы, фактуры, отчёты", "armtek"), |
| | 0 | 39 | | new("ArmtekBy", "Армтек BY", "/images/armtek-logo.svg", "Беларусский аккаунт, проценка и API-консоль", "armtekby |
| | 0 | 40 | | new("ShateM", "Шате‑М", "/images/shate-m-logo.svg", "Товары, проценка, заказы и возвраты"), |
| | 0 | 41 | | new("Japarts", "Japarts", "/images/japarts-logo.jpg", "Проценка, серверная корзина и заказы", CartController: "J |
| | 0 | 42 | | new("Avd", "АВД", "/images/avd-logo.svg", "Проценка (чтение), корзина и заказы (АВД API)", "avd"), |
| | 0 | 43 | | new("Berg", "Берг", "/images/berg-logo-2026.png", "Проценка, справочники и статусы заказов (только чтение)"), |
| | 0 | 44 | | new("Motex", "МоТехС", "/images/motex-logo.png", "Проценка и справочники (только чтение)"), |
| | 0 | 45 | | new("MlAuto", "ML-Auto BY", "https://www.ml-auto.by/media/files/settings/inside-placeholder-logo-mobile.png", |
| | 0 | 46 | | "Проценка, справочники, заказы и возвраты (только чтение)", "mlauto"), |
| | 0 | 47 | | new("MlAutoRu", "ML-Auto RU", "https://www.ml-auto.by/media/files/settings/inside-placeholder-logo-mobile.png", |
| | 0 | 48 | | "Справочники и тестовая проценка (только чтение)", "mlautoru"), |
| | 0 | 49 | | new("ForumAuto", "Форум-Авто (Союз)", "/images/forum-auto-logo.svg", "Проценка и справочники (только чтение)", " |
| | 0 | 50 | | new("ForumAutoInterparts", "Форум-Авто (Интерпартс)", "/images/forum-auto-logo.svg", "Проценка и справочники (то |
| | 0 | 51 | | new("ForumAutoPiter", "Форум-Авто (Питер)", "/images/forum-auto-logo.svg", "Проценка и справочники (только чтени |
| | 0 | 52 | | new("ForumAutoRostov", "Форум-Авто (Ростов)", "/images/forum-auto-logo.svg", "Проценка и справочники (только чте |
| | 0 | 53 | | new("ForumAutoIstra", "Форум-Авто (Истра)", "/images/forum-auto-logo.svg", "Проценка и справочники (только чтени |
| | 0 | 54 | | new("FavoritParts", "Фаворит Союз", "/images/favorit-parts-logo.png", "Проценка, корзина и заказы", "favoritpart |
| | 0 | 55 | | new("FavoritPartsIstra", "Фаворит Истра", "/images/favorit-parts-logo.png", "Проценка, корзина и заказы", "favor |
| | 0 | 56 | | new("FavoritPartsRostov", "Фаворит Ростов", "/images/favorit-parts-logo.png", "Проценка, корзина и заказы", "fav |
| | 0 | 57 | | new("MoskvorechieIstra", "Москворечье (Истра)", "/images/moskvorechie-logo.gif", "Проценка, внешняя корзина и за |
| | 0 | 58 | | LogoClass: "sp-moskvorechie-logo"), |
| | 0 | 59 | | new("MikadoMskHod20", "Микадо МскХод20", "https://mikado-parts.ru/img/MikadoLogo.svg", "WebService: диагностика, |
| | 0 | 60 | | LogoClass: "sp-mikado-logo"), |
| | 0 | 61 | | new("ZZapMoscow", "ZZap Москва", "/images/zzap-logo.svg", "Агрегатор продавцов: поиск без замен, корзина и заказ |
| | 0 | 62 | | LogoClass: "sp-zzap-logo"), |
| | 0 | 63 | | new("ProfitLiga", "Профит-Лига", "/images/profit-liga-logo.svg", "Проценка, корзина и заказы (Ростовский офис)", |
| | 0 | 64 | | LogoClass: "sp-profit-liga-logo"), |
| | 0 | 65 | | new("Nikei", "Nikei", "/images/nikei-logo.svg", "Read-only консоль и подготовка интеграции API", FixedCurrency: |
| | 0 | 66 | | ]; |
| | | 67 | | |
| | | 68 | | /// <summary> |
| | | 69 | | /// Строки грида. <paramref name="settings"/> — настройки по ключу интеграции (валюта, проценка, имя для Форум-Авто) |
| | | 70 | | /// ссылки строит <paramref name="url"/>(controller, action, provider). Настройки показываются только администратору |
| | | 71 | | /// </summary> |
| | | 72 | | public static List<ApiSupplierCatalogRow> Build( |
| | | 73 | | IReadOnlyDictionary<string, ApiSupplierSettings> settings, |
| | | 74 | | IReadOnlyDictionary<string, string> defaultDisplayNames, |
| | | 75 | | IReadOnlyList<SupplierGridRow> suppliers, |
| | | 76 | | bool isAdmin, |
| | | 77 | | Func<string, string, string?, string> url) => |
| | 0 | 78 | | Entries.Select(e => |
| | 0 | 79 | | { |
| | 0 | 80 | | settings.TryGetValue(e.Key, out var s); |
| | 0 | 81 | | var name = e.Key.StartsWith("ForumAuto", StringComparison.Ordinal) |
| | 0 | 82 | | ? s?.DisplayName ?? defaultDisplayNames.GetValueOrDefault(e.Key) ?? e.Name |
| | 0 | 83 | | : e.Name; |
| | 0 | 84 | | var cartUrl = e.CartController != null ? url(e.CartController, "Index", null) |
| | 0 | 85 | | : e.CartProvider != null ? url("SupplierCart", "Index", e.CartProvider) |
| | 0 | 86 | | : null; |
| | 0 | 87 | | return new ApiSupplierCatalogRow( |
| | 0 | 88 | | e.Key, name, e.LogoUrl, e.LogoMark, e.LogoClass, e.Description, |
| | 0 | 89 | | s != null ? s.CurrencyCode.ToString() : e.FixedCurrency, |
| | 0 | 90 | | s?.IsQuotationEnabled, |
| | 0 | 91 | | url(e.Key, "Index", null), |
| | 0 | 92 | | cartUrl, |
| | 0 | 93 | | isAdmin ? url("ApiSupplierSettings", e.Key, null) : null, |
| | 0 | 94 | | suppliers.Where(r => r.ApiProviders.Any(p => p.Key == e.Key)).Select(r => r.Name ?? "—").OrderBy(n = |
| | 0 | 95 | | }) |
| | 0 | 96 | | .ToList(); |
| | | 97 | | } |