// To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://aka.ms/RazorPagesCRUD. public async Task <IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return(Page()); } _context.Attach(Room).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!RoomExists(Room.ID)) { return(NotFound()); } else { throw; } } return(RedirectToPage("./Index")); }
// To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://aka.ms/RazorPagesCRUD. public async Task <IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return(Page()); } _context.Customer.Add(Customer); await _context.SaveChangesAsync(); return(RedirectToPage("./Index")); }
// To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://aka.ms/RazorPagesCRUD. public async Task <IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return(Page()); } else if (Booking.CheckIn < DateTime.Today) { ViewData["CheckInerr"] = "Check in Date Must be in the future"; return(Page()); } else if (Booking.CheckIn > Booking.CheckOut) { ViewData["CheckOuterr"] = "Check Out Date Must be in the future"; return(Page()); } var roomID = new SqliteParameter("roomID", Booking.RoomID); var cInDate = new SqliteParameter("cInDate", Booking.CheckIn); var cOutDate = new SqliteParameter("cOutDate", Booking.CheckOut); var Query = _context.Room.FromSqlRaw("SELECT [Room].* FROM Room " + "WHERE [Room].ID = @roomID " + " AND [Room].ID NOT IN " + "(SELECT [Room].ID " + "FROM [Room] " + "INNER JOIN [Booking] " + "ON [Room].ID = [Booking].RoomId " + "WHERE @cInDate < Booking.Checkout " + "AND Booking.CheckIn < @cOutDate ) ", roomID, cInDate, cOutDate); var succesQuerys = await Query.ToListAsync(); if (succesQuerys.Count == 1) { _context.Booking.Add(Booking); await _context.SaveChangesAsync(); ViewData["SuccessDB"] = "success"; } else { ViewData["Fail"] = "During your period, Booking not available, This room is this period already taken"; return(Page()); } return(RedirectToPage("./BookingManagement")); }
public async Task <IActionResult> OnPostAsync(string id) { if (id == null) { return(NotFound()); } Customer = await _context.Customer.FindAsync(id); if (Customer != null) { _context.Customer.Remove(Customer); await _context.SaveChangesAsync(); } return(RedirectToPage("./Index")); }
public async Task <IActionResult> OnPostAsync(int?id) { if (id == null) { return(NotFound()); } Room = await _context.Room.FindAsync(id); if (Room != null) { _context.Room.Remove(Room); await _context.SaveChangesAsync(); } return(RedirectToPage("./Index")); }
public async Task <IActionResult> OnPostAsync(int?id) { if (id == null) { return(NotFound()); } Booking = await _context.Booking.FindAsync(id); if (Booking != null) { _context.Booking.Remove(Booking); await _context.SaveChangesAsync(); } return(RedirectToPage("./BookingManagement")); }
// To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://aka.ms/RazorPagesCRUD. public async Task <IActionResult> OnPostAsync() { ViewData["CustomerEmail"] = new SelectList(_context.Customer, "Email", "FullName"); ViewData["RoomID"] = new SelectList(_context.Room, "ID", "ID"); if (!ModelState.IsValid) { return(Page()); } _context.Attach(Booking).State = EntityState.Modified; //TODO SQL VALIDATIION //Check new dates are aviable //dont include current booking in sub query //raw sql var roomID = new SqliteParameter("roomID", Booking.RoomID); var checkIn = new SqliteParameter("checkIn", Booking.CheckIn); var checkOut = new SqliteParameter("checkOut", Booking.CheckOut); var bookingID = new SqliteParameter("bookingID", Booking.ID); String query = "SELECT [Room].* FROM Room " + "WHERE [Room].ID = @roomID "; String subQuery = "(SELECT [Room].ID " + "FROM [Room] " + "INNER JOIN [Booking] " + "ON [Room].ID = [Booking].RoomId " + "WHERE @checkIn < Booking.Checkout " + "AND Booking.CheckIn < @checkOut " + "AND Booking.ID != @bookingID ) "; String notQuery = query + " AND [Room].ID NOT IN " + subQuery; var searchQuery = _context.Room.FromSqlRaw(notQuery, roomID, checkIn, checkOut, bookingID); var thing = await searchQuery.ToListAsync(); //TODO FIX BULLSHIT OUTPUT if (thing.Count == 1) { try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!BookingExists(Booking.ID)) { return(NotFound()); } else { throw; } } } else { ViewData["SuccessDB"] = "Booking not available"; return(Page()); } return(RedirectToPage("./BookingManagement")); }
// To protect from overposting attacks, enable the specific properties you want to bind to, for // more details, see https://aka.ms/RazorPagesCRUD. public async Task <IActionResult> OnPostAsync() { ViewData["RoomID"] = new SelectList(_context.Room, "ID", "ID"); // Validation, when user tried to book invalid data, will return error message instead of success message. if (!ModelState.IsValid) { return(Page()); } else if (BookingRoom.CheckIn < DateTime.Today) { ViewData["CheckInerr"] = "Check in Date Must be in the future"; return(Page()); } else if (BookingRoom.CheckIn > BookingRoom.CheckOut) { ViewData["CheckOuterr"] = "Check Out Date Must be in the future"; return(Page()); } // Current logged in User, Customer, will only book. // So, can meet the requirmenet of "1 customer books 1 room" string _email = User.FindFirst(ClaimTypes.Name).Value; Booking Booking = new Booking { TheCustomer = await _context.Customer.FirstOrDefaultAsync(m => m.Email == _email), TheRoom = await _context.Room.FirstOrDefaultAsync(m => m.ID == BookingRoom.RoomID), RoomID = BookingRoom.RoomID, CustomerEmail = _email, CheckIn = BookingRoom.CheckIn, CheckOut = BookingRoom.CheckOut }; // Caculate Data of night. var lengthOfStay = (int)(Booking.CheckOut - Booking.CheckIn).TotalDays; BookingRoom.TotalCost = lengthOfStay * Booking.TheRoom.Price; Booking.Cost = BookingRoom.TotalCost; //Level requirement, var theLevel = await _context.Room.FirstOrDefaultAsync(m => m.ID == BookingRoom.RoomID); BookingRoom.Level = theLevel.Level; var roomID = new SqliteParameter("roomID", BookingRoom.RoomID); var cInDate = new SqliteParameter("cInDate", BookingRoom.CheckIn); var cOutDate = new SqliteParameter("cOutDate", BookingRoom.CheckOut); var Query = _context.Room.FromSqlRaw("SELECT [Room].* FROM Room " + "WHERE [Room].ID = @roomID " + " AND [Room].ID NOT IN " + "(SELECT [Room].ID " + "FROM [Room] " + "INNER JOIN [Booking] " + "ON [Room].ID = [Booking].RoomId " + "WHERE @cInDate < Booking.Checkout " + "AND Booking.CheckIn < @cOutDate ) ", roomID, cInDate, cOutDate); var succesQuerys = await Query.ToListAsync(); // The result is only 1, store into DB, // If the result came out more than one, which means bookings are duplicated, means, someone already book, // so, use else state to display error message. if (succesQuerys.Count == 1) { _context.Booking.Add(Booking); await _context.SaveChangesAsync(); ViewData["SuccessDB"] = "success"; } else //If query result is more than one, (which means my query could be wrong or ..something worng), error mes display { ViewData["Fail"] = "During your period, Booking not available, This room is this period already taken"; } return(Page()); }