< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.Grid.Commit.TransactionCommitContext
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Commit/TransactionCommitContext.cs
Line coverage
84%
Covered lines: 38
Uncovered lines: 7
Coverable lines: 45
Total lines: 116
Line coverage: 84.4%
Branch coverage
50%
Covered branches: 1
Total branches: 2
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Definition()100%11100%
get_Request()100%11100%
get_User()100%11100%
get_Services()100%11100%
get_CancellationToken()100%11100%
get_Edits()100%11100%
get_Orders()100%11100%
get_UpdatedOrders()100%11100%
get_OrdersToTransaction()100%11100%
get_StatusOnlyOrderIds()100%11100%
get_DeferredOrderIds()100%11100%
get_OneCHandledExternally()100%210%
get_FromStatusByOrderId()100%11100%
get_Transitions()100%11100%
get_TargetStatus()100%11100%
get_ProcessIn1C()100%11100%
get_StockCheck()100%210%
get_StockBlockedOrderIds()100%11100%
get_OneCResponses()100%11100%
get_OneCGroups()100%11100%
get_OneCSender()100%210%
get_OneCRecipient()100%210%
get_TechnicalComment()100%11100%
get_SummaryBlocks()100%11100%
get_StructuredBlocks()100%11100%
get_Report()100%11100%
get_Warnings()100%11100%
get_RowErrors()100%11100%
get_SupplierOrderConflicts()100%11100%
get_CreatedAt()100%11100%
get_HistoryWindowStart()100%11100%
get_TransactionId()100%11100%
get_ChangedCount()100%11100%
get_TransactionDateTime()100%11100%
get_CartResults()100%11100%
get_SupplierVerification()100%11100%
get_OzonShipResult()100%210%
get_Failure()100%11100%
get_IsFailed()100%11100%
Fail(...)100%11100%
get_CommentFlow()100%11100%
get_UserComment()50%22100%
Resolve()100%210%
StageAsync(...)100%11100%
TryResolve()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Commit/TransactionCommitContext.cs

