コード例 #1
0
 public OrderTransactionRegisterLogic(ShopifyApiClient client)
 {
     _client = client;
 }
コード例 #2
0
        public async Task <IActionResult> ShopifyInvoiceEndpoint(
            string storeId, string orderId, decimal amount, bool checkOnly = false)
        {
            var shopifySearchTerm       = $"{ShopifyOrderMarkerHostedService.SHOPIFY_ORDER_ID_PREFIX}{orderId}";
            var matchedExistingInvoices = await _invoiceRepository.GetInvoices(new InvoiceQuery()
            {
                TextSearch = shopifySearchTerm,
                StoreId    = new[] { storeId }
            });

            matchedExistingInvoices = matchedExistingInvoices.Where(entity =>
                                                                    entity.GetInternalTags(ShopifyOrderMarkerHostedService.SHOPIFY_ORDER_ID_PREFIX)
                                                                    .Any(s => s == orderId))
                                      .ToArray();

            var firstInvoiceStillPending =
                matchedExistingInvoices.FirstOrDefault(entity =>
                                                       entity.GetInvoiceState().Status == InvoiceStatusLegacy.New);

            if (firstInvoiceStillPending != null)
            {
                return(Ok(new
                {
                    invoiceId = firstInvoiceStillPending.Id,
                    status = firstInvoiceStillPending.Status.ToString().ToLowerInvariant()
                }));
            }

            var firstInvoiceSettled =
                matchedExistingInvoices.LastOrDefault(entity =>
                                                      new[] { InvoiceStatusLegacy.Paid, InvoiceStatusLegacy.Complete, InvoiceStatusLegacy.Confirmed }
                                                      .Contains(
                                                          entity.GetInvoiceState().Status));

            var store = await _storeRepository.FindStore(storeId);

            var shopify             = store?.GetStoreBlob()?.GetShopifySettings();
            ShopifyApiClient client = null;
            ShopifyOrder     order  = null;

            if (shopify?.IntegratedAt.HasValue is true)
            {
                client = new ShopifyApiClient(_clientFactory, shopify.CreateShopifyApiCredentials());
                order  = await client.GetOrder(orderId);

                if (order?.Id is null)
                {
                    return(NotFound());
                }
            }

            if (firstInvoiceSettled != null)
            {
                //if BTCPay was shut down before the tx managed to get registered on shopify, this will fix it on the next UI load in shopify
                if (client != null && order?.FinancialStatus == "pending" &&
                    firstInvoiceSettled.Status != InvoiceStatusLegacy.Paid)
                {
                    await new OrderTransactionRegisterLogic(client).Process(orderId, firstInvoiceSettled.Id,
                                                                            firstInvoiceSettled.Currency,
                                                                            firstInvoiceSettled.Price.ToString(CultureInfo.InvariantCulture), true);
                    order = await client.GetOrder(orderId);
                }

                return(Ok(new
                {
                    invoiceId = firstInvoiceSettled.Id,
                    status = firstInvoiceSettled.Status.ToString().ToLowerInvariant()
                }));
            }

            if (checkOnly)
            {
                return(Ok());
            }

            if (shopify?.IntegratedAt.HasValue is true)
            {
                if (order?.Id is null ||
                    !new[] { "pending", "partially_paid" }.Contains(order.FinancialStatus))
                {
                    return(NotFound());
                }

                //we create the invoice at due amount provided from order page or full amount if due amount is bigger than order amount
                var invoice = await _invoiceController.CreateInvoiceCoreRaw(
                    new CreateInvoiceRequest()
                {
                    Amount   = amount < order.TotalOutstanding ? amount : order.TotalOutstanding,
                    Currency = order.PresentmentCurrency,
                    Metadata = new JObject
                    {
                        ["orderId"]            = order.OrderNumber,
                        ["shopifyOrderId"]     = order.Id,
                        ["shopifyOrderNumber"] = order.OrderNumber
                    },
                    AdditionalSearchTerms = new []
                    {
                        order.OrderNumber.ToString(CultureInfo.InvariantCulture),
                        order.Id.ToString(CultureInfo.InvariantCulture),
                        shopifySearchTerm
                    }
                }, store,
                    Request.GetAbsoluteRoot(), new List <string>() { shopifySearchTerm });

                return(Ok(new { invoiceId = invoice.Id, status = invoice.Status.ToString().ToLowerInvariant() }));
            }

            return(NotFound());
        }
