protected virtual RefundOrderEto CreateRefundOrderEto(Order order)
        {
            if (!order.PaymentId.HasValue)
            {
                throw new OrderIsInWrongStageException(order.Id);
            }

            var eto = new RefundOrderEto(
                order.TenantId,
                order.Id,
                order.StoreId,
                order.PaymentId.Value,
                OrdersConsts.InventoryReductionFailedAutoCancellationReason,
                OrdersConsts.InventoryReductionFailedAutoCancellationReason,
                OrdersConsts.InventoryReductionFailedAutoCancellationReason);

            eto.OrderLines.AddRange(order.OrderLines.Select(x => new OrderLineRefundInfoModel
            {
                OrderLineId = x.Id,
                Quantity    = x.Quantity - x.RefundedQuantity,
                TotalAmount = x.ActualTotalPrice - x.RefundAmount
            }));

            eto.OrderExtraFees.AddRange(order.OrderExtraFees.Select(x => new OrderExtraFeeRefundInfoModel
            {
                Name        = x.Name,
                Key         = x.Key,
                TotalAmount = x.Fee - x.RefundAmount
            }));

            return(eto);
        }
Пример #2
0
    public async Task Should_Refund_Order()
    {
        var handler = ServiceProvider.GetRequiredService <RefundOrderEventHandler>();

        var eto = new RefundOrderEto(null, PaymentsTestData.Order1, PaymentsTestData.Store1,
                                     PaymentsTestData.Payment1, "Test", null, null);

        eto.OrderLines.Add(new OrderLineRefundInfoModel
        {
            OrderLineId = PaymentsTestData.OrderLine1,
            Quantity    = 2,
            TotalAmount = 0.4m
        });

        eto.OrderExtraFees.Add(new OrderExtraFeeRefundInfoModel
        {
            Name        = "Name",
            Key         = "Key",
            TotalAmount = 0.6m
        });

        await handler.HandleEventAsync(eto);

        var eventData = TestRefundPaymentEventHandler.LastEto;

        TestRefundPaymentEventHandler.LastEto = null;
        eventData.ShouldNotBeNull();
        eventData.CreateRefundInput.RefundItems.Count.ShouldBe(1);

        var refundItem = eventData.CreateRefundInput.RefundItems[0];

        refundItem.GetProperty <Guid?>(nameof(RefundItem.OrderId)).ShouldBe(PaymentsTestData.Order1);

        var orderLines =
            _jsonSerializer.Deserialize <List <OrderLineRefundInfoModel> >(
                refundItem.GetProperty <string>(nameof(RefundItem.OrderLines)));

        orderLines.Count.ShouldBe(1);
        orderLines[0].OrderLineId.ShouldBe(PaymentsTestData.OrderLine1);
        orderLines[0].Quantity.ShouldBe(2);
        orderLines[0].TotalAmount.ShouldBe(0.4m);

        var orderExtraFees =
            _jsonSerializer.Deserialize <List <OrderExtraFeeRefundInfoModel> >(
                refundItem.GetProperty <string>(nameof(RefundItem.OrderExtraFees)));

        orderExtraFees.Count.ShouldBe(1);
        orderExtraFees[0].Name.ShouldBe("Name");
        orderExtraFees[0].Key.ShouldBe("Key");
        orderExtraFees[0].TotalAmount.ShouldBe(0.6m);
    }
    protected virtual async Task TryRefundOrderAsync(Order order)
    {
        if (order.PaymentId is null)
        {
            return;
        }

        var eto = new RefundOrderEto(
            order.TenantId,
            order.Id,
            order.StoreId,
            order.PaymentId.Value,
            BookingOrderConsts.BookingOrderAutoCancellationResult,
            BookingOrderConsts.BookingOrderAutoCancellationResult,
            BookingOrderConsts.BookingOrderAutoCancellationResult);

        await _distributedEventBus.PublishAsync(eto);
    }
 protected virtual async Task RefundOrderAsync(RefundOrderEto refundOrderEto)
 {
     await _distributedEventBus.PublishAsync(refundOrderEto);
 }