public ActionResult StoreNewItem(StoreItemDisplayModel storeItem)
        {
            var sg = new StoreGateway();
            try
            {
                StoreItemDisplay display = new StoreItemDisplay();
                display.CanPickUpLocally = storeItem.CanPickUpLocally;
                display.ArticleNumber = storeItem.ArticleNumber;
                display.CanRunOutOfStock = storeItem.CanRunOutOfStock;
                display.Currency = storeItem.Currency;
                display.Description = storeItem.Description;
                display.InternalId = storeItem.InternalId;
                display.Note = storeItem.HtmlNote;
                display.Price = storeItem.Price;
                display.PrivateManagerId = storeItem.PrivateManagerId;
                display.QuantityInStock = storeItem.QuantityInStock;
                display.StoreItemId = storeItem.StoreItemId;
                display.Merchant.Name = storeItem.StoreName;
                display.Weight = storeItem.Weight;
                display.MerchantId = storeItem.MerchantId;
                display.Name = storeItem.Name;
                display.Shipping = storeItem.Shipping;
                display.HasExtraLarge = storeItem.HasExtraLarge;
                display.HasExtraSmall = storeItem.HasExtraSmall;
                display.HasLarge = storeItem.HasLarge;
                display.HasMedium = storeItem.HasMedium;
                display.HasSmall = storeItem.HasSmall;
                display.HasXXLarge = storeItem.HasXXLarge;
                display.ItemTypeEnum = storeItem.ItemTypeEnum;
                display.ItemType = storeItem.ItemType;
                display.ColorTempSelected = storeItem.ColorsSelected;

                display = sg.CreateNewStoreItem(display);
                if (display.StoreItemId > 0)
                    return Redirect(Url.Content("~/store/item/edit/" + display.StoreItemId + "/" + display.PrivateManagerId.ToString().Replace("-", "") + "/" + display.MerchantId.ToString().Replace("-", "")));

            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            //if the item didn't actually get created.
            var store = sg.GetStoreForManager(storeItem.MerchantId, storeItem.PrivateManagerId, false);
            storeItem.InternalId = store.InternalReference;
            storeItem.MerchantId = store.MerchantId;
            storeItem.PrivateManagerId = store.PrivateManagerId;
            return View(storeItem);
        }
        public Classes.Store GetStore(Guid? merchantId, bool isRdn = false)
        {
            var store = new Classes.Store();
            try
            {
                if (!merchantId.HasValue && !isRdn)
                    throw new Exception("Invalid merchant id. (CreateNewShoppingCart in StoreGateway");

                var mc = new ManagementContext();
                Merchant merchant = null;
                if (merchantId.HasValue) // ToDo: When Store is updated, updated the references here to include more tables
                    merchant = mc.Merchants.Include("Items").FirstOrDefault(x => x.MerchantId.Equals(merchantId.Value));
                else
                    merchant = mc.Merchants.Include("Items").FirstOrDefault(x => x.IsRDNation.Equals(true));
                if (merchant == null)
                    return null;

                store.Name = merchant.ShopName;
                store.MerchantId = merchant.MerchantId;
                store.InternalId = merchant.InternalReference;
                foreach (var storeItem in merchant.Items)
                {
                    var item = new Classes.StoreItemDisplay();
                    item.ArticleNumber = storeItem.ArticleNumber;
                    item.CanRunOutOfStock = storeItem.CanRunOutOfStock;
                    if (storeItem.Merchant.CurrencyRate == null)
                    {
                        item.Currency = "USD";
                        item.CurrencyCost = 1;
                    }
                    else
                    {
                        item.Currency = storeItem.Merchant.CurrencyRate.CurrencyAbbrName;
                        item.CurrencyCost = storeItem.Merchant.CurrencyRate.CurrencyExchangePerUSD;
                    }
                    item.Description = storeItem.Description;
                    item.Name = storeItem.Name;
                    item.Price = storeItem.Price;
                    item.QuantityInStock = storeItem.QuantityInStock;
                    item.StoreItemId = storeItem.StoreItemId;
                    item.Weight = storeItem.Weight;
                    item.Note = storeItem.Note;
                    item.IsPublished = storeItem.IsPublished;
                    item.ItemType = (StoreItemTypeEnum)Enum.Parse(typeof(StoreItemTypeEnum), storeItem.ItemTypeEnum.ToString());
                    if (item.ItemType == StoreItemTypeEnum.Shirt)
                    {
                        item.ItemSize = (StoreItemShirtSizesEnum)Enum.Parse(typeof(StoreItemShirtSizesEnum), storeItem.SizesEnum.ToString());
                        item.ItemSizeEnum = storeItem.SizesEnum;
                    }
                    store.StoreItems.Add(item);
                }
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return store;
        }
        public StoreItemDisplay CreateNewStoreItem(StoreItemDisplay storeItem)
        {
            try
            {
                var dc = new ManagementContext();

                var merchant = dc.Merchants.Where(x => x.InternalReference == storeItem.InternalId && x.MerchantId == storeItem.MerchantId && x.PrivateManagerId == storeItem.PrivateManagerId).FirstOrDefault();
                if (merchant != null)
                {
                    DataModels.Store.StoreItem si = new DataModels.Store.StoreItem();
                    si.ArticleNumber = storeItem.ArticleNumber;
                    si.CanRunOutOfStock = storeItem.CanRunOutOfStock;
                    si.CanPickUpLocally = storeItem.CanPickUpLocally;
                    si.Description = storeItem.Description;
                    si.ExemptFromShipping = false;
                    si.Merchant = merchant;
                    si.Name = storeItem.Name;
                    si.Note = storeItem.Note;
                    si.Price = storeItem.Price;
                    si.QuantityInStock = storeItem.QuantityInStock;
                    si.VisibleOnRdn = false;
                    si.Weight = storeItem.Weight;
                    si.ShippingCosts = storeItem.Shipping;
                    si.IsPublished = false;
                    //si.ItemTypeEnum = storeItem.ItemTypeEnum;
                    si.ItemTypeEnum = (int)storeItem.ItemType;
                    si.Category = dc.StoreItemCategories.Where(x => x.StoreItemCategoryId == si.ItemTypeEnum).FirstOrDefault();
                    if (storeItem.HasExtraLarge)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.X_Large);
                    if (storeItem.HasExtraSmall)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.X_Small);
                    if (storeItem.HasLarge)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.Large);
                    if (storeItem.HasMedium)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.Medium);
                    if (storeItem.HasSmall)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.Small);
                    if (storeItem.HasXXLarge)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.XX_Large);

                    if (!String.IsNullOrEmpty(storeItem.ColorTempSelected))
                    {
                        foreach (string color in storeItem.ColorTempSelected.Split(';'))
                        {
                            if (color.Length > 3)
                            {
                                Color c = ColorTranslator.FromHtml(color);
                                int arb = c.ToArgb();
                                var colorDb = dc.Colors.Where(x => x.ColorIdCSharp == arb).FirstOrDefault();
                                if (colorDb != null)
                                {
                                    DataModels.Store.StoreItemColor cItem = new DataModels.Store.StoreItemColor();
                                    cItem.Color = colorDb;
                                    cItem.StoreItem = si;
                                    si.Colors.Add(cItem);
                                }
                            }
                        }
                    }

                    dc.StoreItems.Add(si);
                    dc.SaveChanges();

                    storeItem.StoreItemId = si.StoreItemId;
                }
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return storeItem;
        }
        public Classes.StoreItemDisplay GetStoreItemManager(Guid merchantId, Guid privateManagerId, int itemId)
        {
            var item = new Classes.StoreItemDisplay();
            try
            {
                var mc = new ManagementContext();
                var storeItem = mc.StoreItems.Include("Colors").Include("Colors.Color").Include("Photos").Where(x => x.StoreItemId == itemId).Where(x => x.Merchant.MerchantId == merchantId).Where(x => x.Merchant.PrivateManagerId == privateManagerId).FirstOrDefault();
                if (storeItem == null)
                    return item;

                item.CanPickUpLocally = storeItem.CanPickUpLocally;
                item.Name = storeItem.Merchant.ShopName;
                item.MerchantId = storeItem.Merchant.MerchantId;
                item.InternalId = storeItem.Merchant.InternalReference;
                item.PrivateManagerId = storeItem.Merchant.PrivateManagerId;
                item.ArticleNumber = storeItem.ArticleNumber;
                item.CanRunOutOfStock = storeItem.CanRunOutOfStock;
                if (storeItem.Merchant.CurrencyRate == null)
                {
                    item.Currency = "USD";
                    item.CurrencyCost = 1;
                }
                else
                {
                    item.Currency = storeItem.Merchant.CurrencyRate.CurrencyAbbrName;
                    item.CurrencyCost = storeItem.Merchant.CurrencyRate.CurrencyExchangePerUSD;
                }
                item.Description = storeItem.Description;
                item.Name = storeItem.Name;
                item.Price = storeItem.Price;
                item.QuantityInStock = storeItem.QuantityInStock;
                item.StoreItemId = storeItem.StoreItemId;
                item.Weight = storeItem.Weight;
                item.Note = storeItem.Note;
                item.Shipping = storeItem.ShippingCosts;
                item.ShippingAdditional = storeItem.ShippingCostsAdditional;
                item.IsPublished = storeItem.IsPublished;
                item.ItemTypeEnum = storeItem.ItemTypeEnum;
                item.ItemType = (StoreItemTypeEnum)Enum.Parse(typeof(StoreItemTypeEnum), storeItem.ItemTypeEnum.ToString());
                if (item.ItemType == StoreItemTypeEnum.Shirt)
                {
                    item.ItemSizeEnum = storeItem.SizesEnum;
                    item.ItemSize = (StoreItemShirtSizesEnum)Enum.Parse(typeof(StoreItemShirtSizesEnum), storeItem.SizesEnum.ToString());
                }
                DisplayStoreItemColors(storeItem, item);

                foreach (var photo in storeItem.Photos)
                {
                    PhotoItem p = new PhotoItem(photo.ItemPhotoId, photo.ImageUrl, photo.ImageUrlThumb, photo.IsPrimaryPhoto, photo.AlternativeText);
                    item.Photos.Add(p);
                }
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return item;
        }
        public StoreItemDisplay UpdateStoreItem(StoreItemDisplay storeItem)
        {
            try
            {
                var dc = new ManagementContext();
                var si = dc.StoreItems.Include("Colors").Include("Colors.Color").Where(x => x.StoreItemId == storeItem.StoreItemId && x.Merchant.InternalReference == storeItem.InternalId && x.Merchant.MerchantId == storeItem.MerchantId && x.Merchant.PrivateManagerId == storeItem.PrivateManagerId).FirstOrDefault();

                if (si != null)
                {
                    si.CanPickUpLocally = storeItem.CanPickUpLocally;
                    si.Merchant = si.Merchant;
                    si.ArticleNumber = storeItem.ArticleNumber;
                    si.CanRunOutOfStock = storeItem.CanRunOutOfStock;
                    si.Description = storeItem.Description;
                    si.ExemptFromShipping = false;
                    si.Name = storeItem.Name;
                    si.Note = storeItem.Note;
                    si.Price = storeItem.Price;
                    si.QuantityInStock = storeItem.QuantityInStock;
                    si.VisibleOnRdn = false;
                    si.Weight = storeItem.Weight;
                    si.ShippingCosts = storeItem.Shipping;
                    si.ShippingCostsAdditional = storeItem.ShippingAdditional;
                    si.Category = dc.StoreItemCategories.Where(x => x.StoreItemCategoryId == storeItem.ItemTypeEnum).FirstOrDefault();
                    //they are just now publishing the item.
                    if (!si.IsPublished && storeItem.IsPublished)
                    {
                        AddRDNationFeeToMerchant(si);
                        si.LastPublished = DateTime.UtcNow;
                    }
                    si.IsPublished = storeItem.IsPublished;
                    si.ItemTypeEnum = storeItem.ItemTypeEnum;
                    si.SizesEnum = 0;
                    if (storeItem.HasExtraLarge)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.X_Large);
                    if (storeItem.HasExtraSmall)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.X_Small);
                    if (storeItem.HasLarge)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.Large);
                    if (storeItem.HasMedium)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.Medium);
                    if (storeItem.HasSmall)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.Small);
                    if (storeItem.HasXXLarge)
                        si.SizesEnum += Convert.ToInt32(StoreItemShirtSizesEnum.XX_Large);

                    //removes any colors not being used anymore.
                    List<int> colors = new List<int>();
                    if (!String.IsNullOrEmpty(storeItem.ColorTempSelected))
                    {
                        foreach (string color in storeItem.ColorTempSelected.Split(';'))
                        {
                            if (color.Length > 3)
                            {
                                Color c = ColorTranslator.FromHtml(color);
                                int arb = c.ToArgb();
                                colors.Add(arb);
                            }
                        }
                    }
                    var colorsNoLongerIn = si.Colors.Where(x => !colors.Contains(x.Color.ColorIdCSharp)).ToList();
                    foreach (var removeColor in colorsNoLongerIn)
                    {
                        si.Colors.Remove(removeColor);
                    }
                    //adds colors that are not currently added to the storeitem.
                    if (!String.IsNullOrEmpty(storeItem.ColorTempSelected))
                    {
                        foreach (string color in storeItem.ColorTempSelected.Split(';'))
                        {
                            if (color.Length > 3)
                            {
                                Color c = ColorTranslator.FromHtml(color);
                                int arb = c.ToArgb();
                                if (si.Colors.Where(x => x.Color.ColorIdCSharp == arb).FirstOrDefault() == null)
                                {
                                    var colorDb = dc.Colors.Where(x => x.ColorIdCSharp == arb).FirstOrDefault();
                                    if (colorDb != null)
                                    {
                                        DataModels.Store.StoreItemColor cItem = new DataModels.Store.StoreItemColor();
                                        cItem.Color = colorDb;
                                        cItem.StoreItem = si;
                                        si.Colors.Add(cItem);
                                    }
                                }
                            }
                        }
                    }



                    int ch = dc.SaveChanges();

                    storeItem.StoreItemId = si.StoreItemId;
                }
            }
            catch (System.Exception e)
            {
                var ex = e;
                ErrorDatabaseManager.AddException(ex, ex.GetType());
            }
            return storeItem;
        }
        public StoreShoppingCart GetShoppingCart(Guid cartId)
        {
            var output = new StoreShoppingCart();
            try
            {
                var mc = new ManagementContext();
                DateTime now = DateTime.Now;
                var cart = mc.ShoppingCarts.Include("Items").Include("Items.StoreItem").Include("Items.StoreItem.Colors").Include("Items.StoreItem.Colors.Color").Include("Items.StoreItem.Merchant").FirstOrDefault(x => x.ShoppingCartId.Equals(cartId));
                if (cart == null) return output;

                output.ShoppingCartId = cart.ShoppingCartId;
                output.Ip = cart.Ip;

                foreach (var shoppingCartItem in cart.Items)
                {
                    output.ItemsCount += 1;
                    var item = new StoreItemDisplay();
                    item.Merchant.MerchantId = shoppingCartItem.StoreItem.Merchant.MerchantId;
                    item.Merchant.Name = shoppingCartItem.StoreItem.Merchant.ShopName;
                    item.Merchant.TaxRate = shoppingCartItem.StoreItem.Merchant.TaxRate;
                    if (shoppingCartItem.StoreItem.Merchant.CurrencyRate == null)
                    {
                        item.Merchant.Currency = "USD";
                        item.Merchant.CurrencyCost = 1;
                    }
                    else
                    {
                        item.Merchant.Currency = shoppingCartItem.StoreItem.Merchant.CurrencyRate.CurrencyAbbrName;
                        item.Merchant.CurrencyCost = shoppingCartItem.StoreItem.Merchant.CurrencyRate.CurrencyExchangePerUSD;
                    }
                    item.Name = shoppingCartItem.StoreItem.Name;
                    item.BasePrice = shoppingCartItem.StoreItem.Price;
                    item.Price = (shoppingCartItem.StoreItem.Price * shoppingCartItem.Quantity);
                    var color = DisplayStoreItemColor(shoppingCartItem.StoreItem.Colors.Where(x => x.Color.ColorIdCSharp == shoppingCartItem.Color).FirstOrDefault());
                    if (color != null)
                    {
                        item.Colors.Add(color);
                        item.ColorAGB = color.CSharpColor;
                        item.ColorHex = color.HexColor;
                    }
                    item.QuantityOrdered = shoppingCartItem.Quantity;
                    item.Weight = (shoppingCartItem.StoreItem.Weight * shoppingCartItem.Quantity);
                    item.ShoppingCartItemId = shoppingCartItem.ShoppingCartItemId;
                    item.ArticleNumber = shoppingCartItem.StoreItem.ArticleNumber;
                    if (shoppingCartItem.StoreItem.Merchant.CurrencyRate == null)
                    {
                        item.Currency = "USD";
                        item.CurrencyCost = 1;
                    }
                    else
                    {
                        item.Currency = shoppingCartItem.StoreItem.Merchant.CurrencyRate.CurrencyAbbrName;
                        item.CurrencyCost = shoppingCartItem.StoreItem.Merchant.CurrencyRate.CurrencyExchangePerUSD;
                    }
                    item.Description = shoppingCartItem.StoreItem.Description;
                    item.WillPickUpLocally = shoppingCartItem.WillPickUpLocally;
                    if (!shoppingCartItem.WillPickUpLocally)
                    {
                        item.Shipping = shoppingCartItem.StoreItem.ShippingCosts;
                        //if there are more than one of the same items being shipped, then we add on the additional fees.
                        if (shoppingCartItem.Quantity > 1)
                            item.Shipping += shoppingCartItem.StoreItem.ShippingCostsAdditional * (shoppingCartItem.Quantity - 1);
                    }
                    else
                        item.Shipping = 0;
                    item.CanRunOutOfStock = shoppingCartItem.StoreItem.CanRunOutOfStock;
                    item.StoreItemId = shoppingCartItem.StoreItem.StoreItemId;
                    item.Note = shoppingCartItem.StoreItem.Note;
                    item.BaseTaxOnItem = Math.Round((item.BasePrice * Convert.ToDecimal(shoppingCartItem.StoreItem.Merchant.TaxRate)), 2);
                    item.TotalTaxOnItem = (item.BaseTaxOnItem * shoppingCartItem.Quantity);
                    item.PriceInclTax = Math.Round((item.Price + item.TotalTaxOnItem), 2);
                    item.ItemType = (StoreItemTypeEnum)Enum.Parse(typeof(StoreItemTypeEnum), shoppingCartItem.StoreItem.ItemTypeEnum.ToString());
                    if (item.ItemType == StoreItemTypeEnum.Shirt)
                    {
                        item.ItemSize = (StoreItemShirtSizesEnum)Enum.Parse(typeof(StoreItemShirtSizesEnum), shoppingCartItem.Size.ToString());
                        item.ItemSizeEnum = shoppingCartItem.Size;
                    }
                    foreach (var photo in shoppingCartItem.StoreItem.Photos)
                    {
                        PhotoItem p = new PhotoItem(photo.ItemPhotoId, photo.ImageUrl, photo.ImageUrlThumb, photo.IsPrimaryPhoto, photo.AlternativeText);
                        item.Photos.Add(p);
                    }
                    var store = output.Stores.Where(x => x.MerchantId == item.Merchant.MerchantId).FirstOrDefault();
                    if (store != null)
                    {
                        store.TotalPrice += item.Price;
                        store.TotalShipping += item.Shipping;
                        store.TotalAfterShipping += item.Price + item.Shipping;
                        store.StoreItems.Add(item);
                    }
                    else
                    {
                        Store.Classes.Store s = new Classes.Store();
                        s.MerchantId = item.Merchant.MerchantId;
                        s.Currency = item.Merchant.Currency;
                        s.StripePublishableKey = item.Merchant.StripePublishableKey;
                        s.Name = item.Merchant.Name;
                        s.TotalPrice = item.Price;
                        s.TotalShipping = item.Shipping;
                        s.TotalAfterShipping = item.Price + item.Shipping;
                        s.StoreItems.Add(item);
                        output.Stores.Add(s);
                    }
                }
                cart.Expires = DateTime.Now.AddDays(1);
                mc.SaveChanges();
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return output;
        }