private static void CheckOrderLineCommand(BaseProductLineItem item, AddMainOrderLineItemCommand command)
 {
     Assert.AreEqual(item.Price, command.ValueLineItem, "Line item  value");
     Assert.AreEqual(item.VatValue, command.LineItemVatValue, "Line item VAT value");
     Assert.AreEqual(item.Quantity, command.Qty, "Line item Qauntity");
     Assert.AreEqual(item.ProductMasterId, command.ProductId, "Line item Product ID");
     Assert.AreEqual(item.ProductDiscount, command.ProductDiscount, "Line item Product Discount");
 }
        public void Handle(AddMainOrderLineItemCommand command)
        {
            var order = GetOrder();
            var item = order.AllItems.FirstOrDefault(i => i.ProductMasterId == command.ProductId);
            if (item == null)
            {
                var product = saleProductRepository.FindById(command.ProductId);
                
                //Product will be null for returnable items 
                if (product == null )
                {
                    item = AddReturnableLineItem(order, command);
                }
                else
                {
                    item = AddProductLineItem(order, product, command);
                }

                item.Quantity = command.Qty;
            }
        }
 private BaseProductLineItem AddReturnableLineItem(Order order, AddMainOrderLineItemCommand command)
 {
     var returnableProduct = returnableProductRepository.GetById(command.ProductId);
     var rerturnableItem = order.AddReturnableItem(command.CommandId, returnableProduct, command.ProductId, command.Qty, command.ValueLineItem);
     return rerturnableItem;
 }
        private BaseProductLineItem AddProductLineItem(Order order, SaleProduct product, AddMainOrderLineItemCommand command)
        {
            var vatRate = command.LineItemVatValue/command.ValueLineItem;

            return order.AddItem(command.CommandId, product, product.Id, command.Qty, command.ValueLineItem, vatRate);
        }