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) }); }
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 }; } } }