public void SaveProductVariant(ProductVariant productVariant)
        {
            ProductVariant existingData = GetProductVariantByID(productVariant.ProductVariantID);

            if (existingData == null)
            {
                productVariant.CreatedOn = DateTime.Now;
                productVariant.UpdatedOn = DateTime.Now;
                _context.ProductVariants.AddObject(productVariant);
            }
            else
            {
                existingData.ProductID = productVariant.ProductID;
                existingData.Name = productVariant.Name;
                existingData.BarCode = productVariant.BarCode;
                existingData.RestrictedUnder18 = productVariant.RestrictedUnder18;
                existingData.StockQuantity = productVariant.StockQuantity;
                existingData.DisplayStockQuantity = productVariant.DisplayStockQuantity;
                existingData.MinimumStockQuantity = productVariant.MinimumStockQuantity;
                existingData.NotifyForQuantityBelow = productVariant.NotifyForQuantityBelow;
                existingData.BuyingPrice = productVariant.BuyingPrice;
                existingData.PictureID = productVariant.PictureID;
                existingData.CreatedOn = existingData.CreatedOn;
                existingData.UpdatedOn = DateTime.Now;
                existingData.SellingPrice = productVariant.SellingPrice;

                if (!_context.IsAttached(existingData))
                    _context.ProductVariants.Attach(existingData);
            }
            _context.SaveChanges();
        }
 private Sale CreateSale(ProductVariant productVariant)
 {
     return null;
 }
        private ProductVariant GetSaleProductVariant(string barCode)
        {
            if (string.IsNullOrEmpty(barCode))
                return null;

            ProductVariant ProductVariant = new ProductVariant();

            if (ZuluContext.Current.ProductVariants == null)
                ZuluContext.Current.ProductVariants = new List<ProductVariant>();
            else
                ProductVariant = ZuluContext.Current.ProductVariants.FirstOrDefault(c => c.BarCode == barCode);

            if (ProductVariant == null)
            {
                ProductVariant = IoC.Resolve<IProductService>().GetProductVariantByBarCode(barCode);
                ZuluContext.Current.ProductVariants.Add(ProductVariant);
            }
            return ProductVariant;
        }
        /// <summary>
        /// Add Product Variant to cache 
        /// </summary>
        /// <param name="productVariant">The Product Variant Object</param>
        private void AddProductVariantToCache(ProductVariant productVariant)
        {
            if (productVariant != null)
            {
                List<ProductVariant> productVariants = new List<ProductVariant>();

                if (CacheProductVariants != null && CacheProductVariants.Count > 0)
                {
                    productVariants = CacheProductVariants;
                    ProductVariant cacheProductVariant = new ProductVariant();
                    cacheProductVariant = CacheProductVariants.FirstOrDefault(c => c.ProductVariantID == productVariant.ProductVariantID);
                }

                if (CacheProductVariants != null && CacheProductVariants.Count > 0)
                {
                    productVariants.Add(productVariant);
                    CacheProductVariants = productVariants;
                }
            }
        }
        private void Save()
        {
            if (txtBarcode.Text.Length > 0)
            {
                ProductVariant productvariant = ProductService.GetProductVariantByBarCode(txtBarcode.Text);

                if (productvariant == null || productvariant.ProductVariantID == 0)
                {
                    productvariant = new ProductVariant();

                    //for Edit Data
                    if (VariantID.Length > 0)
                    {
                        productvariant.ProductVariantID = int.Parse(VariantID);
                        productvariant.CreatedOn = Convert.ToDateTime(txtVariant.Tag.ToString());
                    }

                    productvariant.Name = txtVariant.Text.ToString();
                    productvariant.BarCode = txtBarcode.Text.ToString();
                    productvariant.SupplierID = int.Parse(lueSupplier.EditValue.ToString());
                    productvariant.ProductID = int.Parse(lueProductName.EditValue.ToString());
                    productvariant.IsActive = Convert.ToBoolean(chkIsActive.EditValue);
                    productvariant.RestrictedUnder18 = Convert.ToBoolean(chkUnder18.EditValue);

                    ProductImageID = zpcProductImage.SavePicture();
                    productvariant.PictureID = ProductImageID;

                    productvariant.UpdatedOn = DateTime.Now;

                    //for New Data
                    if (VariantID.Length < 0)
                    {
                        productvariant.CreatedOn = DateTime.Now;
                    }

                    ProductService.SaveProductVariant(productvariant);

                    grdProductVariant.DataSource = ProductService.GetProductVariantsByProductID(int.Parse(lueProductName.EditValue.ToString()));

                    ClearForm();
                }
                else
                {
                    MessageBox.Show("Existing product variant has the same barcode. Please Check!", "Invalid", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Please, fill the barcode up!", "Invalid", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtBarcode.Focus();
            }
        }
        /// <summary>
        /// Save Product Variant use for both Insert and Update 
        /// </summary>
        /// <param name="productVariant">The product variant</param>
        public void SaveProductVariant(ProductVariant productVariant)
        {
            ProductVariant existingData = GetProductVariantByID(productVariant.ProductVariantID);

            RemoveProductVariantFromTheCache(existingData);

            if (existingData == null)
            {
                productVariant.CreatedOn = DateTime.Now;
                productVariant.UpdatedOn = DateTime.Now;
                _context.ProductVariants.AddObject(productVariant);
            }
              			else
            {
                existingData.ProductID = productVariant.ProductID;
                existingData.Name = productVariant.Name;
                existingData.BarCode = productVariant.BarCode;
                existingData.SupplierID = productVariant.SupplierID;
                existingData.RestrictedUnder18 = productVariant.RestrictedUnder18;
                existingData.PictureID = productVariant.PictureID;
                existingData.CreatedOn = existingData.CreatedOn;
                existingData.UpdatedOn = DateTime.Now;
                existingData.IsActive = productVariant.IsActive;

                if (!_context.IsAttached(existingData))
                    _context.ProductVariants.Attach(existingData);
            }
            _context.SaveChanges();

            AddProductVariantToCache(existingData);
        }
        /// <summary>
        /// Get Product Variant By ID. Firstly look from the project cache and get from the database 
        /// </summary>
        /// <param name="productVariantID">The product variant identifier</param>
        /// <returns>ProductVariant</returns>
        public ProductVariant GetProductVariantByID(int productVariantID)
        {
            if (productVariantID == 0)
                return null;

            ProductVariant productVariant = new ProductVariant();
            if (CacheProductVariants != null)
                productVariant = CacheProductVariants.FirstOrDefault(c => c.ProductVariantID == productVariantID);

            if (productVariant == null || productVariant.ProductVariantID == 0)
            {
                productVariant = _context.ProductVariants.FirstOrDefault(c => c.ProductVariantID == productVariantID);
                AddProductVariantToCache(productVariant);
                return productVariant;
            }
            return productVariant;
        }
        /// <summary>
        /// Get Product Variant By barcode. Firstly look from the project cache and get from the database 
        /// </summary>
        /// <param name="productVariantID">The product variant identifier</param>
        /// <returns>ProductVariant</returns>
        public ProductVariant GetProductVariantByBarCode(string barCode)
        {
            if (string.IsNullOrEmpty(barCode))
                return null;

            ProductVariant productVariant = new ProductVariant();
            if (CacheProductVariants != null)
                productVariant = CacheProductVariants.FirstOrDefault(c => c.BarCode == barCode);

            if (productVariant == null || productVariant.ProductVariantID == 0)
            {
                productVariant = _context.ProductVariants.FirstOrDefault(c => c.BarCode == barCode);
                AddProductVariantToCache(productVariant);
                return productVariant;
            }
            return productVariant;
        }
        /// <summary>
        /// Remove Specific Product Variant from the cache 
        /// </summary>
        /// <param name="productVariant">The Product Variant Object</param>
        private void RemoveProductVariantFromTheCache(ProductVariant productVariant)
        {
            if (productVariant != null)
            {
                ProductVariant cacheProductVariant = new ProductVariant();
                if (CacheProductVariants != null)
                    cacheProductVariant = CacheProductVariants.FirstOrDefault(c => c.ProductVariantID == productVariant.ProductVariantID);

                if (cacheProductVariant != null)
                {
                    List<ProductVariant> productVariants = new List<ProductVariant>();

                    if (CacheProductVariants != null && CacheProductVariants.Count > 0)
                        productVariants = CacheProductVariants;

                    productVariants.Remove(cacheProductVariant);
                    CacheProductVariants = productVariants;
                }
            }
        }
        private void FixupnpProductVariant(ProductVariant previousValue, bool skipKeys = false)
        {
            if (IsDeserializing)
            {
                return;
            }

            if (previousValue != null && previousValue.npDamageByProductVariants.Contains(this))
            {
                previousValue.npDamageByProductVariants.Remove(this);
            }

            if (npProductVariant != null)
            {
                if (!npProductVariant.npDamageByProductVariants.Contains(this))
                {
                    npProductVariant.npDamageByProductVariants.Add(this);
                }

                ProductVariantID = npProductVariant.ProductVariantID;
            }
            else if (!skipKeys)
            {
                ProductVariantID = null;
            }

            if (ChangeTracker.ChangeTrackingEnabled)
            {
                if (ChangeTracker.OriginalValues.ContainsKey("npProductVariant")
                    && (ChangeTracker.OriginalValues["npProductVariant"] == npProductVariant))
                {
                    ChangeTracker.OriginalValues.Remove("npProductVariant");
                }
                else
                {
                    ChangeTracker.RecordOriginalValue("npProductVariant", previousValue);
                }
                if (npProductVariant != null && !npProductVariant.ChangeTracker.ChangeTrackingEnabled)
                {
                    npProductVariant.StartTracking();
                }
            }
        }