public bool UpdateQuantity(int TableHeaderId)
        {
            try
            {
                var tblDetailsObj = _db.TableBookingHeader.Where(t => t.Id == TableHeaderId).FirstOrDefault();
                if (tblDetailsObj != null)
                {
                    TableTrack objT = _db.TableTrack.Include(t => t.Table).Where(t => t.DateTable.Date == tblDetailsObj.SitInDate.Date && t.TimeTable == tblDetailsObj.SitInTime && t.Table.SeatingName == tblDetailsObj.TableName).FirstOrDefault();
                    if (objT != null)
                    {
                        objT.AmtAva += tblDetailsObj.TableBooked;
                        if (objT.AmtAva > objT.Table.MaxTables)
                        {
                            objT.AmtAva = objT.Table.MaxTables;
                        }

                        _db.SaveChanges();
                    }
                }
                return(true);
            }
            catch
            {
                return(false);
            }
        }
        public async Task <IActionResult> Index(CustomerBookingVM objCB)
        {
            if (objCB.ChosenTableId <= 0 || objCB.DateChosen == null || objCB.TimeChosen == null)
            {
                return(RedirectToAction(nameof(Index)));
            }

            var FindIdInTableTrack = _db.TableTrack.Include(t => t.Table).Where(t => t.TableId == objCB.ChosenTableId &&
                                                                                t.DateTable.Date == objCB.DateChosen.Value.Date &&
                                                                                t.TimeTable == objCB.TimeChosen.Value.TimeOfDay);

            objCB.TableTracks = new TableTrack();

            if (FindIdInTableTrack.Any())
            {
                objCB.TableTracks = await FindIdInTableTrack.FirstAsync();
            }
            else
            {
                var GetTable = await _db.Table.FindAsync(objCB.ChosenTableId);

                int        MaxQuan    = GetTable.MaxTables;
                TableTrack tableTrack = new TableTrack
                {
                    TableId   = objCB.ChosenTableId,
                    AmtAva    = MaxQuan,
                    DateTable = objCB.DateChosen.Value.Date,
                    TimeTable = objCB.TimeChosen.Value.TimeOfDay
                };

                _db.TableTrack.Add(tableTrack);
                await _db.SaveChangesAsync();

                objCB.TableTracks = await _db.TableTrack.Include(t => t.Table).Where(t => t.Id == tableTrack.Id).Select(t => t).FirstAsync();
            }

            var TableObj = await _db.Table.AnyAsync();

            if (TableObj)
            {
                objCB.TableList = await _db.Table.Where(t => t.Active == true).OrderBy(t => t.SeatingName).Select(t => new SelectListItem
                {
                    Text  = t.SeatingName,
                    Value = t.Id.ToString()
                }).ToListAsync();
            }
            else
            {
                objCB.TableList = new List <SelectListItem>();
            }

            objCB.Quantity = 0;

            return(View(objCB));
        }
        public async Task <IActionResult> DeleteConfirmed(int?id)
        {
            var table = await _db.Table.FindAsync(id);

            if (table == null)
            {
                return(View());
            }

            // Delete Image
            string webRootPath = _hostingEnvironment.WebRootPath;
            var    imagePath   = Path.Combine(webRootPath, table.Image.TrimStart('\\'));

            if (System.IO.File.Exists(imagePath))
            {
                System.IO.File.Delete(imagePath);
            }
            //End Delete Image
            // Send Email to All pending and approved bookings for specific item that is being deleted
            // Inform Customers that the table is no longer available etc.

            /*
             * Following code is to remove all table tracks in TableTrack that is linked to the table being
             * deleted.
             */
            var CheckTableTrack = await _db.TableTrack.Where(t => t.TableId == id).ToListAsync();

            if (CheckTableTrack.Any())
            {
                foreach (var item in CheckTableTrack)
                {
                    TableTrack tableTrack = await _db.TableTrack.FindAsync(item.Id);

                    _db.TableTrack.Remove(tableTrack);
                }
            }

            /*
             * Following code is to cancel/reject all bookings that have the soon to be deleted table name
             */

            //Reject Pending Ones:
            var CheckTableHeaderPending = await _db.TableBookingHeader.Where(t => t.TableName == table.SeatingName && t.Status != SD.TableStatusCancelled && t.BookStatus == SD.BookTableStatusPending && t.SitInDate.Date >= DateTime.Now.Date).ToListAsync();

            if (CheckTableHeaderPending.Any())
            {
                foreach (var item in CheckTableHeaderPending)
                {
                    TableBookingHeader tableHeader = _db.TableBookingHeader.Find(item.Id);
                    tableHeader.BookStatus   = SD.BookTableStatusRejected;
                    tableHeader.TimeRejected = DateTime.Now;

                    var claimsIdentity = (ClaimsIdentity)User.Identity;
                    var claim          = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier);
                    var StaffName      = _db.ApplicationUser.Where(a => a.Id == claim.Value).SingleOrDefault().Name;

                    tableHeader.RejectedBy = StaffName;
                    // Send Email saying their booking was rejected because table is unavailable
                    var CustomerInfo  = _db.ApplicationUser.Where(u => u.Id == tableHeader.UserId).FirstOrDefault();
                    var CustomerEmail = CustomerInfo.Email;
                    var CustomerName  = CustomerInfo.Name;

                    SendEmail(CustomerName, CustomerEmail, "Table Booking : " + item.Id + " - Rejected", "The following table booking has been rejected:", tableHeader);
                }
            }

            //Cancel Approved Ones:
            var CheckTableHeaderApproved = await _db.TableBookingHeader.Where(t => t.TableName == table.SeatingName && t.BookStatus == SD.BookTableStatusApproved && t.Status == SD.TableStatusSubmitted && t.SitInDate.Date > DateTime.Now.Date).ToListAsync();

            if (CheckTableHeaderApproved.Any())
            {
                foreach (var item in CheckTableHeaderApproved)
                {
                    TableBookingHeader tableHeader = _db.TableBookingHeader.Find(item.Id);
                    tableHeader.Status       = SD.TableStatusCancelled;
                    tableHeader.TimeRejected = DateTime.Now;
                    var claimsIdentity = (ClaimsIdentity)User.Identity;
                    var claim          = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier);
                    var StaffName      = _db.ApplicationUser.Where(a => a.Id == claim.Value).SingleOrDefault().Name;

                    tableHeader.RejectedBy = StaffName;
                    // Send Email saying their booking was cancelled because table is unavailable
                    var CustomerInfo  = _db.ApplicationUser.Where(u => u.Id == tableHeader.UserId).FirstOrDefault();
                    var CustomerEmail = CustomerInfo.Email;
                    var CustomerName  = CustomerInfo.Name;

                    SendEmail(CustomerName, CustomerEmail, "Table Booking : " + item.Id + " - Cancelled", "The following table booking has been cancelled, we apologise for the inconvenience:", tableHeader);
                }
            }



            _db.Table.Remove(table);
            await _db.SaveChangesAsync();

            return(RedirectToAction(nameof(Index)));
        }
        public async Task <IActionResult> AddToTable(int?Quantity, int?TableTrackId)
        {
            if (Quantity.HasValue)
            {
                if (Quantity.Value <= 0)
                {
                    return(RedirectToAction(nameof(Index)));
                }
            }
            if (!Quantity.HasValue || !TableTrackId.HasValue)
            {
                return(RedirectToAction(nameof(Index)));
            }


            var claimsIdentity = (ClaimsIdentity)this.User.Identity;
            var claim          = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier);

            var tableTrack = await _db.TableTrack.Include(t => t.Table).Where(t => t.Id == TableTrackId.Value).FirstOrDefaultAsync();

            if (tableTrack == null)
            {
                return(RedirectToAction(nameof(Index)));
            }

            TableBookingHeader objTBH = new TableBookingHeader
            {
                UserId          = claim.Value,
                DateBookingMade = SharedMethods.GetDateTime(),
                SitInDate       = tableTrack.DateTable,
                SitInTime       = tableTrack.TimeTable,
                TableName       = tableTrack.Table.SeatingName,
                TableBooked     = Quantity.Value,
                Status          = SD.TableStatusSubmitted,
                BookStatus      = SD.BookTableStatusPending,
                ApprovedBy      = "",
                RejectedBy      = "",
                TimeApproved    = null,
                TimeCheckOut    = null,
                TimeRejected    = null,
                TimeSitIn       = null,
                Duration        = ""
            };

            await _db.TableBookingHeader.AddAsync(objTBH);

            TableTrack objTT = await _db.TableTrack.FindAsync(tableTrack.Id);

            objTT.AmtAva -= Quantity.Value;

            await _db.SaveChangesAsync();

            //Send Email
            var CustomerInfo  = _db.ApplicationUser.Where(u => u.Id == claim.Value).FirstOrDefault();
            var CustomerEmail = CustomerInfo.Email;
            var CustomerName  = CustomerInfo.Name;


            SendEmail(CustomerName, CustomerEmail, "Table Booking : " + objTBH.Id + " - Received", "Your Table Booking has been received", "Thank you for your table booking, it is awaiting approval from the Admin.", objTBH);
            //End Send Email

            return(View("Confirm", objTBH));
        }
        public async Task <IActionResult> Edit(TableEditVM objTable)
        {
            if (ModelState.IsValid)
            {
                if (objTable.Table.MaxTables != objTable.OldMaxValue)
                {
                    int SubtractTab = objTable.Table.MaxTables - objTable.OldMaxValue;

                    var TableTrackObj = await _db.TableTrack.Include(t => t.Table).Where(t => t.TableId == objTable.Table.Id).ToListAsync();

                    if (TableTrackObj.Any())
                    {
                        foreach (var item in TableTrackObj)
                        {
                            TableTrack objTT = await _db.TableTrack.FindAsync(item.Id);

                            objTT.AmtAva += SubtractTab;
                            if (objTT.AmtAva < 0)
                            {
                                objTT.AmtAva = 0;
                            }
                        }
                    }
                }

                var TableFromDb = await _db.Table.FindAsync(objTable.Table.Id);

                //Begin Image
                string webRootPath = _hostingEnvironment.WebRootPath;
                var    files       = HttpContext.Request.Form.Files;
                if (files.Count > 0)
                {
                    //New Image File was upload

                    //Combining the webroot path with images
                    var uploads       = Path.Combine(webRootPath, @"images\Table");
                    var extension_new = Path.GetExtension(files[0].FileName);

                    // Delete Image File that was in Database
                    var imagePath = Path.Combine(webRootPath, TableFromDb.Image.TrimStart('\\'));

                    if (System.IO.File.Exists(imagePath))
                    {
                        System.IO.File.Delete(imagePath);
                    }

                    // New Image File will be uploaded
                    using (var filesStream = new FileStream(Path.Combine(uploads, objTable.Table.Id + extension_new), FileMode.Create))
                    {
                        //will copy the image to the file location on the sever and rename it
                        files[0].CopyTo(filesStream);
                    }

                    //In database the name will be changed to te loctaion where the image is saved
                    TableFromDb.Image = @"\images\Table\" + objTable.Table.Id + extension_new;
                }
                //End Image


                TableFromDb.MaxTables = objTable.Table.MaxTables;
                TableFromDb.Active    = objTable.Table.Active;

                await _db.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(objTable));
        }