예제 #1
0
        public IActionResult Complete(int id)
        {
            this.orderService.Complete(id);
            var order = this.orderService.GetOrder(id);
            var model = new GetOrderViewModel {
                Order = order
            };

            return(this.View(model));
        }
예제 #2
0
        public async Task <ActionResult <GetOrderViewModel> > GetOrder(Guid id)
        {
            var order = await _context.Order
                        .Include(o => o.DeliveryAddress)
                        .Include(o => o.InvoiceAddress)
                        .Include(o => o.DeliveryAddress.City)
                        .Include(o => o.InvoiceAddress.City)
                        .Include(o => o.Products)
                        .FirstOrDefaultAsync(o => o.OrderId == id);

            if (order == null)
            {
                return(NotFound());
            }

            var getOrderViewModel = new GetOrderViewModel(order);

            return(getOrderViewModel);
        }
예제 #3
0
        public IActionResult ViewDetails(int orderId)
        {
            if (orderId != 0)
            {
                var order    = orderAppService.GetOrders().FirstOrDefault(i => i.Id == orderId);
                var customer = customerAppService.GetAllCustomers().FirstOrDefault(i => i.Id == order.CustomerId);

                var model = new GetOrderViewModel()
                {
                    OrderId      = order.Id,
                    OrderDate    = order.OrderDate,
                    OrderTotal   = order.OrderTotal,
                    OrderItems   = mapper.Map <List <OrderItemDto> >(order.OrderItems),
                    CustomerId   = order.CustomerId,
                    CustomerName = customer.CustomerName
                };

                return(View(model));
            }

            return(NotFound());
        }
예제 #4
0
        public async Task <ActionResult <GetOrderViewModel> > PostOrder(PostOrderViewModel model)
        {
            //VERIFY USER ROLE
            //-------------------------------------------
            var userId = User.FindFirst(ClaimTypes.NameIdentifier);
            var user   = await _context.Users.Include(u => u.Products).FirstOrDefaultAsync(u => u.Id == userId.Value);

            //-------------------------------------------
            //Extract Adresses
            //-------------------------------------------
            var invoiceAddress  = AddressViewModel.GetAddress(model.InvoiceAddress);
            var deliveryAddress = model.DeliveryAddress == null
                ? invoiceAddress
                : AddressViewModel.GetAddress(model.DeliveryAddress);
            //-------------------------------------------


            var order = new Order
            {
                OrderId         = Guid.NewGuid(),
                Invoice_Id      = Guid.NewGuid(),
                Date            = DateTime.Now,
                PaymentMethod   = model.PaymentMethod,
                ShipmentMethod  = model.ShipmentMethod,
                OrderState      = model.OrderState,
                InvoiceAddress  = invoiceAddress,
                DeliveryAddress = deliveryAddress,
                CustomerId      = user?.Id
            };

            //Extract Products and add to Order
            //------------------------------------------
            if (model.Products == null || model.Products.Count == 0)
            {
                return(BadRequest("List of Product cant be null or empty"));
            }

            var counter = 0;
            ICollection <SendRestockEmailParam> sendRestockEmailParams = new List <SendRestockEmailParam>();
            ICollection <OrderProduct>          orderProducts          = new List <OrderProduct>();
            ICollection <Product> products = new List <Product>();

            foreach (var VARIABLE in model.Products)
            {
                var product = await _context.Product.FindAsync(VARIABLE.ProductId);

                counter += VARIABLE.Cardinality;
                if (product == null)
                {
                    continue;
                }

                var cardinality = VARIABLE.Cardinality;

                if (product.InStock - cardinality < 0)
                {
                    return(BadRequest("Don't have that many in stock"));
                }

                if (product.IsDisabled)
                {
                    return(BadRequest($"Product with ID: {product.ProductId} is Disabled"));
                }

                if ((product.InStock - cardinality) < product.MinStock)
                {
                    sendRestockEmailParams.Add(new SendRestockEmailParam()
                    {
                        ManufacturerId = product.ManufacturerId,
                        ProductId      = product.ProductId
                    });
                }

                product.InStock -= cardinality;
                _context.Entry(product).State = EntityState.Modified;

                //TODO Add Product to USerProductList if not already contained

                if (user.Products == null)
                {
                    user.Products = new List <Product> {
                        product
                    };
                }
                else if (user.Products.Any(p => p.ProductId == product.ProductId) != true)
                {
                    user.Products.Add(product);
                }

                //_context.Entry(user).State = EntityState.Modified;
                var orderProduct = new OrderProduct
                {
                    Product       = product,
                    Cardinality   = cardinality,
                    OderProductId = Guid.NewGuid(),
                    ProductId     = product.ProductId,
                    Order         = order,
                    OrderId       = order.OrderId
                };
                orderProducts.Add(orderProduct);
            }
            if (counter <= 0)
            {
                return(BadRequest("You have to Order sth"));
            }
            order.Products = orderProducts;
            //Calculate total Cost
            //TODO what about tax?
            ICollection <decimal> costList = order.Products.Select(i => i.Cardinality * i.Product.Price).ToList();

            foreach (var @decimal in costList)
            {
                order.TotalCost += @decimal;
            }

            //------------------------------------------
            try
            {
                await _context.Order.AddAsync(order);

                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                throw;
            }

            try
            {
                await _mailService.SendOrderConfirmationEmailAsync(user, order);

                await _mailService.SendInvoiceEmailAsync(user, order);
                await SendRestockEmailManyAsync(sendRestockEmailParams);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            var getOrderViewModel = new GetOrderViewModel(order);

            return(CreatedAtAction("GetOrder", new { id = order.OrderId }, getOrderViewModel));
        }