< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.Grid.Commit.Steps.SupplierCartsPostStep
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Commit/Steps/SupplierCartsSteps.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 21
Coverable lines: 21
Total lines: 151
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
get_Key()100%210%
ExecuteAsync()0%342180%

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
 13    public SupplierCartsPreStep(SupplierCartsProcessor carts)
 14    {
 15        _carts = carts;
 16    }
 17
 18    public string Key => TransactionCommitStepKeys.SupplierCartsPre;
 19
 20    public async Task ExecuteAsync(TransactionCommitContext ctx)
 21    {
 22        if (!ctx.Definition.SupplierCarts)
 23        {
 24            return;
 25        }
 26
 27        var queues = ctx.Request.SupplierCarts?.Queues ?? new Dictionary<string, string>();
 28        _carts.Bind(queues, ctx.User.Name, (code, title, detail) => ctx.StageAsync(code, title, detail), ctx.Cancellatio
 29            SupplierOrderConfirmation.FromIds(ctx.Request.ConfirmedConflictIds), ctx.Request.ProgressKey);
 30        if (!_carts.HasQueues)
 31        {
 32            return;
 33        }
 34
 35        // Защита от повторных заказов — до любых действий у поставщиков и до записи транзакции.
 36        var guard = await _carts.GuardAsync(ctx.Orders);
 37        ctx.Warnings.AddRange(guard.Warnings);
 38        if (!guard.IsAllowed)
 39        {
 40            ctx.SupplierOrderConflicts.AddRange(guard.Blocking);
 41            ctx.Fail(TransactionErrorCode.SupplierOrderConflict, guard.BlockingMessage());
 42            return;
 43        }
 44
 45        await ctx.StageAsync("carts-direct", "Оформляем заказы у поставщиков");
 46        var error = await _carts.CheckoutDirectAsync(ctx.Orders);
 47        if (!string.IsNullOrWhiteSpace(error))
 48        {
 49            ctx.Fail(TransactionErrorCode.Unknown, error);
 50        }
 51    }
 52}
 53
 54/// <summary>Отложенные корзины поставщиков и сборка отправления в Ozon — после записи транзакции (как в классическом по
 55public sealed class SupplierCartsPostStep : ITransactionCommitStep
 56{
 57    private readonly SupplierCartsProcessor _carts;
 58
 059    public SupplierCartsPostStep(SupplierCartsProcessor carts)
 60    {
 061        _carts = carts;
 062    }
 63
 064    public string Key => TransactionCommitStepKeys.SupplierCartsPost;
 65
 66    public async Task ExecuteAsync(TransactionCommitContext ctx)
 67    {
 068        var d = ctx.Definition;
 069        if (ctx.TransactionId <= 0 || ctx.OrdersToTransaction.Count == 0)
 70        {
 071            return;
 72        }
 73
 074        var shipInOzon = d.ShipInOzon && ctx.Request.ShipInOzon;
 075        if (!d.SupplierCarts && !shipInOzon)
 76        {
 077            return;
 78        }
 79
 080        if (d.SupplierCarts)
 81        {
 082            var queues = ctx.Request.SupplierCarts?.Queues ?? new Dictionary<string, string>();
 083            _carts.Bind(queues, ctx.User.Name, (code, title, detail) => ctx.StageAsync(code, title, detail), ctx.Cancell
 084                SupplierOrderConfirmation.FromIds(ctx.Request.ConfirmedConflictIds));
 85        }
 86
 087        var html = await _carts.PlaceBasketsAsync(ctx.OrdersToTransaction, shipInOzon);
 088        ctx.OzonShipResult = _carts.OzonShipResult;
 089        ctx.Report.AddRange(_carts.ReportRows);
 090        if (!string.IsNullOrWhiteSpace(html))
 91        {
 092            ctx.SummaryBlocks.Add(html);
 093            ctx.StructuredBlocks.Add(html);
 94        }
 095    }
 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}