public AvailabilitySearchResultDto CheckAvailability(long businessId, AvailabilitySearchCriteriaDto searchCriteria)
        {
            // Make sure the current user has access to this business
            CheckAccessRights(businessId);

            // Validate if business exists
            if (Cache.Business.TryGetValue(businessId) == null)
            {
                throw new ValidationException(ErrorFactory.CreateAndLogError(Errors.SRVEX30001, "PropertyManagementSystemService.CheckAvailability",
                    additionalDescriptionParameters: (new object[] { businessId })));
            }

            // Convert the criteria to a model object
            AvailabilitySearchCriteria criteria = DataTransferObjectsConverter.ConvertDtoToAvailabilitySearchCriteria(searchCriteria);

            // Get the results
            AvailabilitySearchResult result = availabilityManager.CheckAvailability(criteria);

            // Convert the result back to a DTO and return
            var dtoResults = DataTransferObjectsConverter.ConvertAvailabilitySearchResultToDto(result);

            return dtoResults;
        }
            public void CheckAvailabilityWithInvalidBusinessThrowsException()
            {
                // Arrange
                CalendarDate startDate = CalendarDate.ConvertToCalendarDate(DateTime.UtcNow);
                CalendarDate endDate = CalendarDate.ConvertToCalendarDate(DateTime.UtcNow).AddDays(1);

                // business that we know will never exist in the cache
                const long INVALID_BUSINESS = -100;

                var searchDto = new AvailabilitySearchCriteriaDto
                {
                    StartDate = DataTransferObjectsConverter.ConvertCalendarDateToDto(startDate),
                    EndDate = DataTransferObjectsConverter.ConvertCalendarDateToDto(endDate),
                    BusinessId = INVALID_BUSINESS,
                    RoomTypeId = 1,
                    NumberOfAdults = 1,
                    NumberOfChildren = 0
                };

                try
                {
                    // Act
                    PropertyManagementSystemService.CheckAvailability(INVALID_BUSINESS, searchDto);

                    // Assert
                    Assert.Fail("An exception SRVEX30001 of type ValidationException should have been thrown");
                }
                catch (ValidationException ex)
                {
                    // Assert
                    Assert.AreEqual("SRVEX30001", ex.Code,
                                    "The Validation exception is not returning the right error code");
                }
            }
            public void CheckAdditionalRatePlanAvailabilityByRoomTypeIsSuccessful()
            {
                // Arrange
                const int BUSINESS_ID = 1;
                var availabilityManager = MockRepository.GenerateStub<IAvailabilityManager>();
                CalendarDate startDate = CalendarDate.ConvertToCalendarDate(DateTime.UtcNow);
                CalendarDate endDate = CalendarDate.ConvertToCalendarDate(DateTime.UtcNow).AddDays(1);

                var searchDto = new AvailabilitySearchCriteriaDto
                {
                    StartDate = DataTransferObjectsConverter.ConvertCalendarDateToDto(startDate),
                    EndDate = DataTransferObjectsConverter.ConvertCalendarDateToDto(endDate),
                    BusinessId = BUSINESS_ID,
                    RoomTypeId = 1,
                    NumberOfAdults = 1,
                    NumberOfChildren = 0
                };

                var resultToReturn = new AvailabilitySearchResult
                {
                    StartDate = startDate,
                    EndDate = endDate,
                    NoOfAdults = 2,
                    NoOfChildren = null,
                    BusinessCandidates = new List<AvailabilityResultBusiness>
                    {
                        new AvailabilityResultBusiness
                        {
                            BusinessId = BUSINESS_ID
                        }
                    },
                };

                resultToReturn.BusinessCandidates[0].RoomTypes = new List<AvailabilityResultRoomType>
                {
                    new AvailabilityResultRoomType
                    {
                        BusinessId = BUSINESS_ID,
                        RoomTypeCode = "R1",
                        RoomTypeName = "Double Room",
                        RoomTypeId = 1
                    }
                };

                resultToReturn.BusinessCandidates[0].RoomTypes[0].RatesAndRoomsAvailable = new List<RoomsAvailability>
                {
                    new RoomsAvailability
                    {
                        RatePlanId = 1,
                        RoomTypeId = 1,
                        RoomList = new List<int> {1, 2}
                    }
                };

                // Stub the BusinessCache to be used by our service method
                CacheHelper.StubBusinessCacheSingleBusiness(BUSINESS_ID);

                // invalidate the cache so we make sure our business is loaded into the cache
                Cache.Business.Invalidate();

                availabilityManager.Stub(m => m.CheckAvailability(Arg<AvailabilitySearchCriteria>.Is.Anything)).Return(
                    resultToReturn);
                PropertyManagementSystemService.AvailabilityManager = availabilityManager;

                // Act
                AvailabilitySearchResultDto availabilitySearchResult =
                    PropertyManagementSystemService.CheckAvailability(BUSINESS_ID, searchDto);

                // Assert
                Assert.AreEqual(BUSINESS_ID, availabilitySearchResult.BusinessCandidates[0].BusinessId,
                                "Check the businessId has been correctly set");
                Assert.AreEqual(1, availabilitySearchResult.BusinessCandidates[0].RoomTypes.Count,
                                "Number Of RoomTypesRatesAndRoomsAvailable returned is incorrect.");
                Assert.AreEqual(1, availabilitySearchResult.BusinessCandidates[0].RoomTypes[0].RoomTypeId,
                                "RoomType Id retrieved is incorrect.");
                Assert.IsNotNull(availabilitySearchResult.BusinessCandidates[0].RoomTypes[0].RatesAndRoomsAvailable,
                                 "RatesAndRoomsAvailable are not retrieved for roomType.");

                RoomsAvailabilityDto additionalRateplan =
                    availabilitySearchResult.BusinessCandidates[0].RoomTypes[0].RatesAndRoomsAvailable[0];

                Assert.AreEqual(1, additionalRateplan.RatePlanId, "Rateplan id retrieved is incorrect.");
            }
 /// <summary>
 /// Convert the AvailabilitySearchCriteriaDto to AvailabilitySearchCriteria Model
 /// </summary>
 /// <param name="searchCriteria">The object to convert</param>
 /// <returns>AvailabilitySearchCriteria</returns>
 public static AvailabilitySearchCriteria ConvertDtoToAvailabilitySearchCriteria(AvailabilitySearchCriteriaDto searchCriteria)
 {
     return new AvailabilitySearchCriteria
                {
                    BusinessIds = new List<long> { searchCriteria.BusinessId },
                    StartDate = ConvertDtoToCalendarDate(searchCriteria.StartDate),
                    EndDate = ConvertDtoToCalendarDate(searchCriteria.EndDate),
                    NumberOfAdults = searchCriteria.NumberOfAdults,
                    NumberOfChildren = searchCriteria.NumberOfChildren,
                    RoomTypeId = searchCriteria.RoomTypeId,
                    RatePlanId = searchCriteria.RatePlanId,
                    ModifyBookingId = searchCriteria.ModifyBookingId,
                    ChannelId = searchCriteria.ChannelId,
                    BoardBasis = searchCriteria.BoardBasis != null ? new BoardBasis { Code = searchCriteria.BoardBasis.Code } : null,
                    CancellationClass = searchCriteria.CancellationClass != null ? new CancellationClass { Code = searchCriteria.CancellationClass.Code } : null,
                    RequestedCurrency = searchCriteria.RequestedCurrency
                };
 }