#LineLine coverage
 1using OzonDomains.Models;
 2using OzonOrdersWeb.Areas.Studio2.Models.Transactions;
 3using OzonOrdersWeb.TransactionServices;
 4using OzonOrdersWeb.WebServices.Transactions.Grid.Contracts;
 5using OzonOrdersWeb.WebServices.Transactions;
 6using OzonOrdersWeb.WebServices.Transactions.Grid.Definitions;
 7using Services.ApiServices._1CApi.Models;
 8using Services.ApiServices._1CApi.Stock;
 9using Services.SupplierStatusServices;
 10
 11namespace OzonOrdersWeb.WebServices.Transactions.Grid.Commit;
 12
 13/// <summary>Пользователь, проводящий транзакцию (без ClaimsPrincipal — шаги не зависят от HTTP).</summary>
 14public sealed record TransactionCommitUser(string Id, string Name, bool IsAdmin, int? AccessProfileId);
 15
 16/// <summary>
 17/// Состояние одного проведения, передаваемое между шагами. Шаги дописывают результаты
 18/// (заказы после правок, ответы 1С, HTML-блоки итога) и могут остановить конвейер через <see cref="Fail"/>.
 19/// </summary>
 20public sealed class TransactionCommitContext
 21{
 7722    public required TransactionDefinition Definition { get; init; }
 7523    public required TransactionCommitRequest Request { get; init; }
 8624    public required TransactionCommitUser User { get; init; }
 3225    public required IServiceProvider Services { get; init; }
 3526    public CancellationToken CancellationToken { get; init; }
 27
 28    /// <summary>Правки по Id заказа (из запроса, минус вычеркнутые).</summary>
 14129    public Dictionary<int, TransactionGridRowEdit> Edits { get; } = new();
 30
 31    /// <summary>Заказы из БД (без трекинга), доступные пользователю и не вычеркнутые.</summary>
 4632    public List<Order> Orders { get; set; } = new();
 33
 34    /// <summary>Заказы после <c>TransactOrder</c> (для разбитых — часть /2).</summary>
 3135    public List<Order> UpdatedOrders { get; set; } = new();
 36
 37    /// <summary>Заказы, попавшие в документ (в целевом статусе).</summary>
 8338    public List<Order> OrdersToTransaction { get; set; } = new();
 39
 40    /// <summary>Заказы, получающие только смену статуса (без 1С).</summary>
 3141    public HashSet<int> StatusOnlyOrderIds { get; } = new();
 42
 43    /// <summary>Заказы, которые ApplyEdits пропустил — их проводит ZeroQuantityPolicyStep (транзит утерь).</summary>
 3144    public HashSet<int> DeferredOrderIds { get; } = new();
 45
 46    /// <summary>Документ 1С уже создан другим шагом (транзит утерь) — OneCDocumentStep пропускается.</summary>
 047    public bool OneCHandledExternally { get; set; }
 48
 3149    public Dictionary<int, int> FromStatusByOrderId { get; set; } = new();
 3150    public List<StatusTransition> Transitions { get; set; } = new();
 1351    public AppStatus? TargetStatus { get; set; }
 52
 53    /// <summary>Эффективный флаг 1С после проверок остатков и режима «из файла».</summary>
 3154    public bool ProcessIn1C { get; set; }
 55
 056    public StockCheckResult? StockCheck { get; set; }
 3157    public HashSet<int> StockBlockedOrderIds { get; } = new();
 58
 3159    public List<OneCResponse> OneCResponses { get; } = new();
 3160    public List<(string Sender, string Recipient, List<Order> Orders, List<OneCResponse> Result)> OneCGroups { get; } = 
 061    public string? OneCSender { get; set; }
 062    public string? OneCRecipient { get; set; }
 63
 64    /// <summary>Техническая часть комментария (детали 1С), дописывается к пользовательскому.</summary>
 3165    public string TechnicalComment { get; set; } = string.Empty;
 66
 67    /// <summary>HTML-блоки для карточки результата (1С, корзины, Ozon).</summary>
 5768    public List<string> SummaryBlocks { get; } = new();
 69
 70    /// <summary>Блоки из <see cref="SummaryBlocks"/>, у которых уже есть структурированные строки в <see cref="Report"/
 3171    public HashSet<string> StructuredBlocks { get; } = new(StringComparer.Ordinal);
 72
 73    /// <summary>Структурированный результат проведения для таблицы в модалке результата.</summary>
 4474    public TransactionReportBuilder Report { get; } = new();
 75
 7476    public List<string> Warnings { get; } = new();
 5377    public Dictionary<int, string> RowErrors { get; } = new();
 78
 79    /// <summary>Конфликты «уже заказано у поставщика», остановившие проведение; клиент показывает их в диалоге подтверж
 4680    public List<SupplierOrderConflict> SupplierOrderConflicts { get; } = new();
 81
 3182    public DateTime CreatedAt { get; } = DateTime.Now;
 3183    public DateTime HistoryWindowStart { get; set; } = DateTime.Now;
 2984    public int TransactionId { get; set; }
 4585    public int ChangedCount { get; set; }
 5786    public string TransactionDateTime { get; set; } = string.Empty;
 87
 88    /// <summary>Результаты корзин поставщиков (providerKey → объект результата адаптера).</summary>
 3189    public Dictionary<string, object> CartResults { get; } = new(StringComparer.OrdinalIgnoreCase);
 90
 91    /// <summary>Итог проверки заказов у поставщиков после проведения (null — проверка не выполнялась).</summary>
 1392    public SupplierVerificationSummary? SupplierVerification { get; set; }
 93
 94    /// <summary>Итог сборки отправления Ozon (OrderToSupplier).</summary>
 095    public object? OzonShipResult { get; set; }
 96
 97    /// <summary>Причина остановки конвейера; после установки шаги не выполняются.</summary>
 8398    public (TransactionErrorCode Code, string Message)? Failure { get; private set; }
 99
 63100    public bool IsFailed => Failure != null;
 101
 10102    public void Fail(TransactionErrorCode code, string message) => Failure = (code, message);
 103
 104    /// <summary>Пользовательский комментарий и состояние AI-комментария (см. <c>TransactionCommentAiSchedulingHelper.Be
 53105    public TransactionCommentAiFlowState CommentFlow { get; set; }
 106
 26107    public string UserComment => CommentFlow.UserCommentOnly ?? string.Empty;
 108
 0109    public T Resolve<T>() where T : notnull => Services.GetRequiredService<T>();
 110
 111    /// <summary>Этап проведения для оверлея прогресса (SignalR, группа <c>Request.ProgressKey</c>).</summary>
 112    public Task StageAsync(string code, string title, string? detail = null)
 1113        => Services.GetRequiredService<TransactionProgressReporter>().StageAsync(Request.ProgressKey, code, title, detai
 114
 0115    public T? TryResolve<T>() where T : class => Services.GetService<T>();
 116}