Exemple #1
0
        public static OutgoingReservationItem Parse(ReserveItems x)
        {
            if (x == null)
            {
                return(null);
            }

            return(new OutgoingReservationItem
            {
                Id = x.Id,
                Quantity = x.Quantity,
                PricePreTax = x.PricePreTax,
                IgnoreQuantityRestrictions = x.IgnoreQuantityRestrictions,
                IsDeleted = x.IsDeleted,
                DeletedDate = x.DeletedDate,
                ItemId = x.ItemId,
                ReservationId = x.ReservationId,
                TaxRate = x.TaxRate,
                FinalPrice = x.FinalPrice,
                Item = OutgoingVenueItems.Parse(x.VenueItems)
            });
        }
Exemple #2
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
                    };
                }
            }
        }