コード例 #3
0
        public async Task <IActionResult> EditShopify(string storeId,
                                                      ShopifySettings vm, string command = "")
        {
            switch (command)
            {
            case "ShopifySaveCredentials":
            {
                var shopify    = vm;
                var validCreds = shopify != null && shopify?.CredentialsPopulated() == true;
                if (!validCreds)
                {
                    TempData[WellKnownTempData.ErrorMessage] = "Please provide valid Shopify credentials";
                    return(View(vm));
                }
                var apiClient = new ShopifyApiClient(_clientFactory, shopify.CreateShopifyApiCredentials());
                try
                {
                    await apiClient.OrdersCount();
                }
                catch (ShopifyApiException err)
                {
                    TempData[WellKnownTempData.ErrorMessage] = err.Message;
                    return(View(vm));
                }

                var scopesGranted = await apiClient.CheckScopes();

                if (!scopesGranted.Contains("read_orders") || !scopesGranted.Contains("write_orders"))
                {
                    TempData[WellKnownTempData.ErrorMessage] =
                        "Please grant the private app permissions for read_orders, write_orders";
                    return(View(vm));
                }

                // everything ready, proceed with saving Shopify integration credentials
                shopify.IntegratedAt = DateTimeOffset.Now;

                var blob = CurrentStore.GetStoreBlob();
                blob.SetShopifySettings(shopify);
                if (CurrentStore.SetStoreBlob(blob))
                {
                    await _storeRepository.UpdateStore(CurrentStore);
                }

                TempData[WellKnownTempData.SuccessMessage] = "Shopify plugin successfully updated";
                break;
            }

            case "ShopifyClearCredentials":
            {
                var blob = CurrentStore.GetStoreBlob();
                blob.SetShopifySettings(null);
                if (CurrentStore.SetStoreBlob(blob))
                {
                    await _storeRepository.UpdateStore(CurrentStore);
                }

                TempData[WellKnownTempData.SuccessMessage] = "Shopify plugin credentials cleared";
                break;
            }
            }

            return(RedirectToAction(nameof(EditShopify), new { storeId = CurrentStore.Id }));
        }
コード例 #4
0
        public async Task <IActionResult> EditShopifyIntegration(string storeId,
                                                                 ShopifySettings vm, string command = "", string exampleUrl = "")
        {
            if (!string.IsNullOrEmpty(exampleUrl))
            {
                try
                {
                    //https://{apikey}:{password}@{hostname}/admin/api/{version}/{resource}.json
                    var parsedUrl = new Uri(exampleUrl);
                    var userInfo  = parsedUrl.UserInfo.Split(":");
                    vm = new ShopifySettings()
                    {
                        ApiKey   = userInfo[0],
                        Password = userInfo[1],
                        ShopName = parsedUrl.Host.Replace(".myshopify.com", "",
                                                          StringComparison.InvariantCultureIgnoreCase)
                    };
                    command = "ShopifySaveCredentials";
                }
                catch (Exception)
                {
                    TempData[WellKnownTempData.ErrorMessage] = "The provided Example Url was invalid.";
                    return(View(vm));
                }
            }

            switch (command)
            {
            case "ShopifySaveCredentials":
            {
                var shopify    = vm;
                var validCreds = shopify != null && shopify?.CredentialsPopulated() == true;
                if (!validCreds)
                {
                    TempData[WellKnownTempData.ErrorMessage] = "Please provide valid Shopify credentials";
                    return(View(vm));
                }

                var apiClient = new ShopifyApiClient(_clientFactory, shopify.CreateShopifyApiCredentials());
                try
                {
                    await apiClient.OrdersCount();
                }
                catch (ShopifyApiException)
                {
                    TempData[WellKnownTempData.ErrorMessage] =
                        "Shopify rejected provided credentials, please correct values and try again";
                    return(View(vm));
                }

                var scopesGranted = await apiClient.CheckScopes();

                if (!scopesGranted.Contains("read_orders") || !scopesGranted.Contains("write_orders"))
                {
                    TempData[WellKnownTempData.ErrorMessage] =
                        "Please grant the private app permissions for read_orders, write_orders";
                    return(View(vm));
                }

                // everything ready, proceed with saving Shopify integration credentials
                shopify.IntegratedAt = DateTimeOffset.Now;

                var blob = CurrentStore.GetStoreBlob();
                blob.SetShopifySettings(shopify);
                if (CurrentStore.SetStoreBlob(blob))
                {
                    await _storeRepository.UpdateStore(CurrentStore);
                }

                TempData[WellKnownTempData.SuccessMessage] = "Shopify integration successfully updated";
                break;
            }

            case "ShopifyClearCredentials":
            {
                var blob = CurrentStore.GetStoreBlob();
                blob.SetShopifySettings(null);
                if (CurrentStore.SetStoreBlob(blob))
                {
                    await _storeRepository.UpdateStore(CurrentStore);
                }

                TempData[WellKnownTempData.SuccessMessage] = "Shopify integration credentials cleared";
                break;
            }
            }

            return(RedirectToAction(nameof(EditShopifyIntegration), new { storeId = CurrentStore.Id }));
        }