Ejemplo n.º 1
0
        public Task <ApiModels.OrderPost> PostOrder(ApiModels.OrderPost orderPost)
        {
            return(Task.Run(() =>
            {
                var id = Guid.NewGuid();
                int ticketNum;
                DatabaseModels.OrderItems orderItems;
                DatabaseModels.OrderDiscount orderDiscount;

                lock (ticketNumberLock)
                {
                    if (ticketNumber > 99)
                    {
                        ticketNumber = 1;
                    }
                    ticketNum = ticketNumber;
                    ticketNumber++;
                }
                DatabaseModels.Order order = _orderRepository.Insert(new DatabaseModels.Order(id, orderPost.CashierId, DatabaseModels.OrderStatus.Preparing, orderPost.CreatedAt, orderPost.Price, ticketNum));
                foreach (var product in orderPost.Products)
                {
                    double price = _productRepository.GetProductPrice(product.Id);
                    orderItems = _orderItemsRepository.Insert(new DatabaseModels.OrderItems(id, product.Id, product.Count, price));
                }
                foreach (var discount in orderPost.Discounts)
                {
                    if (discount != null)
                    {
                        bool isAvailable = _discountRepository.GetDiscountStatus(discount.Id);
                        if (isAvailable)
                        {
                            orderDiscount = _orderDiscountRepository.Insert(new DatabaseModels.OrderDiscount(id, discount.Id, discount.Count));
                        }
                        else
                        {
                            throw new Exception(); //TODO: Use more descriptive exception
                        }
                    }
                }
                DatabaseModels.Cashier cashier = _cashierRepository.Get(orderPost.CashierId);
                cashier.Bilans += orderPost.Price;
                cashier = _cashierRepository.Update(cashier);

                var orderProductsItems = _productRepository.GetOrderProducts(order);
                var orderPrice = _productRepository.GetOrderProductPrices(order).Sum();
                var orderDiscounts = _orderDiscountRepository.GetOrderDiscounts(order);
                List <ApiModels.DiscountBasic> discountBasics = new List <ApiModels.DiscountBasic>();
                List <ApiModels.Product> orderProducts = new List <ApiModels.Product>();
                foreach (var e in orderDiscounts)
                {
                    discountBasics.Add(new ApiModels.DiscountBasic(e.DiscountId, e.Quantity));
                }
                foreach (var e in orderProductsItems)
                {
                    orderProducts.Add(new ApiModels.Product(e.id, e.name, e.quantity));
                }
                return new ApiModels.OrderPost(cashier.Id, orderPrice, orderProducts, discountBasics, order.CreatedAt);
            }));
        }
        /// <summary>
        /// Adds an order to the database
        /// </summary>
        /// <param name="customer">Customer that placed order</param>
        /// <param name="location">Location that was ordered from</param>
        /// <param name="sales">List of sales that the customer placed</param>
        public void AddOrder(Customer customer, Location location, ICollection <Sale> sales)
        {
            // get the context of the db
            using var context = new Project0Context(_dbContext);

            // create list converting from Library.Sale to DatabaseModel.Sale
            var     dbSales    = new List <DatabaseModels.Sale>();
            decimal orderTotal = 0.0m;

            foreach (var item in sales)
            {
                // need the product details
                var dbProduct = context.Products.First(p => p.Id == item.ProductId);
                var dbSale    = new DatabaseModels.Sale()
                {
                    ProductId     = item.ProductId,
                    ProductName   = dbProduct.Name,
                    PurchasePrice = dbProduct.Price,
                    Quantity      = item.SaleQuantity,
                };
                // add to the sum of the order total
                orderTotal += item.SaleQuantity * dbProduct.Price;

                // add the sale to the running list
                dbSales.Add(dbSale);

                // remove the amount from the inventory of the store
                var locationInventory = context.Inventories.First(i => i.LocationId == location.Id && i.ProductId == item.ProductId);
                locationInventory.Quantity -= item.SaleQuantity;
                context.Inventories.Update(locationInventory);
                context.SaveChanges();
            }

            // create the classes
            var order = new DatabaseModels.Order()
            {
                CustomerId = customer.Id,
                LocationId = location.Id,
                Date       = DateTime.Now,
                Sales      = dbSales
            };

            // calculate total
            order.OrderTotal = orderTotal;
            context.Orders.Add(order);
            context.SaveChanges();
        }