diff --git a/pms/tests.py b/pms/tests.py
index 7ce503c2d..0c66233ad 100644
--- a/pms/tests.py
+++ b/pms/tests.py
@@ -1,3 +1,97 @@
-from django.test import TestCase
+from datetime import date
+
+from django.test import TestCase, override_settings
+from django.urls import reverse
+
+from pms.models import Booking, Customer, Room, Room_type
# Create your tests here.
+@override_settings(STATICFILES_STORAGE="django.contrib.staticfiles.storage.StaticFilesStorage")
+class EditBookingDatesViewTest(TestCase):
+ def setUp(self):
+ self.room_type = Room_type.objects.create(
+ name="Single",
+ max_guests=1,
+ price=20
+ )
+
+ self.room_1 = Room.objects.create(name="Room 1.1", room_type=self.room_type)
+ self.room_2 = Room.objects.create(name="Room 1.2", room_type=self.room_type)
+
+ self.customer = Customer.objects.create(
+ name="John Doe",
+ email="john@example.com",
+ phone="123456789"
+ )
+
+ self.booking = Booking.objects.create(
+ room=self.room_1,
+ customer=self.customer,
+ checkin=date(2022, 1, 10),
+ checkout=date(2022, 1, 12),
+ guests=1,
+ total=40,
+ code="ABC123",
+ state="NEW"
+ )
+
+ def test_booking_dates_are_updated_when_room_is_available(self):
+ response = self.client.post(
+ reverse("edit_booking_dates", kwargs={"pk": self.booking.id}),
+ {
+ "checkin": "2022-01-15",
+ "checkout": "2022-01-18",
+ }
+ )
+
+ self.assertEqual(response.status_code, 302)
+
+ self.booking.refresh_from_db()
+ self.assertEqual(self.booking.checkin, date(2022, 1, 15))
+ self.assertEqual(self.booking.checkout, date(2022, 1, 18))
+
+ def test_error_is_shown_when_dates_overlap_with_another_booking(self):
+ Booking.objects.create(
+ room=self.room_1,
+ customer=self.customer,
+ checkin=date(2022, 1, 14),
+ checkout=date(2022, 1, 16),
+ guests=1,
+ total=40,
+ code="XYZ789",
+ state="NEW"
+ )
+
+ response = self.client.post(
+ reverse("edit_booking_dates", kwargs={"pk": self.booking.id}),
+ {
+ "checkin": "2022-01-15",
+ "checkout": "2022-01-17",
+ }
+ )
+
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, "No hay disponibilidad para las fechas seleccionadas")
+
+ self.booking.refresh_from_db()
+ self.assertEqual(self.booking.checkin, date(2022, 1, 10))
+ self.assertEqual(self.booking.checkout, date(2022, 1, 12))
+
+ def test_error_is_shown_when_checkout_is_not_later_than_checkin(self):
+ response = self.client.post(
+ reverse("edit_booking_dates", kwargs={"pk": self.booking.id}),
+ {
+ "checkin": "2022-01-15",
+ "checkout": "2022-01-15",
+ }
+ )
+
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(
+ response,
+ "La fecha de salida debe ser posterior a la fecha de entrada."
+ )
+
+ self.booking.refresh_from_db()
+ self.assertEqual(self.booking.checkin, date(2022, 1, 10))
+ self.assertEqual(self.booking.checkout, date(2022, 1, 12))
\ No newline at end of file
diff --git a/pms/urls.py b/pms/urls.py
index c18714abf..a9e701dc0 100644
--- a/pms/urls.py
+++ b/pms/urls.py
@@ -8,6 +8,7 @@
path("search/booking/", views.BookingSearchView.as_view(), name="booking_search"),
path("booking//", views.BookingView.as_view(), name="booking"),
path("booking//edit", views.EditBookingView.as_view(), name="edit_booking"),
+ path("booking//edit-dates/", views.EditBookingDatesView.as_view(), name="edit_booking_dates"),
path("booking//delete", views.DeleteBookingView.as_view(), name="delete_booking"),
path("rooms/", views.RoomsView.as_view(), name="rooms"),
path("room//", views.RoomDetailsView.as_view(), name="room_details"),
diff --git a/pms/views.py b/pms/views.py
index f38563933..7e9cccdda 100644
--- a/pms/views.py
+++ b/pms/views.py
@@ -173,6 +173,45 @@ def post(self, request, pk):
customer_form.save()
return redirect("/")
+class EditBookingDatesView(View):
+ # renders the booking dates edition form
+ def get(self, request, pk):
+ booking = Booking.objects.get(id=pk)
+ form = BookingDatesForm(instance=booking)
+
+ context = {
+ "booking": booking,
+ "form": form,
+ }
+ return render(request, "edit_booking_dates.html", context)
+
+ # updates the booking dates after validating room availability
+ def post(self, request, pk):
+ booking = Booking.objects.get(id=pk)
+ form = BookingDatesForm(request.POST, instance=booking)
+
+ if form.is_valid():
+ checkin = form.cleaned_data["checkin"]
+ checkout = form.cleaned_data["checkout"]
+
+ conflicting_bookings = Booking.objects.filter(
+ room=booking.room,
+ checkin__lt=checkout,
+ checkout__gt=checkin,
+ state="NEW"
+ ).exclude(id=booking.id)
+
+ if conflicting_bookings.exists():
+ form.add_error(None, "No hay disponibilidad para las fechas seleccionadas")
+ else:
+ form.save()
+ return redirect("/")
+
+ context = {
+ "booking": booking,
+ "form": form,
+ }
+ return render(request, "edit_booking_dates.html", context)
class DashboardView(View):
def get(self, request):