/// <summary> /// Dodawanie zamówienia z terminala klienckiego w lokalu. Znajdywanie kelnera obsługującego zadanie następuje od razu. /// </summary> /// <param name="clientId">Identyfikator klienta</param> /// <param name="tableId">Numer stolika</param> /// <param name="menuItemsEnumerable">Elementy stanowiące zamówienie</param> /// <returns></returns> Order IClientDataAccessWCFService.AddOrder(int clientId, int tableId, IEnumerable<Tuple<int, int>> menuItemsEnumerable) { if (!CheckHasUserRole(clientId, UserRole.Client)) throw new SecurityException(String.Format("Client id={0} is not logged in.", clientId)); var menuItems = menuItemsEnumerable as Tuple<int, int>[] ?? menuItemsEnumerable.ToArray(); if (menuItems == null || !menuItems.Any()) throw new ArgumentNullException("menuItemsEnumerable"); OrderEntity orderEntity = null; using (var db = new DataAccessProvider()) { UserContextEntity client = db.Users.Find(clientId); if(client == null) throw new ArgumentException(String.Format("No such user (id={0}) exists.", clientId)); if(client.Role != UserRole.Client) throw new ArgumentException(String.Format("User (id={0}) is not a client.", clientId)); TableEntity table = db.Tables.Find(tableId); if (table == null) throw new ArgumentException(String.Format("No such table (id={0}) exists.", tableId)); orderEntity = new OrderEntity() { Client = client, Table = table, State = OrderState.Placed, PlacingDate = DateTime.Now, ClosingDate = DateTime.MaxValue }; foreach (var tuple in menuItems) { MenuItemEntity menuItem = db.MenuItems.Find(tuple.Item1); if (menuItem == null) throw new ArgumentException(String.Format("No such menuItem (id={0}) exists", tuple.Item1)); if (tuple.Item2 <= 0) throw new ArgumentException(String.Format("MenuItem id={0} has quantity={1}", tuple.Item1, tuple.Item2)); MenuItemQuantityEntity menuItemQuantity = new MenuItemQuantityEntity() { MenuItem = menuItem, Quantity = tuple.Item2 }; orderEntity.MenuItems.Add(menuItemQuantity); } orderEntity = db.Orders.Add(orderEntity); db.SaveChanges(); var order = new Order(orderEntity); logger.Write(String.Format("Order {0} by user {1} was created.", order.Id, order.Client), LoggingCategory.Information); Task.Run(() => AssignOrder(order)); return order; } }
public MenuItemQuantity(MenuItemQuantityEntity menuItemQuantity) : base(menuItemQuantity) { MenuItem = new MenuItem(menuItemQuantity.MenuItem); Quantity = menuItemQuantity.Quantity; }
/// <summary> /// Dodawanie zamówienia z poziomu strony internetowej. Od zamówienia z lokalu różni się tym, iż klient podaje datę, kiedy zamierza przyjść do lokalu. /// Wybór stolika następuje automatycznie /// </summary> /// <param name="userId">Identyfikator klienta</param> /// <param name="orderTime">Czas obsługi zamówienia</param> /// <param name="menuItemsEnumerable">Elementy stanowiące zamówienie</param> /// <returns></returns> public Order AddOrder(int clientId, DateTime orderTime, IEnumerable<Tuple<int, int>> menuItemsEnumerable) { if (!CheckHasUserRole(clientId, UserRole.Client)) throw new SecurityException(String.Format("Client id={0} is not logged in.", clientId)); // Data zamówienia jest w przeszłości if (orderTime.CompareTo(DateTime.Now) < 0) throw new ArgumentException("Specified date already passed.", "orderTime"); var menuItems = menuItemsEnumerable as Tuple<int, int>[] ?? menuItemsEnumerable.ToArray(); if (menuItems == null || !menuItems.Any()) throw new ArgumentNullException("menuItemsEnumerable"); OrderEntity orderEntity = null; using (var db = new DataAccessProvider()) { UserContextEntity client = db.Users.Find(clientId); if (client == null) throw new ArgumentException(String.Format("No such user (id={0}) exists.", clientId)); if (client.Role != UserRole.Client) throw new ArgumentException(String.Format("User (id={0}) is not a client.", clientId)); orderEntity = new OrderEntity() { Client = client, State = OrderState.Placed, PlacingDate = DateTime.Now, ClosingDate = DateTime.MaxValue }; foreach (var tuple in menuItems) { MenuItemEntity menuItem = db.MenuItems.Find(tuple.Item1); if (menuItem == null) throw new ArgumentException(String.Format("No such menuItem (id={0}) exists", tuple.Item1)); if (tuple.Item2 <= 0) throw new ArgumentException(String.Format("MenuItem id={0} has quantity={1}", tuple.Item1, tuple.Item2)); MenuItemQuantityEntity menuItemQuantity = new MenuItemQuantityEntity() { MenuItem = menuItem, Quantity = tuple.Item2 }; orderEntity.MenuItems.Add(menuItemQuantity); } orderEntity = db.Orders.Add(orderEntity); db.SaveChanges(); var order = new Order(orderEntity); orderAssignScheduler.AddOrder(new OrderServicingDateWrapper(order, orderTime)); logger.Write(String.Format("Order {0} by user {1} added to scheduler. Deploy date {2}", order.Id, order.Client, orderTime), LoggingCategory.Information); return order; } }