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); }
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); }