public ActionResult Create()
 {
     BookDataViewModel bvm = new BookDataViewModel
     {
         Book = new Book(),
         LocationCodes = uow.LocationCodeRepository.Get()
     };
     return View(bvm);
 }
        public ActionResult Create(BookDataViewModel bdModel, IEnumerable<int> itemCode)
        {
            if (ModelState.IsValid)
            {
                // check if this ISbn no has been added, if yes do an update instead of insert
                var existingIsbn = uow.BookRepository.FirstOrDefault(x => x.Isbn10 == bdModel.Book.Isbn10);
                if (existingIsbn == null) //no existing Isbn, do insert
                {
                    // handle book's authors
                    bdModel.Book.Authors = new List<Author>();
                    if (bdModel.AuthorsText != null)
                    {
                        var authors = HelperClass.converStringToListAuthors(bdModel.AuthorsText);
                        foreach (var item in authors)
                        {
                            var existingAuthor = uow.AuthorRepository.FirstOrDefault(x => x.AuthorName == item.AuthorName);
                            if (existingAuthor != null)
                            {
                                bdModel.Book.Authors.Add(existingAuthor);
                            }
                            else
                            {
                                bdModel.Book.Authors.Add(item);
                            }
                        }
                    }

                    // handle book's categories
                    bdModel.Book.Categories = new List<Category>();
                    if (bdModel.CategoriesText != null)
                    {
                        var categories = HelperClass.converStringToListCategories(bdModel.CategoriesText);
                        foreach (var item in categories)
                        {
                            var existingCategory = uow.CategoryRepository.FirstOrDefault(x => x.CategoryName == item.CategoryName);
                            if (existingCategory != null)
                            {
                                bdModel.Book.Categories.Add(existingCategory);
                            }
                            else
                            {
                                bdModel.Book.Categories.Add(item);
                            }
                        }
                    }

                    // handle Location Codes
                    if (itemCode != null)
                    {
                        bdModel.Book.LocationCodes = uow.LocationCodeRepository.Get(x => itemCode.Contains(x.Id)).ToList();
                    }

                    // save to db
                    uow.BookRepository.Insert(bdModel.Book);
                }
                else //this Isbn already exist in db, do nothing
                {
                    // detech changes and save the chnaged fields to existing
                    //existingIsbn.Title = bdModel.Book.Title;
                    //existingIsbn.Subtitle = bdModel.Book.Subtitle;
                    //existingIsbn.Publisher = bdModel.Book.Publisher;
                    //existingIsbn.PublishedDate = bdModel.Book.PublishedDate;
                    //existingIsbn.CostPrice = bdModel.Book.CostPrice;
                    //existingIsbn.SalesPrice = bdModel.Book.SalesPrice;
                    //existingIsbn.Quantity = bdModel.Book.Quantity;

                    //string existingAuthors = ListExtension.ConvertToString<Author>(existingIsbn.Authors);

                    //uow.BookRepository.Update(existingIsbn);
                }

                uow.BookRepository.SaveChanges();
                return RedirectToAction("Index");
            }

            BookDataViewModel initial = new BookDataViewModel
            {
                Book = new Book(),
                LocationCodes = uow.LocationCodeRepository.Get()
            };
            return View(initial);
        }
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            //TODO create the include method in genericRepo
            DbSet<Book> bookDbSet = uow.BookRepository.dbSet;
            Book book = bookDbSet.Include(x => x.Authors).Include(y => y.Categories).Include(z => z.LocationCodes).FirstOrDefault(b => b.BookId == id);
            if (book == null)
            {
                return HttpNotFound();
            }
            BookDataViewModel editBook = new BookDataViewModel
            {
                Book = book,
                LocationCodes = uow.LocationCodeRepository.Get(),
                AuthorsText = ListExtension.ConvertToString<Author>(book.Authors),
                CategoriesText = ListExtension.ConvertToString<Category>(book.Categories)
            };
            return View(editBook);
        }
        public ActionResult Edit(BookDataViewModel data, IEnumerable<int> itemCode)
        {
            if (ModelState.IsValid)
            {
                //TODO process data to save new authors, categories and itemcode
                uow.BookRepository.Update(data.Book);
                return RedirectToAction("Index");
            }

            data.LocationCodes = uow.LocationCodeRepository.Get();
            return View(data);
        }
 //// GET: Books/Details/5
 public ActionResult Details(int? id)
 {
     if (id == null)
     {
         return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
     }
     DbSet<Book> bookDbSet = uow.BookRepository.dbSet;
     Book book = bookDbSet.Include(x => x.Authors).Include(y => y.Categories).Include(z => z.LocationCodes).FirstOrDefault(b => b.BookId == id);
     if (book == null)
     {
         return HttpNotFound();
     }
     BookDataViewModel details = new BookDataViewModel
     {
         Book = book,
         AuthorsText = ListExtension.ConvertToString<Author>(book.Authors),
         CategoriesText = ListExtension.ConvertToString<Category>(book.Categories),
         LocationCodes = book.LocationCodes
     };
     return View(details);
 }