public ActionResult Create(InitialInfo initialinfo)
        {
            if (ModelState.IsValid)
            {
                db.InitialInfoes.Add(initialinfo);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(initialinfo);
        }
        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;
        }
        //
        // GET: //CreateSalesOrder
        public ActionResult CreateSalesOrder(string id)
        {
            int nSalesOrderNo = 0;
            int nTradeid = 0;
            int nCustomerId = 0;
            double dTaxRate = 0;
            InitialInfo initialinfo = null;
            Customers customer = null;
            SalesOrder salesorder = null;

            //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;
            }

            //Get the customer id
            customer = db.Customers.Where(cst => cst.CustomerNo == id).FirstOrDefault<Customers>();
            if (customer != null)
            {
                nCustomerId = customer.Id;

                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();
            }

            return RedirectToAction("Edit", new { id = salesorder.SalesOrderId });
            //return View("Edit", new { id = salesorder.SalesOrderId });
        }
        private void GetSalesOrderTotals01(TimelyDepotContext db01, int nSalesOrderId, ref double dSalesAmount, ref double dTotalTax, ref double dTax, ref double dTotalAmount, ref double dBalanceDue)
        {
            double dShipping = 0;
            double dPayment = 0;
            double dSOTax = 0;

            IQueryable<SalesOrderDetail> qryDetails = null;
            InitialInfo initialinfo = null;

            dSalesAmount = 0;
            dTax = 0;
            dTotalAmount = 0;
            dBalanceDue = 0;
            dTotalTax = 0;

            initialinfo = db01.InitialInfoes.FirstOrDefault<InitialInfo>();
            if (initialinfo == null)
            {
                initialinfo = new InitialInfo();
                initialinfo.InvoiceNo = 0;
                initialinfo.PaymentNo = 0;
                initialinfo.PurchaseOrderNo = 0;
                initialinfo.SalesOrderNo = 1;
                initialinfo.TaxRate = 0;
                db.InitialInfoes.Add(initialinfo);
                dTax = initialinfo.TaxRate;
            }
            else
            {
                dTax = initialinfo.TaxRate;
            }

            //Each sales order should save it own tax information. Also the tax should be on product only, no tax on service.
            SalesOrder salesorder = db01.SalesOrders.Find(nSalesOrderId);
            if (salesorder != null)
            {
                dShipping = Convert.ToDouble(salesorder.ShippingHandling);
                dPayment = Convert.ToDouble(salesorder.PaymentAmount);

                //Use the sales order tax information
                if (salesorder.Tax_rate != null)
                {
                    if (Convert.ToDecimal(salesorder.Tax_rate) >= 0)
                    {
                        dTax = Convert.ToDouble(salesorder.Tax_rate);
                    }
                }
                dSOTax = dTax;

                qryDetails = db01.SalesOrderDetails.Where(sldt => sldt.SalesOrderId == salesorder.SalesOrderId);
                if (qryDetails.Count() > 0)
                {
                    foreach (var item in qryDetails)
                    {
                        ////use the tax on product
                        //if (item.Tax != null)
                        //{
                        //    if (Convert.ToDecimal(item.Tax) >= 0)
                        //    {
                        //        dTax = Convert.ToDouble(item.Tax);
                        //    }
                        //}

                        dSalesAmount = dSalesAmount + (Convert.ToDouble(item.Quantity) * Convert.ToDouble(item.UnitPrice));
                        //use the tax on product
                        if (!string.IsNullOrEmpty(item.Sub_ItemID))
                        {
                            dTotalTax = dTotalTax + (Convert.ToDouble(item.Quantity) * Convert.ToDouble(item.UnitPrice) * (dTax / 100));
                        }
                    }
                }

                dTotalAmount = dSalesAmount + dTotalTax + dShipping;
                dBalanceDue = dTotalAmount - dPayment;

                //Set the sales order tax again
                dTax = dSOTax;
            }
        }
        //
        // GET: //Payment
        public PartialViewResult Payment(int id = 0)
        {
            int nPaymentNo = 0;
            int nCustomerId = 0;
            int nPos = -1;
            int nHas = 0;
            double dSalesAmount = 0;
            double dTax = 0;
            double dTotalTax = 0;
            double dTotalAmount = 0;
            double dBalanceDue = 0;
            string szError = "";
            string szDecriptedData = "";
            string szMsg = "";
            string szCustomerNo = "";

            Payments payment = null;

            InitialInfo initialinfo = null;

            Customers customer = null;
            List<KeyValuePair<string, string>> listSelector = new List<KeyValuePair<string, string>>();

            //Get sales order
            SalesOrder salesorder = db.SalesOrders.Find(id);
            if (salesorder != null)
            {
                //Get the totals
                GetSalesOrderTotals(salesorder.SalesOrderId, ref dSalesAmount, ref dTotalTax, ref dTax, ref dTotalAmount, ref dBalanceDue);

                customer = db.Customers.Where(cst => cst.Id == salesorder.CustomerId).FirstOrDefault<Customers>();
                if (customer != null)
                {
                    //Get the next payment No
                    initialinfo = db.InitialInfoes.FirstOrDefault<InitialInfo>();
                    if (initialinfo == null)
                    {
                        initialinfo = new InitialInfo();
                        initialinfo.InvoiceNo = 0;
                        initialinfo.PaymentNo = 1;
                        initialinfo.PurchaseOrderNo = 0;
                        initialinfo.SalesOrderNo = 0;
                        initialinfo.TaxRate = 0;
                        db.InitialInfoes.Add(initialinfo);
                    }
                    else
                    {
                        nPaymentNo = initialinfo.PaymentNo;
                        nPaymentNo++;
                        initialinfo.PaymentNo = nPaymentNo;
                        db.Entry(initialinfo).State = EntityState.Modified;
                    }
                    db.SaveChanges();

                    //Get Payment Type
                    listSelector = new List<KeyValuePair<string, string>>();
                    var qryPaymentType = db.CustomersCardTypes.OrderBy(cdty => cdty.CardType);
                    if (qryPaymentType.Count() > 0)
                    {
                        foreach (var item in qryPaymentType)
                        {
                            listSelector.Add(new KeyValuePair<string, string>(item.CardType, item.CardType));
                        }
                    }
                    SelectList paymentTypeselectorlist = new SelectList(listSelector, "Key", "Value");

                    //Get the Credit Card Number for each credit card
                    listSelector = new List<KeyValuePair<string, string>>();
                    if (paymentTypeselectorlist.Count() > 0)
                    {
                        foreach (var item in paymentTypeselectorlist)
                        {
                            var qryPayment = db.CustomersCreditCardShippings.Join(db.Customers, ctcc => ctcc.CustomerId, cstm => cstm.Id, (ctcc, cstm)
                                 => new { ctcc, cstm }).OrderBy(Nctad => Nctad.ctcc.CardType).ThenBy(Nctad => Nctad.ctcc.CreditNumber).Where(Nctad => Nctad.ctcc.CustomerId == customer.Id && Nctad.ctcc.CardType == item.Value);
                            if (qryPayment.Count() > 0)
                            {
                                foreach (var itemCard in qryPayment)
                                {
                                    if (nCustomerId == 0)
                                    {
                                        nCustomerId = itemCard.cstm.Id;
                                    }

                                    //Decode card number
                                    szError = "";
                                    szDecriptedData = TimelyDepotMVC.Controllers.PaymentController.DecodeInfo02(itemCard.ctcc.CreditNumber, ref szError);
                                    if (!string.IsNullOrEmpty(szError))
                                    {
                                        nPos = szError.IndexOf("data to decode");
                                        if (nPos != -1)
                                        {
                                            szDecriptedData = string.Empty;
                                        }
                                        else
                                        {
                                            szDecriptedData = string.Format("******");
                                        }
                                    }
                                    else
                                    {
                                        //Mask the card number
                                        nHas = szDecriptedData.Length;
                                        if (nHas > 4)
                                        {
                                            szMsg = szDecriptedData.Substring(nHas - 4, 4);
                                            szDecriptedData = string.Format("******{0}", szMsg);
                                        }
                                        else
                                        {
                                            szDecriptedData = string.Format("******");
                                        }
                                    }

                                    szMsg = string.Format("{0} - {1}", itemCard.ctcc.CardType, szDecriptedData);
                                    listSelector.Add(new KeyValuePair<string, string>(itemCard.ctcc.CreditNumber, szMsg));
                                }
                            }

                        }
                    }

                    SelectList cardsselectorlist = new SelectList(listSelector, "Key", "Value");
                    ViewBag.CardsList = cardsselectorlist;

                    payment = new Payments();
                    payment.PaymentNo = nPaymentNo.ToString();
                    payment.PaymentDate = DateTime.Now;
                    payment.CustomerNo = customer.CustomerNo;
                    payment.SalesOrderNo = salesorder.SalesOrderNo;
                    payment.Amount = Convert.ToDecimal(dBalanceDue);
                    //db.Payments.Add(payment);
                    //db.SaveChanges();

                }
            }

            return PartialView(payment);
        }
        public ActionResult Create()
        {
            int nPurchaseOrderNo = 0;

            List<KeyValuePair<string, string>> listSelector = new List<KeyValuePair<string, string>>();
            IQueryable<Trade> qryTrade = null;

            InitialInfo initialinfo = null;

            //Get the next Purchase Order No
            initialinfo = db.InitialInfoes.FirstOrDefault<InitialInfo>();
            if (initialinfo == null)
            {
                initialinfo = new InitialInfo();
                initialinfo.InvoiceNo = 0;
                initialinfo.PaymentNo = 0;
                initialinfo.PurchaseOrderNo = 1;
                initialinfo.SalesOrderNo = 0;
                initialinfo.TaxRate = 0;
                db.InitialInfoes.Add(initialinfo);
            }
            else
            {
                nPurchaseOrderNo = initialinfo.PurchaseOrderNo;
                nPurchaseOrderNo++;
                initialinfo.PurchaseOrderNo = nPurchaseOrderNo;
                db.Entry(initialinfo).State = EntityState.Modified;
            }

            PurchaseOrders purchaseorder = new PurchaseOrders();
            purchaseorder.PurchaseOrderNo = nPurchaseOrderNo.ToString();
            purchaseorder.PODate = DateTime.Now;
            db.PurchaseOrders.Add(purchaseorder);
            db.SaveChanges();

            //Get the dropdown data
            qryTrade = db.Trades.OrderBy(trd => trd.TradeName);
            if (qryTrade.Count() > 0)
            {
                foreach (var item in qryTrade)
                {
                    listSelector.Add(new KeyValuePair<string, string>(item.TradeId.ToString(), item.TradeName));
                }
            }
            SelectList tradeselectorlist = new SelectList(listSelector, "Key", "Value");
            ViewBag.TradeList = tradeselectorlist;

            return View(purchaseorder);
        }
        private void GetSalesOrderTotals01(TimelyDepotContext db01, int nSalesOrderId, ref double dSalesAmount, ref double dTotalTax, ref double dTax, ref double dTotalAmount, ref double dBalanceDue)
        {
            double dShipping = 0;
            double dPayment = 0;

            IQueryable<SalesOrderDetail> qryDetails = null;
            InitialInfo initialinfo = null;

            dSalesAmount = 0;
            dTax = 0;
            dTotalAmount = 0;
            dBalanceDue = 0;
            dTotalTax = 0;

            initialinfo = db01.InitialInfoes.FirstOrDefault<InitialInfo>();
            if (initialinfo == null)
            {
                initialinfo = new InitialInfo();
                initialinfo.InvoiceNo = 0;
                initialinfo.PaymentNo = 0;
                initialinfo.PurchaseOrderNo = 0;
                initialinfo.SalesOrderNo = 1;
                initialinfo.TaxRate = 0;
                db.InitialInfoes.Add(initialinfo);
                dTax = initialinfo.TaxRate;
            }
            else
            {
                dTax = initialinfo.TaxRate;
            }

            SalesOrder salesorder = db01.SalesOrders.Find(nSalesOrderId);
            if (salesorder != null)
            {
                dShipping = Convert.ToDouble(salesorder.ShippingHandling);
                dPayment = Convert.ToDouble(salesorder.PaymentAmount);

                qryDetails = db01.SalesOrderDetails.Where(sldt => sldt.SalesOrderId == salesorder.SalesOrderId);
                if (qryDetails.Count() > 0)
                {
                    foreach (var item in qryDetails)
                    {
                        dSalesAmount = dSalesAmount + (Convert.ToDouble(item.Quantity) * Convert.ToDouble(item.UnitPrice));
                        dTotalTax = dTotalTax + (Convert.ToDouble(item.Quantity) * Convert.ToDouble(item.UnitPrice) * (dTax / 100));
                    }
                }

                dTotalAmount = dSalesAmount + dTotalTax + dShipping;
                dBalanceDue = dTotalAmount - dPayment;
            }
        }
        //
        // GET: //GenerateInvoice
        public ActionResult GenerateInvoice(int id = 0)
        {
            int nInvoiceNo = 0;
            int nTrackingNo = 0;
            int nPos = -1;
            double dTax = 0;
            string szMsg = "";
            string[] szHlp = null;
            InitialInfo initialinfo = null;
            Invoice invoice = null;
            InvoiceDetail invoicedetail = null;

            TimelyDepotContext db01 = new TimelyDepotContext();

            IQueryable<SalesOrderDetail> qrySODetails = null;

            SalesOrder salesorder = db.SalesOrders.Find(id);
            if (salesorder != null)
            {
                //Get the next payment No
                initialinfo = db.InitialInfoes.FirstOrDefault<InitialInfo>();
                if (initialinfo == null)
                {
                    initialinfo = new InitialInfo();
                    initialinfo.InvoiceNo = 1;
                    initialinfo.PaymentNo = 0;
                    initialinfo.PurchaseOrderNo = 0;
                    initialinfo.SalesOrderNo = 0;
                    initialinfo.TaxRate = 0;
                    initialinfo.TrackingNo = 1;
                    db.InitialInfoes.Add(initialinfo);
                }
                else
                {
                    nInvoiceNo = initialinfo.InvoiceNo;
                    nInvoiceNo++;
                    initialinfo.InvoiceNo = nInvoiceNo;
                    nTrackingNo = Convert.ToInt32(initialinfo.TrackingNo);
                    nTrackingNo++;
                    initialinfo.TrackingNo = nTrackingNo;
                    dTax = initialinfo.TaxRate;
                    db.Entry(initialinfo).State = EntityState.Modified;
                }

                //Use the sales order tax information
                if (salesorder.Tax_rate != null)
                {
                    if (Convert.ToDecimal(salesorder.Tax_rate) >= 0)
                    {
                        dTax = Convert.ToDouble(salesorder.Tax_rate);
                    }
                }

                //Create the Invoice
                invoice = new Invoice();
                invoice.InvoiceNo = nInvoiceNo.ToString();
                invoice.CustomerId = salesorder.CustomerId;
                invoice.BussinesType = salesorder.BussinesType;
                invoice.CreaditCardNo = salesorder.CreaditCardNo;
                invoice.CustomerShipLocation = salesorder.CustomerShipLocation;
                invoice.CustomerShiptoId = salesorder.CustomerShiptoId;
                //invoice.InvoiceDate = DateTime.Now;
                invoice.InvoiceDate = Convert.ToDateTime(salesorder.SODate);
                invoice.IsBlindShip = salesorder.IsBlindShip;
                invoice.Note = salesorder.Note;
                invoice.PaymentAmount = salesorder.PaymentAmount;
                invoice.PaymentDate = salesorder.PaymentDate;
                invoice.PaymentTerms = salesorder.PaymentTerms;
                invoice.PurchaseOrderNo = salesorder.PurchaseOrderNo;
                invoice.SalesOrderId = salesorder.SalesOrderId;
                invoice.SalesOrderNo = salesorder.SalesOrderNo;
                invoice.SalesRep = salesorder.SalesRep;
                invoice.ShipDate = salesorder.ShipDate;
                invoice.ShippingHandling = salesorder.ShippingHandling;
                invoice.ShipVia = salesorder.ShipVia;
                invoice.TrackingNo = nTrackingNo.ToString();
                invoice.TradeId = salesorder.TradeId;
                invoice.VendorAddress = salesorder.VendorAddress;
                invoice.VendorId = salesorder.VendorId;
                invoice.Tax_rate = Convert.ToDecimal(dTax);
                invoice.Invs_Tax = Convert.ToDecimal(dTax);

                //Set the shipment information
                invoice.FromAddress1 = salesorder.FromAddress1;
                invoice.FromAddress2 = salesorder.FromAddress2;
                invoice.FromCity = salesorder.FromCity;
                invoice.FromCompany = salesorder.FromCompany;
                invoice.FromCountry = salesorder.FromCountry;
                invoice.FromEmail = salesorder.FromEmail;
                invoice.FromFax = salesorder.FromFax;
                invoice.FromName = salesorder.FromName;
                invoice.FromState = salesorder.FromState;
                invoice.FromTel = salesorder.FromTel;
                invoice.FromTitle = salesorder.FromTitle;
                invoice.FromZip = salesorder.FromZip;

                invoice.ToAddress1 = salesorder.ToAddress1;
                invoice.ToAddress2 = salesorder.ToAddress2;
                invoice.ToCity = salesorder.ToCity;
                invoice.ToCompany = salesorder.ToCompany;
                invoice.ToCountry = salesorder.ToCountry;
                invoice.ToEmail = salesorder.ToEmail;
                invoice.ToFax = salesorder.ToFax;
                invoice.ToName = salesorder.ToName;
                invoice.ToState = salesorder.ToState;
                invoice.ToTel = salesorder.ToTel;
                invoice.ToTitle = salesorder.ToTitle;
                invoice.ToZip = salesorder.ToZip;

                db.Invoices.Add(invoice);
                db.SaveChanges();

                //Create the details
                qrySODetails = db.SalesOrderDetails.Where(sodt => sodt.SalesOrderId == salesorder.SalesOrderId);
                if (qrySODetails.Count() > 0)
                {
                    foreach (var item in qrySODetails)
                    {
                        invoicedetail = new InvoiceDetail();
                        invoicedetail.BackOrderQuantity = 0;
                        invoicedetail.Description = item.Description;

                        nPos = -1;
                        nPos = item.Description.IndexOf("Set up Charge");
                        if (nPos != -1)
                        {
                            szHlp = item.Description.Split(' ');
                            szHlp[3] = invoice.InvoiceId.ToString();
                            szMsg = string.Format("{0} {1} {2} {3} {4}", szHlp[0], szHlp[1], szHlp[2], szHlp[3], szHlp[4]);
                            invoicedetail.Description = szMsg;
                        }

                        nPos = -1;
                        nPos = item.Description.IndexOf("Run Charge");
                        if (nPos != -1)
                        {
                            szHlp = item.Description.Split(' ');
                            szHlp[2] = invoice.InvoiceId.ToString();
                            szMsg = string.Format("{0} {1} {2} {3}", szHlp[0], szHlp[1], szHlp[2], szHlp[3]);
                            invoicedetail.Description = szMsg;
                        }

                        invoicedetail.InvoiceId = invoice.InvoiceId;
                        invoicedetail.ItemID = item.ItemID;
                        invoicedetail.ItemOrder = item.ItemOrder;
                        invoicedetail.ItemPosition = item.ItemPosition;
                        invoicedetail.Quantity = item.Quantity;
                        invoicedetail.ShipQuantity = item.Quantity;
                        invoicedetail.Sub_ItemID = item.Sub_ItemID;
                        invoicedetail.Tax = item.Tax;
                        invoicedetail.UnitPrice = item.UnitPrice;
                        invoicedetail.Tax = item.Tax;
                        db.InvoiceDetails.Add(invoicedetail);

                    }

                    db.SaveChanges();
                }

            }

            return RedirectToAction("Edit", new { id = invoice.InvoiceId });
        }
        public void GetInvoiceTotals01(TimelyDepotContext db01, int nInvoiceId, ref double dSalesAmount, ref double dTotalTax, ref double dTax, ref double dTotalAmount, ref double dBalanceDue)
        {
            double dShipping = 0;
            double dPayment = 0;
            double dSOTax = 0;

            IQueryable<InvoiceDetail> qryDetails = null;
            InitialInfo initialinfo = null;

            dSalesAmount = 0;
            dTax = 0;
            dTotalAmount = 0;
            dBalanceDue = 0;
            dTotalTax = 0;

            initialinfo = db01.InitialInfoes.FirstOrDefault<InitialInfo>();
            if (initialinfo == null)
            {
                initialinfo = new InitialInfo();
                initialinfo.InvoiceNo = 0;
                initialinfo.PaymentNo = 0;
                initialinfo.PurchaseOrderNo = 0;
                initialinfo.SalesOrderNo = 1;
                initialinfo.TaxRate = 0;
                db01.InitialInfoes.Add(initialinfo);
                dTax = initialinfo.TaxRate;
            }
            else
            {
                dTax = initialinfo.TaxRate;
            }

            Invoice salesorder = db01.Invoices.Find(nInvoiceId);
            if (salesorder != null)
            {
                dShipping = Convert.ToDouble(salesorder.ShippingHandling);
                dPayment = Convert.ToDouble(salesorder.PaymentAmount);

                //Use the sales order tax information
                if (salesorder.Tax_rate != null)
                {
                    if (Convert.ToDecimal(salesorder.Tax_rate) >= 0)
                    {
                        dTax = Convert.ToDouble(salesorder.Tax_rate);
                    }
                }
                dSOTax = dTax;

                qryDetails = db01.InvoiceDetails.Where(sldt => sldt.InvoiceId == salesorder.InvoiceId);
                if (qryDetails.Count() > 0)
                {
                    foreach (var item in qryDetails)
                    {
                        //use the tax on product
                        if (item.Tax != null)
                        {
                            if (Convert.ToDecimal(item.Tax) >= 0)
                            {
                                dTax = Convert.ToDouble(item.Tax);
                            }
                        }
                        dSalesAmount = dSalesAmount + (Convert.ToDouble(item.Quantity) * Convert.ToDouble(item.UnitPrice));
                        dTotalTax = dTotalTax + (Convert.ToDouble(item.Quantity) * Convert.ToDouble(item.UnitPrice) * (dTax / 100));
                    }
                }

                dTotalAmount = dSalesAmount + dTotalTax + dShipping;
                dBalanceDue = dTotalAmount - dPayment;

                //Set the sales order tax again
                dTax = dSOTax;
            }
        }
        public ActionResult Add()
        {
            int nPaymentNo = 0;
            string CustomerNo = string.Empty;
            string CompanyName = string.Empty;
            InitialInfo initialinfo = null;

            //Get the next payment No
            initialinfo = db.InitialInfoes.FirstOrDefault<InitialInfo>();
            if (initialinfo == null)
            {
                initialinfo = new InitialInfo();
                initialinfo.InvoiceNo = 0;
                initialinfo.PaymentNo = 1;
                initialinfo.PurchaseOrderNo = 0;
                initialinfo.SalesOrderNo = 0;
                initialinfo.TaxRate = 0;
                db.InitialInfoes.Add(initialinfo);
            }
            else
            {
                nPaymentNo = initialinfo.PaymentNo;
                nPaymentNo++;
                initialinfo.PaymentNo = nPaymentNo;
                db.Entry(initialinfo).State = EntityState.Modified;
            }

            Payments payment = new Payments();
            payment.PaymentNo = nPaymentNo.ToString();
            payment.PaymentDate = DateTime.Now;
            db.Payments.Add(payment);
            db.SaveChanges();

            TempData["Status"] = "Add";

            return RedirectToAction("Index", new { id = payment.Id });
        }
 public ActionResult Edit(InitialInfo initialinfo)
 {
     if (ModelState.IsValid)
     {
         db.Entry(initialinfo).State = EntityState.Modified;
         db.SaveChanges();
         return RedirectToAction("Index");
     }
     return View(initialinfo);
 }