public async Task <ViewPaymentRequestViewModel> GetPaymentRequest(string id, string userId = null) { var pr = await _PaymentRequestRepository.FindPaymentRequest(id, null); if (pr == null) { return(null); } var blob = pr.GetBlob(); var rateRules = pr.StoreData.GetStoreBlob().GetRateRules(_BtcPayNetworkProvider); var invoices = await _PaymentRequestRepository.GetInvoicesForPaymentRequest(id); var paymentStats = _AppService.GetCurrentContributionAmountStats(invoices, true); var amountCollected = await _AppService.GetCurrentContributionAmount(paymentStats, blob.Currency, rateRules); var amountDue = blob.Amount - amountCollected; return(new ViewPaymentRequestViewModel(pr) { AmountFormatted = _currencies.FormatCurrency(blob.Amount, blob.Currency), AmountCollected = amountCollected, AmountCollectedFormatted = _currencies.FormatCurrency(amountCollected, blob.Currency), AmountDue = amountDue, AmountDueFormatted = _currencies.FormatCurrency(amountDue, blob.Currency), CurrencyData = _currencies.GetCurrencyData(blob.Currency, true), LastUpdated = DateTime.Now, AnyPendingInvoice = invoices.Any(entity => entity.Status == InvoiceStatus.New), Invoices = invoices.Select(entity => new ViewPaymentRequestViewModel.PaymentRequestInvoice() { Id = entity.Id, Amount = entity.ProductInformation.Price, Currency = entity.ProductInformation.Currency, ExpiryDate = entity.ExpirationTime.DateTime, Status = entity.GetInvoiceState().ToString(), Payments = entity.GetPayments().Select(paymentEntity => { var paymentNetwork = _BtcPayNetworkProvider.GetNetwork(paymentEntity.GetCryptoCode()); var paymentData = paymentEntity.GetCryptoPaymentData(); string link = null; string txId = null; switch (paymentData) { case Payments.Bitcoin.BitcoinLikePaymentData onChainPaymentData: txId = onChainPaymentData.Outpoint.Hash.ToString(); link = string.Format(CultureInfo.InvariantCulture, paymentNetwork.BlockExplorerLink, txId); break; case LightningLikePaymentData lightningLikePaymentData: txId = lightningLikePaymentData.BOLT11; break; } return new ViewPaymentRequestViewModel.PaymentRequestInvoicePayment() { Amount = paymentData.GetValue(), PaymentMethod = paymentEntity.GetPaymentMethodId().ToString(), Link = link, Id = txId }; }).ToList() }).ToList()
public async Task <ViewPaymentRequestViewModel> GetPaymentRequest(string id, string userId = null) { var pr = await _PaymentRequestRepository.FindPaymentRequest(id, null); if (pr == null) { return(null); } var blob = pr.GetBlob(); var invoices = await _PaymentRequestRepository.GetInvoicesForPaymentRequest(id); var paymentStats = _AppService.GetContributionsByPaymentMethodId(blob.Currency, invoices, true); var amountDue = blob.Amount - paymentStats.TotalCurrency; var pendingInvoice = invoices.OrderByDescending(entity => entity.InvoiceTime) .FirstOrDefault(entity => entity.Status == InvoiceStatus.New); return(new ViewPaymentRequestViewModel(pr) { Archived = pr.Archived, AmountFormatted = _currencies.FormatCurrency(blob.Amount, blob.Currency), AmountCollected = paymentStats.TotalCurrency, AmountCollectedFormatted = _currencies.FormatCurrency(paymentStats.TotalCurrency, blob.Currency), AmountDue = amountDue, AmountDueFormatted = _currencies.FormatCurrency(amountDue, blob.Currency), CurrencyData = _currencies.GetCurrencyData(blob.Currency, true), LastUpdated = DateTime.Now, AnyPendingInvoice = pendingInvoice != null, PendingInvoiceHasPayments = pendingInvoice != null && pendingInvoice.ExceptionStatus != InvoiceExceptionStatus.None, Invoices = invoices.Select(entity => new ViewPaymentRequestViewModel.PaymentRequestInvoice() { Id = entity.Id, Amount = entity.Price, AmountFormatted = _currencies.FormatCurrency(entity.Price, blob.Currency), Currency = entity.Currency, ExpiryDate = entity.ExpirationTime.DateTime, Status = entity.GetInvoiceState().ToString(), Payments = entity .GetPayments() .Select(paymentEntity => { var paymentData = paymentEntity.GetCryptoPaymentData(); var paymentMethodId = paymentEntity.GetPaymentMethodId(); if (paymentData is null || paymentMethodId is null) { return null; } string txId = paymentData.GetPaymentId(); string link = GetTransactionLink(paymentMethodId, txId); return new ViewPaymentRequestViewModel.PaymentRequestInvoicePayment() { Amount = paymentData.GetValue(), PaymentMethod = paymentMethodId.ToString(), Link = link, Id = txId }; }) .Where(payment => payment != null) .ToList() }).ToList()