< Summary

Information
Class: Services.AiAssistant.AiOrderActionSuggestor
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/AiAssistant/AiOrderActionSuggestor.cs
Line coverage
100%
Covered lines: 65
Uncovered lines: 0
Coverable lines: 65
Total lines: 104
Line coverage: 100%
Branch coverage
97%
Covered branches: 35
Total branches: 36
Branch coverage: 97.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
Suggest()97.22%3636100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/AiAssistant/AiOrderActionSuggestor.cs

#LineLine coverage
 1using Services.ApiServices.OpenRouterApi.Models;
 2
 3namespace Services.AiAssistant;
 4
 5/// <summary>
 6/// Чипы для контекста «заказ».
 7/// Синие (read) — история заказа, данные по заказу.
 8/// Серые (nav)  — открыть в таблице, архив.
 9///
 10/// ПРАВИЛО: добавляй сюда новые read-действия для заказа.
 11/// Каждый чип должен открывать данные, а не инициировать изменение.
 12/// </summary>
 13public sealed class AiOrderActionSuggestor : IAiActionSuggestor
 14{
 115    private static readonly HashSet<string> DetailTools = new(StringComparer.Ordinal)
 116    {
 117        "order_detail", "order_history", "order_product"
 118    };
 19
 120    private static readonly HashSet<string> PresetTools = new(StringComparer.Ordinal)
 121    {
 122        "orders_today", "cancelled_orders_today", "unprofitable_orders", "no_supplier_orders"
 123    };
 24
 125    private static readonly HashSet<string> HistoryNavTools = new(StringComparer.Ordinal)
 126    {
 127        "user_actions_today", "order_history_recent"
 128    };
 29
 30    public IEnumerable<AiActionLinkDto> Suggest(AiSuggestionContext ctx)
 31    {
 2232        var toolName = ctx.ToolName ?? "";
 2233        var orders   = ctx.Orders;
 34
 35        // Журнал изменений для истории-инструментов (без заказов в ответе)
 2236        if (HistoryNavTools.Contains(toolName))
 37        {
 238            yield return new AiActionLinkDto
 239            {
 240                Label = "Журнал изменений",
 241                Url   = "/OrderHistory/Index",
 242                Kind  = "orders",
 243                IsNav = true
 244            };
 245            yield break;
 46        }
 47
 2148        if (orders.Count == 0) yield break;
 49
 1950        var distinct = AiOrderAnalysisService.DeduplicateSummaries(orders);
 5251        var ids      = string.Join(",", distinct.Select(o => o.Id));
 1952        var usePreset = PresetTools.Contains(toolName);
 53
 54        // ── Nav: открыть в таблице (серый) ──────────────────────────────────
 1955        yield return new AiActionLinkDto
 1956        {
 1957            Label = distinct.Count == 1
 1958                ? "Открыть заказ в таблице"
 1959                : $"Открыть {distinct.Count} заказ(ов) в таблице",
 1960            Url          = "/Orders/Index?page=1",
 1961            Kind         = "orders",
 1962            FilterIds    = usePreset ? null : ids,
 1963            FilterPreset = usePreset ? toolName : null,
 1964            IsNav        = true
 1965        };
 66
 67        // ── Для одного заказа — history (read/синий) ─────────────────────────
 1968        if (distinct.Count == 1 && DetailTools.Contains(toolName))
 69        {
 470            yield return new AiActionLinkDto
 471            {
 472                Label = "История заказа",
 473                Url   = $"/OrderHistory/GetOrderHistory?orderId={distinct[0].Id}",
 474                Kind  = "history"
 475            };
 76
 477            if (distinct[0].IsArchived)
 78            {
 179                yield return new AiActionLinkDto
 180                {
 181                    Label = "Архив заказов",
 182                    Url   = "/Studio2/OrderArchive",
 183                    Kind  = "archive",
 184                    IsNav = true
 185                };
 86            }
 87        }
 88
 89        // ── Открыть в таблице для прочих тулов ───────────────────────────────
 1990        if (!usePreset && orders.Count > 0 && !DetailTools.Contains(toolName) &&
 1991            toolName is not "orders_summary" and not "transaction_types_info" and not "orders_filter"
 1992                     and not "ozon_live_product" and not "bitrix_stock_article" and not "")
 93        {
 494            yield return new AiActionLinkDto
 495            {
 496                Label        = "Открыть в таблице заказов",
 497                Url          = "/Orders/Index?page=1",
 498                Kind         = "orders",
 499                FilterPreset = toolName,
 4100                IsNav        = true
 4101            };
 102        }
 19103    }
 104}

Methods/Properties

.cctor()
Suggest()