< Summary

Information
Class: Services.AiAssistant.AiWriteContextFormatter
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/AiAssistant/AiWriteContextFormatter.cs
Line coverage
100%
Covered lines: 35
Uncovered lines: 0
Coverable lines: 35
Total lines: 61
Line coverage: 100%
Branch coverage
100%
Covered branches: 46
Total branches: 46
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
FormatTransactionProposal(...)100%2020100%
FormatOrderFactsHeader(...)100%2626100%

File(s)

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

#LineLine coverage
 1using System.Text;
 2using OzonDomains.Models;
 3using Services.ApiServices.OpenRouterApi.Models;
 4
 5namespace Services.AiAssistant;
 6
 7/// <summary>Структурированный контекст для LLM при write-транзакциях и редактировании.</summary>
 8public static class AiWriteContextFormatter
 9{
 10    public static string FormatTransactionProposal(AiActionProposalDto proposal, OrderSummaryDto? order)
 11    {
 1012        var sb = new StringBuilder();
 1013        sb.AppendLine("=== Проверка транзакции (факты из БД, не выдумывать) ===");
 1014        sb.AppendLine($"Отправление: {proposal.ShipmentNumber}");
 1015        sb.AppendLine($"ID заказа: {proposal.OrderId}");
 1016        sb.AppendLine($"Текущий AppStatus: «{proposal.CurrentStatus ?? "Не указан"}»");
 17
 1018        if (order != null)
 19        {
 220            sb.AppendLine($"ClientStatus Ozon: «{order.ClientStatus ?? "Не указан"}»");
 221            sb.AppendLine($"Товар: {order.ProductName}");
 222            sb.AppendLine($"Поставщик в заказе: «{order.Supplier ?? "Не указан"}»");
 223            sb.AppendLine($"Склад отгрузки: «{order.ShipmentWarehouseName ?? "Не указан"}»");
 24        }
 25
 1026        var txLabel = proposal.TransactionDto?.TransactionLabel ?? "—";
 1027        sb.AppendLine($"Запрошенная транзакция: «{txLabel}»");
 28
 1029        if (proposal.MissingFields is { Count: > 0 })
 30        {
 231            sb.AppendLine("Нужно уточнить (missingFields):");
 1232            foreach (var field in proposal.MissingFields)
 433                sb.AppendLine($"  • {field}");
 234            sb.AppendLine(
 235                "ВАЖНО: не называй другой AppStatus и не пиши «Отменен»/«Новый», если выше указан иной статус. " +
 236                "Не перечисляй альтернативные транзакции — только missingFields.");
 37        }
 38        else
 839            sb.AppendLine("Проверки пройдены. Карточка подтверждения показана пользователю.");
 40
 1041        return sb.ToString().TrimEnd();
 42    }
 43
 44    public static string FormatOrderFactsHeader(Order order)
 45    {
 1046        var sb = new StringBuilder();
 1047        sb.AppendLine("=== ФАКТЫ ЗАКАЗА (только эти данные; игнорируй историю чата) ===");
 1048        sb.AppendLine($"Отправление: {order.ShipmentNumber}");
 1049        sb.AppendLine($"ID: {order.Id}");
 1050        sb.AppendLine($"Товар: {order.ProductName}");
 1051        sb.AppendLine($"Артикул: {order.Article ?? "—"}");
 1052        sb.AppendLine($"Количество: {order.TrueQuantity} шт.");
 1053        sb.AppendLine($"AppStatus: «{order.AppStatus?.Name ?? "Не указан"}»" +
 1054                      (order.AppStatus?.IsFinal == true ? " (финальный)" : ""));
 1055        sb.AppendLine($"ClientStatus Ozon: «{order.ClientStatus?.Name ?? "Не указан"}»");
 1056        sb.AppendLine($"Поставщик: «{order.Supplier?.Name ?? "Не указан"}»");
 1057        sb.AppendLine($"Склад отгрузки: «{order.ShipmentWarehouse?.Name ?? "Не указан"}»");
 1058        sb.AppendLine($"Ozon-клиент: «{order.OzonClient?.Name ?? "Не указан"}»");
 1059        return sb.ToString().TrimEnd();
 60    }
 61}