public async Task <ResponseGeneric> Handle(GetCouponRequest request, CancellationToken cancellationToken)
        {
            request.Validate();
            if (request.Invalid)
            {
                AddNotifications(request.Notifications);
                return(new ResponseGeneric(false, "Não foi possível consultar o cupom de desconto! Cupom inválido.", request.Notifications));
            }

            Entities.Coupon coupon = this.couponRepository.GetBy(x => x.Reference.ToLower() == request.Reference.ToLower());
            coupon.Validate();

            if (coupon.Invalid)
            {
                return(new ResponseGeneric(false, "Não foi possível consultar o cupom de desconto!", coupon.Notifications));
            }

            var response = new ResponseGeneric(true, "Cupom de desconto aplicado com sucesso!", new { Reference = coupon.Reference, Percent = coupon.Percent });

            return(await Task.FromResult(response));
        }
示例#2
0
        public async Task <ResponseGeneric> Handle(ProcessOrderRequest request, CancellationToken cancellationToken)
        {
            request.Validate();
            if (request.Invalid)
            {
                AddNotifications(request.Notifications);
                return(new ResponseGeneric(false, "Não foi possível processar o pedido!", request.Notifications));
            }

            Entities.User user = this.userRepository.GetBy(x => x.Id == request.UserId);

            if (user == null)
            {
                AddNotification("User", "Usuário inválido");
                return(new ResponseGeneric(false, "Não foi possível processar o pedido!", Notifications));
            }

            Entities.Coupon coupon = this.couponRepository.GetBy(x => x.Reference.ToLower() == request.ReferenceDiscount.ToLower());
            coupon.Validate();

            if (coupon.Invalid)
            {
                return(new ResponseGeneric(false, "Não foi possível consultar o cupom de desconto!", coupon.Notifications));
            }

            Entities.Order order = new Entities.Order(0, 0, 0, Enums.EOrderStatus.Processing);

            order.setUser(user);

            decimal totalProducts = 0;

            foreach (var item in request.Items)
            {
                Entities.Cart itemCart = this.cartRepository.GetBy(x => x.Id == item.Id);
                itemCart.setBuyed();
                this.cartRepository.Update(itemCart);

                Entities.Product product = this.productRepository.GetBy(x => x.Id == item.ProductId);

                if (product == null)
                {
                    AddNotification("Product", "Produto não encontrado!");
                    return(new ResponseGeneric(false, "Não foi possível processar o pedido", Notifications));
                }

                totalProducts += item.Quantity * product.Price;

                Entities.OrderItem itemOrder = new Entities.OrderItem(item.Size, item.Quantity, product.Price);
                itemOrder.setOrder(order);
                itemOrder.setProduct(product);

                order.Items.Add(itemOrder);
            }

            decimal totalDiscount = (totalProducts * coupon.Percent) / 100;
            decimal totalOrder    = totalProducts - totalDiscount;

            order.SetTotalProducts(totalProducts);
            order.SetTotalDiscount(totalDiscount);
            order.SetTotalOrder(totalOrder);

            this.orderRepository.Add(order);

            if (await this.unitOfWork.SaveChanges() == 0)
            {
                AddNotification("Order", "Erro ao salvar processamento do pedido");
                return(new ResponseGeneric(false, "Não foi possível processar o pedido!", Notifications));
            }

            var response = new ResponseGeneric(true, "Pedido processado com sucesso! Aguarde a entrega do pedido.", null);

            return(await Task.FromResult(response));
        }