public async Task <IActionResult> SyncProducts()
        {
            var errorList       = new List <string>();
            var productsCreated = 0;
            var productsUpdated = 0;

            try
            {
                if (_db.Connection.State == System.Data.ConnectionState.Closed)
                {
                    await _db.Connection.OpenAsync();
                }

                var query    = new ProductQueries(_db);
                var products = await query.GetAllProducts();

                foreach (var product in products)
                {
                    decimal price = 0;
                    if (!string.IsNullOrEmpty(product._price))
                    {
                        decimal.TryParse(product._price, out price);
                    }
                    int typeId = 0;
                    if (!string.IsNullOrEmpty(product._cat_id))
                    {
                        int.TryParse(product._cat_id, out typeId);
                    }

                    var found = await _context.Product.FindAsync(int.Parse(product.id.ToString()));

                    if (found == null)
                    {
                        productsCreated++;
                        var newProduct = new Product
                        {
                            AllowOutOfStockPurchase = true,
                            Barcode            = product._sku,
                            ChargeTaxes        = true,
                            ModifiedDate       = DateTime.Now,
                            ProductCode        = product._sku,
                            ProductDescription = "",
                            ProductId          = int.Parse(product.id.ToString()),
                            ProductName        = product.post_title,
                            ProductTypeId      = typeId,
                            PurchasePrice      = 0,
                            Sku        = product._sku,
                            SalesPrice = price
                        };

                        if (typeId > 0)
                        {
                            var existingProductType = await _context.ProductType.FindAsync(typeId);

                            if (existingProductType == null)
                            {
                                newProduct.ProductType = new ProductType
                                {
                                    ProductTypeId   = typeId,
                                    ModifiedDate    = DateTime.Now,
                                    ProductTypeName = product._category
                                };
                            }
                        }
                        else
                        {
                            newProduct.ProductType = null;
                        }
                        await _context.Product.AddAsync(newProduct);

                        await _context.SaveChangesAsync();
                    }
                    else
                    {
                        productsUpdated++;
                        found.ModifiedDate = DateTime.Now;
                        found.SalesPrice   = price;
                        await _context.SaveChangesAsync();
                    }
                }
                _db.Connection.Close();
            }
            catch (Exception ex)
            {
                errorList.Add("order taxes:" + ex.ToString());
            }

            await _emailSender.SendEmailAsync("*****@*****.**", "Sync Finished: Products", $"Sync Finished: Products. \n Products Created: {productsCreated}. \n Products Updated: {productsUpdated}. \n Errors: {string.Join(",", errorList)}");

            return(Ok(errorList));
        }
        public async Task <IActionResult> SyncProducts()
        {
            var stopWatch = new Stopwatch();

            stopWatch.Start();
            var errorList       = new List <string>();
            var productsCreated = 0;
            var productsUpdated = 0;

            try
            {
                if (_db.Connection.State == System.Data.ConnectionState.Closed)
                {
                    await _db.Connection.OpenAsync();
                }

                var query    = new ProductQueries(_db);
                var products = await query.GetAllProducts();

                foreach (var product in products)
                {
                    try
                    {
                        decimal price = 0;
                        if (!string.IsNullOrEmpty(product._price))
                        {
                            decimal.TryParse(product._price, out price);
                        }

                        var found = await _context.Product.FindAsync(int.Parse(product.id.ToString()));

                        if (found == null)
                        {
                            productsCreated++;
                            var newProduct = new Product
                            {
                                AllowOutOfStockPurchase = true,
                                Barcode            = product._sku,
                                ChargeTaxes        = true,
                                ModifiedDate       = DateTime.Now,
                                ProductCode        = product._sku,
                                ProductDescription = "",
                                ProductId          = int.Parse(product.id.ToString()),
                                ProductName        = product.post_title,
                                ProductTypeId      = 0,
                                PurchasePrice      = 0,
                                Sku        = product._sku,
                                SalesPrice = price
                            };

                            newProduct.ProductType = null;

                            await _context.Product.AddAsync(newProduct);

                            await _context.ProductInventory.AddAsync(new ProductInventory
                            {
                                Balance      = 0,
                                BinCode      = "",
                                LocationId   = 1,
                                ModifiedDate = newProduct.ModifiedDate,
                                ProductId    = newProduct.ProductId,
                            });

                            await _context.ProductInventory.AddAsync(new ProductInventory
                            {
                                Balance      = 0,
                                BinCode      = "",
                                LocationId   = 2,
                                ModifiedDate = newProduct.ModifiedDate,
                                ProductId    = newProduct.ProductId,
                            });

                            await _context.ProductInventory.AddAsync(new ProductInventory
                            {
                                Balance      = 0,
                                BinCode      = "",
                                LocationId   = 3,
                                ModifiedDate = newProduct.ModifiedDate,
                                ProductId    = newProduct.ProductId,
                            });

                            await _context.SaveChangesAsync();
                        }
                        else
                        {
                            productsUpdated++;
                            found.ModifiedDate = DateTime.Now;
                            found.ProductName  = product.post_title;
                            found.SalesPrice   = price;
                            found.Barcode      = product._sku;
                            found.ProductCode  = product._sku;
                            await _context.SaveChangesAsync();
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                        errorList.Add("products error:" + e.ToString());
                    }
                }
                _db.Connection.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                errorList.Add("products error:" + ex.ToString());
            }
            stopWatch.Stop();
            var timeTook = $"Products Sync Took: {TimeSpan.FromMilliseconds(stopWatch.ElapsedMilliseconds).Minutes} minutes.";
            var message  = $"Products Sync Finished. \n Products Created: {productsCreated}. \n Products Updated: {productsUpdated}. {timeTook}\n Errors: {string.Join(",", errorList)}";

            _emailSender.SendEmailAsync("*****@*****.**", "Sync Finished: Products", message, null, null, true);

            return(Ok(message));
        }