public HttpResponseMessage UpdateSalesInvoiceItem(Entities.TrnSalesInvoiceItem objSalesInvoiceItem, String id, String SIId)
        {
            try
            {
                var currentUser = from d in db.MstUsers
                                  where d.UserId == User.Identity.GetUserId()
                                  select d;

                if (currentUser.Any())
                {
                    var currentUserId   = currentUser.FirstOrDefault().Id;
                    var currentBranchId = currentUser.FirstOrDefault().BranchId;

                    var userForms = from d in db.MstUserForms
                                    where d.UserId == currentUserId &&
                                    d.SysForm.FormName.Equals("SalesInvoiceDetail")
                                    select d;

                    if (userForms.Any())
                    {
                        if (userForms.FirstOrDefault().CanEdit)
                        {
                            var salesInvoice = from d in db.TrnSalesInvoices
                                               where d.Id == Convert.ToInt32(SIId)
                                               select d;

                            if (salesInvoice.Any())
                            {
                                if (!salesInvoice.FirstOrDefault().IsLocked)
                                {
                                    var salesInvoiceItem = from d in db.TrnSalesInvoiceItems
                                                           where d.Id == Convert.ToInt32(id)
                                                           select d;

                                    if (salesInvoiceItem.Any())
                                    {
                                        var item = from d in db.MstArticles
                                                   where d.Id == objSalesInvoiceItem.ItemId &&
                                                   d.ArticleTypeId == 1 &&
                                                   d.IsLocked == true
                                                   select d;

                                        if (item.Any())
                                        {
                                            var taxTypes = from d in db.MstTaxTypes
                                                           where d.Id == objSalesInvoiceItem.VATId &&
                                                           d.IsLocked == true
                                                           select d;

                                            if (taxTypes.Any())
                                            {
                                                var discounts = from d in db.MstDiscounts
                                                                where d.Id == objSalesInvoiceItem.DiscountId &&
                                                                d.IsLocked == true
                                                                select d;

                                                if (discounts.Any())
                                                {
                                                    var conversionUnit = from d in db.MstArticleUnits
                                                                         where d.ArticleId == objSalesInvoiceItem.ItemId &&
                                                                         d.UnitId == objSalesInvoiceItem.UnitId &&
                                                                         d.MstArticle.IsLocked == true
                                                                         select d;

                                                    if (conversionUnit.Any())
                                                    {
                                                        Decimal discountAmount = objSalesInvoiceItem.Price * (objSalesInvoiceItem.DiscountRate / 100);
                                                        Decimal netPrice       = objSalesInvoiceItem.Price - discountAmount;
                                                        Decimal amount         = netPrice * objSalesInvoiceItem.Quantity;
                                                        Decimal VATAmount      = amount * (objSalesInvoiceItem.VATPercentage / 100);

                                                        if (taxTypes.FirstOrDefault().IsInclusive)
                                                        {
                                                            VATAmount = amount / (1 + (objSalesInvoiceItem.VATPercentage / 100)) * (objSalesInvoiceItem.VATPercentage / 100);
                                                        }

                                                        Decimal baseQuantity = objSalesInvoiceItem.Quantity * 1;
                                                        if (conversionUnit.FirstOrDefault().Multiplier > 0)
                                                        {
                                                            baseQuantity = objSalesInvoiceItem.Quantity * (1 / conversionUnit.FirstOrDefault().Multiplier);
                                                        }

                                                        Decimal basePrice = amount;
                                                        if (baseQuantity > 0)
                                                        {
                                                            basePrice = amount / baseQuantity;
                                                        }

                                                        var updateSalesInvoiceItem = salesInvoiceItem.FirstOrDefault();
                                                        updateSalesInvoiceItem.SIId               = Convert.ToInt32(SIId);
                                                        updateSalesInvoiceItem.ItemId             = objSalesInvoiceItem.ItemId;
                                                        updateSalesInvoiceItem.ItemInventoryId    = objSalesInvoiceItem.ItemInventoryId;
                                                        updateSalesInvoiceItem.Particulars        = objSalesInvoiceItem.Particulars;
                                                        updateSalesInvoiceItem.UnitId             = objSalesInvoiceItem.UnitId;
                                                        updateSalesInvoiceItem.Quantity           = objSalesInvoiceItem.Quantity;
                                                        updateSalesInvoiceItem.Price              = objSalesInvoiceItem.Price;
                                                        updateSalesInvoiceItem.DiscountId         = objSalesInvoiceItem.DiscountId;
                                                        updateSalesInvoiceItem.DiscountRate       = objSalesInvoiceItem.DiscountRate;
                                                        updateSalesInvoiceItem.DiscountAmount     = discountAmount;
                                                        updateSalesInvoiceItem.NetPrice           = netPrice;
                                                        updateSalesInvoiceItem.Amount             = amount;
                                                        updateSalesInvoiceItem.VATId              = objSalesInvoiceItem.VATId;
                                                        updateSalesInvoiceItem.VATPercentage      = objSalesInvoiceItem.VATPercentage;
                                                        updateSalesInvoiceItem.VATAmount          = VATAmount;
                                                        updateSalesInvoiceItem.BaseUnitId         = item.FirstOrDefault().UnitId;
                                                        updateSalesInvoiceItem.BaseQuantity       = baseQuantity;
                                                        updateSalesInvoiceItem.BasePrice          = basePrice;
                                                        updateSalesInvoiceItem.SalesItemTimeStamp = DateTime.Now;

                                                        db.SubmitChanges();

                                                        Decimal salesInvoiceItemTotalAmount = 0;

                                                        if (salesInvoice.FirstOrDefault().TrnSalesInvoiceItems.Any())
                                                        {
                                                            salesInvoiceItemTotalAmount = salesInvoice.FirstOrDefault().TrnSalesInvoiceItems.Sum(d => d.Amount);
                                                        }

                                                        var updateSalesInvoiceAmount = salesInvoice.FirstOrDefault();
                                                        updateSalesInvoiceAmount.Amount = salesInvoiceItemTotalAmount;
                                                        db.SubmitChanges();

                                                        return(Request.CreateResponse(HttpStatusCode.OK));
                                                    }
                                                    else
                                                    {
                                                        return(Request.CreateResponse(HttpStatusCode.BadRequest, "The selected item has no unit conversion."));
                                                    }
                                                }
                                                else
                                                {
                                                    return(Request.CreateResponse(HttpStatusCode.BadRequest, "The selected discount was not found in the server."));
                                                }
                                            }
                                            else
                                            {
                                                return(Request.CreateResponse(HttpStatusCode.BadRequest, "The selected tax type was not found in the server."));
                                            }
                                        }
                                        else
                                        {
                                            return(Request.CreateResponse(HttpStatusCode.BadRequest, "The selected item was not found in the server."));
                                        }
                                    }
                                    else
                                    {
                                        return(Request.CreateResponse(HttpStatusCode.NotFound, "This sales invoice item detail is no longer exist in the server."));
                                    }
                                }
                                else
                                {
                                    return(Request.CreateResponse(HttpStatusCode.BadRequest, "You cannot edit and update sales invoice item if the current sales invoice detail is locked."));
                                }
                            }
                            else
                            {
                                return(Request.CreateResponse(HttpStatusCode.NotFound, "These current sales invoice details are not found in the server. Please add new sales invoice first before proceeding."));
                            }
                        }
                        else
                        {
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, "Sorry. You have no rights to edit and update sales invoice item in this sales invoice detail page."));
                        }
                    }
                    else
                    {
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, "Sorry. You have no access in this sales invoice detail page."));
                    }
                }
                else
                {
                    return(Request.CreateResponse(HttpStatusCode.BadRequest, "Theres no current user logged in."));
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, "Something's went wrong from the server."));
            }
        }
        public HttpResponseMessage AddSalesInvoiceItem(Entities.TrnSalesInvoiceItem objSalesInvoiceItem, String SIId)
        {
            try
            {
                var currentUser = from d in db.MstUsers
                                  where d.UserId == User.Identity.GetUserId()
                                  select d;

                if (currentUser.Any())
                {
                    var currentUserId   = currentUser.FirstOrDefault().Id;
                    var currentBranchId = currentUser.FirstOrDefault().BranchId;

                    var userForms = from d in db.MstUserForms
                                    where d.UserId == currentUserId &&
                                    d.SysForm.FormName.Equals("SalesInvoiceDetail")
                                    select d;

                    if (userForms.Any())
                    {
                        if (userForms.FirstOrDefault().CanAdd)
                        {
                            var salesInvoice = from d in db.TrnSalesInvoices
                                               where d.Id == Convert.ToInt32(SIId)
                                               select d;

                            if (salesInvoice.Any())
                            {
                                if (!salesInvoice.FirstOrDefault().IsLocked)
                                {
                                    var item = from d in db.MstArticles
                                               where d.Id == objSalesInvoiceItem.ItemId &&
                                               d.ArticleTypeId == 1 &&
                                               d.IsLocked == true
                                               select d;

                                    if (item.Any())
                                    {
                                        var taxTypes = from d in db.MstTaxTypes
                                                       where d.Id == objSalesInvoiceItem.VATId &&
                                                       d.IsLocked == true
                                                       select d;

                                        if (taxTypes.Any())
                                        {
                                            var discounts = from d in db.MstDiscounts
                                                            where d.Id == objSalesInvoiceItem.DiscountId &&
                                                            d.IsLocked == true
                                                            select d;

                                            if (discounts.Any())
                                            {
                                                var conversionUnit = from d in db.MstArticleUnits
                                                                     where d.ArticleId == objSalesInvoiceItem.ItemId &&
                                                                     d.UnitId == objSalesInvoiceItem.UnitId &&
                                                                     d.MstArticle.IsLocked == true
                                                                     select d;

                                                if (conversionUnit.Any())
                                                {
                                                    Decimal discountAmount = objSalesInvoiceItem.Price * (objSalesInvoiceItem.DiscountRate / 100);
                                                    Decimal netPrice       = objSalesInvoiceItem.Price - discountAmount;
                                                    Decimal amount         = netPrice * objSalesInvoiceItem.Quantity;
                                                    Decimal VATAmount      = amount * (objSalesInvoiceItem.VATPercentage / 100);

                                                    if (taxTypes.FirstOrDefault().IsInclusive)
                                                    {
                                                        VATAmount = amount / (1 + (objSalesInvoiceItem.VATPercentage / 100)) * (objSalesInvoiceItem.VATPercentage / 100);
                                                    }

                                                    Decimal baseQuantity = objSalesInvoiceItem.Quantity * 1;
                                                    if (conversionUnit.FirstOrDefault().Multiplier > 0)
                                                    {
                                                        baseQuantity = objSalesInvoiceItem.Quantity * (1 / conversionUnit.FirstOrDefault().Multiplier);
                                                    }

                                                    Decimal basePrice = amount;
                                                    if (baseQuantity > 0)
                                                    {
                                                        basePrice = amount / baseQuantity;
                                                    }

                                                    Data.TrnSalesInvoiceItem newPackageSalesInvoiceItem = new Data.TrnSalesInvoiceItem
                                                    {
                                                        SIId               = Convert.ToInt32(SIId),
                                                        ItemId             = objSalesInvoiceItem.ItemId,
                                                        ItemInventoryId    = objSalesInvoiceItem.ItemInventoryId,
                                                        Particulars        = objSalesInvoiceItem.Particulars,
                                                        UnitId             = objSalesInvoiceItem.UnitId,
                                                        Quantity           = objSalesInvoiceItem.Quantity,
                                                        Price              = objSalesInvoiceItem.Price,
                                                        DiscountId         = objSalesInvoiceItem.DiscountId,
                                                        DiscountRate       = objSalesInvoiceItem.DiscountRate,
                                                        DiscountAmount     = discountAmount,
                                                        NetPrice           = netPrice,
                                                        Amount             = amount,
                                                        VATId              = objSalesInvoiceItem.VATId,
                                                        VATPercentage      = objSalesInvoiceItem.VATPercentage,
                                                        VATAmount          = VATAmount,
                                                        BaseUnitId         = item.FirstOrDefault().UnitId,
                                                        BaseQuantity       = baseQuantity,
                                                        BasePrice          = basePrice,
                                                        SalesItemTimeStamp = DateTime.Now
                                                    };

                                                    db.TrnSalesInvoiceItems.InsertOnSubmit(newPackageSalesInvoiceItem);
                                                    db.SubmitChanges();

                                                    var itemComponents = from d in db.MstArticleComponents
                                                                         where d.ArticleId == objSalesInvoiceItem.ItemId
                                                                         select new
                                                    {
                                                        ComponentArticleId = d.ComponentArticleId,
                                                        Quantity           = d.Quantity,
                                                        UnitId             = d.MstArticle1.UnitId,
                                                        Cost  = Convert.ToDecimal(d.MstArticle1.Cost),
                                                        Price = d.MstArticle1.Price,
                                                        ComponentArticleInventoryId = GetComponentItemArticleInventoryId(d.ComponentArticleId),
                                                        Amount      = d.Quantity * Convert.ToDecimal(d.MstArticle1.Cost),
                                                        Particulars = d.Particulars
                                                    };

                                                    if (itemComponents.Any())
                                                    {
                                                        if (item.FirstOrDefault().Kitting == 2)
                                                        {
                                                            foreach (var itemComponent in itemComponents)
                                                            {
                                                                var componentItemConversionUnit = from d in db.MstArticleUnits
                                                                                                  where d.ArticleId == itemComponent.ComponentArticleId &&
                                                                                                  d.UnitId == itemComponent.UnitId &&
                                                                                                  d.MstArticle.IsLocked == true
                                                                                                  select d;

                                                                if (componentItemConversionUnit.Any())
                                                                {
                                                                    Decimal itemComponentDiscountAmount = 0 * (objSalesInvoiceItem.DiscountRate / 100);
                                                                    Decimal itemComponentNetPrice       = 0 - itemComponentDiscountAmount;

                                                                    if (discounts.FirstOrDefault().IsInclusive)
                                                                    {
                                                                        Decimal price = 0 / (1 + (objSalesInvoiceItem.VATPercentage / 100));

                                                                        itemComponentDiscountAmount = price * (objSalesInvoiceItem.DiscountRate / 100);
                                                                        itemComponentNetPrice       = price - itemComponentDiscountAmount;
                                                                    }

                                                                    Decimal itemComponentQuantity  = itemComponent.Quantity * objSalesInvoiceItem.Quantity;
                                                                    Decimal itemComponentAmount    = itemComponentNetPrice * itemComponentQuantity;
                                                                    Decimal itemComponentVATAmount = itemComponentAmount * (objSalesInvoiceItem.VATPercentage / 100);

                                                                    if (taxTypes.FirstOrDefault().IsInclusive)
                                                                    {
                                                                        itemComponentVATAmount = itemComponentAmount / (1 + (objSalesInvoiceItem.VATPercentage / 100)) * (objSalesInvoiceItem.VATPercentage / 100);
                                                                    }

                                                                    Decimal componentItemBaseQuantity = itemComponentQuantity * 1;
                                                                    if (componentItemConversionUnit.FirstOrDefault().Multiplier > 0)
                                                                    {
                                                                        componentItemBaseQuantity = itemComponentQuantity * (1 / componentItemConversionUnit.FirstOrDefault().Multiplier);
                                                                    }

                                                                    Decimal componentItemBasePrice = itemComponentAmount;
                                                                    if (baseQuantity > 0)
                                                                    {
                                                                        componentItemBasePrice = itemComponentAmount / componentItemBaseQuantity;
                                                                    }

                                                                    Data.TrnSalesInvoiceItem newComponentSalesInvoiceItem = new Data.TrnSalesInvoiceItem
                                                                    {
                                                                        SIId               = Convert.ToInt32(SIId),
                                                                        ItemId             = itemComponent.ComponentArticleId,
                                                                        ItemInventoryId    = itemComponent.ComponentArticleInventoryId,
                                                                        Particulars        = itemComponent.Particulars,
                                                                        UnitId             = itemComponent.UnitId,
                                                                        Quantity           = itemComponentQuantity,
                                                                        Price              = 0,
                                                                        DiscountId         = objSalesInvoiceItem.DiscountId,
                                                                        DiscountRate       = objSalesInvoiceItem.DiscountRate,
                                                                        DiscountAmount     = discountAmount,
                                                                        NetPrice           = itemComponentNetPrice,
                                                                        Amount             = itemComponentAmount,
                                                                        VATId              = objSalesInvoiceItem.VATId,
                                                                        VATPercentage      = objSalesInvoiceItem.VATPercentage,
                                                                        VATAmount          = itemComponentVATAmount,
                                                                        BaseUnitId         = itemComponent.UnitId,
                                                                        BaseQuantity       = componentItemBaseQuantity,
                                                                        BasePrice          = componentItemBasePrice,
                                                                        SalesItemTimeStamp = DateTime.Now
                                                                    };

                                                                    db.TrnSalesInvoiceItems.InsertOnSubmit(newComponentSalesInvoiceItem);
                                                                    db.SubmitChanges();
                                                                }
                                                            }
                                                        }
                                                    }

                                                    Decimal salesInvoiceItemTotalAmount = 0;

                                                    if (salesInvoice.FirstOrDefault().TrnSalesInvoiceItems.Any())
                                                    {
                                                        salesInvoiceItemTotalAmount = salesInvoice.FirstOrDefault().TrnSalesInvoiceItems.Sum(d => d.Amount);
                                                    }

                                                    var updateSalesInvoiceAmount = salesInvoice.FirstOrDefault();
                                                    updateSalesInvoiceAmount.Amount = salesInvoiceItemTotalAmount;
                                                    db.SubmitChanges();

                                                    return(Request.CreateResponse(HttpStatusCode.OK));
                                                }
                                                else
                                                {
                                                    return(Request.CreateResponse(HttpStatusCode.BadRequest, "The selected item has no unit conversion."));
                                                }
                                            }
                                            else
                                            {
                                                return(Request.CreateResponse(HttpStatusCode.BadRequest, "The selected discount was not found in the server."));
                                            }
                                        }
                                        else
                                        {
                                            return(Request.CreateResponse(HttpStatusCode.BadRequest, "The selected tax type was not found in the server."));
                                        }
                                    }
                                    else
                                    {
                                        return(Request.CreateResponse(HttpStatusCode.BadRequest, "The selected item was not found in the server."));
                                    }
                                }
                                else
                                {
                                    return(Request.CreateResponse(HttpStatusCode.BadRequest, "You cannot add new sales invoice item if the current sales invoice detail is locked."));
                                }
                            }
                            else
                            {
                                return(Request.CreateResponse(HttpStatusCode.NotFound, "These current sales invoice details are not found in the server. Please add new sales invoice first before proceeding."));
                            }
                        }
                        else
                        {
                            return(Request.CreateResponse(HttpStatusCode.BadRequest, "Sorry. You have no rights to add new sales invoice item in this sales invoice detail page."));
                        }
                    }
                    else
                    {
                        return(Request.CreateResponse(HttpStatusCode.BadRequest, "Sorry. You have no access in this sales invoice detail page."));
                    }
                }
                else
                {
                    return(Request.CreateResponse(HttpStatusCode.BadRequest, "Theres no current user logged in."));
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
                return(Request.CreateResponse(HttpStatusCode.InternalServerError, "Something's went wrong from the server."));
            }
        }