Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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;
            }
        }