Пример #1
0
        public ActionResult AddPetReservation(ReservationGroup reservationGroup, Guid skuCategoryId, Guid?addPetId)
        {
            // Step 1. Sync ReservationGroupId
            reservationGroup.PetReservationList.ForEach(x => x.ReservationGroupId = reservationGroup.Id);

            // Step 2. Get First
            PetReservation petReservation = reservationGroup.PetReservationList.FirstOrDefault();

            if (petReservation == null)
            {
                throw new InvalidOperationException("Pet Reservation Required");
            }

            // Step 3. Add Pet
            if (addPetId != null)
            {
                reservationGroup.PetReservationList.Add(new PetReservation()
                {
                    SkuCategoryId = skuCategoryId, PetId = addPetId.Value
                });
            }

            // Step 4. Add viewData
            this.ViewData["__Pet"] = new Paw.Services.Messages.Web.Pets.GetPet()
            {
                Id = petReservation.PetId, ProviderGroupId = (Guid)this.ViewData["__ProviderGroupId"]
            }.ExecuteItem();

            return(View(reservationGroup));
        }
Пример #2
0
        public void CanInsertFacilityDownTime()
        {
            int resourceId = 80010; //Zygo NewView 5000
            int rid        = 0;
            int fdtid      = 0;

            using (ContextManager.StartRequest(1600))
            {
                // Create a reservation that starts at 10 am tomorrow.

                var data = new ReservationData()
                {
                    ClientID            = 1600,
                    ResourceID          = resourceId,
                    ActivityID          = 6,
                    AccountID           = 67,
                    Notes               = "Test Reservation",
                    AutoEnd             = true,
                    KeepAlive           = true,
                    ReservationDuration = new ReservationDuration(DateTime.Now.Date.AddDays(1).AddHours(10), TimeSpan.FromMinutes(5))
                };

                var rsv = ReservationUtility.Create(data);
                rid = rsv.ReservationID;
            }

            using (ContextManager.StartRequest(155))
            {
                int clientId = HttpContext.Current.CurrentUser().ClientID;

                DateTime sd = DateTime.Now.Date.AddDays(1).AddHours(9);
                DateTime ed = sd.AddHours(4);

                ReservationGroup group = FacilityDownTimeUtility.CreateFacilityDownTimeGroup(clientId, sd, ed);

                var result = FacilityDownTimeUtility.InsertFacilityDownTime(
                    resourceId: 80010,
                    groupId: group.GroupID,
                    clientId: clientId,
                    beginDateTime: sd,
                    endDateTime: ed,
                    notes: "EECS building fire drill"
                    );

                Assert.AreEqual(1, result.Existing.Count());
                Assert.AreEqual(rid, result.Existing.ElementAt(0).ReservationID);

                fdtid = result.ReservationID;

                var rsv = DA.Current.Single <Reservation>(fdtid);
                Assert.IsTrue(rsv.Activity.IsFacilityDownTime);
            }

            using (ContextManager.StartRequest(1301))
            {
                // clean up
                PurgeReservations(new[] { rid, fdtid });
            }
        }
Пример #3
0
        public static OutgoingMinimalReservationGroup Parse(ReservationGroup x)
        {
            if (x == null)
            {
                return(null);
            }

            return(new OutgoingMinimalReservationGroup
            {
                Id = x.Id,
                UserId = x.UserId,
                HotelId = x.HotelId
            });
        }
Пример #4
0
        public ActionResult AddPetReservation(Guid skuCategoryId, Guid petId)
        {
            ReservationGroup reservationGroup = new ReservationGroup();

            reservationGroup.PetReservationList.Add(new PetReservation()
            {
                SkuCategoryId = skuCategoryId, PetId = petId
            });

            this.ViewData["__Pet"] = new Paw.Services.Messages.Web.Pets.GetPet()
            {
                Id = petId, ProviderGroupId = (Guid)this.ViewData["__ProviderGroupId"]
            }.ExecuteItem();

            return(View(reservationGroup));
        }
Пример #5
0
        public static OutgoingReservationGroup Parse(ReservationGroup x)
        {
            if (x == null)
            {
                return(null);
            }

            return(new OutgoingReservationGroup
            {
                Id = x.Id,
                Status = OutgoingReservationGroupStatus.Parse(x.ReservationGroupStatus),
                UserId = x.UserId,
                HotelId = x.HotelId,
                StatusDate = x.StatusDate,
                StatusGuid = x.StatusGuid,
                ReserveItems = x.ReserveItems?.Select(y => OutgoingReservationItem.Parse(y))?.ToList()
            });
        }
