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()
Example #2
0
        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()