コード例 #1
0
        public async Task <IHttpActionResult> Post([FromBody] CreateReservationInfo model)
        {
            var route  = DB.Routes.Find(model.RouteId);
            var wallet = DB.Wallet.Find(model.WalletId);

            if (route == null || wallet == null)
            {
                return(NotFound());
            }

            if (Helpers.RouteHelpers.Categorize(route.DepartureTime, route.ArrivalTime) != Helpers.BusRouteState.Pending)
            {
                return(BadRequest("Reservation cannot be booked at this time!"));
            }

            //  Check seat has been booked already
            var seats = model.Seats.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

            if (seats.Length == 0)
            {
                return(BadRequest("No seats booked!"));
            }

            //  Check for already booked seats
            List <int> bookedSeats = new List <int>();

            foreach (var seatBooking in DB.Reservations.Where(x => !x.Cancelled && x.RouteId == model.RouteId).Select(x => x.Seats).ToArray())
            {
                bookedSeats.AddRange(seatBooking.Split(',').Select(x => int.Parse(x)).ToArray());
            }

            //
            var intersecting = seats.Select(x => int.Parse(x)).Intersect(bookedSeats);

            if (intersecting.Count() > 0)
            {
                return(BadRequest($"The seat(s) {string.Join(",", intersecting)} {(intersecting.Count() == 1 ? "has" : "have")} already been booked!"));
            }

            var user        = DB.Users.Find(UserId);
            var rCount      = DB.Reservations.Count().ToString();
            var reservation = new BookReservation()
            {
                RouteId        = model.RouteId,
                Route          = route,
                Seats          = model.Seats,
                ReferenceNo    = $"{Guid.NewGuid().ToString("N").Substring(0, 3)}{ (rCount.Length < 3 ? rCount.PadLeft(3, '0') : rCount.Substring(rCount.Length - 3))}",
                PickupLocation = model.PickupLocation,
                User           = user,
            };

            user.Reservations.Add(reservation);

            var finalCost      = route.Cost * seats.Length;
            var gatewayCharges = (await payment.CalculateCharges(finalCost, wallet, TransactionType.Charge));

            //  Charge for reservation here
            var txn = await payment.Charge(new ChargeOptions()
            {
                Amount          = finalCost + gatewayCharges,
                FeesOnCustomer  = true,
                AdditionalToken = model.AdditionalToken,
                Email           = user.Email,
                Name            = user.FullName,
                RefLocal        = $"BKS-{Guid.NewGuid().ToString("N").Substring(0, 12)}",

                //
                UnitSeatCost   = route.Cost,
                TotalSeats     = seats.Length,
                GatewayCharges = gatewayCharges
            }, wallet);

            //  Set reservation
            txn.Reservation = reservation;
            reservation.Transactions.Add(txn);

            DB.SaveChanges();

            //
            if (txn.Status == TransactionStatus.Successful)
            {
                await payNotification.OnPaymentSuccessul(reservation, txn);
            }
            else if (txn.Status == TransactionStatus.Failed)
            {
                await payNotification.OnPaymentFail(reservation, txn);
            }

            //
            return(ResponseMessage(Request.CreateResponse(HttpStatusCode.Created, Map <ReservationInfo>(reservation))));
        }
コード例 #2
0
 public static IEndpoint CreateReservation(CreateReservationInfo reservation) => new ApiEndpoint(BaseUri, HttpMethod.Post, reservation);