public void Post_ValidIntervalRatePlanData_Returns200Ok()
        {
            var reservation = new ReservationTransferObject
            {
                AmountOfAdults   = 1,
                AmountOfChildren = 0,
                RatePlanId       = -3,
                ReservationStart = new DateTime(2020, 08, 01),
                ReservationEnd   = new DateTime(2020, 08, 03),
                RoomId           = -2
            };

            var controllerBuilder = new ReservationControllerBuilder();

            var controllerMock = controllerBuilder.GetDefaultReservationService();

            controllerMock.Setup(r => r.MakeReservationIntervalPlan(It.IsAny <ReservationTransferObject>()))
            .Returns(ServiceResult <double> .SuccessResult(450));

            var controller = controllerBuilder.WithReservationService(controllerMock.Object).Build();

            var response = controller.PostInterval(reservation);

            Assert.IsType <OkObjectResult>(response);
        }
        public void MakeReservation_ValidateResultNightlyRatePlan_Success()
        {
            var reservation = new ReservationTransferObject
            {
                AmountOfAdults   = 1,
                AmountOfChildren = 0,
                RatePlanId       = -1,
                ReservationStart = new DateTime(2020, 07, 01),
                ReservationEnd   = new DateTime(2020, 07, 03),
                RoomId           = -1
            };

            var expectedValue = 1000;

            var controllerBuilder = new ReservationControllerBuilder();

            var Mock = controllerBuilder.GetDefaultReservationService();

            Mock.Setup(r => r.MakeReservationNighlyPlan(It.IsAny <ReservationTransferObject>()))
            .Returns(ServiceResult <double> .SuccessResult(expectedValue));

            var response = Mock.Object.MakeReservationNighlyPlan(reservation);

            Assert.Equal(response.ResponseCode, ResponseCode.Success);
            Assert.Equal(response.Result, expectedValue);
        }
        public ServiceResult <double> MakeReservationNighlyPlan(ReservationTransferObject ReservationTransferObject)
        {
            var ratePlan = nightlyRatePlanRepository.All()
                           .Include(r => r.Seasons)
                           .Include(r => r.RatePlanRooms)
                           .ThenInclude(r => r.Room)
                           .First(r => r.Id == ReservationTransferObject.RatePlanId);

            var canReserve = ratePlan.Seasons
                             .Any(s => ReservationTransferObject.ReservationStart >= s.StartDate && ReservationTransferObject.ReservationEnd <= s.EndDate);

            var room = ratePlan.RatePlanRooms
                       .First(r => r.RoomId == ReservationTransferObject.RoomId && r.RatePlanId == ReservationTransferObject.RatePlanId);

            var isRoomAvailable = room.Room.Amount > 0 &&
                                  ReservationTransferObject.AmountOfAdults <= room.Room.MaxAdults &&
                                  ReservationTransferObject.AmountOfChildren <= room.Room.MaxChildren;

            if (canReserve && isRoomAvailable)
            {
                room.Room.Amount -= 1;
                nightlyRatePlanRepository.SaveChanges();
                var days  = (ReservationTransferObject.ReservationEnd - ReservationTransferObject.ReservationStart).TotalDays;
                var Price = days * ratePlan.Price;
                return(ServiceResult <double> .SuccessResult(Price));
            }
            return(ServiceResult <double> .ErrorResult("No se puede Reservar"));
        }
        public IActionResult PostInterval([FromBody] ReservationTransferObject ReservationTransferObject)
        {
            var result = reservationService.MakeReservationIntervalPlan(ReservationTransferObject);

            if (result.ResponseCode == ResponseCode.Success)
            {
                return(Ok(result.Result));
            }
            return(BadRequest(result.Error));
        }