public async Task <IActionResult> PutTicketPurchaseSeat(int id, TicketPurchaseSeat ticketPurchaseSeat) { if (id != ticketPurchaseSeat.EventSeatId) { return(BadRequest()); } _context.Entry(ticketPurchaseSeat).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!TicketPurchaseSeatExists(id)) { return(NotFound()); } else { throw; } } return(NoContent()); }
// returns a tuple where Item1 corresponds to the success of the attempt, and Item2 is the associated status message public async Task <Tuple <bool, object> > TryAddPurchase(IEnumerable <int> eventSeatIds, string paymentMethod) { // check that event seats with the given ids exist and are available for purchase var purchaseSeats = new List <EventSeat>(); foreach (int id in eventSeatIds) { var target = _context.EventSeat.SingleOrDefault(es => es.EventSeatId == id); if (target == null) { return(new Tuple <bool, object>(false, $"An event seat with event_seat_id {id} does not exist")); } bool isPurchased = _context.TicketPurchaseSeat.ToList().Any(tps => tps.EventSeatId == id); if (isPurchased) { return(new Tuple <bool, object>(false, $"The event seat with event_seat_id {id} has already been purchased")); } purchaseSeats.Add(target); } // make the purchase var purchase = new TicketPurchase { PaymentMethod = paymentMethod, ConfirmationCode = _rand.Next(100000, 999999).ToString() }; var ticketPurchases = new List <TicketPurchaseSeat>(); decimal totalPurchaseCost = 0; foreach (EventSeat es in purchaseSeats) { decimal seatPrice = (decimal)_context.Seat.SingleOrDefault(s => s.SeatId == es.SeatId).Price; var seatPurchase = new TicketPurchaseSeat { EventSeat = es, Purchase = purchase, SeatSubtotal = es.EventSeatPrice + seatPrice }; ticketPurchases.Add(seatPurchase); totalPurchaseCost += (decimal)seatPurchase.SeatSubtotal; } purchase.PaymentAmount = totalPurchaseCost; _context.TicketPurchase.Add(purchase); await _context.SaveChangesAsync(); foreach (TicketPurchaseSeat ticket in ticketPurchases) { _context.TicketPurchaseSeat.Add(ticket); } await _context.SaveChangesAsync(); return(new Tuple <bool, object>(true, purchase)); }
public static void Initialize(ssdticketsContext context) { context.Database.EnsureCreated(); if (context.Venue.Any()) { // DB has already been seeded return; } // Initialization constants const string VENUE_NAME = "BCIT Stadium"; const int NUM_SECTIONS = 10; const int ROWS_PER_SECTION = 10; const int SEATS_PER_ROW = 10; const int CAPACITY = NUM_SECTIONS * ROWS_PER_SECTION * SEATS_PER_ROW; const decimal VENUE_SEAT_PRICE = 12.50m; // Venue Venue bcit = new Venue { Capacity = CAPACITY, VenueName = VENUE_NAME }; context.Venue.Add(bcit); context.SaveChanges(); // Sections List <Section> sections = new List <Section>(); for (int i = 0; i < NUM_SECTIONS; i++) { var section = new Section { VenueName = bcit.VenueName, SectionName = $"Section {i + 1}" }; sections.Add(section); context.Section.Add(section); } context.SaveChanges(); // Rows List <Row> rows = new List <Row>(); foreach (Section s in sections) { for (int i = 0; i < ROWS_PER_SECTION; i++) { var row = new Row { Section = s, RowName = $"Row {i + 1}" }; rows.Add(row); context.Row.Add(row); } context.SaveChanges(); } // Seats List <Seat> seats = new List <Seat>(); foreach (Row r in rows) { for (int i = 0; i < SEATS_PER_ROW; i++) { var seat = new Seat { Row = r, Price = VENUE_SEAT_PRICE }; seats.Add(seat); context.Seat.Add(seat); } context.SaveChanges(); } // Events var events = new Event[] { new Event { EventName = "Conference", VenueName = VENUE_NAME }, new Event { EventName = "Barbecue", VenueName = VENUE_NAME }, new Event { EventName = "Hackathon", VenueName = VENUE_NAME }, new Event { EventName = "Convention", VenueName = VENUE_NAME }, new Event { EventName = "Soccer Championships", VenueName = VENUE_NAME } }; foreach (Event e in events) { context.Event.Add(e); } context.SaveChanges(); // Event Seats // Prices for events are 10.50, plus an extra $5 for each row closer to the front // (eg. if there are 10 rows, the 10th row will have no extra cost, and the 1st row will be an extra $45) foreach (Event e in events) { decimal eventPrice = 10.50m; foreach (Seat venueSeat in seats) { var eventSeat = new EventSeat { Seat = venueSeat, Event = e, EventSeatPrice = eventPrice + (5 * (ROWS_PER_SECTION - getRowNumber(venueSeat.Row))) }; context.EventSeat.Add(eventSeat); } context.SaveChanges(); } // Ticket Purchases // Each event has the first row of section 1 sold out // Each event also has seats 1 and 2 sold in the second row of section 1 foreach (Event e in events) { // Purchase first row in a single transaction IEnumerable <EventSeat> firstRow = e.EventSeat.Where(es => getRowNumber(es.Seat.Row) == 1 && es.Seat.Row.SectionId == 1); var firstRowPurchase = new TicketPurchase { PaymentMethod = "Credit Card", ConfirmationCode = "123456" }; decimal totalPurchaseCost = 0; var tickets = new List <TicketPurchaseSeat>(); foreach (EventSeat es in firstRow) { var seatPurchase = new TicketPurchaseSeat { EventSeat = es, Purchase = firstRowPurchase, SeatSubtotal = es.EventSeatPrice + es.Seat.Price }; tickets.Add(seatPurchase); totalPurchaseCost += (decimal)seatPurchase.SeatSubtotal; } firstRowPurchase.PaymentAmount = totalPurchaseCost; context.TicketPurchase.Add(firstRowPurchase); context.SaveChanges(); foreach (TicketPurchaseSeat ticket in tickets) { context.TicketPurchaseSeat.Add(ticket); } context.SaveChanges(); // Purchase seats 1 and 2 of second row IEnumerable <EventSeat> secondRowSeats = e.EventSeat.Where( es => getRowNumber(es.Seat.Row) == 2 && es.Seat.Row.SectionId == 1 && (es.SeatId % SEATS_PER_ROW == 1 || es.SeatId % SEATS_PER_ROW == 2)); var secondRowPurchase = new TicketPurchase { PaymentMethod = "Debit", ConfirmationCode = "789123" }; totalPurchaseCost = 0; tickets = new List <TicketPurchaseSeat>(); foreach (EventSeat es in secondRowSeats) { var seatPurchase = new TicketPurchaseSeat { EventSeat = es, Purchase = secondRowPurchase, SeatSubtotal = es.EventSeatPrice + es.Seat.Price }; tickets.Add(seatPurchase); totalPurchaseCost += (decimal)seatPurchase.SeatSubtotal; } secondRowPurchase.PaymentAmount = totalPurchaseCost; context.TicketPurchase.Add(secondRowPurchase); context.SaveChanges(); foreach (TicketPurchaseSeat ticket in tickets) { context.TicketPurchaseSeat.Add(ticket); } context.SaveChanges(); } }
public async Task <ActionResult <TicketPurchaseSeat> > PostTicketPurchaseSeat(TicketPurchaseSeat ticketPurchaseSeat) { _context.TicketPurchaseSeat.Add(ticketPurchaseSeat); try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { if (TicketPurchaseSeatExists(ticketPurchaseSeat.EventSeatId)) { return(Conflict()); } else { throw; } } return(CreatedAtAction("GetTicketPurchaseSeat", new { id = ticketPurchaseSeat.EventSeatId }, ticketPurchaseSeat)); }
public async Task <ActionResult <TicketPurchaseSeat> > PostTicketPurchaseSeat(TicketPurchaseSeat ticketPurchaseSeat) { _context.TicketPurchaseSeats.Add(ticketPurchaseSeat); await _context.SaveChangesAsync(); return(CreatedAtAction("GetTicketPurchaseSeat", new { id = ticketPurchaseSeat.Id }, ticketPurchaseSeat)); }