private void AddOrUpdateLineItemFromDiscount(ProductAsDiscount productAsDiscount, Product product)
        {

            List<Product> discountProducts = new List<Product>();
            discountProducts.Add(product);
            discProdReturnables = new List<ReturnableProduct>();
            discProdReturnables = _productPackagingSummaryService.GetProductReturnables(product,
                                                                                        productAsDiscount.Quantity);
            if (discProdReturnables != null && discProdReturnables.Count > 0)
            {
                discProdReturnables.ForEach(discountProducts.Add);
            }
            _productPackagingSummaryService.ClearProductReturnables();
            foreach (Product prod in discountProducts)
            {
                decimal unitPrice = 0m;
                decimal unitVatRate = 0m;
                decimal totalNetPrice = 0m;
                decimal vatValue = 0m;
                decimal totalVatAmount = 0m;
                decimal totalPrice = 0m;
                decimal productDiscount = 0m;
                decimal totalProductDiscount = 0m;
                decimal qty = productAsDiscount.Quantity;
                OrderLineItemType orderLineItemType = OrderLineItemType.Discount;
                DiscountType discountType = productAsDiscount.DiscountType;

                if (prod.Id != product.Id)
                {
                    if (((ReturnableProduct) prod).Capacity > 1) //returnable bulk container
                        qty = (int) (productAsDiscount.Quantity/((ReturnableProduct) prod).Capacity);
                    else //sale product returnable
                        qty = productAsDiscount.Quantity;
                    orderLineItemType = 0;
                    discountType = 0;
                }

                if (prod.Id != product.Id)
                {
                    LineItemPricingInfo pi = GetLineItemPricing(
                        new PackagingSummary {Product = prod, Quantity = qty},
                        SelectedOutlet.Id);

                    unitPrice = pi.UnitPrice;
                    unitVatRate = pi.VatValue;
                    totalNetPrice = pi.TotalNetPrice;
                    vatValue = unitPrice*unitVatRate;
                    totalVatAmount = pi.TotalVatAmount;
                    totalPrice = pi.TotalPrice;
                    productDiscount = pi.ProductDiscount;
                    totalProductDiscount = pi.TotalProductDiscount;
                }

                decimal invBalance = 0m;
                decimal lineItemsQty = LineItems.Where(n => n.ProductId == prod.Id).Sum(n => n.Qty);
                decimal balanceAfterLineItems = 0m;

                Guid ccId = GetConfigParams().CostCentreId;
                
                bool inStock = _productPackagingSummaryService.IsProductInStock(
                    ccId,
                    prod.Id,
                    lineItemsQty,
                    qty,
                    out invBalance);

                if (!inStock)
                {
                    MessageBox.Show(
                        "Discount product " + prod.Description +
                        " is out of stock.\nThe product will not be added.\nThe required discount quantity is " +
                        qty,
                        "Distributr: Sales Module", MessageBoxButton.OK);
                }
                else
                {
                    balanceAfterLineItems = invBalance - lineItemsQty;
                    if (balanceAfterLineItems < qty)
                    {
                        MessageBox.Show(
                            "The available inventory of " + balanceAfterLineItems + " units cannot cover the " + qty +
                            " units awarded as discount for product " + prod.Description + ".\n" +
                            "Please give " + balanceAfterLineItems + " units.",
                            "Distributr: Sales Module", MessageBoxButton.OK);
                        qty = balanceAfterLineItems;
                    }
                    if (qty > 0)
                        AddLineItem(prod.Id, prod.Description, unitPrice, vatValue, totalVatAmount, qty, totalPrice,
                                    false, false,
                                    Guid.Empty, product.Id, orderLineItemType, discountType, productDiscount,
                                    prod.GetType().ToString().Split('.').Last());
                    //ordering
                    List<OrderLineItemBase> lineItems = LineItems.Select(n => n as OrderLineItemBase).ToList();
                    LineItems.Clear();
                    _productPackagingSummaryService.OrderLineItems(lineItems)
                                                   .Select(n => n as EditPOSSaleLineItem)
                                                   .ToList()
                                                   .ForEach(LineItems.Add);
                }
            }
        }
        private void AddOrUpdateLineItemFromDiscount(ProductAsDiscount productAsDiscount, Product product)
        {
            List<Product> discountProducts = new List<Product>();
            discountProducts.Add(product);
            discProdReturnables = new List<ReturnableProduct>();
            discProdReturnables = _productPackagingSummaryService.GetProductReturnables(product,
                                                                                        productAsDiscount.Quantity);
            if (discProdReturnables != null && discProdReturnables.Count > 0)
            {
                discProdReturnables.ForEach(discountProducts.Add);
            }
            _productPackagingSummaryService.ClearProductReturnables();

            foreach (Product prod in discountProducts)
            {
                decimal unitPrice = 0m;
                decimal vatValue = 0m;
                decimal totalVatAmount = 0m;
                decimal totalPrice = 0m;
                decimal productDiscount = 0m;
                decimal totalProductDiscount = 0m;
                decimal qty = productAsDiscount.Quantity;

                if (prod.Id != product.Id)
                {
                    if ((prod as ReturnableProduct).Capacity > 1) //returnable bulk container
                        qty = (int) (productAsDiscount.Quantity/(prod as ReturnableProduct).Capacity);
                }
                if (prod.Id != product.Id)
                {
                    LineItemPricingInfo pi = GetLineItemPricing(new PackagingSummary
                                                                    {
                                                                        Product = prod,
                                                                        Quantity = qty
                                                                    },
                                                                OutletId);
                    unitPrice = pi.UnitPrice;
                    vatValue = pi.VatValue;
                    totalVatAmount = pi.TotalVatAmount;
                    totalPrice = pi.TotalPrice;
                    productDiscount = pi.ProductDiscount;
                    totalProductDiscount = pi.TotalProductDiscount;
                }

                ApproveSalesmanOrderItem existingItem = null;
                if (prod.Id == product.Id) //is the discount product
                {
                    existingItem = discountLineItems.FirstOrDefault(n =>
                                                                    n.OrderLineItemType ==
                                                                    OrderLineItemType.Discount &&
                                                                    n.ProductId == prod.Id &&
                                                                    n.LineItemDiscountType ==
                                                                    productAsDiscount.DiscountType);
                }
                else
                {
                    existingItem =
                        LineItems.FirstOrDefault(
                            n => n.ProductId == prod.Id && n.OrderLineItemType != OrderLineItemType.Discount);
                }
                if (existingItem != null)
                {
                    if (prod.Id != product.Id)
                    {
                        if ((prod as ReturnableProduct).Capacity > 1) //returnable bulk container
                            existingItem.Qty += qty;
                        else //sale product returnable
                            existingItem.Qty += qty;
                    }
                    else //sale product
                        existingItem.Qty += qty;
                    existingItem.TotalLineItemVatAmount += totalVatAmount;
                    existingItem.TotalPrice += totalPrice;
                    existingItem.LineItemTotalProductDiscount += totalProductDiscount;
                }
                else
                {
                    using (var container = NestedContainer)
                    {
                        IOtherUtilities _otherUtilities = Using<IOtherUtilities>(container);
                        existingItem = new ApproveSalesmanOrderItem(_otherUtilities)
                                           {
                                               SequenceNo = LineItems.Count() + 1,
                                               ProductDiscount = productDiscount,
                                               LineItemTotalProductDiscount = totalProductDiscount,
                                               IsEditable = false,
                                               LineItemId = Guid.Empty,
                                               ProductId = prod.Id,
                                               Product = prod.Description,
                                               //ParentProductId            = product.Id,
                                               Qty = qty,
                                               UnitPrice = unitPrice,
                                               TotalLineItemVatAmount = totalVatAmount,
                                               LineItemVatValue = vatValue,
                                               TotalPrice = totalPrice,
                                               ProductType = prod.GetType().ToString().Split('.').Last(),
                                               CanEdit = false,
                                               CanRemove = false,
                                               HlnkDeleteContent =
                                                   GetLocalText("sl.approveOrder.lineItemsGrid.deleteLineItem"),
                                           };
                        if (prod.Id == product.Id) //is the discount product
                        {
                            existingItem.LineItemDiscountType = productAsDiscount.DiscountType;
                            existingItem.OrderLineItemType = OrderLineItemType.Discount;
                        }
                        if (existingItem.OrderLineItemType == OrderLineItemType.Discount)
                        {
                            discountLineItems.Add(existingItem);
                        }
                        else
                        {
                            LineItems.Add(existingItem);
                        }
                    }
                }
            }
        }
        private void DisplayProductAsDiscountAndAddToDiscountLineItems(ProductAsDiscount productAsDiscount)
        {
            Product product = GetEntityById(typeof(Product),productAsDiscount.ProductId) as Product;

            AddOrUpdateLineItemFromDiscount(productAsDiscount, product);
        }
        private void DisplayProductAsDiscountAndAddToDiscountLineItems(ProductAsDiscount productAsDiscount)
        {
            using (var container = NestedContainer)
            {

                IProductRepository _productService = Using<IProductRepository>(container);

                Product product = _productService.GetById(productAsDiscount.ProductId);

                AddOrUpdateLineItemFromDiscount(productAsDiscount, product);
            }
        }