public ActionResult TicketDetail(int id) { var ticket = _db.Tickets.Find(id); var transaction = ticket.Trasaction; var actionTicket = new ActionTicket(); actionTicket.Transaction = transaction; List <Ticket> tickets = new List <Ticket> { }; tickets.Add(ticket); actionTicket.Tickets = tickets; return(View(actionTicket)); }
public ActionResult MakeReservation(int id, string orderSeat, string orderSeatReturn = null, int returnId = 0, int flightType = 1, int type = 1, string transactionIds = null, string Cancel = null) { var blockingNumber = Helper.RandomString(5); //add transaction string currentUserId = User.Identity.GetUserId(); Models.Transaction transaction = null; var flight = _db.Flights.Find(id); var seats = orderSeat.Split(','); List <Seat> seatList = new List <Seat> { }; List <Ticket> tickets = new List <Ticket> { }; double totalPrice = 0; for (int i = 0; i < seats.Length; i++) { string position = seats[i]; var seat = _db.Seats.Where(x => x.position == position & x.flightId == id).FirstOrDefault(); if (seat != null) { seatList.Add(seat); } } // check have transaction in request or not if (string.IsNullOrEmpty(transactionIds)) { transaction = _db.Transaction.Add(new Models.Transaction { status = (int)TransactionStatus.PENDING, createdAt = DateTime.Now, updatedAt = DateTime.Now, type = (int)TransactionType.PAYPAL }); // start loop Departure foreach (var item in seatList) { item.status = (int)SeatStatus.Reservation; double price = 0; switch (item.classType) { case 1: price += (flight.price * 90 / 100); break; case 2: price += (flight.price * 90 / 100); break; case 3: price += (flight.price * 90 / 100); break; case 4: price += (flight.price * 90 / 100); break; case 5: price += (flight.price * 90 / 100); break; default: break; } totalPrice += price; var ticket = _db.Tickets.Add(new Ticket { userId = currentUserId, seatId = item.id, transactionId = transaction.id, flightType = flightType, type = (int)TicketType.ADULT, status = (int)TicketStatus.DISABLE, blockingNumber = blockingNumber }); tickets.Add(ticket); flight.seatAvaiable = flight.seatAvaiable - 1; _db.SaveChanges(); } //// end loop seatList Departure if (flightType == 2) { var seatListReturn = new List <Seat> { }; for (int i = 0; i < seats.Length; i++) { var returnSeats = orderSeatReturn.Split(','); string returnPosition = returnSeats[i]; var seat = _db.Seats.Where(x => x.position == returnPosition & x.flightId == returnId).FirstOrDefault(); if (seat != null) { seatListReturn.Add(seat); } } var flightReturn = _db.Flights.Find(returnId); for (int i = 0; i < seatListReturn.Count; i++) { seatListReturn[i].status = (int)SeatStatus.Reservation; double price = 0; switch (seatListReturn[i].classType) { case 1: price += (flightReturn.price * 90 / 100); break; case 2: price += (flightReturn.price * 90 / 100); break; case 3: price += (flightReturn.price * 90 / 100); break; case 4: price += (flightReturn.price * 90 / 100); break; case 5: price += (flightReturn.price * 90 / 100); break; default: break; } totalPrice += price; var ticket = _db.Tickets.Add(new Ticket { userId = currentUserId, seatId = seatListReturn[i].id, transactionId = transaction.id, flightType = flightType, type = (int)TicketType.ADULT, status = (int)TicketStatus.DISABLE, blockingNumber = blockingNumber }); tickets.Add(ticket); flightReturn.seatAvaiable = flightReturn.seatAvaiable - 1; _db.SaveChanges(); } } transaction.price = totalPrice; _db.SaveChanges(); if (string.IsNullOrEmpty(transactionIds)) { transactionIds += (transaction.id).ToString(); } else { transactionIds += "," + (transaction.id).ToString(); } //add transaction } var actionTicket = new ActionTicket(); ApplicationDbContext context = new ApplicationDbContext(); var userManager = new UserManager <ApplicationUser>(new UserStore <ApplicationUser>(new ApplicationDbContext())); var currentUser = userManager.FindById(User.Identity.GetUserId()); var transactionIdList = transactionIds.Split(',').Select(Int32.Parse).ToList(); //sending Email actionTicket.Tickets = tickets; sendTicketMail(currentUser, transaction.Tickets, "blocking", blockingNumber, transaction.price.ToString()); actionTicket.Transaction = transaction; actionTicket.User = currentUser; //on successful payment, show success page to user. return(View("~/Views/Ticket/TicketDetail.cshtml", actionTicket)); }
public ActionResult PaymentWithPaypal(int id, string orderSeat, int oldTransaction = 0, string orderSeatReturn = null, int returnId = 0, int flightType = 1, int type = 1, string transactionIds = null, string Cancel = null) { try { //add transaction string currentUserId = User.Identity.GetUserId(); Models.Transaction transaction = null; var flight = _db.Flights.Find(id); var seats = orderSeat.Split(','); if (oldTransaction != 0) { var oldTransactionItem = _db.Transaction.Find(oldTransaction); oldTransactionItem.status = (int)TransactionStatus.CANCEL; _db.SaveChanges(); var userManager2 = new UserManager <ApplicationUser>(new UserStore <ApplicationUser>(new ApplicationDbContext())); var currentUser2 = userManager2.FindById(User.Identity.GetUserId()); var tickets = _db.Tickets.Where(x => x.transactionId == oldTransaction).ToList(); foreach (var ticket in tickets) { currentUser2.skyMiles = (int)Math.Round(currentUser2.skyMiles - ticket.Seat.Flight.distance); userManager2.Update(currentUser2); } foreach (var oldTicket in tickets) { oldTicket.status = (int)TicketStatus.DISABLE; oldTicket.Seat.status = (int)SeatStatus.Available; _db.SaveChanges(); } } List <Seat> seatList = new List <Seat> { }; double totalPrice = 0; for (int i = 0; i < seats.Length; i++) { string position = seats[i]; var seat = _db.Seats.Where(x => x.position == position & x.flightId == id).FirstOrDefault(); if (seat != null) { seatList.Add(seat); } } // check have transaction in request or not if (string.IsNullOrEmpty(transactionIds)) { transaction = _db.Transaction.Add(new Models.Transaction { status = (int)TransactionStatus.PENDING, createdAt = DateTime.Now, updatedAt = DateTime.Now, type = (int)TransactionType.PAYPAL }); // start loop Departure foreach (var item in seatList) { item.status = (int)SeatStatus.Block; double price = 0; switch (item.classType) { case 1: price += (flight.price * 90 / 100); break; case 2: price += (flight.price * 90 / 100); break; case 3: price += (flight.price * 90 / 100); break; case 4: price += (flight.price * 90 / 100); break; case 5: price += (flight.price * 90 / 100); break; default: break; } totalPrice += price; var ticket = _db.Tickets.Add(new Ticket { userId = currentUserId, seatId = item.id, transactionId = transaction.id, flightType = flightType, type = (int)TicketType.ADULT, status = (int)TicketStatus.DISABLE }); flight.seatAvaiable = flight.seatAvaiable - 1; _db.SaveChanges(); } //// end loop seatList Departure if (flightType == 2) { var seatListReturn = new List <Seat> { }; for (int i = 0; i < seats.Length; i++) { var returnSeats = orderSeatReturn.Split(','); string returnPosition = returnSeats[i]; var seat = _db.Seats.Where(x => x.position == returnPosition & x.flightId == returnId).FirstOrDefault(); if (seat != null) { seatListReturn.Add(seat); } } var flightReturn = _db.Flights.Find(returnId); for (int i = 0; i < seatListReturn.Count; i++) { seatListReturn[i].status = (int)SeatStatus.Block; double price = 0; switch (seatListReturn[i].classType) { case 1: price += (flightReturn.price * 90 / 100); break; case 2: price += (flightReturn.price * 90 / 100); break; case 3: price += (flightReturn.price * 90 / 100); break; case 4: price += (flightReturn.price * 90 / 100); break; case 5: price += (flightReturn.price * 90 / 100); break; default: break; } totalPrice += price; var ticket = _db.Tickets.Add(new Ticket { userId = currentUserId, seatId = seatListReturn[i].id, transactionId = transaction.id, flightType = flightType, type = (int)TicketType.ADULT, status = (int)TicketStatus.DISABLE }); flightReturn.seatAvaiable = flightReturn.seatAvaiable - 1; _db.SaveChanges(); } } transaction.price = totalPrice; _db.SaveChanges(); if (string.IsNullOrEmpty(transactionIds)) { transactionIds += (transaction.id).ToString(); } else { transactionIds += "," + (transaction.id).ToString(); } //add transaction } ApplicationDbContext context = new ApplicationDbContext(); var userManager = new UserManager <ApplicationUser>(new UserStore <ApplicationUser>(new ApplicationDbContext())); var currentUser = userManager.FindById(User.Identity.GetUserId()); ////getting the apiContext if (currentUser.balance < totalPrice) { APIContext apiContext = PaypalConfiguration.GetAPIContext(); try { //A resource representing a Payer that funds a payment Payment Method as paypal //Payer Id will be returned when payment proceeds or click to pay string payerId = Request.Params["PayerID"]; if (string.IsNullOrEmpty(payerId)) { //this section will be executed first because PayerID doesn't exist //it is returned by the create function call of the payment class // Creating a payment //here we are generating guid for storing the paymentID received in session //which will be used in the payment execution var guid = Convert.ToString((new Random()).Next(100000)); //CreatePayment function gives us the payment approval url //on which payer is redirected for paypal account payment // baseURL is the url on which paypal sendsback the data. string baseURI = Request.Url.Scheme + "://" + Request.Url.Authority + "/Flight/PaymentWithPayPal/" + id + "?orderSeat=" + orderSeat + "&flightType=" + flightType + "&type=" + type + "&transactionIds=" + transactionIds + "&"; var createdPayment = this.CreatePayment(apiContext, baseURI + "guid=" + guid, flight.planeCode, totalPrice, seatList.Count); //get links returned from paypal in response to Create function call var links = createdPayment.links.GetEnumerator(); string paypalRedirectUrl = null; while (links.MoveNext()) { Links lnk = links.Current; if (lnk.rel.ToLower().Trim().Equals("approval_url")) { //saving the payapalredirect URL to which user will be redirected for payment paypalRedirectUrl = lnk.href; } } // saving the paymentID in the key guid Session.Add(guid, createdPayment.id); var sessionPaymentId = Session[guid]; return(Redirect(paypalRedirectUrl)); } else { // This function exectues after receving all parameters for the payment var guid = Request.Params["guid"]; var executedPayment = ExecutePayment(apiContext, payerId, Session[guid] as string); //System.Diagnostics.Debug.WriteLine(ExecutePayment.state.ToLower()); //If executed payment failed then we will show payment failure message to user if (executedPayment.state.ToLower() != "approved") { return(null); //return View("FailureView"); } } } catch (PayPal.PaymentsException ex) { Console.WriteLine(ex.Message); } } else { currentUser.balance = currentUser.balance - totalPrice; userManager.Update(currentUser); } var actionTicket = new ActionTicket(); var transactionIdList = transactionIds.Split(',').Select(Int32.Parse).ToList(); var confirmNumber = Helper.RandomString(5); foreach (var item in transactionIdList) { List <Ticket> tickets = new List <Ticket> { }; var transactionItem = _db.Transaction.Find(item); var ticketLists = _db.Tickets.Where(x => x.transactionId == transactionItem.id).ToList(); if (ticketLists.Count != 0) { actionTicket.Transaction = transactionItem; transactionItem.status = (int)TransactionStatus.SUCCESS; transactionItem.updatedAt = DateTime.Now; foreach (var ticket in transactionItem.Tickets) { ticket.status = (int)TicketStatus.ACTIVE; ticket.confirmNumber = confirmNumber; ticket.Seat.status = (int)SeatStatus.Buyed; currentUser.skyMiles = (int)Math.Round(currentUser.skyMiles + ticket.Seat.Flight.distance); userManager.Update(currentUser); tickets.Add(ticket); } _db.SaveChanges(); sendTicketMail(currentUser, transactionItem.Tickets, "confirm", confirmNumber, transactionItem.price.ToString()); } actionTicket.Tickets = tickets; } //sending Email actionTicket.User = currentUser; //on successful payment, show success page to user. return(View("~/Views/Ticket/TicketDetail.cshtml", actionTicket)); } catch (Exception) { throw; } }