public PartialViewResult SerializeAdd(string prevVm)
        {
            //create view model from the vm passed from the view
            AddViewModel addVM = JsonConvert.DeserializeObject <AddViewModel>(prevVm);

            //Create a transaction overview to summerise the transaction been added
            TransactionOverview to = new TransactionOverview();

            to.CustomerId        = addVM.transactionOverview.CustomerId;
            to.Date              = addVM.transactionOverview.Date;
            to.TransactionNumber = addVM.transactionOverview.TransactionNumber;
            to.TotalValue        = addVM.transactionOverview.TotalValue;

            //Add the transaction overview
            m_Context.TransactionOverviews.Add(to);

            //for every item added create a transaction and update the stock and sold
            foreach (Item i in addVM.items)
            {
                Transaction t = new Transaction();
                t.ItemId            = i.ItemId;
                t.TransactionNumber = addVM.transactionOverview.TransactionNumber;
                t.Date       = addVM.transactionOverview.Date;
                t.CustomerId = addVM.transactionOverview.CustomerId;
                m_Context.Transactions.Add(t);

                var item = m_Context.Items.Where(it => it.ItemId == t.ItemId).First();
                item.Stock--;
                item.Sold++;
            }

            //Save the changes to the database
            m_Context.SaveChanges();

            //log that a transaction has been added
            Logger.LogAction("Transaction Added", "Added transaction number " + to.TransactionNumber);

            //create a new vm and return the view
            HistoricViewModel vm = new HistoricViewModel();

            return(PartialView("Partials/HistoricView", vm));
        }
        /// <summary>
        /// This is the basic constructor that creates the view from scratch
        /// </summary>
        public AddViewModel()
        {
            transactionOverview = new TransactionOverview();
            items = new List <Item>();
            transactionOverview.Date = DateTime.Now;

            int iHighestTransactionNumber = 0;

            try
            {
                iHighestTransactionNumber = m_Context.TransactionOverviews.Max(t => t.TransactionNumber);
            }
            catch (System.InvalidOperationException e)
            {
                iHighestTransactionNumber = 0;
            }

            transactionOverview.TransactionNumber = iHighestTransactionNumber + 1;
            return;
        }
        public PartialViewResult SerializeEdit(string prevVM)
        {
            //create the view model and pass in the previous view model
            EditViewModel editVM = JsonConvert.DeserializeObject <EditViewModel>(prevVM);

            //create a new transaction over view and populate the variables to store in the data base
            TransactionOverview to = new TransactionOverview();

            to.CustomerId        = editVM._transactionOverview.CustomerId;
            to.Date              = m_Context.TransactionOverviews.Where(i => i.TransactionNumber == editVM._transactionOverview.TransactionNumber).First().Date;
            to.TransactionNumber = editVM._transactionOverview.TransactionNumber;
            to.TotalValue        = editVM._transactionOverview.TotalValue;

            //retrive the current entry for that transaction id from the database
            //then update the entry with the values populated from the the view model
            var entry = m_Context.TransactionOverviews.Where(t => t.TransactionNumber == editVM._transactionOverview.TransactionNumber).First();

            entry.TransactionNumber = to.TransactionNumber;
            entry.TotalValue        = to.TotalValue;
            entry.CustomerId        = to.CustomerId;
            entry.Date = to.Date;

            //if there are removed items then remove them from the transactions in the database and update the stock and sold variables
            if (editVM._remItemsIndex.Count > 0)
            {
                List <Transaction> remList = new List <Transaction>();
                var ts = m_Context.Transactions.Where(t => t.TransactionNumber == to.TransactionNumber).ToList();
                foreach (int index in editVM._remItemsIndex)
                {
                    if (index < ts.Count)
                    {
                        remList.Add(ts[index]);
                    }
                }

                foreach (Transaction rem in remList)
                {
                    m_Context.Transactions.Remove(rem);

                    var item = m_Context.Items.Where(i => i.ItemId == rem.ItemId).First();
                    item.Stock++;
                    item.Sold--;
                }
            }

            //for every new item in the updated transaction the data base with the item
            foreach (Item i in editVM._newItems)
            {
                Transaction t = new Transaction();
                t.ItemId            = i.ItemId;
                t.TransactionNumber = editVM._transactionOverview.TransactionNumber;
                t.Date       = editVM._transactionOverview.Date;
                t.CustomerId = editVM._transactionOverview.CustomerId;

                m_Context.Transactions.Add(t);

                var item = m_Context.Items.Where(it => it.ItemId == t.ItemId).First();
                item.Stock--;
                item.Sold++;
            }

            //save the changes
            m_Context.SaveChanges();

            //Log that a transaction has been edited
            Logger.LogAction("Transaction Edited", "Edited transaction number " + to.TransactionNumber);

            //Create the historical view model and return a view.
            HistoricViewModel vm = new HistoricViewModel();

            return(PartialView("Partials/HistoricView", vm));
        }