public ActionResult AddItem(int id, int product)
        {
            var p = Product.Find (product);
            var entity = FiscalDocument.Find (id);
            int pl = entity.Customer.PriceList.Id;
            var price = (from x in ProductPrice.Queryable
                     where x.Product.Id == product && x.List.Id == pl
                     select x).SingleOrDefault ();

            if (entity.IsCompleted || entity.IsCancelled) {
                Response.StatusCode = 400;
                return Content (Resources.ItemAlreadyCompletedOrCancelled);
            }

            var item = new FiscalDocumentDetail {
                Document = FiscalDocument.Find (id),
                Product = p,
                ProductCode = p.Code,
                ProductName = p.Name,
                UnitOfMeasurement = p.UnitOfMeasurement,
                Discount = 0,
                TaxRate = p.TaxRate,
                IsTaxIncluded = p.IsTaxIncluded,
                Quantity = 1,
                Price = price.Value,
                ExchangeRate = entity.ExchangeRate,
                Currency = entity.Currency
            };

            if (p.Currency != entity.Currency) {
                item.Price = price.Value * CashHelpers.GetTodayExchangeRate (p.Currency, entity.Currency);
            }

            using (var scope = new TransactionScope ()) {
                item.CreateAndFlush ();
            }

            return Json (new { id = item.Id });
        }
        public ActionResult AddItems(int id, string value)
        {
            var entity = FiscalDocument.Find (id);
            SalesOrder sales_order = null;
            int sales_order_id = 0;
            int count = 0;

            if (entity.IsCompleted || entity.IsCancelled) {
                Response.StatusCode = 400;
                return Content (Resources.ItemAlreadyCompletedOrCancelled);
            }

            if (int.TryParse (value, out sales_order_id)) {
                sales_order = SalesOrder.TryFind (sales_order_id);
            }

            if (sales_order == null) {
                Response.StatusCode = 400;
                return Content (Resources.SalesOrderNotFound);
            }

            if (!sales_order.IsCompleted || sales_order.IsCancelled) {
                Response.StatusCode = 400;
                return Content (Resources.SalesOrderIsNotInvoiceable);
            }

            using (var scope = new TransactionScope ()) {
                foreach (var x in sales_order.Details) {
                    if (!x.Product.IsInvoiceable)
                        continue;

                    decimal max_qty = GetInvoiceableQuantity (x.Id);

                    if (max_qty <= 0)
                        continue;

                    var item = new FiscalDocumentDetail {
                        Document = entity,
                        Product = x.Product,
                        OrderDetail = x,
                        ProductCode = x.ProductCode,
                        ProductName = x.ProductName,
                        UnitOfMeasurement = x.Product.UnitOfMeasurement,
                        Discount = x.Discount,
                        TaxRate = x.TaxRate,
                        IsTaxIncluded = x.IsTaxIncluded,
                        Quantity = max_qty,
                        Price = x.Price,
                        ExchangeRate = entity.ExchangeRate,
                        Currency = entity.Currency,
                        Comment = x.Comment
                    };

                    if (x.Currency != entity.Currency) {
                        item.Price = x.Price * CashHelpers.GetTodayExchangeRate (x.Currency, entity.Currency);
                    }

                    item.Create ();
                    count++;
                }
            }

            if (count == 0) {
                Response.StatusCode = 400;
                return Content (Resources.InvoiceableItemsNotFound);
            }

            return Json (new { id = id, value = string.Empty, itemsChanged = count });
        }