Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
 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));
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
 public BookingServiceTests()
 {
     _service = new BookingService();
     _factory = new BookingFactory();
 }
Ejemplo n.º 6
0
        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());
        }
Ejemplo n.º 7
0
 public BookingController(IBookingService <Booking> bookingService, BookingFactory bookingFactory)
 {
     _bookingService = bookingService;
     _bookingFactory = bookingFactory;
 }
Ejemplo n.º 8
0
 public BookingService(IRepository <Booking> bookingRepository, IEmailClient emailClient, BookingFactory bookingFactory)
 {
     _bookingRepository = bookingRepository;
     _emailClient       = emailClient;
     _bookingFactory    = bookingFactory;
 }