< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.Grid.Commit.Steps.SupplierCartsPreStep
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Commit/Steps/SupplierCartsSteps.cs
Line coverage
86%
Covered lines: 19
Uncovered lines: 3
Coverable lines: 22
Total lines: 151
Line coverage: 86.3%
Branch coverage
58%
Covered branches: 7
Total branches: 12
Branch coverage: 58.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Key()100%11100%
ExecuteAsync()58.33%131282.35%

File(s)

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

#LineLine coverage
 1using OzonOrdersWeb.Areas.Studio2.Models.Transactions;
 2using OzonOrdersWeb.TransactionServices;
 3using OzonOrdersWeb.WebServices.Transactions;
 4using OzonOrdersWeb.WebServices.Transactions.Grid.SupplierCarts;
 5
 6namespace OzonOrdersWeb.WebServices.Transactions.Grid.Commit.Steps;
 7
 8/// <summary>Прямое оформление в корзинах API-поставщиков до смены статусов; ошибка поставщика останавливает проведение.
 9public sealed class SupplierCartsPreStep : ITransactionCommitStep
 10{
 11    private readonly SupplierCartsProcessor _carts;
 12
 613    public SupplierCartsPreStep(SupplierCartsProcessor carts)
 14    {
 615        _carts = carts;
 616    }
 17
 718    public string Key => TransactionCommitStepKeys.SupplierCartsPre;
 19
 20    public async Task ExecuteAsync(TransactionCommitContext ctx)
 21    {
 722        if (!ctx.Definition.SupplierCarts)
 23        {
 024            return;
 25        }
 26
 727        var queues = ctx.Request.SupplierCarts?.Queues ?? new Dictionary<string, string>();
 728        _carts.Bind(queues, ctx.User.Name, (code, title, detail) => ctx.StageAsync(code, title, detail), ctx.Cancellatio
 729            SupplierOrderConfirmation.FromIds(ctx.Request.ConfirmedConflictIds), ctx.Request.ProgressKey);
 730        if (!_carts.HasQueues)
 31        {
 032            return;
 33        }
 34
 35        // Защита от повторных заказов — до любых действий у поставщиков и до записи транзакции.
 736        var guard = await _carts.GuardAsync(ctx.Orders);
 737        ctx.Warnings.AddRange(guard.Warnings);
 738        if (!guard.IsAllowed)
 39        {
 640            ctx.SupplierOrderConflicts.AddRange(guard.Blocking);
 641            ctx.Fail(TransactionErrorCode.SupplierOrderConflict, guard.BlockingMessage());
 642            return;
 43        }
 44
 145        await ctx.StageAsync("carts-direct", "Оформляем заказы у поставщиков");
 146        var error = await _carts.CheckoutDirectAsync(ctx.Orders);
 147        if (!string.IsNullOrWhiteSpace(error))
 48        {
 049            ctx.Fail(TransactionErrorCode.Unknown, error);
 50        }
 751    }
 52}
 53
 54/// <summary>Отложенные корзины поставщиков и сборка отправления в Ozon — после записи транзакции (как в классическом по
 55public sealed class SupplierCartsPostStep : ITransactionCommitStep
 56{
 57    private readonly SupplierCartsProcessor _carts;
 58
 59    public SupplierCartsPostStep(SupplierCartsProcessor carts)
 60    {
 61        _carts = carts;
 62    }
 63
 64    public string Key => TransactionCommitStepKeys.SupplierCartsPost;
 65
 66    public async Task ExecuteAsync(TransactionCommitContext ctx)
 67    {
 68        var d = ctx.Definition;
 69        if (ctx.TransactionId <= 0 || ctx.OrdersToTransaction.Count == 0)
 70        {
 71            return;
 72        }
 73
 74        var shipInOzon = d.ShipInOzon && ctx.Request.ShipInOzon;
 75        if (!d.SupplierCarts && !shipInOzon)
 76        {
 77            return;
 78        }
 79
 80        if (d.SupplierCarts)
 81        {
 82            var queues = ctx.Request.SupplierCarts?.Queues ?? new Dictionary<string, string>();
 83            _carts.Bind(queues, ctx.User.Name, (code, title, detail) => ctx.StageAsync(code, title, detail), ctx.Cancell
 84                SupplierOrderConfirmation.FromIds(ctx.Request.ConfirmedConflictIds));
 85        }
 86
 87        var html = await _carts.PlaceBasketsAsync(ctx.OrdersToTransaction, shipInOzon);
 88        ctx.OzonShipResult = _carts.OzonShipResult;
 89        ctx.Report.AddRange(_carts.ReportRows);
 90        if (!string.IsNullOrWhiteSpace(html))
 91        {
 92            ctx.SummaryBlocks.Add(html);
 93            ctx.StructuredBlocks.Add(html);
 94        }
 95    }
 96}
 97
 98/// <summary>
 99/// Независимая проверка после проведения: повторно читает API поставщиков и сверяет, что заказы/позиции
 100/// реально созданы. Только сигнал — транзакция уже записана, откат не выполняется. Результат уходит в сводку
 101/// на OrdersGrid и системной записью в историю заказа.
 102/// </summary>
 103public sealed class SupplierVerificationStep : ITransactionCommitStep
 104{
 105    private readonly Services.SupplierStatusServices.ISupplierOrderVerificationService _verification;
 106
 107    public SupplierVerificationStep(Services.SupplierStatusServices.ISupplierOrderVerificationService verification)
 108    {
 109        _verification = verification;
 110    }
 111
 112    public string Key => TransactionCommitStepKeys.SupplierVerification;
 113
 114    public async Task ExecuteAsync(TransactionCommitContext ctx)
 115    {
 116        if (!ctx.Definition.SupplierCarts || ctx.TransactionId <= 0 || ctx.OrdersToTransaction.Count == 0)
 117        {
 118            return;
 119        }
 120
 121        var orderIds = ctx.OrdersToTransaction.Select(o => o.Id).Where(id => id > 0).Distinct().ToList();
 122        var queues = ctx.Request.SupplierCarts?.Queues ?? new Dictionary<string, string>();
 123        var required = SupplierQueueOrderIds.Extract(queues.Values).Where(orderIds.Contains).ToList();
 124        if (required.Count == 0)
 125        {
 126            return;
 127        }
 128
 129        await ctx.StageAsync("supplier-verify", "Проверяем заказы у поставщиков", $"позиций: {required.Count}");
 130        var summary = await _verification.VerifyAsync(orderIds, required, ct: ctx.CancellationToken);
 131        if (summary.IsEmpty)
 132        {
 133            return;
 134        }
 135
 136        ctx.SupplierVerification = summary;
 137        ctx.Report.AddRange(TransactionReportMapper.FromVerification(
 138            SupplierVerificationDto.From(summary), SupplierQueueOrderIds.ExtractProviderByOrder(queues)));
 139        var block = SupplierVerificationDto.ToHtmlBlock(summary);
 140        if (!string.IsNullOrWhiteSpace(block))
 141        {
 142            ctx.SummaryBlocks.Add(block);
 143            ctx.StructuredBlocks.Add(block);
 144        }
 145
 146        if (summary.HasProblems)
 147        {
 148            ctx.Warnings.Add($"Проверка поставщиков: проблем {summary.ProblemCount} из {summary.Rows.Count}. Подробности
 149        }
 150    }
 151}