Example #1
0
        private ProductViewModel FetchDataToModify(int id)
        {
            var product = _productRepository.GetProductInclById(id);

            // Find description fields not initialized yet (for example, some fields for category A have been set up AFTER product X within category A has been created)
            var populatedFields   = _productRepository.GetProductDescItemsByProductId(product.Id);
            var requiredFields    = _subcategoryRepository.GetProductDescFieldsBySubcat(product.SubcategoryId);
            var unpopulatedFields = requiredFields.Where(f => !populatedFields.Select(p => p.Field.Id).Contains(f.Id)).ToList();

            foreach (var field in unpopulatedFields)
            {
                product.ProductDescriptionItems.Add(new ProductDescriptionItem {
                    Field = field
                });
            }

            // Persist changes for easier change tracking via existing extension
            if (unpopulatedFields.Count > 0)
            {
                _productRepository.SaveChanges();
            }

            var vm = new ProductViewModel();

            Object2ObjectMappings.ProductToProductViewModel(product, vm);

            PrepareNavData(id, "CPanelProductEdit");

            return(vm);
        }
Example #2
0
        public IActionResult AdminView(int id)
        {
            var product = _productRepository.GetProductInclById(id);

            // map data to viewmodel
            var vm = new ProductViewModel();

            Object2ObjectMappings.ProductToProductViewModel(product, vm);

            PrepareNavData(id, "CPanelProductView");

            return(View("AdminView", vm));
        }
Example #3
0
        public async Task <IActionResult> Save(OrderDTO orderDto)
        {
            var order = _orderRepository.GetOrderInclById(orderDto.Id);

            if (order == null)
            {
                return(BadRequest("Order not found."));
            }

            // Ensure that email is provided for order created by guest user
            if (String.IsNullOrEmpty(order.CustomerId) && String.IsNullOrEmpty(orderDto.DeliveryDetails.Email))
            {
                ModelState.AddModelError("", "Email is not provided.");
            }

            if (!ModelState.IsValid)
            {
                _breadcrumbNavBuilder.CreateForNode("CPanelOrderEdit", new { orderId = order.Id, orderName = ("Order #" + order.Id).ToString() }, this);
                return(View("Edit", orderDto));
            }

            var admin = await _userManager.GetUserAsync(User);

            // Preserve original user comment
            var tempComment = order.DeliveryDetails.Comment;

            // Set delivery & payment details
            Object2ObjectMappings.OrderDetailsDtoToOrder(orderDto.DeliveryDetails, order);

            // Recalculate delivery fee
            order.DeliveryFee             = DeliveryFeeCalculator.Calculate(order.DeliveryDetails.DeliveryMethodType);
            order.DeliveryDetails.Comment = tempComment;

            // Retireve changes and log
            var changeLogs = _auditTrailService.RetrieveAndLogChanges();

            foreach (var changeLog in changeLogs)
            {
                order.ChangeHistory.Add(new OrderChangeLog {
                    ChangeLog = changeLog, Order = order
                });
            }

            // Update last edit timestamp
            order.LastModifiedById = admin.Id;
            order.LastModifiedOn   = DateTime.UtcNow;

            _orderRepository.SaveChanges();

            return(RedirectToAction("AdminView", new { id = orderDto.Id }));
        }
Example #4
0
        public IActionResult AdminView(int id)
        {
            var order = _orderRepository.GetOrderInclById(id);

            // map to dto and return view
            var orderDto = new OrderDTO();

            Object2ObjectMappings.OrderItemListToOrderItemDtoList(order.Items, orderDto.Items);
            Object2ObjectMappings.OrderToOrderDetailsDto(order, orderDto.DeliveryDetails);
            Object2ObjectMappings.OrderMainDataToOrderDto(order, orderDto);

            _breadcrumbNavBuilder.CreateForNode("CPanelOrderView", new { orderId = order.Id, orderName = ("Order #" + order.Id).ToString() }, this);

            return(View("AdminView", orderDto));
        }
