public async Task <IActionResult> Invoice(string invoiceId) { var invoice = (await _InvoiceRepository.GetInvoices(new InvoiceQuery() { InvoiceId = new[] { invoiceId }, UserId = GetUserId(), IncludeAddresses = true, IncludeEvents = true })).FirstOrDefault(); if (invoice == null) { return(NotFound()); } var prodInfo = invoice.ProductInformation; var store = await _StoreRepository.FindStore(invoice.StoreId); var model = new InvoiceDetailsModel() { StoreName = store.StoreName, StoreLink = Url.Action(nameof(StoresController.UpdateStore), "Stores", new { storeId = store.Id }), Id = invoice.Id, State = invoice.GetInvoiceState().ToString(), TransactionSpeed = invoice.SpeedPolicy == SpeedPolicy.HighSpeed ? "high" : invoice.SpeedPolicy == SpeedPolicy.MediumSpeed ? "medium" : invoice.SpeedPolicy == SpeedPolicy.LowMediumSpeed ? "low-medium" : "low", RefundEmail = invoice.RefundMail, CreatedDate = invoice.InvoiceTime, ExpirationDate = invoice.ExpirationTime, MonitoringDate = invoice.MonitoringExpiration, OrderId = invoice.OrderId, BuyerInformation = invoice.BuyerInformation, Fiat = _CurrencyNameTable.DisplayFormatCurrency(prodInfo.Price, prodInfo.Currency), TaxIncluded = _CurrencyNameTable.DisplayFormatCurrency(prodInfo.TaxIncluded, prodInfo.Currency), NotificationEmail = invoice.NotificationEmail, NotificationUrl = invoice.NotificationURL?.AbsoluteUri, RedirectUrl = invoice.RedirectURL?.AbsoluteUri, ProductInformation = invoice.ProductInformation, StatusException = invoice.ExceptionStatus, Events = invoice.Events, PosData = PosDataParser.ParsePosData(invoice.PosData) }; model.Addresses = invoice.HistoricalAddresses.Select(h => new InvoiceDetailsModel.AddressModel { Destination = h.GetAddress(), PaymentMethod = h.GetPaymentMethodId().ToPrettyString(), Current = !h.UnAssigned.HasValue }).ToArray(); var details = InvoicePopulatePayments(invoice); model.CryptoPayments = details.CryptoPayments; model.Payments = details.Payments; return(View(model)); }
public ActionResult CompleteETA(FormCollection formCollection) { AddSerialBL obj = new AddSerialBL(); List <InvoiceDetailsModel> Olist = new List <InvoiceDetailsModel>(); List <OrderInvoiceEntity> Oent = obj.GetInvoiceStatus(); InvoiceDetailsModel ordobj; if (Oent != null) { foreach (OrderInvoiceEntity item in Oent) { ordobj = new InvoiceDetailsModel(); ordobj.InvOrderNo = item.InvOrderNo; ordobj.InvoiceNo = item.InvoiceNo; ordobj.InvoiceType = item.InvoiceType; ordobj.CustomerName = item.CustomerName; ordobj.InvoiceDate = item.InvoiceDate; ordobj.RecivingDate = item.RecivingDate; ordobj.InvoiceAmount = item.InvoiceAmount; ordobj.PendingAmount = Convert.ToDecimal(item.InvoiceAmount) - Convert.ToDecimal(item.RecieveAmt); ordobj.RecieveAmt = item.RecieveAmt; Olist.Add(ordobj); } } return(View(Olist)); }
public ActionResult Orderinvoice() { AddSerialBL obj = new AddSerialBL(); List <InvoiceDetailsModel> Olist = new List <InvoiceDetailsModel>(); List <OrderInvoiceEntity> Oent = obj.Getinvoicedetails(); InvoiceDetailsModel ordobj; if (Oent != null) { foreach (OrderInvoiceEntity item in Oent) { ordobj = new InvoiceDetailsModel(); ordobj.InvOrderNo = item.InvOrderNo; ordobj.InvoiceNo = item.InvoiceNo; ordobj.InvoiceType = item.InvoiceType; ordobj.CustomerName = item.CustomerName; ordobj.InvoiceDate = item.InvoiceDate; ordobj.deliverydate = item.deliverydate; ordobj.ETADate = item.ETADate; ordobj.InvoiceAmount = item.InvoiceAmount; ordobj.PendingAmount = Convert.ToDecimal(item.InvoiceAmount) - Convert.ToDecimal(item.RecieveAmt); ordobj.RecieveAmt = item.RecieveAmt; ordobj.PendingDays = item.PendingDays; ordobj.UploadFile = item.UploadFileName.ToLower(); if (ordobj.UploadFile.IndexOf("jpeg") > 0) { ordobj.Icon = "Jpeg.png"; } else if (ordobj.UploadFile.IndexOf("jpg") > 0) { ordobj.Icon = "Jpeg.png"; } else if (ordobj.UploadFile.IndexOf("pdf") > 0) { ordobj.Icon = "download.png"; } else if (ordobj.UploadFile.IndexOf("xlsx") > 0) { ordobj.Icon = "Excel.jpg"; } else if (ordobj.UploadFile.IndexOf("xls") > 0) { ordobj.Icon = "Excel.jpg"; } else { ordobj.Icon = "Unknown.png"; } Olist.Add(ordobj); } } return(View(Olist)); }
public static int UpdateInvoiceDetails(int invoiceDetailsId, int invoiceId, int locationId, string productName, decimal quantity, decimal price, decimal value) { InvoiceDetailsModel invoiceDetails = new InvoiceDetailsModel { InvoiceDetailsId = invoiceDetailsId, InvoiceId = invoiceId, LocationId = locationId, ProductName = productName, Price = price, Quantity = quantity, Value = value }; string sql = @"UPDATE dbo.InvoiceDetails SET InvoiceDetailsId = @InvoiceDetailsId, InvoiceId = @InvoiceId, LocationId = @LocationId, ProductName = @ProductName, Price = @Price, Quantity = @Quantity, Value = @Value WHERE InvoiceDetailsId = @InvoiceDetailsId AND LocationId = @LocationId"; return(SqlDataAccess <InvoiceDetailsModel> .SaveData(sql, invoiceDetails)); }
public async Task <IActionResult> Invoice(string invoiceId) { var invoice = (await _InvoiceRepository.GetInvoices(new InvoiceQuery() { UserId = GetUserId(), InvoiceId = invoiceId })).FirstOrDefault(); if (invoice == null) { return(NotFound()); } var dto = invoice.EntityToDTO(); var store = await _StoreRepository.FindStore(invoice.StoreId); InvoiceDetailsModel model = new InvoiceDetailsModel() { StoreName = store.StoreName, StoreLink = Url.Action(nameof(StoresController.UpdateStore), "Stores", new { storeId = store.Id }), Id = invoice.Id, Status = invoice.Status, RefundEmail = invoice.RefundMail, CreatedDate = invoice.InvoiceTime, ExpirationDate = invoice.ExpirationTime, OrderId = invoice.OrderId, BuyerInformation = invoice.BuyerInformation, Rate = invoice.Rate, Fiat = dto.Price + " " + dto.Currency, BTC = invoice.GetTotalCryptoDue().ToString() + " BTC", BTCDue = invoice.GetCryptoDue().ToString() + " BTC", BTCPaid = invoice.GetTotalPaid().ToString() + " BTC", NetworkFee = invoice.GetNetworkFee().ToString() + " BTC", NotificationUrl = invoice.NotificationURL, ProductInformation = invoice.ProductInformation, BitcoinAddress = invoice.DepositAddress, PaymentUrl = dto.PaymentUrls.BIP72 }; var payments = invoice .Payments .Select(async payment => { var m = new InvoiceDetailsModel.Payment(); m.DepositAddress = payment.Output.ScriptPubKey.GetDestinationAddress(_Network); m.Confirmations = (await _Explorer.GetTransactionAsync(payment.Outpoint.Hash))?.Confirmations ?? 0; m.TransactionId = payment.Outpoint.Hash.ToString(); m.ReceivedTime = payment.ReceivedTime; m.TransactionLink = _Network == Network.Main ? $"https://www.smartbit.com.au/tx/{m.TransactionId}" : $"https://testnet.smartbit.com.au/tx/{m.TransactionId}"; return(m); }) .ToArray(); await Task.WhenAll(payments); model.Payments = payments.Select(p => p.GetAwaiter().GetResult()).ToList(); model.StatusMessage = StatusMessage; return(View(model)); }
private InvoiceDetailsModel InvoicePopulatePayments(InvoiceEntity invoice) { var model = new InvoiceDetailsModel(); foreach (var data in invoice.GetPaymentMethods()) { var accounting = data.Calculate(); var paymentMethodId = data.GetId(); var cryptoPayment = new InvoiceDetailsModel.CryptoPayment(); cryptoPayment.PaymentMethod = paymentMethodId.ToPrettyString(); cryptoPayment.Due = _CurrencyNameTable.DisplayFormatCurrency(accounting.Due.ToDecimal(MoneyUnit.BTC), paymentMethodId.CryptoCode); cryptoPayment.Paid = _CurrencyNameTable.DisplayFormatCurrency(accounting.CryptoPaid.ToDecimal(MoneyUnit.BTC), paymentMethodId.CryptoCode); cryptoPayment.Overpaid = _CurrencyNameTable.DisplayFormatCurrency(accounting.OverpaidHelper.ToDecimal(MoneyUnit.BTC), paymentMethodId.CryptoCode); var paymentMethodDetails = data.GetPaymentMethodDetails(); cryptoPayment.Address = paymentMethodDetails.GetPaymentDestination(); cryptoPayment.Rate = ExchangeRate(data); model.CryptoPayments.Add(cryptoPayment); } foreach (var payment in invoice.GetPayments()) { var paymentData = payment.GetCryptoPaymentData(); //TODO: abstract if (paymentData is Payments.Bitcoin.BitcoinLikePaymentData onChainPaymentData) { var m = new InvoiceDetailsModel.Payment(); m.Crypto = payment.GetPaymentMethodId().CryptoCode; m.DepositAddress = onChainPaymentData.GetDestination(); int confirmationCount = onChainPaymentData.ConfirmationCount; if (confirmationCount >= payment.Network.MaxTrackedConfirmation) { m.Confirmations = "At least " + (payment.Network.MaxTrackedConfirmation); } else { m.Confirmations = confirmationCount.ToString(CultureInfo.InvariantCulture); } m.TransactionId = onChainPaymentData.Outpoint.Hash.ToString(); m.ReceivedTime = payment.ReceivedTime; m.TransactionLink = string.Format(CultureInfo.InvariantCulture, payment.Network.BlockExplorerLink, m.TransactionId); m.Replaced = !payment.Accounted; model.OnChainPayments.Add(m); } else { var lightningPaymentData = (LightningLikePaymentData)paymentData; model.OffChainPayments.Add(new InvoiceDetailsModel.OffChainPayment() { Crypto = payment.Network.CryptoCode, BOLT11 = lightningPaymentData.BOLT11 }); } } return(model); }
/// <summary> /// Handles the partial view request for Azure details. /// </summary> /// <param name="customerName">Name of the customer.</param> /// <param name="invoiceId">The invoice identifier.</param> /// <returns>A partial view containing the InvoiceDetailsModel model.</returns> /// <exception cref="ArgumentException"> /// <paramref name="customerName"/> is empty or null. /// or /// <paramref name="invoiceId"/> is empty or null. /// </exception> public async Task <PartialViewResult> AzureDetails(string customerName, string invoiceId) { customerName.AssertNotEmpty(nameof(customerName)); invoiceId.AssertNotEmpty(nameof(invoiceId)); InvoiceDetailsModel invoiceDetailsModel = new InvoiceDetailsModel() { InvoiceLineItems = await GetInvoiceLineItemsAsync(invoiceId, customerName, "Azure").ConfigureAwait(false) }; return(PartialView(invoiceDetailsModel)); }
/// <summary> /// Handles the request for the OfficeDetails partial view. /// </summary> /// <param name="customerName">Name of the customer.</param> /// <param name="invoiceId">The invoice identifier.</param> /// <returns>A partial view containing the InvoiceDetailsModel model.</returns> /// <exception cref="System.ArgumentException"> /// <paramref name="customerName"/> is empty or null. /// or /// <paramref name="invoiceId"/> is empty or null. /// </exception> public async Task <PartialViewResult> OfficeDetails(string customerName, string invoiceId) { customerName.AssertNotEmpty(nameof(customerName)); invoiceId.AssertNotEmpty(nameof(invoiceId)); InvoiceDetailsModel invoiceDetailsModel = new InvoiceDetailsModel() { InvoiceLineItems = await this.GetInvoiceLineItemsAsync(invoiceId, customerName, "Office") }; return(this.PartialView(invoiceDetailsModel)); }
public static int DeleteInvoiceDetails(int invoiceDetailsId, int locationId) { InvoiceDetailsModel invoiceDetails = new InvoiceDetailsModel { InvoiceDetailsId = invoiceDetailsId, LocationId = locationId }; string sql = "DELETE FROM dbo.InvoiceDetails WHERE InvoiceDetailsId = @InvoiceDetailsId AND LocationId = @LocationId"; return(SqlDataAccess <InvoiceDetailsModel> .SaveData(sql, invoiceDetails)); }
/// <summary> /// Handles the Details view request. /// </summary> /// <param name="invoiceId">The invoice identifier.</param> /// <returns>The HTML template for the details page.</returns> public ActionResult Details(string invoiceId) { if (string.IsNullOrEmpty(invoiceId)) { return(RedirectToAction("Index", "Invoices")); } InvoiceDetailsModel invoiceDetailsModel = new InvoiceDetailsModel() { InvoiceId = invoiceId, }; return(View(invoiceDetailsModel)); }
public static int CreateInvoiceDetail(int invoiceDetailsId, int invoiceId, int locationId, string productName, decimal quantity, decimal price, decimal value) { InvoiceDetailsModel invoiceDetails = new InvoiceDetailsModel { InvoiceDetailsId = invoiceDetailsId, InvoiceId = invoiceId, LocationId = locationId, ProductName = productName, Price = price, Quantity = quantity, Value = value }; string sql = @"INSERT INTO dbo.InvoiceDetails (InvoiceDetailsId, InvoiceId, LocationId, ProductName, Price, Quantity, Value) VALUES (@InvoiceDetailsId, @InvoiceId, @LocationId, @ProductName, @Price, @Quantity, @Value)"; return(SqlDataAccess <InvoiceDetailsModel> .SaveData(sql, invoiceDetails)); }
/// <summary> /// Handles the partial view request for Azure details. /// </summary> /// <param name="customerName">Name of the customer.</param> /// <param name="invoiceId">The invoice identifier.</param> /// <returns>A partial view containing the InvoiceDetailsModel model.</returns> /// <exception cref="System.ArgumentNullException"> /// </exception> public async Task <PartialViewResult> AzureDetails(string customerName, string invoiceId) { if (string.IsNullOrEmpty(customerName)) { throw new ArgumentNullException(nameof(customerName)); } if (string.IsNullOrEmpty(invoiceId)) { throw new ArgumentNullException(nameof(invoiceId)); } InvoiceDetailsModel invoiceDetailsModel = new InvoiceDetailsModel() { InvoiceLineItems = await GetInvoiceLineItemsAsync(invoiceId, customerName, "Azure") }; return(PartialView(invoiceDetailsModel)); }
private InvoiceDetailsModel InvoicePopulatePayments(InvoiceEntity invoice) { var model = new InvoiceDetailsModel(); model.Payments = invoice.GetPayments(); foreach (var data in invoice.GetPaymentMethods()) { var accounting = data.Calculate(); var paymentMethodId = data.GetId(); var cryptoPayment = new InvoiceDetailsModel.CryptoPayment(); cryptoPayment.PaymentMethodId = paymentMethodId; cryptoPayment.PaymentMethod = paymentMethodId.ToPrettyString(); cryptoPayment.Due = _CurrencyNameTable.DisplayFormatCurrency(accounting.Due.ToDecimal(MoneyUnit.BTC), paymentMethodId.CryptoCode); cryptoPayment.Paid = _CurrencyNameTable.DisplayFormatCurrency(accounting.CryptoPaid.ToDecimal(MoneyUnit.BTC), paymentMethodId.CryptoCode); cryptoPayment.Overpaid = _CurrencyNameTable.DisplayFormatCurrency(accounting.OverpaidHelper.ToDecimal(MoneyUnit.BTC), paymentMethodId.CryptoCode); var paymentMethodDetails = data.GetPaymentMethodDetails(); cryptoPayment.Rate = ExchangeRate(data); model.CryptoPayments.Add(cryptoPayment); } return(model); }
public async Task <IActionResult> Invoice(string invoiceId) { var invoice = (await _InvoiceRepository.GetInvoices(new InvoiceQuery() { UserId = GetUserId(), InvoiceId = invoiceId, IncludeAddresses = true, IncludeEvents = true })).FirstOrDefault(); if (invoice == null) { return(NotFound()); } var dto = invoice.EntityToDTO(_NetworkProvider); var store = await _StoreRepository.FindStore(invoice.StoreId); InvoiceDetailsModel model = new InvoiceDetailsModel() { StoreName = store.StoreName, StoreLink = Url.Action(nameof(StoresController.UpdateStore), "Stores", new { storeId = store.Id }), Id = invoice.Id, Status = invoice.Status, TransactionSpeed = invoice.SpeedPolicy == SpeedPolicy.HighSpeed ? "high" : invoice.SpeedPolicy == SpeedPolicy.MediumSpeed ? "medium" : "low", RefundEmail = invoice.RefundMail, CreatedDate = invoice.InvoiceTime, ExpirationDate = invoice.ExpirationTime, MonitoringDate = invoice.MonitoringExpiration, OrderId = invoice.OrderId, BuyerInformation = invoice.BuyerInformation, Fiat = FormatCurrency((decimal)dto.Price, dto.Currency), NotificationUrl = invoice.NotificationURL, RedirectUrl = invoice.RedirectURL, ProductInformation = invoice.ProductInformation, StatusException = invoice.ExceptionStatus, Events = invoice.Events }; foreach (var data in invoice.GetPaymentMethods(null)) { var cryptoInfo = dto.CryptoInfo.First(o => o.GetpaymentMethodId() == data.GetId()); var accounting = data.Calculate(); var paymentMethodId = data.GetId(); var cryptoPayment = new InvoiceDetailsModel.CryptoPayment(); cryptoPayment.PaymentMethod = ToString(paymentMethodId); cryptoPayment.Due = accounting.Due.ToString() + $" {paymentMethodId.CryptoCode}"; cryptoPayment.Paid = accounting.CryptoPaid.ToString() + $" {paymentMethodId.CryptoCode}"; var onchainMethod = data.GetPaymentMethodDetails() as Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod; if (onchainMethod != null) { cryptoPayment.Address = onchainMethod.DepositAddress; } cryptoPayment.Rate = FormatCurrency(data); cryptoPayment.PaymentUrl = cryptoInfo.PaymentUrls.BIP21; model.CryptoPayments.Add(cryptoPayment); } var payments = invoice .GetPayments() .Where(p => p.GetPaymentMethodId().PaymentType == PaymentTypes.BTCLike) .Select(async payment => { var paymentData = (Payments.Bitcoin.BitcoinLikePaymentData)payment.GetCryptoPaymentData(); var m = new InvoiceDetailsModel.Payment(); var paymentNetwork = _NetworkProvider.GetNetwork(payment.GetCryptoCode()); m.PaymentMethod = ToString(payment.GetPaymentMethodId()); m.DepositAddress = paymentData.Output.ScriptPubKey.GetDestinationAddress(paymentNetwork.NBitcoinNetwork); int confirmationCount = 0; if ((paymentData.ConfirmationCount < paymentNetwork.MaxTrackedConfirmation && payment.Accounted) && (paymentData.Legacy || invoice.MonitoringExpiration < DateTimeOffset.UtcNow)) // The confirmation count in the paymentData is not up to date { confirmationCount = (await((ExplorerClientProvider)_ServiceProvider.GetService(typeof(ExplorerClientProvider))).GetExplorerClient(payment.GetCryptoCode())?.GetTransactionAsync(paymentData.Outpoint.Hash))?.Confirmations ?? 0; paymentData.ConfirmationCount = confirmationCount; payment.SetCryptoPaymentData(paymentData); await _InvoiceRepository.UpdatePayments(new List <PaymentEntity> { payment }); } else { confirmationCount = paymentData.ConfirmationCount; } if (confirmationCount >= paymentNetwork.MaxTrackedConfirmation) { m.Confirmations = "At least " + (paymentNetwork.MaxTrackedConfirmation); } else { m.Confirmations = confirmationCount.ToString(CultureInfo.InvariantCulture); } m.TransactionId = paymentData.Outpoint.Hash.ToString(); m.ReceivedTime = payment.ReceivedTime; m.TransactionLink = string.Format(CultureInfo.InvariantCulture, paymentNetwork.BlockExplorerLink, m.TransactionId); m.Replaced = !payment.Accounted; return(m); }) .ToArray(); await Task.WhenAll(payments); model.Addresses = invoice.HistoricalAddresses.Select(h => new InvoiceDetailsModel.AddressModel { Destination = h.GetAddress(), PaymentMethod = ToString(h.GetPaymentMethodId()), Current = !h.UnAssigned.HasValue }).ToArray(); model.Payments = payments.Select(p => p.GetAwaiter().GetResult()).ToList(); model.StatusMessage = StatusMessage; return(View(model)); }
public async Task <IActionResult> Invoice(string invoiceId) { var invoice = (await _InvoiceRepository.GetInvoices(new InvoiceQuery() { InvoiceId = invoiceId, UserId = GetUserId(), IncludeAddresses = true, IncludeEvents = true })).FirstOrDefault(); if (invoice == null) { return(NotFound()); } var prodInfo = invoice.ProductInformation; var store = await _StoreRepository.FindStore(invoice.StoreId); var model = new InvoiceDetailsModel() { StoreName = store.StoreName, StoreLink = Url.Action(nameof(StoresController.UpdateStore), "Stores", new { storeId = store.Id }), Id = invoice.Id, State = invoice.GetInvoiceState().ToString(), TransactionSpeed = invoice.SpeedPolicy == SpeedPolicy.HighSpeed ? "high" : invoice.SpeedPolicy == SpeedPolicy.MediumSpeed ? "medium" : invoice.SpeedPolicy == SpeedPolicy.LowMediumSpeed ? "low-medium" : "low", RefundEmail = invoice.RefundMail, CreatedDate = invoice.InvoiceTime, ExpirationDate = invoice.ExpirationTime, MonitoringDate = invoice.MonitoringExpiration, OrderId = invoice.OrderId, BuyerInformation = invoice.BuyerInformation, Fiat = _CurrencyNameTable.DisplayFormatCurrency(prodInfo.Price, prodInfo.Currency), TaxIncluded = _CurrencyNameTable.DisplayFormatCurrency(prodInfo.TaxIncluded, prodInfo.Currency), NotificationEmail = invoice.NotificationEmail, NotificationUrl = invoice.NotificationURL, RedirectUrl = invoice.RedirectURL, ProductInformation = invoice.ProductInformation, StatusException = invoice.ExceptionStatus, Events = invoice.Events, PosData = PosDataParser.ParsePosData(invoice.PosData), StatusMessage = StatusMessage }; model.Addresses = invoice.HistoricalAddresses.Select(h => new InvoiceDetailsModel.AddressModel { Destination = h.GetAddress(), PaymentMethod = ToString(h.GetPaymentMethodId()), Current = !h.UnAssigned.HasValue }).ToArray(); var updateConfirmationCountIfNeeded = invoice .GetPayments() .Select <PaymentEntity, Task>(async payment => { var paymentNetwork = _NetworkProvider.GetNetwork(payment.GetCryptoCode()); var paymentData = payment.GetCryptoPaymentData(); if (paymentData is Payments.Bitcoin.BitcoinLikePaymentData onChainPaymentData) { int confirmationCount = 0; if ((onChainPaymentData.ConfirmationCount < paymentNetwork.MaxTrackedConfirmation && payment.Accounted) && (onChainPaymentData.Legacy || invoice.MonitoringExpiration < DateTimeOffset.UtcNow)) // The confirmation count in the paymentData is not up to date { confirmationCount = (await((ExplorerClientProvider)_ServiceProvider.GetService(typeof(ExplorerClientProvider))).GetExplorerClient(payment.GetCryptoCode())?.GetTransactionAsync(onChainPaymentData.Outpoint.Hash))?.Confirmations ?? 0; onChainPaymentData.ConfirmationCount = confirmationCount; payment.SetCryptoPaymentData(onChainPaymentData); await _InvoiceRepository.UpdatePayments(new List <PaymentEntity> { payment }); } } }) .ToArray(); await Task.WhenAll(updateConfirmationCountIfNeeded); var details = InvoicePopulatePayments(invoice); model.CryptoPayments = details.CryptoPayments; model.OnChainPayments = details.OnChainPayments; model.OffChainPayments = details.OffChainPayments; return(View(model)); }
public async Task <IActionResult> Invoice(string invoiceId, string cryptoCode = null) { if (cryptoCode == null) { cryptoCode = "BTC"; } var invoice = (await _InvoiceRepository.GetInvoices(new InvoiceQuery() { UserId = GetUserId(), InvoiceId = invoiceId })).FirstOrDefault(); if (invoice == null) { return(NotFound()); } var network = _NetworkProvider.GetNetwork(cryptoCode); if (network == null || !invoice.Support(network)) { return(NotFound()); } var cryptoData = invoice.GetCryptoData(network); var dto = invoice.EntityToDTO(_NetworkProvider); var cryptoInfo = dto.CryptoInfo.First(o => o.CryptoCode.Equals(cryptoCode, StringComparison.OrdinalIgnoreCase)); var store = await _StoreRepository.FindStore(invoice.StoreId); var accounting = cryptoData.Calculate(); InvoiceDetailsModel model = new InvoiceDetailsModel() { StoreName = store.StoreName, StoreLink = Url.Action(nameof(StoresController.UpdateStore), "Stores", new { storeId = store.Id }), Id = invoice.Id, Status = invoice.Status, RefundEmail = invoice.RefundMail, CreatedDate = invoice.InvoiceTime, ExpirationDate = invoice.ExpirationTime, OrderId = invoice.OrderId, BuyerInformation = invoice.BuyerInformation, Rate = cryptoData.Rate, Fiat = dto.Price + " " + dto.Currency, BTC = accounting.TotalDue.ToString() + $" {network.CryptoCode}", BTCDue = accounting.Due.ToString() + $" {network.CryptoCode}", BTCPaid = accounting.Paid.ToString() + $" {network.CryptoCode}", NetworkFee = accounting.NetworkFee.ToString() + $" {network.CryptoCode}", NotificationUrl = invoice.NotificationURL, ProductInformation = invoice.ProductInformation, BitcoinAddress = BitcoinAddress.Create(cryptoInfo.Address, network.NBitcoinNetwork), PaymentUrl = cryptoInfo.PaymentUrls.BIP72 }; var payments = invoice .Payments .Select(async payment => { var m = new InvoiceDetailsModel.Payment(); m.DepositAddress = payment.GetScriptPubKey().GetDestinationAddress(network.NBitcoinNetwork); m.Confirmations = (await _Explorer.GetTransactionAsync(payment.Outpoint.Hash))?.Confirmations ?? 0; m.TransactionId = payment.Outpoint.Hash.ToString(); m.ReceivedTime = payment.ReceivedTime; m.TransactionLink = string.Format(network.BlockExplorerLink, m.TransactionId); return(m); }) .ToArray(); await Task.WhenAll(payments); model.Payments = payments.Select(p => p.GetAwaiter().GetResult()).ToList(); model.StatusMessage = StatusMessage; return(View(model)); }
public async Task <IActionResult> Invoice(string invoiceId) { var invoice = (await _InvoiceRepository.GetInvoices(new InvoiceQuery() { UserId = GetUserId(), InvoiceId = invoiceId, IncludeAddresses = true })).FirstOrDefault(); if (invoice == null) { return(NotFound()); } var dto = invoice.EntityToDTO(_NetworkProvider); var store = await _StoreRepository.FindStore(invoice.StoreId); InvoiceDetailsModel model = new InvoiceDetailsModel() { StoreName = store.StoreName, StoreLink = Url.Action(nameof(StoresController.UpdateStore), "Stores", new { storeId = store.Id }), Id = invoice.Id, Status = invoice.Status, RefundEmail = invoice.RefundMail, CreatedDate = invoice.InvoiceTime, ExpirationDate = invoice.ExpirationTime, MonitoringDate = invoice.MonitoringExpiration, OrderId = invoice.OrderId, BuyerInformation = invoice.BuyerInformation, Fiat = FormatCurrency((decimal)dto.Price, dto.Currency), NotificationUrl = invoice.NotificationURL, ProductInformation = invoice.ProductInformation, StatusException = invoice.ExceptionStatus }; foreach (var data in invoice.GetCryptoData()) { var cryptoInfo = dto.CryptoInfo.First(o => o.CryptoCode.Equals(data.Key, StringComparison.OrdinalIgnoreCase)); var accounting = data.Value.Calculate(); var paymentNetwork = _NetworkProvider.GetNetwork(data.Key); var cryptoPayment = new InvoiceDetailsModel.CryptoPayment(); cryptoPayment.CryptoCode = paymentNetwork.CryptoCode; cryptoPayment.Due = accounting.Due.ToString() + $" {paymentNetwork.CryptoCode}"; cryptoPayment.Paid = accounting.CryptoPaid.ToString() + $" {paymentNetwork.CryptoCode}"; cryptoPayment.Address = data.Value.DepositAddress.ToString(); cryptoPayment.Rate = FormatCurrency(data.Value); cryptoPayment.PaymentUrl = cryptoInfo.PaymentUrls.BIP21; model.CryptoPayments.Add(cryptoPayment); } var payments = invoice .GetPayments() .Select(async payment => { var m = new InvoiceDetailsModel.Payment(); var paymentNetwork = _NetworkProvider.GetNetwork(payment.GetCryptoCode()); m.CryptoCode = payment.GetCryptoCode(); m.DepositAddress = payment.GetScriptPubKey().GetDestinationAddress(paymentNetwork.NBitcoinNetwork); m.Confirmations = (await _ExplorerClients.GetExplorerClient(payment.GetCryptoCode())?.GetTransactionAsync(payment.Outpoint.Hash))?.Confirmations ?? 0; m.TransactionId = payment.Outpoint.Hash.ToString(); m.ReceivedTime = payment.ReceivedTime; m.TransactionLink = string.Format(paymentNetwork.BlockExplorerLink, m.TransactionId); m.Replaced = !payment.Accounted; return(m); }) .ToArray(); await Task.WhenAll(payments); model.Addresses = invoice.HistoricalAddresses; model.Payments = payments.Select(p => p.GetAwaiter().GetResult()).ToList(); model.StatusMessage = StatusMessage; return(View(model)); }
public async Task <IActionResult> Invoice(string invoiceId) { var invoice = (await _InvoiceRepository.GetInvoices(new InvoiceQuery() { InvoiceId = new[] { invoiceId }, UserId = GetUserId(), IncludeAddresses = true, IncludeEvents = true, IncludeArchived = true, })).FirstOrDefault(); if (invoice == null) { return(NotFound()); } var store = await _StoreRepository.FindStore(invoice.StoreId); var invoiceState = invoice.GetInvoiceState(); var model = new InvoiceDetailsModel() { StoreId = store.Id, StoreName = store.StoreName, StoreLink = Url.Action(nameof(StoresController.UpdateStore), "Stores", new { storeId = store.Id }), PaymentRequestLink = Url.Action(nameof(PaymentRequestController.ViewPaymentRequest), "PaymentRequest", new { id = invoice.Metadata.PaymentRequestId }), Id = invoice.Id, State = invoiceState.ToString(), TransactionSpeed = invoice.SpeedPolicy == SpeedPolicy.HighSpeed ? "high" : invoice.SpeedPolicy == SpeedPolicy.MediumSpeed ? "medium" : invoice.SpeedPolicy == SpeedPolicy.LowMediumSpeed ? "low-medium" : "low", RefundEmail = invoice.RefundMail, CreatedDate = invoice.InvoiceTime, ExpirationDate = invoice.ExpirationTime, MonitoringDate = invoice.MonitoringExpiration, Fiat = _CurrencyNameTable.DisplayFormatCurrency(invoice.Price, invoice.Currency), TaxIncluded = _CurrencyNameTable.DisplayFormatCurrency(invoice.Metadata.TaxIncluded ?? 0.0m, invoice.Currency), NotificationUrl = invoice.NotificationURL?.AbsoluteUri, RedirectUrl = invoice.RedirectURL?.AbsoluteUri, TypedMetadata = invoice.Metadata, StatusException = invoice.ExceptionStatus, Events = invoice.Events, PosData = PosDataParser.ParsePosData(invoice.Metadata.PosData), Archived = invoice.Archived, CanRefund = CanRefund(invoiceState), ShowCheckout = invoice.Status == InvoiceStatusLegacy.New, Deliveries = (await _InvoiceRepository.GetWebhookDeliveries(invoiceId)) .Select(c => new Models.StoreViewModels.DeliveryViewModel(c)) .ToList(), CanMarkInvalid = invoiceState.CanMarkInvalid(), CanMarkComplete = invoiceState.CanMarkComplete(), }; model.Addresses = invoice.HistoricalAddresses.Select(h => new InvoiceDetailsModel.AddressModel { Destination = h.GetAddress(), PaymentMethod = h.GetPaymentMethodId().ToPrettyString(), Current = !h.UnAssigned.HasValue }).ToArray(); var details = InvoicePopulatePayments(invoice); model.CryptoPayments = details.CryptoPayments; model.Payments = details.Payments; return(View(model)); }