< Summary

Information
Class: OzonOrdersWeb.WebServices.Sidebar.NavigationPageRow
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Sidebar/NavigationPageRows.cs
Line coverage
58%
Covered lines: 7
Uncovered lines: 5
Coverable lines: 12
Total lines: 122
Line coverage: 58.3%
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_Id()100%11100%
get_Order()100%11100%
get_Title()100%210%
get_Icon()100%210%
get_Href()100%210%
get_External()100%210%
get_Group()100%11100%
get_GroupIcon()100%210%
get_Subgroup()100%11100%
get_Description()100%11100%
get_Keywords()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Sidebar/NavigationPageRows.cs

#LineLine coverage
 1namespace OzonOrdersWeb.WebServices.Sidebar;
 2
 3/// <summary>Строка грида навигации /Studio2/Home: пункт меню с группой, подгруппой и назначением.</summary>
 444public sealed record NavigationPageRow(
 25    string Id,
 16    int Order,
 07    string Title,
 08    string Icon,
 09    string Href,
 010    bool External,
 4211    string Group,
 012    string GroupIcon,
 113    string? Subgroup,
 4214    string Description,
 4515    string? Keywords);
 16
 17/// <summary>
 18/// Грид навигации Studio2 (/Studio2/Home) из того же дерева, что боковое меню (<see cref="SidebarNavigationCatalog"/>):
 19/// один пункт — одна строка с назначением раздела. Пункт с адресом, который уже встречался выше, не повторяется.
 20/// </summary>
 21public static class NavigationPageRows
 22{
 23    /// <summary>Назначение разделов: что делают на странице. Ключ — id пункта меню (тест проверяет полноту).</summary>
 24    public static readonly IReadOnlyDictionary<string, string> Descriptions = new Dictionary<string, string>(StringCompa
 25    {
 26        ["orders.grid"] = "Все заказы в одной бесконечной таблице: фильтры и сортировка по всему набору, групповые дейст
 27        ["orders.list"] = "Классический список заказов с карточкой заказа, фильтрами и задачами контроля.",
 28        ["orders.upload.api"] = "Загрузка новых заказов из API маркетплейсов или из файла выгрузки.",
 29        ["orders.upload.file"] = "Импорт заказов только из файла (Excel/CSV) по сохранённому сопоставлению колонок.",
 30        ["orders.upload.percentage"] = "Загрузка отчёта Ozon для проценки: расчёт цен и наценки по позициям.",
 31        ["orders.history"] = "История изменений заказа: поля, транзакции, расчёты, проценки, движения 1С.",
 32        ["orders.control"] = "Заказы, требующие действий по правилам SLA: просрочки и зависшие статусы.",
 33        ["orders.labels"] = "Печать этикеток Ozon для отправлений.",
 34        ["orders.assembly"] = "Лист подбора для склада: что собрать и откуда.",
 35        ["orders.assembly.keys"] = "Ключи внешнего доступа к листам подбора без входа в Studio2.",
 36        ["orders.transactions"] = "Журнал проведённых документов по заказам (транзакции) с фильтрами и печатью.",
 37        ["orders.transaction.jobs"] = "Фоновые задания проведения транзакций: очередь, статус и ошибки.",
 38        ["orders.time.tracking"] = "Отчёт о времени между этапами обработки заказов.",
 39        ["orders.archive"] = "Архивные заказы: поиск и возврат из архива.",
 40        ["orders.returns.ozon"] = "Возвраты Ozon: акты, статусы и связь с заказами.",
 41        ["orders.returns.journal"] = "Журнал оформленных возвратов по заказам.",
 42        ["orders.returns.ozon.external"] = "Внешний сервис обработки возвратов Ozon (открывается в новой вкладке).",
 43        ["purchases.cart"] = "Корзины и заказы API-поставщиков: проверка, оформление и статусы.",
 44        ["purchases.bitrix.stock"] = "Синхронизация остатков 1С → Bitrix → Ozon: запуски, отчёты, исключения.",
 45        ["settlements"] = "Взаиморасчёты с поставщиками: сальдо, документы, фактуры и их позиции по каждому поставщику."
 46        ["purchases.warehouse.stock"] = "Остатки собственного склада и движение товара.",
 47        ["purchases.onec.stock"] = "Остатки номенклатуры по складам 1С, давность поступления и залежавшийся товар.",
 48        ["purchases.match.files"] = "Сравнение двух файлов прайсов или выгрузок по артикулам.",
 49        ["purchases.interparts.currency"] = "Курсы валют Interparts для пересчёта закупочных цен.",
 50        ["purchases.interparts.access"] = "Какие склады Interparts доступны для заказа и проценки.",
 51        ["analytics.products"] = "Аналитика продаж и оборачиваемости товаров.",
 52        ["analytics.prices"] = "История изменения цен товаров во времени.",
 53        ["analytics.ozon.chat"] = "Переписка с покупателями Ozon: чаты и непрочитанные сообщения.",
 54        ["analytics.ai"] = "AI-ассистент: вопросы по заказам и данным Studio2 на естественном языке.",
 55        ["integrations.onec.fresh"] = "Работа с 1С Fresh: документы, номенклатура и проведение.",
 56        ["integrations.onec.m2"] = "Внешний проект М2 в 1С (открывается в новой вкладке).",
 57        ["integrations.mail.results"] = "Результаты импорта заказов из почтовых вложений.",
 58        ["integrations.mail.rules"] = "Правила разбора писем: отправители, файлы и сопоставления для импорта.",
 59        ["integrations.mail.scheduler"] = "Расписание проверки почты и автоматического импорта.",
 60        ["integrations.files.records"] = "Журнал загруженных файлов и результат их обработки.",
 61        ["integrations.files.mappings"] = "Сопоставления колонок Excel/CSV с полями заказа для импорта.",
 62        ["integrations.feeds.stat"] = "Статистика товарных фидов: выгрузки, ошибки и аномалии.",
 63        ["integrations.feeds.links"] = "Связи поставщиков с фидом: чей товар попадает в выгрузку.",
 64        ["integrations.ozon.webhooks"] = "Входящие push-уведомления Ozon и результат их обработки.",
 65        ["integrations.ozon.clients"] = "Кабинеты Ozon: ключи API, настройки и статусы клиентов.",
 66        ["integrations.suppliers.settings"] = "Ключи и параметры API-поставщиков: склады, адреса доставки, наценки.",
 67        ["integrations.suppliers.audit"] = "Журнал запросов к API поставщиков: ответы, ошибки, время.",
 68        ["integrations.suppliers.consoles"] = "Ручные запросы к API поставщиков: поиск, корзина, заказы.",
 69        ["catalogs.products"] = "Справочник товаров: артикулы, производители, карточки.",
 70        ["catalogs.suppliers"] = "Поставщики: коэффициенты цен, валюта, сроки и связь с контрагентом 1С.",
 71        ["catalogs.manufacturers"] = "Производители Ozon и их сопоставление с брендами.",
 72        ["catalogs.producers"] = "Производители ET и их синонимы.",
 73        ["catalogs.excluded.articles"] = "Артикулы, исключённые из проценки и выгрузок.",
 74        ["catalogs.warehouse"] = "Склады отгрузки Studio2 и их параметры.",
 75        ["catalogs.warehouse.mapping"] = "Связи складов Studio2 с поставщиками, 1С и маркетплейсами.",
 76        ["catalogs.warehouse.excluded"] = "Склады Bitrix, не участвующие в синхронизации остатков.",
 77        ["catalogs.status.app"] = "Статусы заказов Studio2: названия, цвета и порядок.",
 78        ["catalogs.status.transitions"] = "Разрешённые переходы между статусами и их условия.",
 79        ["catalogs.status.supplier"] = "Статусы заказов у поставщиков и их соответствие статусам Studio2.",
 80        ["catalogs.status.client"] = "Статусы клиентов Ozon для отчётов и фильтров.",
 81        ["catalogs.expense.types"] = "Типы расходов для учёта затрат по заказам.",
 82        ["admin.center"] = "Раздел администрирования: роли, пользователи, права и журнал изменений.",
 83        ["admin.access.profiles"] = "Профили доступа пользователей Studio2.",
 84        ["admin.data.scopes"] = "Наборы данных: ограничение видимых записей для ролей и пользователей.",
 85        ["admin.partners"] = "Партнёры: учётные записи, правила видимости заказов, возможности, уведомления и журнал дей
 86        ["admin.job.logs"] = "Журнал фоновых задач: запуски, проведения 1С, вебхуки, импорт.",
 87        ["admin.config"] = "Конфигурация приложения и подключения к базе данных.",
 88        ["system.hangfire.stats"] = "Статистика очередей Hangfire: нагрузка и ошибки фоновых задач.",
 89        ["system.hangfire"] = "Панель Hangfire: задачи, повторы и расписания (открывается в новой вкладке).",
 90        ["system.autoload"] = "Расписания автозагрузки заказов и остатков."
 91    };
 92
 93    public static IReadOnlyList<NavigationPageRow> Build(IReadOnlyList<SidebarNode> tree)
 94    {
 95        var rows = new List<NavigationPageRow>();
 96        var seenHrefs = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
 97        foreach (var group in tree)
 98        {
 99            foreach (var node in group.Children ?? [])
 100            {
 101                if (node.IsLeaf)
 102                {
 103                    Add(node, group, null);
 104                    continue;
 105                }
 106                foreach (var leaf in node.Children ?? [])
 107                    if (leaf.IsLeaf) Add(leaf, group, node.Title);
 108            }
 109        }
 110        return rows;
 111
 112        void Add(SidebarNode leaf, SidebarNode group, string? subgroup)
 113        {
 114            if (!seenHrefs.Add(leaf.Href!)) return;
 115            rows.Add(new NavigationPageRow(
 116                leaf.Id, rows.Count, leaf.Title, leaf.Icon, leaf.Href!, leaf.External,
 117                group.Title, group.Icon, subgroup,
 118                Descriptions.TryGetValue(leaf.Id, out var description) ? description : string.Empty,
 119                leaf.Keywords));
 120        }
 121    }
 122}