Exemple #1
0
        public async Task <CustomerPaybackDTO> PostCanceledOrder(CanceledOrder canceledOrder)
        {
            CustomerPaybackDTO customerPayback = new CustomerPaybackDTO();

            if (!canceledOrder.ReturnedItems.Any())
            {
                throw new BadRequestException(Enum.InternalCode.ValidationException, "To cancel order you must add 'ReturnedItems'");
            }
            List <int>       OrderItemIds = canceledOrder.ReturnedItems.Select(p => p.OrderItemId).Distinct().ToList();
            List <OrderItem> orderItems   = await _context.OrderItems
                                            .Include(p => p.Product)
                                            .Where(p => OrderItemIds.Contains(p.Id)).ToListAsync();

            SetOrderItem(canceledOrder, orderItems);

            CheckForBelongItemsToOrder(canceledOrder, orderItems);
            CheckForItemsCantReturn(orderItems);
            await CheckQuantityOfReturnItems(canceledOrder, orderItems);

            Order order = await _context.Orders.FindAsync(canceledOrder.OrderId);

            if ((DateTime.UtcNow - order.OrderDate).TotalDays >= 30)
            {
                throw new BadRequestException(Enum.InternalCode.DateOver, $"you can return an item only before 30 days from the order, order date {order.OrderDate}");
            }


            customerPayback.Amount = canceledOrder.ReturnedItems.Sum(p => p.OrderItem.UnitPrice * p.Quantity);

            if ((DateTime.UtcNow - order.OrderDate).TotalDays < 16)
            {
                //TODO Handling customers who have not paid cash
                customerPayback.PaymentType = PaymentType.Cash;
            }
            else
            {
                Coupon coupon = await _couponsService.CreateCoupon(customerPayback.Amount, canceledOrder.OrderId);

                customerPayback.PaymentType = PaymentType.Coupon;
                customerPayback.Identity    = coupon.CouponIdentity;
            }

            canceledOrder.CanceledDate = DateTime.UtcNow;
            canceledOrder.SalesmanId   = _baseServise.UserId;
            _context.CanceledOrders.Add(canceledOrder);
            await _context.SaveChangesAsync();

            return(customerPayback);
        }
Exemple #2
0
        public async Task <ActionResult <CustomerPaybackDTO> > PostCanceledOrder(CanceledOrder canceledOrder)
        {
            CustomerPaybackDTO customerPayback = await _canceledOrdersService.PostCanceledOrder(canceledOrder);

            return(customerPayback);
        }