Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 7
0
        /// <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));
        }
Exemplo n.º 9
0
        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));
        }
Exemplo n.º 10
0
        /// <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));
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 14
0
        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));
        }
Exemplo n.º 15
0
        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));
        }
Exemplo n.º 16
0
        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));
        }
Exemplo n.º 17
0
        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));
        }
Exemplo n.º 18
0
        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));
        }