Ejemplo n.º 1
0
        public virtual async Task StartRefundAsync(Payment payment, IEnumerable <RefundInfoModel> refundInfos, string displayReason = null)
        {
            var provider = GetProvider(payment);

            var refundInfoModels = refundInfos.ToList();

            payment.StartRefund(refundInfoModels);

            await _paymentRepository.UpdateAsync(payment, true);

            var refunds = new List <Refund>();

            foreach (var refund in refundInfoModels.Select(model => new Refund(
                                                               id: GuidGenerator.Create(),
                                                               tenantId: CurrentTenant.Id,
                                                               paymentId: payment.Id,
                                                               paymentItemId: model.PaymentItem.Id,
                                                               refundPaymentMethod: payment.PaymentMethod,
                                                               externalTradingCode: null,
                                                               currency: payment.Currency,
                                                               refundAmount: model.RefundAmount,
                                                               customerRemark: model.CustomerRemark,
                                                               staffRemark: model.StaffRemark
                                                               )))
            {
                refunds.Add(await _refundRepository.InsertAsync(refund, true));
            }

            await provider.OnRefundStartedAsync(payment, refunds, displayReason);
        }
Ejemplo n.º 2
0
        public virtual async Task HandleEventAsync(EntityCreatedEto <RefundEto> eventData)
        {
            using var uow = _unitOfWorkManager.Begin(isTransactional: true);

            using var changeTenant = _currentTenant.Change(eventData.Entity.TenantId);

            var refund = await _refundRepository.FindAsync(eventData.Entity.Id);

            if (refund != null)
            {
                return;
            }

            var payment = await _paymentRepository.FindAsync(eventData.Entity.PaymentId);

            if (payment == null)
            {
                return;
            }

            refund = _objectMapper.Map <RefundEto, Refund>(eventData.Entity);

            refund.SetRefundItems(
                _objectMapper.Map <List <RefundItemEto>, List <RefundItem> >(eventData.Entity.RefundItems));

            refund.RefundItems.ForEach(item =>
            {
                FillRefundItemStoreId(item);
                FillRefundItemOrderId(item);
            });

            FillRefundItemOrderLines(refund);

            await _refundRepository.InsertAsync(refund, true);

            if (refund.CompletedTime.HasValue)
            {
                uow.OnCompleted(async() => await _distributedEventBus.PublishAsync(new EShopRefundCompletedEto
                {
                    Refund = _objectMapper.Map <Refund, EShopRefundEto>(refund)
                }));
            }

            await uow.CompleteAsync();
        }
        public virtual async Task StartRefundAsync(Payment payment, CreateRefundInput input)
        {
            var provider = GetProvider(payment);

            input.RefundItems.ForEach(x => x.RefundAmount.EnsureIsNonNegative());

            var refundAmount = input.RefundItems.Sum(x => x.RefundAmount);

            refundAmount.EnsureIsNonNegative();

            var paymentItemIds = input.RefundItems.Select(x => x.PaymentItemId).ToList();

            var exceptItemIds = paymentItemIds.Except(payment.PaymentItems.Select(x => x.Id)).ToList();

            if (exceptItemIds.Any())
            {
                throw new EntityNotFoundException(typeof(PaymentItem), exceptItemIds);
            }

            if (paymentItemIds.Count != paymentItemIds.Distinct().Count())
            {
                throw new DuplicatePaymentItemIdException();
            }

            if (await _refundRepository.FindByPaymentIdAsync(payment.Id) != null)
            {
                throw new AnotherRefundIsInProgressException(payment.Id);
            }

            var refund = CreateRefund(payment, input);

            await _refundRepository.InsertAsync(refund, true);

            payment.StartRefund(refund);

            await _paymentRepository.UpdateAsync(payment, true);

            await provider.OnRefundStartedAsync(payment, refund);
        }