コード例 #1
0
 public static PaymentRequestStatusInfo Error(PaymentRequestProcessingError processingError)
 {
     return(new PaymentRequestStatusInfo
     {
         Status = PaymentRequestStatus.Error,
         ProcessingError = processingError
     });
 }
コード例 #2
0
 public static PaymentRequestStatusInfo Error(PaymentRequestProcessingError processingError, decimal paid, DateTime?date)
 {
     return(new PaymentRequestStatusInfo
     {
         Status = PaymentRequestStatus.Error,
         ProcessingError = processingError,
         Amount = paid,
         Date = date
     });
 }
コード例 #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);
                }
            }
        }
コード例 #4
0
        public static InvoiceStatus Convert(PaymentRequestStatus status, PaymentRequestProcessingError error)
        {
            switch (status)
            {
            case PaymentRequestStatus.New:
                return(InvoiceStatus.Unpaid);

            case PaymentRequestStatus.Cancelled:
                return(InvoiceStatus.Removed);

            case PaymentRequestStatus.InProcess:
                return(InvoiceStatus.InProgress);

            case PaymentRequestStatus.Confirmed:
                return(InvoiceStatus.Paid);

            case PaymentRequestStatus.RefundInProgress:
                return(InvoiceStatus.RefundInProgress);

            case PaymentRequestStatus.Refunded:
                return(InvoiceStatus.Refunded);

            case PaymentRequestStatus.Error:
                switch (error)
                {
                case PaymentRequestProcessingError.PaymentExpired:
                    return(InvoiceStatus.PastDue);

                case PaymentRequestProcessingError.LatePaid:
                    return(InvoiceStatus.LatePaid);

                case PaymentRequestProcessingError.PaymentAmountBelow:
                    return(InvoiceStatus.Underpaid);

                case PaymentRequestProcessingError.PaymentAmountAbove:
                    return(InvoiceStatus.Overpaid);

                case PaymentRequestProcessingError.RefundNotConfirmed:
                    return(InvoiceStatus.NotConfirmed);

                case PaymentRequestProcessingError.UnknownPayment:
                case PaymentRequestProcessingError.UnknownRefund:
                    return(InvoiceStatus.InternalError);

                default:
                    throw new Exception($"Unknown payment request error '{error}'");
                }

            default:
                throw new Exception($"Unknown payment request status '{status}'");
            }
        }
コード例 #5
0
        public static InvoiceStatus ToInvoiceStatus(this PaymentRequestStatus status, PaymentRequestProcessingError error)
        {
            switch (status)
            {
            case PaymentRequestStatus.New:
                return(InvoiceStatus.Unpaid);

            case PaymentRequestStatus.Cancelled:
                return(InvoiceStatus.Removed);

            case PaymentRequestStatus.InProcess:
                return(InvoiceStatus.InProgress);

            case PaymentRequestStatus.Confirmed:
                return(InvoiceStatus.Paid);

            case PaymentRequestStatus.RefundInProgress:
                return(InvoiceStatus.RefundInProgress);

            case PaymentRequestStatus.Refunded:
                return(InvoiceStatus.Refunded);

            case PaymentRequestStatus.Error:
                switch (error)
                {
                case PaymentRequestProcessingError.PaymentExpired:
                    return(InvoiceStatus.PastDue);

                case PaymentRequestProcessingError.LatePaid:
                    return(InvoiceStatus.LatePaid);

                case PaymentRequestProcessingError.PaymentAmountBelow:
                    return(InvoiceStatus.Underpaid);

                case PaymentRequestProcessingError.PaymentAmountAbove:
                    return(InvoiceStatus.Overpaid);

                case PaymentRequestProcessingError.RefundNotConfirmed:
                    return(InvoiceStatus.NotConfirmed);

                case PaymentRequestProcessingError.UnknownPayment:
                case PaymentRequestProcessingError.UnknownRefund:
                    return(InvoiceStatus.InternalError);

                default:
                    return(InvoiceStatus.None);
                }

            default:
                return(InvoiceStatus.None);
            }
        }