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