< Summary

Information
Class: OzonOrdersWeb.WebServices.Sidebar.NavigationPageRows
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Sidebar/NavigationPageRows.cs
Line coverage
100%
Covered lines: 85
Uncovered lines: 0
Coverable lines: 85
Total lines: 122
Line coverage: 100%
Branch coverage
94%
Covered branches: 17
Total branches: 18
Branch coverage: 94.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
Build(...)92.85%1414100%
Add()100%44100%

File(s)

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

#LineLine coverage
 1namespace OzonOrdersWeb.WebServices.Sidebar;
 2
 3/// <summary>Строка грида навигации /Studio2/Home: пункт меню с группой, подгруппой и назначением.</summary>
 4public sealed record NavigationPageRow(
 5    string Id,
 6    int Order,
 7    string Title,
 8    string Icon,
 9    string Href,
 10    bool External,
 11    string Group,
 12    string GroupIcon,
 13    string? Subgroup,
 14    string Description,
 15    string? Keywords);
 16
 17/// <summary>
 18/// Грид навигации Studio2 (/Studio2/Home) из того же дерева, что боковое меню (<see cref="SidebarNavigationCatalog"/>):
 19/// один пункт — одна строка с назначением раздела. Пункт с адресом, который уже встречался выше, не повторяется.
 20/// </summary>
 21public static class NavigationPageRows
 22{
 23    /// <summary>Назначение разделов: что делают на странице. Ключ — id пункта меню (тест проверяет полноту).</summary>
 124    public static readonly IReadOnlyDictionary<string, string> Descriptions = new Dictionary<string, string>(StringCompa
 125    {
 126        ["orders.grid"] = "Все заказы в одной бесконечной таблице: фильтры и сортировка по всему набору, групповые дейст
 127        ["orders.list"] = "Классический список заказов с карточкой заказа, фильтрами и задачами контроля.",
 128        ["orders.upload.api"] = "Загрузка новых заказов из API маркетплейсов или из файла выгрузки.",
 129        ["orders.upload.file"] = "Импорт заказов только из файла (Excel/CSV) по сохранённому сопоставлению колонок.",
 130        ["orders.upload.percentage"] = "Загрузка отчёта Ozon для проценки: расчёт цен и наценки по позициям.",
 131        ["orders.history"] = "История изменений заказа: поля, транзакции, расчёты, проценки, движения 1С.",
 132        ["orders.control"] = "Заказы, требующие действий по правилам SLA: просрочки и зависшие статусы.",
 133        ["orders.labels"] = "Печать этикеток Ozon для отправлений.",
 134        ["orders.assembly"] = "Лист подбора для склада: что собрать и откуда.",
 135        ["orders.assembly.keys"] = "Ключи внешнего доступа к листам подбора без входа в Studio2.",
 136        ["orders.transactions"] = "Журнал проведённых документов по заказам (транзакции) с фильтрами и печатью.",
 137        ["orders.transaction.jobs"] = "Фоновые задания проведения транзакций: очередь, статус и ошибки.",
 138        ["orders.time.tracking"] = "Отчёт о времени между этапами обработки заказов.",
 139        ["orders.archive"] = "Архивные заказы: поиск и возврат из архива.",
 140        ["orders.returns.ozon"] = "Возвраты Ozon: акты, статусы и связь с заказами.",
 141        ["orders.returns.journal"] = "Журнал оформленных возвратов по заказам.",
 142        ["orders.returns.ozon.external"] = "Внешний сервис обработки возвратов Ozon (открывается в новой вкладке).",
 143        ["purchases.cart"] = "Корзины и заказы API-поставщиков: проверка, оформление и статусы.",
 144        ["purchases.bitrix.stock"] = "Синхронизация остатков 1С → Bitrix → Ozon: запуски, отчёты, исключения.",
 145        ["settlements"] = "Взаиморасчёты с поставщиками: сальдо, документы, фактуры и их позиции по каждому поставщику."
 146        ["purchases.warehouse.stock"] = "Остатки собственного склада и движение товара.",
 147        ["purchases.onec.stock"] = "Остатки номенклатуры по складам 1С, давность поступления и залежавшийся товар.",
 148        ["purchases.match.files"] = "Сравнение двух файлов прайсов или выгрузок по артикулам.",
 149        ["purchases.interparts.currency"] = "Курсы валют Interparts для пересчёта закупочных цен.",
 150        ["purchases.interparts.access"] = "Какие склады Interparts доступны для заказа и проценки.",
 151        ["analytics.products"] = "Аналитика продаж и оборачиваемости товаров.",
 152        ["analytics.prices"] = "История изменения цен товаров во времени.",
 153        ["analytics.ozon.chat"] = "Переписка с покупателями Ozon: чаты и непрочитанные сообщения.",
 154        ["analytics.ai"] = "AI-ассистент: вопросы по заказам и данным Studio2 на естественном языке.",
 155        ["integrations.onec.fresh"] = "Работа с 1С Fresh: документы, номенклатура и проведение.",
 156        ["integrations.onec.m2"] = "Внешний проект М2 в 1С (открывается в новой вкладке).",
 157        ["integrations.mail.results"] = "Результаты импорта заказов из почтовых вложений.",
 158        ["integrations.mail.rules"] = "Правила разбора писем: отправители, файлы и сопоставления для импорта.",
 159        ["integrations.mail.scheduler"] = "Расписание проверки почты и автоматического импорта.",
 160        ["integrations.files.records"] = "Журнал загруженных файлов и результат их обработки.",
 161        ["integrations.files.mappings"] = "Сопоставления колонок Excel/CSV с полями заказа для импорта.",
 162        ["integrations.feeds.stat"] = "Статистика товарных фидов: выгрузки, ошибки и аномалии.",
 163        ["integrations.feeds.links"] = "Связи поставщиков с фидом: чей товар попадает в выгрузку.",
 164        ["integrations.ozon.webhooks"] = "Входящие push-уведомления Ozon и результат их обработки.",
 165        ["integrations.ozon.clients"] = "Кабинеты Ozon: ключи API, настройки и статусы клиентов.",
 166        ["integrations.suppliers.settings"] = "Ключи и параметры API-поставщиков: склады, адреса доставки, наценки.",
 167        ["integrations.suppliers.audit"] = "Журнал запросов к API поставщиков: ответы, ошибки, время.",
 168        ["integrations.suppliers.consoles"] = "Ручные запросы к API поставщиков: поиск, корзина, заказы.",
 169        ["catalogs.products"] = "Справочник товаров: артикулы, производители, карточки.",
 170        ["catalogs.suppliers"] = "Поставщики: коэффициенты цен, валюта, сроки и связь с контрагентом 1С.",
 171        ["catalogs.manufacturers"] = "Производители Ozon и их сопоставление с брендами.",
 172        ["catalogs.producers"] = "Производители ET и их синонимы.",
 173        ["catalogs.excluded.articles"] = "Артикулы, исключённые из проценки и выгрузок.",
 174        ["catalogs.warehouse"] = "Склады отгрузки Studio2 и их параметры.",
 175        ["catalogs.warehouse.mapping"] = "Связи складов Studio2 с поставщиками, 1С и маркетплейсами.",
 176        ["catalogs.warehouse.excluded"] = "Склады Bitrix, не участвующие в синхронизации остатков.",
 177        ["catalogs.status.app"] = "Статусы заказов Studio2: названия, цвета и порядок.",
 178        ["catalogs.status.transitions"] = "Разрешённые переходы между статусами и их условия.",
 179        ["catalogs.status.supplier"] = "Статусы заказов у поставщиков и их соответствие статусам Studio2.",
 180        ["catalogs.status.client"] = "Статусы клиентов Ozon для отчётов и фильтров.",
 181        ["catalogs.expense.types"] = "Типы расходов для учёта затрат по заказам.",
 182        ["admin.center"] = "Раздел администрирования: роли, пользователи, права и журнал изменений.",
 183        ["admin.access.profiles"] = "Профили доступа пользователей Studio2.",
 184        ["admin.data.scopes"] = "Наборы данных: ограничение видимых записей для ролей и пользователей.",
 185        ["admin.partners"] = "Партнёры: учётные записи, правила видимости заказов, возможности, уведомления и журнал дей
 186        ["admin.job.logs"] = "Журнал фоновых задач: запуски, проведения 1С, вебхуки, импорт.",
 187        ["admin.config"] = "Конфигурация приложения и подключения к базе данных.",
 188        ["system.hangfire.stats"] = "Статистика очередей Hangfire: нагрузка и ошибки фоновых задач.",
 189        ["system.hangfire"] = "Панель Hangfire: задачи, повторы и расписания (открывается в новой вкладке).",
 190        ["system.autoload"] = "Расписания автозагрузки заказов и остатков."
 191    };
 92
 93    public static IReadOnlyList<NavigationPageRow> Build(IReadOnlyList<SidebarNode> tree)
 94    {
 295        var rows = new List<NavigationPageRow>();
 296        var seenHrefs = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
 1697        foreach (var group in tree)
 98        {
 6099            foreach (var node in group.Children ?? [])
 100            {
 24101                if (node.IsLeaf)
 102                {
 14103                    Add(node, group, null);
 14104                    continue;
 105                }
 82106                foreach (var leaf in node.Children ?? [])
 62107                    if (leaf.IsLeaf) Add(leaf, group, node.Title);
 108            }
 109        }
 2110        return rows;
 111
 112        void Add(SidebarNode leaf, SidebarNode group, string? subgroup)
 113        {
 46114            if (!seenHrefs.Add(leaf.Href!)) return;
 44115            rows.Add(new NavigationPageRow(
 44116                leaf.Id, rows.Count, leaf.Title, leaf.Icon, leaf.Href!, leaf.External,
 44117                group.Title, group.Icon, subgroup,
 44118                Descriptions.TryGetValue(leaf.Id, out var description) ? description : string.Empty,
 44119                leaf.Keywords));
 44120        }
 121    }
 122}