/// <summary>
        /// Adds new Restaurant Tables Booking Record to DataBase
        /// </summary>
        /// <param name="thebooking">The RestaurantBooking for which these bookings are being done</param>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <returns>Returns true if operation is successful otherwise returns false</returns>
        public bool Add(RestaurantBooking thebooking)
        {
            if (thebooking == null)
                throw new ArgumentNullException("thebooking");
            if (thebooking.BookingId < 1)
                throw new ArgumentOutOfRangeException("thebooking", thebooking.BookingId, "A new Menu Item Booking record can not be added for a booking with invalid Id");
            var res = 0;

            using (var cn = new SqlConnection(DatabaseConnection.ConnectionStringToDb))
            {
                foreach (var table in thebooking.BookedTables)
                {
                    using (var cmd = new SqlCommand("AddTableBookings", cn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@BOOKINGID", SqlDbType.BigInt).Value = thebooking.BookingId;
                        cmd.Parameters.Add("@TABLEID", SqlDbType.BigInt).Value = table.TableId;
                        cmd.Parameters.Add("@BOOKEDFOR", SqlDbType.DateTime).Value = thebooking.BookedFor.ToUniversalTime();
                        cmd.Parameters.Add("@BOOKEDTILL", SqlDbType.DateTime).Value = thebooking.BookedTill.ToUniversalTime();

                        if (cn.State != ConnectionState.Open) cn.Open();
                        res += cmd.ExecuteNonQuery();
                    }
                }
            }
            return res == thebooking.BookedTables.Count;
        }
        /// <summary>
        /// Updates the Available Record with new Details
        /// </summary>
        /// <param name="thebooking">The RestaurantBooking instance for which these bookings are being done</param>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <returns>Returns true if operation is successful otherwise returns false</returns>
        /// <remarks>This method actually deleates all the record with the specified booking id and calls Add() method</remarks>
        public bool Update(RestaurantBooking thebooking)
        {
            if (thebooking == null)
                throw new ArgumentNullException("thebooking");
            if (thebooking.BookingId < 1)
                throw new ArgumentOutOfRangeException("thebooking", thebooking.BookingId, "A new Table Booking record can not be Updated for a booking with invalid BookingId");

            return Delete(thebooking.BookingId) && Add(thebooking);
        }
        public ActionResult Confirm(string couponcode)
        {
            var tmpdata = TempData.Peek(TempDataStringResuorce.NewBookingData) as TempDataConfirmBooking;
            try
            {
                if (tmpdata == null)
                {
                    TempData[TempDataStringResuorce.ActionResultNotification] = new ActionResultNotification
                            {
                                Result = false,
                                Message = "Invalid Booking Request, please try again !",
                                State = ActionResultNotification.MessageState.Error
                            };
                    return RedirectToAction("New");
                }

                var model = tmpdata.Model;
                if (model == null)
                {
                    TempData[TempDataStringResuorce.ActionResultNotification] = new ActionResultNotification
                    {
                        Result = false,
                        Message = "Invalid Booking Request, please try again !",
                        State = ActionResultNotification.MessageState.Error
                    };
                    return RedirectToAction("New");
                }
                var offerid = tmpdata.OfferId;
                IEnumerable<RestaurantMenuItem> restaurantMenuItems;
                IEnumerable<RestaurantTable> restaurantTables;
                SeasonalOffer restaurantOffer;
                Coupon restaurantcoupon;
                BookingHelper.ValidateModel(this, model, offerid, couponcode, out restaurantMenuItems, out restaurantTables, out restaurantOffer, out restaurantcoupon);
                if (restaurantOffer != null && restaurantcoupon != null)
                {
                    ModelState.AddModelError("addstatus", "Two or more offers cannot be clubbed together, either use a Coupon Code or a Seasonal Offer");
                }
                if (ModelState.IsValid)
                {
                    var booking = new RestaurantBooking
                                      {
                                          BookedFor = model.BookedFor.ToUniversalTime(),
                                          BookedOn = DateTime.UtcNow,
                                          BookedTill = model.BookedFor.ToUniversalTime().AddMinutes(AppConfigHelper.BookingSlotMinutes * model.BookedSlots),
                                          BookedTables = restaurantTables.ToList(),
                                          PrefferedMenuItems = restaurantMenuItems.ToList(),
                                          BookingCustomer = new AccountMembershipService().GetUser(((RestaurantUserIdentity)User.Identity).UserGuid, true)
                                      };
                    booking.Bills.Add(BookingHelper.GetBookingBill(restaurantMenuItems, restaurantTables, restaurantOffer,
                                                     restaurantcoupon, model.BookedSlots));

                    //Status of the booking is automaticaly set by repository according to availability
                    var bookingresult = Repository.Add(booking);
                    if (bookingresult > 0) TempData.Remove(TempDataStringResuorce.NewBookingData);
                    var message = bookingresult > 0
                                      ? String.Format("The Booking of Booking ID:{0} was successful", bookingresult)
                                      : String.Format("The Booking was Unsuccessful! Please try again");
                    var result = new ActionResultNotification
                    {
                        Result = bookingresult > 0,
                        Message = message,
                        State = bookingresult > 0 ? ActionResultNotification.MessageState.Information : ActionResultNotification.MessageState.Error
                    };
                    if (Request.IsAjaxRequest())
                        return Json(result);

                    TempData[TempDataStringResuorce.ActionResultNotification] = result;
                    return RedirectToAction("Index");
                }
                // If we got this far, something failed, redisplay form
                TempData[TempDataStringResuorce.ActionResultNotification] = new ActionResultNotification
                {
                    Message = ModelState.ContainsKey("addstatus") ? ModelState["addstatus"].Errors[0].ErrorMessage : "There was an Error in making you booking, please try again !",
                    Result = false,
                    State = ActionResultNotification.MessageState.Error
                };
                return View(model);
            }
            catch (Exception e)
            {
                var result = new ActionResultNotification
                {
                    Result = false,
                    Message = e.Message,
                    State = ActionResultNotification.MessageState.Error
                };
                if (Request.IsAjaxRequest())
                    return Json(result);
                TempData[TempDataStringResuorce.ActionResultNotification] = result;
                if (tmpdata != null)
                TempData[TempDataStringResuorce.NewBookingData] =
                    new TempDataConfirmBooking { Model = tmpdata.Model, OfferId = tmpdata.OfferId };
                return Confirm();
            }
        }