public ActionResult Create(SalesOrderDetail salesorderdetail)
        {
            if (ModelState.IsValid)
            {
                db.SalesOrderDetails.Add(salesorderdetail);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(salesorderdetail);
        }
        private bool CreateSalesOrderRecords(int nCustomerId, string[] szDetailsIds, string tradeId, ref int nSalesOrderIdHlp, ref string szError)
        {
            bool bStatus = false;
            int nQuoteid = 0;
            int nItemPos = 1;
            int nSalesOrderId = 0;
            int nQuoteDetailsId = 0;
            int nSubItemid = 0;
            int nPos = -1;
            int nTradeid = 0;
            int nSalesOrderNo = 0;
            double dOnHand = 0;
            double dQtyQuote = 0;
            double dReqQty = 0;
            double dShipQty = 0;
            double dPOQty = 0;
            double dUnitPrice = 0;
            double dTaxRate = 0;
            string szDetailsId = "";
            string szDescription = "";
            string szSalesOrderIdHlp = "";
            string szItemIdHlp = "";

            List<String> quotedetailsList = null;
            IQueryable<SUB_ITEM> qySubItem = null;
            SUB_ITEM subitem = null;
            UserQuotation quotation = null;
            UserQuotationDetail quotationdetail = null;
            SalesOrderDetail salesorderdetail = null;
            InitialInfo initialinfo = null;
            Trade trade = null;
            SetupChargeDetail setupcharge = null;

            try
            {
                if (string.IsNullOrEmpty(tradeId))
                {
                    trade = db.Trades.FirstOrDefault<Trade>();
                    if (trade != null)
                    {
                        nTradeid = trade.TradeId;
                    }
                }
                else
                {
                    nTradeid = Convert.ToInt32(tradeId);
                }

                //Get the sales order no
                initialinfo = db.InitialInfoes.FirstOrDefault<InitialInfo>();
                if (initialinfo == null)
                {
                    initialinfo = new InitialInfo();
                    initialinfo.InvoiceNo = 0;
                    initialinfo.PaymentNo = 0;
                    initialinfo.PurchaseOrderNo = 0;
                    initialinfo.SalesOrderNo = 1;
                    nSalesOrderNo = 1;
                    initialinfo.TaxRate = 0;
                    db.InitialInfoes.Add(initialinfo);
                }
                else
                {
                    nSalesOrderNo = initialinfo.SalesOrderNo;
                    nSalesOrderNo++;
                    initialinfo.SalesOrderNo = nSalesOrderNo;
                    dTaxRate = initialinfo.TaxRate;
                    db.Entry(initialinfo).State = EntityState.Modified;
                }

                quotedetailsList = szDetailsIds.ToList<string>();

                SalesOrder salesorder = new SalesOrder();
                salesorder.CustomerId = nCustomerId;
                salesorder.SODate = DateTime.Now;
                salesorder.IsBlindShip = false;
                salesorder.TradeId = nTradeid;
                salesorder.SalesOrderNo = nSalesOrderNo.ToString();
                salesorder.Tax_rate = Convert.ToDouble(dTaxRate);
                salesorder.Invs_Tax = Convert.ToDouble(dTaxRate);
                db.SalesOrders.Add(salesorder);
                db.SaveChanges();

                nSalesOrderIdHlp = salesorder.SalesOrderId;

                nSalesOrderId = salesorder.SalesOrderId;

                //
                // Con szDetailsIds leer UserQuotationDetails, luego leer el inventario para establecer las cantidades disponible y
                // luego crear el detalle de la Sales Order, lee el inventario e incluye setup charge y runcharge
                foreach (var item in quotedetailsList)
                {
                    nPos = -1;
                    nPos = item.IndexOf("chk_");
                    if (nPos != -1)
                    {

                        szDetailsId = item.Replace("chk_", "");

                        nQuoteDetailsId = Convert.ToInt16(szDetailsId);
                        quotationdetail = db.UserQuotationDetails.Find(nQuoteDetailsId);
                        if (quotationdetail != null)
                        {
                            if (quotationdetail.Status == 0)
                            {
                                if (nQuoteid == 0)
                                {
                                    nQuoteid = Convert.ToInt32(quotationdetail.DetailId);
                                }

                                dQtyQuote = Convert.ToDouble(quotationdetail.Quantity) - Convert.ToDouble(quotationdetail.ShippedQuantity);
                                dReqQty = Convert.ToDouble(quotationdetail.Quantity);
                                dShipQty = 0;
                                dPOQty = 0;

                                quotation = db.UserQuotations.Find(quotationdetail.DetailId);
                                if (quotation != null)
                                {
                                    subitem = db.SUB_ITEM.Where(sbit => sbit.ItemID == quotation.ProductId && sbit.Description == quotationdetail.ProductType).FirstOrDefault<SUB_ITEM>();

                                }
                                else
                                {
                                    nSubItemid = Convert.ToInt32(quotationdetail.ItemID);
                                    subitem = db.SUB_ITEM.Find(nSubItemid);
                                }

                                if (subitem != null)
                                {
                                    szDescription = subitem.Description;

                                    //Get OnHand inventory
                                    dOnHand = Convert.ToDouble(subitem.OnHand_Db) - Convert.ToDouble(subitem.OnHand_Cr);

                                    if (dQtyQuote >= dOnHand)
                                    {
                                        if (dOnHand == 0)
                                        {
                                            dPOQty = dQtyQuote;
                                        }
                                        else
                                        {
                                            dPOQty = dQtyQuote - dOnHand;
                                            dShipQty = dOnHand;
                                        }
                                    }
                                    else
                                    {
                                    }

                                    //Create sales order detail
                                    salesorderdetail = new SalesOrderDetail();
                                    salesorderdetail.SalesOrderId = nSalesOrderId;
                                    salesorderdetail.ItemID = subitem.ItemID;
                                    salesorderdetail.Sub_ItemID = subitem.Sub_ItemID;
                                    salesorderdetail.Description = szDescription;
                                    salesorderdetail.Quantity = dReqQty;
                                    salesorderdetail.ShipQuantity = dShipQty;
                                    salesorderdetail.BackOrderQuantity = dPOQty;
                                    salesorderdetail.Tax = 0;
                                    salesorderdetail.UnitPrice = quotationdetail.Amount;
                                    salesorderdetail.ItemPosition = nItemPos;
                                    salesorderdetail.ItemOrder = 0;
                                    salesorderdetail.Tax = Convert.ToDouble(dTaxRate);
                                    db.SalesOrderDetails.Add(salesorderdetail);
                                    db.SaveChanges();
                                    nItemPos++;

                                    szSalesOrderIdHlp = salesorderdetail.SalesOrderId.ToString();
                                    szItemIdHlp = salesorderdetail.ItemID;

                                    //Create setup charge
                                    setupcharge = db.SetupChargeDetails.Where(stup => stup.itemid == subitem.ItemID).FirstOrDefault<SetupChargeDetail>();
                                    if (setupcharge != null)
                                    {
                                        salesorderdetail = new SalesOrderDetail();
                                        salesorderdetail.SalesOrderId = nSalesOrderId;
                                        salesorderdetail.ItemID = string.Empty;
                                        salesorderdetail.Sub_ItemID = string.Empty;
                                        salesorderdetail.Description = string.Format("Set up Charge {0} {1}", szSalesOrderIdHlp, szItemIdHlp);
                                        salesorderdetail.Quantity = dReqQty;
                                        salesorderdetail.ShipQuantity = 0;
                                        salesorderdetail.BackOrderQuantity = 0;
                                        salesorderdetail.Tax = 0;
                                        salesorderdetail.UnitPrice = setupcharge.SetUpCharge;
                                        salesorderdetail.ItemPosition = 0;
                                        salesorderdetail.ItemOrder = 0;
                                        salesorderdetail.Tax = Convert.ToDouble(dTaxRate);
                                        db.SalesOrderDetails.Add(salesorderdetail);

                                        //Create run charge
                                        salesorderdetail = new SalesOrderDetail();
                                        salesorderdetail.SalesOrderId = nSalesOrderId;
                                        salesorderdetail.ItemID = string.Empty;
                                        salesorderdetail.Sub_ItemID = string.Empty;
                                        salesorderdetail.Description = string.Format("Run Charge {0} {1}", szSalesOrderIdHlp, szItemIdHlp);
                                        salesorderdetail.Quantity = dReqQty;
                                        salesorderdetail.ShipQuantity = 0;
                                        salesorderdetail.BackOrderQuantity = 0;
                                        salesorderdetail.Tax = 0;
                                        salesorderdetail.UnitPrice = setupcharge.RunCharge;
                                        salesorderdetail.ItemPosition = 0;
                                        salesorderdetail.ItemOrder = 0;
                                        salesorderdetail.Tax = Convert.ToDouble(dTaxRate);
                                        db.SalesOrderDetails.Add(salesorderdetail);

                                    }

                                    //Update Quote Details
                                    quotationdetail.ShippedQuantity = dShipQty;
                                    quotationdetail.BOQuantity = dPOQty;
                                    if (dShipQty >= Convert.ToDouble(quotationdetail.Quantity))
                                    {
                                        quotationdetail.Status = 1;
                                    }
                                    else
                                    {
                                        quotationdetail.Status = 1;
                                    }

                                }
                                else
                                {
                                    //szDescription = quotationdetail.ProductType;

                                    ////Create sales order detail
                                    //salesorderdetail = new SalesOrderDetail();
                                    //salesorderdetail.SalesOrderId = nSalesOrderId;
                                    //salesorderdetail.Description = szDescription;
                                    //salesorderdetail.Quantity = dReqQty;
                                    ////salesorderdetail.ShipQuantity = dShipQty;
                                    ////salesorderdetail.BackOrderQuantity = dPOQty;
                                    //salesorderdetail.Tax = 0;
                                    //salesorderdetail.UnitPrice = quotationdetail.Amount;
                                    //salesorderdetail.ItemPosition = nItemPos;
                                    //salesorderdetail.ItemOrder = 0;
                                    //db.SalesOrderDetails.Add(salesorderdetail);
                                    //nItemPos++;

                                    //quotationdetail.Status = 1;
                                }

                                //Update Sub Item Inventory

                            }
                        }
                    }
                }

                //Update the sales order record with the quoteid
                if (nQuoteid != 0)
                {
                    SalesOrder salesorderHlp = db.SalesOrders.Find(nSalesOrderId);
                    if (salesorderHlp != null)
                    {
                        salesorderHlp.QuoteId = nQuoteid;
                        db.Entry(salesorderHlp).State = EntityState.Modified;
                    }
                }

                //Save all changes
                db.SaveChanges();

                bStatus = true;

            }
            catch (Exception err)
            {
                szError = err.Message;
            }

            return bStatus;
        }
        public ActionResult AddSalesOrderDetails(string itemOrder, int id = 0, int salesorderId = 0, int itemPos = 0)
        {
            int nitemPosNext = 0;
            int nItemPos = 0;
            int nCurrentItemPos = 0;
            int nNextItemPos = 0;
            int nSalesOrderId = 0;
            double nItemOrder = 0;
            double dItemOrder = 0;
            double dCurrentItemOrder = 0;
            double dNextItemOrder = 0;
            double dQty = 0;
            decimal dPrice = 0;
            string szCurentItemId = "";
            string szNextItemId = "";
            string szSalesOrderIdHlp = "";
            string szItemId = "";
            SalesOrderDetail salesdetail = null;
            SalesOrderDetail salesdetailcurrent = null;
            SalesOrderDetail salesdetailnext = null;
            SalesOrderDetail salesorderdetail = null;
            SetupChargeDetail setupcharge = null;
            IQueryable<PRICE> qryPrice = null;

            TimelyDepotContext db01 = new TimelyDepotContext();

            SUB_ITEM subitem = db.SUB_ITEM.Find(id);
            if (subitem != null)
            {
                if (!string.IsNullOrEmpty(itemOrder))
                {
                    //itemOrder = itemOrder.Replace(".", ",");
                    nItemOrder = Convert.ToDouble(itemOrder);
                }

                //Get the current salesorderdetail
                salesdetailcurrent = db.SalesOrderDetails.Where(sldt => sldt.SalesOrderId == salesorderId && sldt.ItemPosition == itemPos && sldt.ItemOrder == nItemOrder).FirstOrDefault<SalesOrderDetail>();
                if (salesdetailcurrent != null)
                {
                    nCurrentItemPos = Convert.ToInt32(salesdetailcurrent.ItemPosition);
                    dCurrentItemOrder = Convert.ToDouble(salesdetailcurrent.ItemOrder);
                    szCurentItemId = salesdetailcurrent.ItemID;
                }

                //Get the next salesorderdetail
                salesdetailnext = db.SalesOrderDetails.Where(sldt => sldt.SalesOrderId == salesorderId && sldt.ItemPosition == nCurrentItemPos && sldt.ItemOrder > dCurrentItemOrder).OrderBy(sldt => sldt.ItemOrder).FirstOrDefault<SalesOrderDetail>();
                if (salesdetailnext != null)
                {
                    nNextItemPos = Convert.ToInt32(salesdetailnext.ItemPosition);
                    szNextItemId = salesdetailnext.ItemID;
                    dNextItemOrder = Convert.ToDouble(salesdetailnext.ItemOrder);
                }

                if (subitem.ItemID == szNextItemId)
                {
                    nItemPos = nCurrentItemPos;
                    dItemOrder = (dCurrentItemOrder + dNextItemOrder) / 2;
                }
                else
                {
                    nItemPos = nCurrentItemPos;
                    dItemOrder = dCurrentItemOrder + 1;
                }

                //
                // Set the price and qty search to the lowest price for this item
                double dDiscountPrc = 0;
                qryPrice = db.PRICEs.Where(prc => prc.Item == subitem.ItemID).OrderBy(prc => prc.Qty);
                if (qryPrice.Count() > 0)
                {
                    foreach (var item in qryPrice)
                    {
                        dQty = item.Qty;
                        dPrice = item.thePrice;
                        dDiscountPrc = TimelyDepotMVC.Controllers.InventoryController.GetDiscount(db01, item.Discount_Code);
                        break;
                    }
                }

                salesdetail = new SalesOrderDetail();
                salesdetail.SalesOrderId = salesorderId;
                salesdetail.ItemID = subitem.ItemID;
                salesdetail.Sub_ItemID = subitem.Sub_ItemID;
                salesdetail.BackOrderQuantity = 0;
                salesdetail.Description = subitem.Description;
                salesdetail.Quantity = dQty;
                salesdetail.ShipQuantity = 0;
                salesdetail.Tax = 0;
                salesdetail.UnitPrice = dPrice * (1 - Convert.ToDecimal(dDiscountPrc));
                salesdetail.ItemPosition = nItemPos;
                salesdetail.ItemOrder = dItemOrder;
                db.SalesOrderDetails.Add(salesdetail);
                db.SaveChanges();

                szSalesOrderIdHlp = salesdetail.SalesOrderId.ToString();
                nSalesOrderId = Convert.ToInt32(szSalesOrderIdHlp);
                szItemId = salesdetail.ItemID;

                //Create setup charge
                setupcharge = db.SetupChargeDetails.Where(stup => stup.itemid == subitem.ItemID).FirstOrDefault<SetupChargeDetail>();
                if (setupcharge != null)
                {
                    // Setup charge
                    double dDiscount = TimelyDepotMVC.Controllers.InventoryController.GetDiscount(db, setupcharge.SetupChargeDiscountCode);

                    salesorderdetail = new SalesOrderDetail();
                    salesorderdetail.SalesOrderId = nSalesOrderId;
                    salesorderdetail.ItemID = string.Empty;
                    salesorderdetail.Sub_ItemID = string.Empty;
                    salesorderdetail.Description = string.Format("Set up Charge {0} {1}", szSalesOrderIdHlp, szItemId);
                    salesorderdetail.Quantity = 0;
                    salesorderdetail.ShipQuantity = 0;
                    salesorderdetail.BackOrderQuantity = 0;
                    salesorderdetail.Tax = 0;
                    salesorderdetail.UnitPrice = setupcharge.SetUpCharge * (1 - Convert.ToDecimal(dDiscount));
                    salesorderdetail.ItemPosition = 0;
                    salesorderdetail.ItemOrder = 0;
                    salesorderdetail.Tax = 0;
                    db.SalesOrderDetails.Add(salesorderdetail);

                    //Create run charge
                    dDiscount = TimelyDepotMVC.Controllers.InventoryController.GetDiscount(db, setupcharge.RunChargeDiscountCode);
                    salesorderdetail = new SalesOrderDetail();
                    salesorderdetail.SalesOrderId = nSalesOrderId;
                    salesorderdetail.ItemID = string.Empty;
                    salesorderdetail.Sub_ItemID = string.Empty;
                    salesorderdetail.Description = string.Format("Run Charge {0} {1}", szSalesOrderIdHlp, szItemId);
                    salesorderdetail.Quantity = 0;
                    salesorderdetail.ShipQuantity = 0;
                    salesorderdetail.BackOrderQuantity = 0;
                    salesorderdetail.Tax = 0;
                    salesorderdetail.UnitPrice = setupcharge.RunCharge * (1 - Convert.ToDecimal(dDiscount));
                    salesorderdetail.ItemPosition = 0;
                    salesorderdetail.ItemOrder = 0;
                    salesorderdetail.Tax = 0;
                    db.SalesOrderDetails.Add(salesorderdetail);

                    db.SaveChanges();

                }
            }

            return RedirectToAction("Edit", new { id = salesorderId });
        }
 //
 // POST: /SalesOrder/UpdateSalesOrderDetail
 public ActionResult UpdateSalesOrderDetail(SalesOrderDetail salesorderdetail)
 {
     if (ModelState.IsValid)
     {
         db.Entry(salesorderdetail).State = EntityState.Modified;
         db.SaveChanges();
     }
     return RedirectToAction("Edit", new { id = salesorderdetail.SalesOrderId });
 }
        //
        // GET: /SalesOrder/InsertItem
        public ActionResult InsertItem(string salesorderid, string itemOrder, int itemPos = 0)
        {
            double nItemOrder = 0;
            int nitemPosNext = 0;
            int nItemPos = 0;
            int nCurrentItemPos = 0;
            int nNextItemPos = 0;
            double dItemOrder = 0;
            double dCurrentItemOrder = 0;
            double dNextItemOrder = 0;
            string szCurentItemId = "";
            string szNextItemId = "";
            SalesOrderDetail salesdetailcurrent = null;
            SalesOrderDetail salesdetailnext = null;

            int nSalesOrderId = Convert.ToInt32(salesorderid);

            if (!string.IsNullOrEmpty(itemOrder))
            {
                //itemOrder = itemOrder.Replace(".", ",");
                nItemOrder = Convert.ToDouble(itemOrder);
            }

            //Get the current salesorderdetail
            salesdetailcurrent = db.SalesOrderDetails.Where(sldt => sldt.SalesOrderId == nSalesOrderId && sldt.ItemPosition == itemPos && sldt.ItemOrder == nItemOrder).FirstOrDefault<SalesOrderDetail>();
            if (salesdetailcurrent != null)
            {
                nCurrentItemPos = Convert.ToInt32(salesdetailcurrent.ItemPosition);
                dCurrentItemOrder = Convert.ToDouble(salesdetailcurrent.ItemOrder);
                szCurentItemId = salesdetailcurrent.ItemID;
            }

            //Get the next salesorderdetail
            salesdetailnext = db.SalesOrderDetails.Where(sldt => sldt.SalesOrderId == nSalesOrderId && sldt.ItemPosition == nCurrentItemPos && sldt.ItemOrder > dCurrentItemOrder).OrderBy(sldt => sldt.ItemOrder).FirstOrDefault<SalesOrderDetail>();
            if (salesdetailnext != null)
            {
                nNextItemPos = Convert.ToInt32(salesdetailnext.ItemPosition);
                szNextItemId = salesdetailnext.ItemID;
                dNextItemOrder = Convert.ToDouble(salesdetailnext.ItemOrder);

                nItemPos = nCurrentItemPos;
                dItemOrder = (dCurrentItemOrder + dNextItemOrder) / 2;
            }
            else
            {
                nItemPos = nCurrentItemPos;
                dItemOrder = dCurrentItemOrder + 1;
            }

            //if (subitem.ItemID == szNextItemId)
            //{
            //    nItemPos = nCurrentItemPos;
            //    dItemOrder = (dCurrentItemOrder + dNextItemOrder) / 2;
            //}
            //else
            //{
            //    nItemPos = nCurrentItemPos;
            //    dItemOrder = dCurrentItemOrder + 1;
            //}

            SalesOrderDetail salesdetail = null;

            salesdetail = new SalesOrderDetail();
            salesdetail.SalesOrderId = nSalesOrderId;
            salesdetail.ItemID = string.Empty;
            salesdetail.Sub_ItemID = string.Empty;
            salesdetail.BackOrderQuantity = 0;
            salesdetail.Description = string.Empty;
            salesdetail.Quantity = 0;
            salesdetail.ShipQuantity = 0;
            salesdetail.Tax = 0;
            salesdetail.UnitPrice = 0;
            salesdetail.ItemPosition = nItemPos;
            salesdetail.ItemOrder = dItemOrder;
            db.SalesOrderDetails.Add(salesdetail);
            db.SaveChanges();

            return RedirectToAction("Edit", new { id = nSalesOrderId });
        }
 public ActionResult Edit(SalesOrderDetail salesorderdetail)
 {
     if (ModelState.IsValid)
     {
         db.Entry(salesorderdetail).State = EntityState.Modified;
         db.SaveChanges();
         return RedirectToAction("Index");
     }
     return View(salesorderdetail);
 }