public IView Book(int id, DateTime startDate, DateTime endDate, string comments) { this.Authorize(Roles.User, Roles.VenueAdmin); var room = this.Data.RepositoryWithRooms.Get(id); if (room == null) { return(NotFound(string.Format("The room with ID {0} does not exist.", id))); } if (endDate < startDate) { throw new ArgumentException("The date range is invalid."); } var availablePeriod = room.AvailableDates.FirstOrDefault(d => d.StartDate <= startDate || endDate <= d.EndDate); if (availablePeriod == null) { throw new ArgumentException(string.Format( "The room is not available to book in the period {0:dd.MM.yyyy} - {1:dd.MM.yyyy}.", startDate, endDate)); } decimal totalPrice = (endDate - startDate).Days * room.PricePerDay; var booking = BookingFactory.CreateBooking(CurrentUser, startDate, endDate, totalPrice, comments); room.Bookings.Add(booking); this.CurrentUser.Bookings.Add(booking); this.UpdateRoomAvailability(startDate, endDate, room, availablePeriod); return(GetView(booking)); }
public AdminController(IUserService <User> userService, IBookingService <Booking> bookingService, BookingFactory bookingFactory) { _userService = userService; _bookingService = bookingService; _bookingFactory = bookingFactory; }
public async Task <ActionResult> Handle(CreateBookingCommand request, CancellationToken cancellationToken) { if (request == null) { throw new ArgumentNullException(nameof(request)); } // gets the available car var availableCar = availableCarRepository.Get(request.AvailableCarId); if (availableCar == null) { var result = new ActionResult { Status = ActionResultCode.Failed, Message = $"Cannot find an available car with the {request.AvailableCarId} id", Errors = new List <string> { $"Cannot find an available car with the {request.AvailableCarId} id" } }; return(await Task.FromResult(result)); } // gets the user var user = userRepository.GetUser(request.UserId); if (user == null) { var result = new ActionResult { Status = ActionResultCode.Failed, Message = $"Cannot find an user with the {request.UserId} id", Errors = new List <string> { $"Cannot find an user with the {request.UserId} id" } }; return(await Task.FromResult(result)); } // creates the booking var booking = BookingFactory.CreateBooking(availableCar, user, request.From, request.To); // validates the booking var validationContext = new ValidationContext(booking); Validator.ValidateObject(booking, validationContext, validateAllProperties: true); bookingRepository.Add(booking); // saves changes await bookingRepository.UnitOfWork.SaveChangesAsync(); var res = new ActionResult { Status = ActionResultCode.Success }; return(await Task.FromResult(res)); }
public void Test_Create_GeneratesValidIds() { var repository = new Mock <IRepository <Booking> >(); SetupBooking(repository, 1, "WO-000001"); var factory = new BookingFactory(repository.Object); var actual = factory.Create(); Assert.AreEqual(2, actual.Id); Assert.AreEqual("WO-000002", actual.Number); }
public BookingServiceTests() { _service = new BookingService(); _factory = new BookingFactory(); }
public ActionResult MatchCleaners(SearchVM searchCriteria, String CleanerId = null) { Boolean searchByCriteria = true; if (!String.IsNullOrWhiteSpace(CleanerId)) { searchByCriteria = false; ModelState.Clear(); } // if specific id peovided ignore the criteria and find the cleaner if (searchByCriteria) { if (searchCriteria.WeeklyJob || searchCriteria.WeeklyJob) { searchCriteria.ServiceDate = DateTime.MinValue; } if (searchCriteria == null) { ModelState.AddModelError(string.Empty, $"No search criteria specified."); } if (searchCriteria.ServiceLengthMins > SystemSettings.WorkSessionMaxHours * 60) { ModelState.AddModelError(string.Empty, $"Service duration can not exceed { SystemSettings.WorkSessionMaxHours} hours."); } if ((searchCriteria.OneOffJob || searchCriteria.VacateClean) && ((searchCriteria.ServiceDate - DateTime.Now.ToUTC()).TotalDays > SystemSettings.BookingsDaysAllowed)) { ModelState.AddModelError(string.Empty, $"Services can't be booked more than {SystemSettings.BookingsDaysAllowed} days in advance."); } } if (ModelState.IsValid) { try { searchCriteria.HasCriteria = true; searchCriteria.StoreSearchCookieCiteria("cleanerMatch"); StringBuilder sql = new StringBuilder(@"select * from Cleaners C inner join Addresses Ph on C.PhysicalAddressRefId = Ph.ID where C.IsActive=1" ); if (searchByCriteria) { if (searchCriteria.RequireIroning) { sql.Append($" and Ironing = {searchCriteria.RequireIroning}"); } if (searchCriteria.FilterRating > 0) { sql.Append($" and C.Rating >= {searchCriteria.FilterRating}"); } if (searchCriteria.OneOffJob || searchCriteria.VacateClean) { // not on leave sql.Append($" and C.ID not in (select distinct PrimaryCleanerRefId from CleanerLeave where '{searchCriteria.ServiceDate.ToUTC().FormatDatabaseDate()}' between DATE(StartDate) and DATE(EndDate))"); } else { } // and rostered for weekday sql.Append($" and C.ID in (select distinct PrimaryCleanerRefId from CleanerRoster where Upper(WeekDay) = Upper('{searchCriteria.ServiceDay}'))"); } else { sql.Append($" and C.ID = '{CleanerId}'"); } sql.Append(" order by LastName, FirstName"); List <CleanerMatchResultVM> _vmResults; using (DBManager db = new DBManager()) { var _orderedResults = db.getConnection().Query <Cleaner, Address, Cleaner>(sql.ToString(), (cl, phys) => { cl.PhysicalAddress = phys; return(cl); }).ToList(); _vmResults = Mapper.Map <List <Cleaner>, List <CleanerMatchResultVM> >(_orderedResults); } foreach (CleanerMatchResultVM _item in _vmResults) { _item.PrimaryZoneList = new List <string>(new string[] { _item.PrimaryZone }); _item.SelectedRosterDay = searchCriteria.ServiceDay.ToDayOfWeek(); _item.SelectedServiceDate = (searchCriteria.WeeklyJob || searchCriteria.FortnightlyJob) ? DateTimeWrapper.FindNextDateForDay(_item.SelectedRosterDay) : searchCriteria.ServiceDate; if (!String.IsNullOrWhiteSpace(_item.SecondaryZone)) { _item.SecondaryZoneList = _item.SecondaryZone.Split(new char[] { ',', ';' }) .Distinct() .ToList(); } else { _item.SecondaryZoneList = new List <string>(); } if (!String.IsNullOrWhiteSpace(_item.ApprovedZone)) { _item.ApprovedZoneList = _item.ApprovedZone.Split(new char[] { ',', ';' }) .Distinct() .ToList(); } else { _item.ApprovedZoneList = new List <string>(); } } if (searchByCriteria) { BookingFactory resultsProcessor = new BookingFactory(_vmResults, searchCriteria); if (!resultsProcessor.ValidSearchZone) { ModelState.AddModelError(string.Empty, $"The suburb '{searchCriteria.Suburb.ToUpper()}' does not have any zones defined yet."); } else { var results = resultsProcessor.GetProcessedResults().ToList <CleanerMatchResultVM>().Where(x => x != null); return(new JsonNetResult() { Data = new { SearchResults = results }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }); } } else { var results = _vmResults[0]; return(new JsonNetResult() { Data = new { SearchResults = results }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }); } } catch (Exception ex) { ModelState.AddModelError(string.Empty, $"Error performing search ({ex.Message})"); LogHelper log = new LogHelper(); log.Log(LogHelper.LogLevels.Error, "Error performing search", nameof(SearchController), ex, null); } } if (!ModelState.IsValid) { Helpers.LogFormValidationErrors(ModelState, nameof(SearchController), null); } return(JsonFormResponse()); }
public BookingController(IBookingService <Booking> bookingService, BookingFactory bookingFactory) { _bookingService = bookingService; _bookingFactory = bookingFactory; }
public BookingService(IRepository <Booking> bookingRepository, IEmailClient emailClient, BookingFactory bookingFactory) { _bookingRepository = bookingRepository; _emailClient = emailClient; _bookingFactory = bookingFactory; }