Пример #6
0
        public static OutgoingMinimalReservationGroupExtra Parse(ReservationGroup x)
        {
            if (x == null)
            {
                return(null);
            }

            return(new OutgoingMinimalReservationGroupExtra
            {
                Id = x.Id,
                UserId = x.UserId,
                HotelId = x.HotelId,
                HotelName = x.Hotels.Name,
                StartDate = x.ReserveItems?.Where(y => y.IsDeleted == false)?.OrderByDescending(y => y.DateReservedFor)?.FirstOrDefault()?.DateReservedFor,
                EndDate = x.ReserveItems?.Where(y => y.IsDeleted == false)?.OrderBy(y => y.DateReservedFor)?.FirstOrDefault()?.DateReservedFor,
                NumberOfItems = x.ReserveItems?.Where(y => y.IsDeleted == false)?.Count() ?? 0,
                Status = OutgoingReservationGroupStatus.Parse(x.ReservationGroupStatus),
                UsersName = x?.AspNetUsers?.FirstName + " " + x?.AspNetUsers?.LastName,
                UsersEmail = x?.AspNetUsers?.Email
            });
        }
Пример #7
0
        public BeginTransactionGroupSummary BeginReservation(string currentUserId, BeginReservation reservationDetails)
        {
            var currentSummary = new BeginTransactionGroupSummary
            {
                OriginalObject = reservationDetails
            };

            if ((reservationDetails?.Items?.Count() ?? 0) < 1)
            {
                currentSummary.Status.FailedCode = BeginTransactionGroupFailedCodes.NO_ITEMS_IN_RESERVATION;

                throw new BeginTransactionException {
                          Summary = currentSummary
                };
            }



            using (var dbTransaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    var currentUser = this.unitOfWork.Users.GetUserById(reservationDetails.UserId, reservationDetails.UserId);

                    if (currentUser == null)
                    {
                        currentSummary.Status.FailedCode = BeginTransactionGroupFailedCodes.USER_NOT_FOUND;
                        throw new BeginTransactionException {
                                  Summary = currentSummary
                        };
                    }

                    var currentHotel = this.unitOfWork.Hotels.GetHotelById(currentUser.Id, reservationDetails.HotelId);

                    if (currentHotel == null)
                    {
                        currentSummary.Status.FailedCode = BeginTransactionGroupFailedCodes.HOTEL_NOT_FOUND;
                        throw new BeginTransactionException {
                                  Summary = currentSummary
                        };
                    }

                    if (currentUser.Id == currentUserId)
                    {
                        var auth = this.CanUserAddReservation(currentUser.Id, currentHotel.Id);

                        if (auth == false)
                        {
                            currentSummary.Status.FailedCode = BeginTransactionGroupFailedCodes.NOT_AUTHORIZED;
                            throw new BeginTransactionException {
                                      Summary = currentSummary
                            };
                        }
                    }
                    else
                    {
                        var auth = this.CanUserAddOtherReservations(currentUserId, currentHotel.Id);

                        if (auth == false)
                        {
                            currentSummary.Status.FailedCode = BeginTransactionGroupFailedCodes.NOT_AUTHORIZED;
                            throw new BeginTransactionException {
                                      Summary = currentSummary
                            };
                        }
                    }



                    var currentTaxRate = currentHotel.TaxRate;

                    var theNewReservationGroup = new ReservationGroup();

                    theNewReservationGroup.HotelId = reservationDetails.HotelId;
                    theNewReservationGroup.UserId  = reservationDetails.UserId;

                    theNewReservationGroup.StatusId   = Convert.ToInt32(ReservationGroupStatusEnum.PENDING);
                    theNewReservationGroup.StatusDate = DateTime.UtcNow;
                    theNewReservationGroup.StatusGuid = null;

                    theNewReservationGroup.DateCreated = DateTime.UtcNow;


                    this.dbContext.ReservationGroup.Add(theNewReservationGroup);
                    currentSummary.Status.Valid = true;
                    try
                    {
                        this.dbContext.SaveChanges();
                    }
                    catch (Exception)
                    {
                        currentSummary.Status.FailedCode = BeginTransactionGroupFailedCodes.UNKNOWN_INVALID_GROUP;
                        throw new BeginTransactionException {
                                  Summary = currentSummary
                        };
                    }



                    currentSummary.ReservationGroupId = theNewReservationGroup.Id;
                    currentSummary.Status.Completed   = true;

                    decimal FinalOverallPrice = 0.0M;

                    foreach (var item in reservationDetails.Items)
                    {
                        var currentItemSummary = new BeginTransactionItemSummary {
                            OriginalObject = item
                        };
                        currentSummary.ItemSummaries.Add(currentItemSummary);

                        if (item == null)
                        {
                            currentItemSummary.Status.FailedCode = BeginTransactionItemFailedCodes.NULL_ITEM;
                            throw new BeginTransactionException {
                                      Summary = currentSummary
                            };
                        }

                        if (item.Date == null)
                        {
                            currentItemSummary.Status.FailedCode = BeginTransactionItemFailedCodes.NULL_DAY;
                            throw new BeginTransactionException {
                                      Summary = currentSummary
                            };
                        }

                        if (item.Date.Date.ToUniversalTime().Equals(DateTime.UtcNow.Date))
                        {
                            currentItemSummary.Status.FailedCode = BeginTransactionItemFailedCodes.INVALID_SAME_DAY;
                            throw new BeginTransactionException {
                                      Summary = currentSummary
                            };
                        }

                        var itemToReserve = this.unitOfWork.VenueItems.GetVenueItemById(currentUser.Id, item.ItemId);

                        if (itemToReserve == null)
                        {
                            currentItemSummary.Status.FailedCode = BeginTransactionItemFailedCodes.ITEM_NOT_FOUND;
                            throw new BeginTransactionException {
                                      Summary = currentSummary
                            };
                        }

                        if (item.Quantity <= 0)
                        {
                            currentItemSummary.Status.FailedCode = BeginTransactionItemFailedCodes.QUANTITY_TOO_SMALL;
                            throw new BeginTransactionException {
                                      Summary = currentSummary
                            };
                        }

                        var newItem = new ReserveItems();

                        newItem.ItemId          = item.ItemId;
                        newItem.Quantity        = item.Quantity;
                        newItem.PricePreTax     = itemToReserve.Price;
                        newItem.TaxRate         = (decimal)currentTaxRate;
                        newItem.DateReservedFor = item.Date;
                        newItem.FinalPrice      = (newItem.PricePreTax + (1.0M * newItem.TaxRate)) * item.Quantity;

                        theNewReservationGroup.ReserveItems.Add(newItem);

                        currentItemSummary.Status.Valid = true;

                        try
                        {
                            this.dbContext.SaveChanges();
                        }
                        catch (Exception)
                        {
                            currentItemSummary.Status.FailedCode = BeginTransactionItemFailedCodes.UNKNOWN_ITEM_EXCEPTION;
                            throw new BeginTransactionException {
                                      Summary = currentSummary
                            };
                        }

                        currentItemSummary.ReservationItemId = newItem.Id;
                        currentItemSummary.Status.Completed  = true;
                        currentItemSummary.FinalPrice        = newItem.FinalPrice;

                        FinalOverallPrice += newItem.FinalPrice;
                    }

                    dbTransaction.Commit();

                    FinalOverallPrice = Math.Round(FinalOverallPrice * 100.0M) / 100.0M; //Must update controller if changed. Rounds to the nearest penny.

                    currentSummary.FinalPrice = FinalOverallPrice;
                    return(currentSummary);
                }
                catch (Exception)
                {
                    dbTransaction.Rollback();

                    if (currentSummary != null)
                    {
                        currentSummary.ReservationGroupId = null;
                    }

                    throw new BeginTransactionException {
                              Summary = currentSummary
                    };
                }
            }
        }
