Example #1
0
        public async Task UpdateStatusAsync(string walletAddress, PaymentRequestStatusInfo statusInfo = null)
        {
            IPaymentRequest paymentRequest = await _paymentRequestRepository.FindAsync(walletAddress);

            if (paymentRequest == null)
            {
                throw new PaymentRequestNotFoundException(walletAddress);
            }

            PaymentRequestStatusInfo newStatusInfo =
                statusInfo ?? await _paymentRequestStatusResolver.GetStatus(walletAddress);

            paymentRequest.Status          = newStatusInfo.Status;
            paymentRequest.PaidDate        = newStatusInfo.Date;
            paymentRequest.PaidAmount      = newStatusInfo.Amount;
            paymentRequest.ProcessingError = paymentRequest.Status == PaymentRequestStatus.Error
                ? newStatusInfo.ProcessingError
                : PaymentRequestProcessingError.None;

            await _paymentRequestRepository.UpdateAsync(paymentRequest);

            //todo: move to separate builder service
            PaymentRequestRefund refundInfo = await GetRefundInfoAsync(paymentRequest.WalletAddress);

            await _paymentRequestPublisher.PublishAsync(paymentRequest, refundInfo);
        }
Example #2
0
        public async Task <IActionResult> GetDetailsAsync(string merchantId, string paymentRequestId)
        {
            try
            {
                IPaymentRequest paymentRequest = await _paymentRequestService.GetAsync(merchantId, paymentRequestId);

                if (paymentRequest == null)
                {
                    return(NotFound(ErrorResponse.Create("Could not find payment request")));
                }

                PaymentRequestRefund refundInfo =
                    await _paymentRequestService.GetRefundInfoAsync(paymentRequest.WalletAddress);

                PaymentRequestDetailsModel model = await _paymentRequestDetailsBuilder.Build <
                    PaymentRequestDetailsModel,
                    PaymentRequestOrderModel,
                    PaymentRequestTransactionModel,
                    PaymentRequestRefundModel>(paymentRequest, refundInfo);

                return(Ok(model));
            }
            catch (Exception ex)
            {
                await _log.WriteErrorAsync(nameof(GetDetailsAsync),
                                           new
                {
                    MerchantId       = merchantId,
                    PaymentRequestId = paymentRequestId
                }.ToJson(), ex);

                throw;
            }
        }
Example #3
0
        private async Task UpdateStatusAsync(IPaymentRequest paymentRequest, PaymentRequestStatusInfo statusInfo = null)
        {
            PaymentRequestStatusInfo newStatusInfo =
                statusInfo ?? await _paymentRequestStatusResolver.GetStatus(paymentRequest.WalletAddress);

            PaymentRequestStatus          previousStatus          = paymentRequest.Status;
            PaymentRequestProcessingError previousProcessingError = paymentRequest.ProcessingError;

            paymentRequest.Status   = newStatusInfo.Status;
            paymentRequest.PaidDate = newStatusInfo.Date;

            if (newStatusInfo.Amount.HasValue)
            {
                paymentRequest.PaidAmount = newStatusInfo.Amount.Value;
            }

            paymentRequest.ProcessingError = (paymentRequest.Status == PaymentRequestStatus.Error || paymentRequest.Status == PaymentRequestStatus.SettlementError)
                ? newStatusInfo.ProcessingError
                : PaymentRequestProcessingError.None;

            await _paymentRequestRepository.UpdateAsync(paymentRequest);

            // if we are updating status from "InProcess" to any other - we have to release the lock
            if (previousStatus == PaymentRequestStatus.InProcess)
            {
                await _paymentLocksService.ReleaseLockAsync(paymentRequest.Id, paymentRequest.MerchantId);
            }

            PaymentRequestRefund refundInfo = await GetRefundInfoAsync(paymentRequest.WalletAddress);

            if (paymentRequest.Status != previousStatus ||
                (paymentRequest.Status == PaymentRequestStatus.Error &&
                 paymentRequest.ProcessingError != previousProcessingError))
            {
                await _paymentRequestPublisher.PublishAsync(paymentRequest, refundInfo);

                IAssetGeneralSettings assetSettings =
                    await _assetSettingsService.GetGeneralAsync(paymentRequest.PaymentAssetId);

                // doing auto settlement only once
                // Some flows assume we can get updates from blockchain multiple times for the same transaction
                // which leads to the same payment request status
                if (paymentRequest.StatusValidForSettlement() && (assetSettings?.AutoSettle ?? false))
                {
                    if (paymentRequest.Status != PaymentRequestStatus.Confirmed &&
                        !_autoSettleSettingsResolver.AllowToMakePartialAutoSettle(paymentRequest.PaymentAssetId))
                    {
                        return;
                    }

                    await SettleAsync(paymentRequest.MerchantId, paymentRequest.Id);
                }
            }
        }
Example #4
0
        public async Task <TResult> Build <TResult, TOrder, TTransaction, TRefund>(IPaymentRequest paymentRequest,
                                                                                   PaymentRequestRefund refundInfo)
        {
            IOrder order = await _orderService.GetAsync(paymentRequest.Id, paymentRequest.OrderId);

            IReadOnlyList <IPaymentRequestTransaction> transactions =
                await _transactionsService.GetByWalletAsync(paymentRequest.WalletAddress);

            IEnumerable <IPaymentRequestTransaction> paymentTransactions = transactions.Where(x => x.IsPayment());

            dynamic model = Mapper.Map <TResult>(paymentRequest);

            model.Order = Mapper.Map <TOrder>(order);

            model.Transactions = Mapper.Map <List <TTransaction> >(paymentTransactions);

            model.Refund = Mapper.Map <TRefund>(refundInfo);

            return(model);
        }
Example #5
0
        public async Task <IActionResult> GetDetailsAsync(
            [Required, RowKey] string merchantId,
            [Required, RowKey] string paymentRequestId)
        {
            IPaymentRequest paymentRequest = await _paymentRequestService.GetAsync(merchantId, paymentRequestId);

            if (paymentRequest == null)
            {
                return(NotFound(ErrorResponse.Create("Could not find payment request")));
            }

            PaymentRequestRefund refundInfo =
                await _paymentRequestService.GetRefundInfoAsync(paymentRequest.WalletAddress);

            PaymentRequestDetailsModel model = await _paymentRequestDetailsBuilder.Build <
                PaymentRequestDetailsModel,
                PaymentRequestOrderModel,
                PaymentRequestTransactionModel,
                PaymentRequestRefundModel>(paymentRequest, refundInfo);

            return(Ok(model));
        }