コード例 #1
0
        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));
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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));
        }
コード例 #4
0
 /// <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);
     }
 }
コード例 #5
0
        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);
        }
コード例 #6
0
 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);
 }
コード例 #7
0
 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);
 }
コード例 #8
0
        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));
        }
コード例 #9
0
 /// <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;
     }
 }