< Summary

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

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Format(...)100%3434100%

File(s)

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

#LineLine coverage
 1using System.Text;
 2using OzonDomains.Models;
 3
 4namespace Services.AiAssistant;
 5
 6/// <summary>
 7/// Хронология заказа для развёрнутого ответа ассистента.
 8/// </summary>
 9public static class AiOrderTimelineFormatter
 10{
 11    public static string Format(Order order, IReadOnlyList<OrderHistory> histories)
 12    {
 2313        var sb = new StringBuilder();
 2314        sb.AppendLine("=== Хронология заказа (для развёрнутого ответа) ===");
 2315        OrderRussianFieldFormatter.AppendKeyPartiesBlock(sb, order);
 2316        OrderRussianFieldFormatter.AppendOrderQuantityBlock(sb, order);
 17
 2318        var events = new List<(DateTime When, string Text)>();
 19
 2320        if (order.ProcessingDate.HasValue)
 21        {
 622            events.Add((
 623                order.ProcessingDate.Value,
 624                $"Заказ принят в обработку (ProcessingDate), номер {order.ShipmentNumber}"));
 25        }
 26
 9727        foreach (var h in histories.OrderBy(x => x.ChangedAt))
 28        {
 1729            var field = !string.IsNullOrWhiteSpace(h.ColumnDisplayName)
 1730                ? h.ColumnDisplayName
 1731                : h.ColumnName ?? "поле";
 1732            var who = string.IsNullOrWhiteSpace(h.ChangedBy) ? "система" : h.ChangedBy!.Trim();
 1733            events.Add((
 1734                h.ChangedAt,
 1735                $"{who} изменил «{field}»: «{h.FormattedOldValue}» → «{h.FormattedNewValue}»"));
 36        }
 37
 2338        if (order.LastStatusChangeDate.HasValue &&
 3139            !events.Any(e => e.Text.Contains("статус", StringComparison.OrdinalIgnoreCase)))
 40        {
 341            events.Add((
 342                order.LastStatusChangeDate.Value,
 343                $"Последнее изменение статуса (LastStatusChangeDate), AppStatus={order.AppStatus?.Name ?? "—"}, Ozon={or
 44        }
 45
 2346        if (events.Count == 0)
 47        {
 148            sb.AppendLine("Явных событий в orders_history нет. Опирайся на поля заказа и синхронизации.");
 149            return sb.ToString().TrimEnd();
 50        }
 51
 12252        foreach (var (when, text) in events.OrderBy(e => e.When))
 2653            sb.AppendLine($"  {when:dd.MM.yyyy HH:mm} UTC — {text}");
 54
 2255        sb.AppendLine();
 2256        sb.AppendLine("Текущий статус в отчёте: «" + (order.AppStatus?.Name ?? "Не указан") + "»");
 2257        sb.AppendLine("Текущий статус Ozon: «" + (order.ClientStatus?.Name ?? "Не указан") + "»");
 58
 2259        return sb.ToString().TrimEnd();
 60    }
 61}