public NewTicketSummery New(ITicketRequest ticketReq) { string newGuid = Guid.NewGuid().ToString("N").Substring(0, 5); ITicket ticket = ticketRepo.GetRestInfo(ticketReq.ProjectionId); ITicket newTicket = ticketRepo.Insert(new Ticket( ticketReq.ProjectionId, newGuid, ticket.ProjectionStartDate, ticket.MovieName, ticket.CinemaName, ticket.RoomNum, ticketReq.Row, ticketReq.Column)); //Creating the model for the Client ITicketSuccess ticketSuccess = new TicketModel( newGuid, ticket.ProjectionStartDate, ticket.MovieName, ticket.CinemaName, ticket.RoomNum, ticketReq.Row, ticketReq.Column ); return(new NewTicketSummery(true, ticketSuccess)); }
public NewTicketSummery New(ITicketRequest ticket) { if (ticket.Guid != null) { IReservation reservation = reservationRepo.GetReservationByGuid(ticket.Guid); if (reservation == null) { return(new NewTicketSummery(false, $"There is someting wrong with this reservation code: {ticket.Guid}")); } if (reservation.IsActive == false) { return(new NewTicketSummery(false, $"This reservation is canceled. It is either used or expired!")); } return(newTicket.New(new TicketWithReservationtModel( reservation.ProjectionId, reservation.Row, reservation.Column ))); } return(newTicket.New(ticket)); }
public NewTicketSummery New(ITicketRequest ticket) { if (ticket.Guid == null) { IEnumerable <ITicket> boughtSites = ticketRepo.BoughtSeats(ticket.ProjectionId); IEnumerable <IReservation> reservationsSits = reservationRepo.GetRowsColsById(ticket.ProjectionId); foreach (var sit in boughtSites) { if (ticket.Row == sit.Row && ticket.Column == sit.Column) { return(new NewTicketSummery(false, "This seat is already taken!")); } } foreach (var reserv in reservationsSits) { if (ticket.Row == reserv.Row && ticket.Column == reserv.Column) { return(new NewTicketSummery(false, "This seat is Reserved!")); } } } return(newTicket.New(ticket)); }
/// <summary> /// Apply all the rules on the ticket request /// </summary> /// <param name="ticketRequest"></param> public void ApplyRule(ITicketRequest ticketRequest) { // Validate all the rules foreach (var orderRule in _orderRules) { orderRule.Validate(Layout, ticketRequest); } }
public bool Validate(ITheatreLayout theatreLayout, ITicketRequest ticketRequest) { var totalSeatVacant = theatreLayout.Rows.Sum(row => row.TotalVacant); if (totalSeatVacant < ticketRequest.TicketCount) { throw new RuleValidationException(TheatreCannotHostParty); } return(true); }
public bool Validate(ITheatreLayout theatreLayout, ITicketRequest ticketRequest) { if (!theatreLayout.Rows.Any( row => row.Sections.Any( section => section.SeatVacant >= ticketRequest.TicketCount)) && theatreLayout.Rows.Sum(row => row.TotalVacant) > ticketRequest.TicketCount) { throw new RuleValidationException(PartyCannotSitInSingleRowFailure); } return(true); }
private (int row, RowSection section)? FindFirstMatchSection(ITicketRequest ticketRequest) { foreach (var row in Rows) { foreach (var section in row.Sections) { if (section.SeatVacant > ticketRequest.TicketCount) { return(row.RowId, section); } } } return(null); }
public NewTicketSummery New(ITicketRequest ticket) { IProjection projection = projectionRepo.GetById(ticket.ProjectionId); if (projection == null) { return(new NewTicketSummery(false, $"Projection with id {ticket.ProjectionId} does not exist")); } IMovie movie = movieRepo.GetById(projection.MovieId); var now = DateTime.UtcNow; var projectionEnd = projection.StartDate.AddMinutes(movie.DurationMinutes); if (projection.StartDate <= now || projectionEnd <= now) { return(new NewTicketSummery(false, $"Projection:{projection.Id} already started or finished!")); } return(newTicket.New(ticket)); }
/// <summary> /// FulFill the request. /// </summary> /// <param name="ticketRequest"></param> public void FulFillRequest(ITicketRequest ticketRequest) { try { // Try exact match section var matchSection = FindExactMatchSection(ticketRequest); if (!matchSection.HasValue) { // Try first fit section matchSection = FindFirstMatchSection(ticketRequest); } if (!matchSection.HasValue) { throw new FulFillOrderRequestException(FulFillOrderRequestFailure); } matchSection.Value.section.SeatVacant = matchSection.Value.section.SeatCount - ticketRequest.TicketCount; Console.WriteLine($"{ticketRequest.PartyName} Row {matchSection.Value.row} Section {matchSection.Value.section.SectionId}"); } catch (FulFillOrderRequestException) { throw; } }