Example #5
0
        public IActionResult Edit(int id)
        {
            // retrieve order and related data
            var order = _orderRepository.GetOrderInclById(id);

            var deliveryDetailsDTO = new OrderDetailsDTO();

            // get relevant delivery and payment data
            Object2ObjectMappings.OrderToOrderDetailsDto(order, deliveryDetailsDTO);

            // append to order DTO
            var orderDTO = new OrderDTO()
            {
                DeliveryDetails = deliveryDetailsDTO,
                Id            = order.Id,
                NoUserAccount = (String.IsNullOrEmpty(order.CustomerId))
            };

            _breadcrumbNavBuilder.CreateForNode("CPanelOrderEdit", new { orderId = order.Id, orderName = ("Order #" + order.Id).ToString() }, this);

            return(View(orderDTO));
        }
Example #6
0
        public IActionResult Display(int id)
        {
            var userId  = _userManager.GetUserId(User);
            var product = _productRepository.GetProductInclById(id);

            // map data to viewmodel
            var vm = new ProductViewModel();

            Object2ObjectMappings.ProductToProductViewModel(product, vm);

            vm.NoUserAccount = String.IsNullOrEmpty(userId);
            vm.IsRatedByUser = _productRepository.ProductIsRatedByUserId(product.Id, userId);

            // check if availability is watched by existing user
            if (!product.IsAvailable && !vm.NoUserAccount)
            {
                vm.IsWatchedByUser = _productRepository.ProductIsWatchedByUserId(product.Id, userId);
            }

            PrepareNavData(id, "ProductDisplay");

            return(View(vm));
        }
Example #7
0
        public IActionResult OnGetAsync(int id)
        {
            var userId = _userManager.GetUserId(User);

            if (string.IsNullOrEmpty(userId))
            {
                return(BadRequest("User not found."));
            }

            var order = _orderRepository.GetOrderInclById(id);

            //validate user
            if (order == null || !String.Equals(order.CustomerId, userId))
            {
                return(BadRequest("Order with such ID for current user doesn't exist."));
            }

            OrderDTO = new OrderDTO();
            Object2ObjectMappings.OrderItemListToOrderItemDtoList(order.Items, OrderDTO.Items);
            Object2ObjectMappings.OrderToOrderDetailsDto(order, OrderDTO.DeliveryDetails);
            Object2ObjectMappings.OrderMainDataToOrderDto(order, OrderDTO);

            return(Page());
        }
