public List <Seat> GetAvailableSeats(SeatsRequested seatsRequested) { if (ExceedCapacity(seatsRequested)) { return(new List <Seat>()); } return(GetReserveSeats(seatsRequested).ToList()); }
public ReservationAttempt BuildReservationAttempt(SeatsRequested seatsRequested) { foreach (var coach in Coaches.Values) { var reservationAttenpt = new ReservationAttempt(TrainId, seatsRequested, coach.GetAvailableSeats(seatsRequested)); if (reservationAttenpt.IsFulFilled()) { return(reservationAttenpt); } } return(new ReservationAttempt(TrainId, seatsRequested, GetReservableSeats().Take(seatsRequested.Value).ToList())); }
public async Task <Reservation> ReserveAsync(TrainId trainId, SeatsRequested seatsRequested) { // get the train var train = await _trainDataService.GetTrain(trainId); if (train.MustNotExceedTrainCapacity(seatsRequested)) { var reservationAttenpt = train.BuildReservationAttempt(seatsRequested); if (reservationAttenpt.IsFulFilled()) { var bookingRef = await _bookingReference.GetBookingReference(); reservationAttenpt.AssignBookingReference(bookingRef); await _trainDataService.ReserveAsync(reservationAttenpt); return(reservationAttenpt.Confirm()); } } return(new ReservationFailure(train.TrainId)); }
public ReservationAttempt(TrainId trainId, SeatsRequested seatsRequested, List <Seat> seats) { TrainId = trainId; SeatsRequested = seatsRequested; Seats = seats; }
private bool ExceedCapacity(SeatsRequested seatsRequested) { var numberOfReservedSeats = Seats.Count(x => !x.IsSeatNotReserved()); return(seatsRequested.Value + numberOfReservedSeats > Seats.Count() * 0.7); }
private IEnumerable <Seat> GetReserveSeats(SeatsRequested seatsRequested) { return(Seats.Where(x => x.IsSeatNotReserved()).Take(seatsRequested.Value)); }
public bool MustNotExceedTrainCapacity(SeatsRequested seatsRequested) { return(ReservedSeats + seatsRequested.Value <= Math.Floor(ThreasholdManager.GetMaxRes() * GetMaxSeat())); }