private async Task <IActionResult> CreateInvoiceForPaymentRequest(string id, bool redirectToInvoice, ViewPaymentRequestViewModel result, decimal?amount = null) { var pr = await _PaymentRequestRepository.FindPaymentRequest(id, null); var blob = pr.GetBlob(); var store = pr.StoreData; store.AdditionalClaims.Add(new Claim(Policies.CanCreateInvoice.Key, store.Id)); try { var redirectUrl = Request.GetDisplayUrl().TrimEnd("/pay", StringComparison.InvariantCulture) .Replace("hub?id=", string.Empty, StringComparison.InvariantCultureIgnoreCase); var newInvoiceId = (await _InvoiceController.CreateInvoiceCore(new CreateInvoiceRequest() { OrderId = $"{PaymentRequestRepository.GetOrderIdForPaymentRequest(id)}", Currency = blob.Currency, Price = amount.GetValueOrDefault(result.AmountDue), FullNotifications = true, BuyerEmail = result.Email, RedirectURL = redirectUrl, }, store, HttpContext.Request.GetAbsoluteRoot(), new List <string>() { PaymentRequestRepository.GetInternalTag(id) })).Data.Id; if (redirectToInvoice) { return(RedirectToAction("Checkout", "Invoice", new { Id = newInvoiceId })); } return(Ok(newInvoiceId)); } catch (BitpayHttpException e) { return(BadRequest(e.Message)); } }
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()