Example #8
0
        public async Task <IActionResult> CheckoutConfirm([FromRoute] string confirmationKey)
        {
            try
            {
                var userId = _userManager.GetUserId(User);

                // validate confirmation key
                if (String.IsNullOrEmpty(confirmationKey))
                {
                    return(BadRequest("Missing confirmation key."));
                }

                // try to retrieve temp order from cache
                var tempOrder = ReadFromCache(confirmationKey);

                if (tempOrder == null)
                {
                    return(BadRequest("Temp order not found."));
                }

                // create order
                var order = new Order(tempOrder.DeliveryDetails.DeliveryMethodType)
                {
                    CreatedOn  = DateTime.UtcNow,
                    CustomerId = userId,
                    Status     = OrderStatus.Created
                };

                // append all items
                foreach (var tempItem in tempOrder.Items)
                {
                    var productInDb = _productRepository.GetProductById(tempItem.Product.Id);

                    if (productInDb != null &&
                        productInDb.NumberInStock >= tempItem.Quantity &&
                        productInDb.IsActive &&
                        productInDb.IsAvailable)
                    {
                        order.Items.Add(new OrderItem
                        {
                            Product       = productInDb,
                            ProductId     = productInDb.Id,
                            PurchasePrice = productInDb.SalePrice,
                            Quantity      = tempItem.Quantity
                        });
                    }
                }

                // check if email has been provided for guest user
                if (String.IsNullOrEmpty(userId))
                {
                    if (String.IsNullOrEmpty(tempOrder.DeliveryDetails.Email))
                    {
                        return(BadRequest("No email address provided for guest user's order."));
                    }

                    order.DeliveryDetails.EmailAddress = tempOrder.DeliveryDetails.Email;
                }

                // set basic delivery details
                order.DeliveryFee = DeliveryFeeCalculator.Calculate(tempOrder.DeliveryDetails.DeliveryMethodType);

                // set delivery-specific details
                Object2ObjectMappings.OrderDetailsDtoToOrder(tempOrder.DeliveryDetails, order);

                // check consistency or order amount (prevents user from accidentally ordering items for which the price has just changed)
                if (order.OrderAmountTotal != tempOrder.OrderAmountTotal)
                {
                    return(BadRequest("Price of some items you are trying to order might have changed."));
                }

                // persist changes
                _orderRepository.AddOrder(order);

                if (_orderRepository.SaveChanges() > 0)
                {
                    _cartManager.ResetCart();
                    _memoryCache.Remove(confirmationKey);

                    await SendOrderConfirmation(order);
                }

                // return order id
                return(Ok(new { orderId = order.Id }));
            }
            catch (Exception ex)
            {
                var userId = _userManager.GetUserId(User);

                _logger.LogError("Order validation failed (user ID: " + userId + "). " + ex.ToString());
                return(BadRequest("Unexpected error has occured. Please try again later."));
            }
        }
Example #9
0
        public async Task <IActionResult> Save([FromForm] ProductViewModel vm)
        {
            Product product;
            string  uploaderErrorMessage = "";
            bool    isAvailableAgain     = false;

            // Validate all inputs
            if (!_uploader.ValidateImageMulti(vm.PicturesToUpload, ref uploaderErrorMessage))
            {
                ModelState.AddModelError("", uploaderErrorMessage);
            }

            if (!ModelState.IsValid)
            {
                if (vm.Id == 0)
                {
                    return(View("Edit", FetchDataToCreate(vm.SubcategoryId)));
                }
                else
                {
                    return(View("Edit", FetchDataToModify(vm.Id)));
                }
            }

            var admin = await _userManager.GetUserAsync(User);

            // New product
            if (vm.Id == 0)
            {
                product = new Product()
                {
                    SubcategoryId = vm.SubcategoryId
                };

                // Copy main prop values
                Object2ObjectMappings.ProductViewModelToProduct(vm, product);

                product.AddedOn = DateTime.UtcNow;
                product.AddedBy = admin.Email;

                _productRepository.AddProduct(product);
            }
            // Edit existing product
            else
            {
                product = _productRepository.GetProductInclById(vm.Id);

                // check if product wasnt avaiable & not is available again
                if (!product.IsAvailable && vm.IsAvailable)
                {
                    isAvailableAgain = true;
                }

                // Copy main prop values
                Object2ObjectMappings.ProductViewModelToProduct(vm, product);

                // Log modifications
                var changeLogs = _auditTrailService.RetrieveAndLogChanges();

                foreach (var changeLog in changeLogs)
                {
                    product.ChangeHistory.Add(new ProductChangeLog {
                        ChangeLog = changeLog, Product = product
                    });
                }

                product.LastModifiedOn   = DateTime.UtcNow;
                product.LastModifiedById = admin.Id;
            }

            // Reset existing pictures if user requested
            if (vm.RemoveExistingImages)
            {
                product.Pictures.Clear();
            }

            // Add images
            var imgUploaded = await _uploader.UploadMulti(vm.PicturesToUpload);

            product.Pictures.AddRange(imgUploaded.Select(pic => new FilePath {
                Path = pic
            }).ToList());

            if (_productRepository.SaveChanges() > 0 && isAvailableAgain)
            {
                await NotifyAllUsers(product);
            }

            return(RedirectToAction("AdminView", new { id = product.Id }));
        }