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); }
public async Task <ActionResult <CustomerPaybackDTO> > PostCanceledOrder(CanceledOrder canceledOrder) { CustomerPaybackDTO customerPayback = await _canceledOrdersService.PostCanceledOrder(canceledOrder); return(customerPayback); }