Пример #8
0
 public ActionResult UpdatePetReservation(ReservationGroup reservationGroup)
 {
     throw new NotImplementedException();
 }
Пример #9
0
        private async Task InitPlane()
        {
            var airPortFrom = new Airport
            {
                Name    = "Brussels Airport",
                Code    = "BRS",
                Country = "BElGIUM"
            };
            var airPortTo = new Airport
            {
                Name    = "John F Kennedy (JFK). ",
                Code    = "JFK",
                Country = "AMERICA"
            };
            var plane = new Plane(new FlightInfo(airPortFrom, airPortTo, DateTime.Now, DateTime.Now.AddHours(8)),
                                  new Catalog())
            {
                TailNumber = "LMAO42069",
                Type       = "AIRBUS A380"
            };

            for (var i = 1; i < 20; i++)
            {
                if (i < 4)
                {
                    plane.AddSeat("A", i, FlightClass.Business);
                    plane.AddSeat("B", i, FlightClass.Business);
                    plane.AddSeat("C", i, FlightClass.Business);
                    plane.AddSeat("D", i, FlightClass.Business);
                    plane.AddSeat("E", i, FlightClass.Business);
                    plane.AddSeat("F", i, FlightClass.Business);
                }
                else
                {
                    plane.AddSeat("A", i, FlightClass.Economy);
                    plane.AddSeat("B", i, FlightClass.Economy);
                    plane.AddSeat("C", i, FlightClass.Economy);
                    plane.AddSeat("D", i, FlightClass.Economy);
                    plane.AddSeat("E", i, FlightClass.Economy);
                    plane.AddSeat("F", i, FlightClass.Economy);
                }
            }
            _context.Plane.Add(plane);
            _context.SaveChanges();

            plane = _context.Plane.Include(p => p.Seats).FirstOrDefault();


            for (var i = 1; i < 20; i++)
            {
                var list = new List <string>()
                {
                    "A",
                    "B",
                    "C",
                    "D",
                    "E",
                    "F",
                };

                foreach (var c in list)
                {
                    var passenger = new Passenger()
                    {
                        ReservationCode = "resvcode" + i + c,
                        UserName        = "******" + i + c
                    };
                    plane.AssingPassengerToSeat(passenger, c, i);
                    var a = await _userManager.CreateAsync(passenger, "Test123!");

                    if (a != IdentityResult.Success)
                    {
                        continue;
                    }
                }
            }

            for (var i = 0; i < 4; i++)
            {
                var crewMem = new CabinCrew()
                {
                    UserName = "******" + i,
                };
                var a = await _userManager.CreateAsync(crewMem, "Test123!");

                if (a != IdentityResult.Success)
                {
                    continue;
                }
                var crewManInit = await _userManager.FindByNameAsync("CrewMem" + i);

                plane.PutCrewManToWork(crewManInit as CabinCrew);
            }


            plane.Catalog       = new Catalog();
            plane.Catalog.Items = new List <CatalogItem>();
            plane.Catalog.Items.AddRange((InitMovies.GetVideos()));

            plane.Catalog.Items.AddRange((AudioInit.GetAudio()));
            plane.Catalog.Items.AddRange((FoodInit.getFoods()));
            plane.Catalog.Items.AddRange((InitBeverage.GetBeverages()));
            //    plane.Catalog.Items.Add(new);
            var passengrs = plane.Seats.Select(p => p.Passenger).OrderBy(p => p.Id).ToList();

            var groups = SplitList <Passenger>(passengrs);

            foreach (var item in groups)
            {
                var group = new ReservationGroup
                {
                    Passengers = new List <Passenger>()
                };
                group.Passengers.AddRange(item);
                _context.ReservationGroups.Add(group);
            }
            _context.SaveChanges();
        }
        public HttpResponseMessage ProcessTransaction(IncomingProcessTransaction model)
        {
            return(ErrorFactory.Handle(() =>
            {
                var userId = User?.Identity?.GetUserId();

                if (string.IsNullOrWhiteSpace(userId))
                {
                    throw new Exception();
                }

                var context = new PoolReservationEntities();

                using (var unitOfWork = new UnitOfWork(context))
                {
                    PrepareAndGetReservationForProcessing_Result reservation = null;

                    try
                    {
                        reservation = context.PrepareAndGetReservationForProcessing(model.ReservationId)?.FirstOrDefault();
                    }
                    catch (Exception)
                    {
                        context.ChangeProcessingStatusToPending(model.ReservationId);
                    }



                    if (reservation == null)
                    {
                        try
                        {
                            context.ChangeProcessingStatusToPending(model.ReservationId);
                        }
                        catch (Exception)
                        {
                        }

                        return JsonFactory.CreateJsonMessage(null, HttpStatusCode.NotFound, this.Request);
                    }

                    if (reservation.StatusId != Convert.ToInt32(ReservationGroupStatusEnum.PROCESSING))
                    {
                        try
                        {
                            context.ChangeProcessingStatusToPending(model.ReservationId);
                        }
                        catch (Exception)
                        {
                        }

                        return JsonFactory.CreateJsonMessage(new OutgoingMessage {
                            Action = "wrongStatus"
                        }, HttpStatusCode.NotFound, this.Request);
                    }

                    ReservationGroup reservationDBObject = null;


                    try
                    {
                        reservationDBObject = unitOfWork.Reservations.GetReservationWithItems(userId, model.ReservationId);

                        if (reservationDBObject == null)
                        {
                            return JsonFactory.CreateJsonMessage(null, HttpStatusCode.NotFound, this.Request);
                        }
                    }
                    catch (Exception)
                    {
                        context.ChangeProcessingStatusToPending(model.ReservationId);
                    }


                    if (reservationDBObject.StatusId != Convert.ToInt32(ReservationGroupStatusEnum.PROCESSING))
                    {
                        try
                        {
                            context.ChangeProcessingStatusToPending(model.ReservationId);
                        }
                        catch (Exception)
                        {
                        }

                        return JsonFactory.CreateJsonMessage(new OutgoingMessage {
                            Action = "wrongStatus"
                        }, HttpStatusCode.NotFound, this.Request);
                    }

                    ReservationTransaction resTransaction = null;
                    int stripeModifiedPriceInCents = 0;
                    try
                    {
                        decimal priceToCharge = 0M;

                        foreach (var item in reservationDBObject.ReserveItems)
                        {
                            if (item.IsDeleted == true)
                            {
                                continue;
                            }

                            priceToCharge += item.FinalPrice;
                        }



                        decimal stripeModifiedPrice = priceToCharge * 100.0M;

                        stripeModifiedPriceInCents = (int)Math.Round(stripeModifiedPrice); //Must Update Repo If Changed.  Rounds to the nearest penny.

                        if (stripeModifiedPriceInCents <= 50)
                        {
                            return JsonFactory.CreateJsonMessage(new OutgoingMessage {
                                Action = "noPriceToCharge"
                            }, HttpStatusCode.NotFound, this.Request);
                        }

                        resTransaction = unitOfWork.Reservations.AddStripeChargeToPendingReservation(userId, userId, model.ReservationId, model.StripeTokenId, priceToCharge);

                        unitOfWork.Complete();
                    }
                    catch (Exception e)
                    {
                        context.ChangeProcessingStatusToPending(model.ReservationId);
                    }



                    string chargeId = null;
                    try
                    {
                        if (resTransaction == null)
                        {
                            throw new Exception();
                        }

                        var myCharge = new StripeChargeCreateOptions();

                        // always set these properties
                        myCharge.Amount = stripeModifiedPriceInCents;
                        myCharge.Currency = "usd";

                        // set this if you want to
                        myCharge.Description = "JustMosey Reservation";

                        myCharge.SourceTokenOrExistingSourceId = model.StripeTokenId;

                        // (not required) set this to false if you don't want to capture the charge yet - requires you call capture later
                        myCharge.Capture = true;

                        var chargeService = new StripeChargeService();
                        StripeCharge stripeCharge = chargeService.Create(myCharge);

                        chargeId = stripeCharge.Id;

                        unitOfWork.Reservations.UpdateStripeSuccessfulChargeOnPendingReservation(userId, userId, resTransaction.Id, chargeId);

                        unitOfWork.Complete();
                    }
                    catch (Exception e)
                    {
                        try
                        {
                            var refundService = new StripeRefundService();

                            StripeRefund refund = refundService.Create(chargeId, new StripeRefundCreateOptions()
                            {
                                Amount = stripeModifiedPriceInCents,
                                Reason = StripeRefundReasons.Unknown
                            });
                        }
                        catch (Exception)
                        {
                        }

                        try
                        {
                            unitOfWork.Reservations.RefundStripeSuccessfulChargeOnPendingReservation(userId, userId, resTransaction.Id);
                            unitOfWork.Complete();
                        }
                        catch (Exception)
                        {
                        }

                        try
                        {
                        }
                        catch (Exception)
                        {
                            context.ChangeProcessingStatusToPending(model.ReservationId);
                        }

                        return JsonFactory.CreateJsonMessage(new OutgoingMessage {
                            Action = "unknownErrorAfterProcessing"
                        }, HttpStatusCode.InternalServerError, this.Request);
                    }

                    try
                    {
                        var updatedReservationDBObject = unitOfWork.Reservations.GetReservationWithItems(userId, model.ReservationId);

                        var outgoingRes = OutgoingReservationGroup.Parse(updatedReservationDBObject);

                        return JsonFactory.CreateJsonMessage(outgoingRes, HttpStatusCode.OK, this.Request);
                    }
                    catch (Exception)
                    {
                        return JsonFactory.CreateJsonMessage(null, HttpStatusCode.OK, this.Request);
                    }
                }
            }, this.Request));
        }