Exemple #1
0
        public virtual async Task HandleEventAsync(CreatePaymentEto eventData)
        {
            using var changeTenant = _currentTenant.Change(eventData.TenantId);

            var providerType = _paymentServiceResolver.GetProviderTypeOrDefault(eventData.PaymentMethod) ??
                               throw new UnknownPaymentMethodException(eventData.PaymentMethod);

            var provider = _serviceProvider.GetService(providerType) as IPaymentServiceProvider ??
                           throw new UnknownPaymentMethodException(eventData.PaymentMethod);

            var paymentItems = eventData.PaymentItems.Select(itemEto =>
            {
                var item = new PaymentItem(_guidGenerator.Create(), itemEto.ItemType, itemEto.ItemKey,
                                           itemEto.OriginalPaymentAmount);

                itemEto.MapExtraPropertiesTo(item, MappingPropertyDefinitionChecks.None);

                return(item);
            }
                                                             ).ToList();

            if (await HasDuplicatePaymentItemInProgressAsync(paymentItems))
            {
                throw new DuplicatePaymentRequestException();
            }

            var payment = new Payment(_guidGenerator.Create(), eventData.TenantId, eventData.UserId,
                                      eventData.PaymentMethod, eventData.Currency, paymentItems.Select(item => item.OriginalPaymentAmount).Sum(),
                                      paymentItems);

            eventData.MapExtraPropertiesTo(payment, MappingPropertyDefinitionChecks.None);

            await _paymentRepository.InsertAsync(payment, autoSave : true);
        }
        public virtual async Task HandleEventAsync(CreatePaymentEto eventData)
        {
            var providerType = _paymentServiceResolver.GetProviderTypeOrDefault(eventData.PaymentMethod) ??
                               throw new UnknownPaymentMethodException(eventData.PaymentMethod);

            var provider = _serviceProvider.GetService(providerType) as IPaymentServiceProvider ??
                           throw new UnknownPaymentMethodException(eventData.PaymentMethod);

            var paymentItems = eventData.PaymentItems.Select(inputPaymentItem =>
                                                             new PaymentItem(_guidGenerator.Create(), inputPaymentItem.ItemType, inputPaymentItem.ItemKey,
                                                                             inputPaymentItem.Currency, inputPaymentItem.OriginalPaymentAmount)).ToList();

            if (paymentItems.Select(item => item.Currency).Any(c => c != eventData.Currency))
            {
                throw new MultiCurrencyNotSupportedException();
            }

            if (await HasDuplicatePaymentItemInProgressAsync(paymentItems))
            {
                throw new DuplicatePaymentRequestException();
            }

            var payment = new Payment(_guidGenerator.Create(), eventData.TenantId, eventData.UserId,
                                      eventData.PaymentMethod, eventData.Currency, paymentItems.Select(item => item.OriginalPaymentAmount).Sum(),
                                      paymentItems);

            foreach (var property in eventData.ExtraProperties)
            {
                payment.SetProperty(property.Key, property.Value);
            }

            await _paymentRepository.InsertAsync(payment, autoSave : true);
        }