using Nop.Core; using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Orders; using Nop.Data; namespace Nop.Services.Orders; /// /// Return request service /// public partial class ReturnRequestService : IReturnRequestService { #region Fields protected readonly IRepository _returnRequestRepository; protected readonly IRepository _returnRequestActionRepository; protected readonly IRepository _returnRequestReasonRepository; protected readonly IRepository _orderItemRepository; protected readonly IRepository _productRepository; #endregion #region Ctor public ReturnRequestService(IRepository returnRequestRepository, IRepository returnRequestActionRepository, IRepository returnRequestReasonRepository, IRepository orderItemRepository, IRepository productRepository) { _returnRequestRepository = returnRequestRepository; _returnRequestActionRepository = returnRequestActionRepository; _returnRequestReasonRepository = returnRequestReasonRepository; _orderItemRepository = orderItemRepository; _productRepository = productRepository; } #endregion #region Methods /// /// Deletes a return request /// /// Return request /// A task that represents the asynchronous operation public virtual async Task DeleteReturnRequestAsync(ReturnRequest returnRequest) { await _returnRequestRepository.DeleteAsync(returnRequest); } /// /// Gets a return request /// /// Return request identifier /// /// A task that represents the asynchronous operation /// The task result contains the return request /// public virtual async Task GetReturnRequestByIdAsync(int returnRequestId) { return await _returnRequestRepository.GetByIdAsync(returnRequestId); } /// /// Search return requests /// /// Store identifier; 0 to load all entries /// Customer identifier; 0 to load all entries /// Order item identifier; 0 to load all entries /// Custom number; null or empty to load all entries /// Return request status; null to load all entries /// Created date from (UTC); null to load all records /// Created date to (UTC); null to load all records /// Page index /// Page size /// A value in indicating whether you want to load only total number of records. Set to "true" if you don't want to load data from database /// /// A task that represents the asynchronous operation /// The task result contains the return requests /// public virtual async Task> SearchReturnRequestsAsync(int storeId = 0, int customerId = 0, int orderItemId = 0, string customNumber = "", ReturnRequestStatus? rs = null, DateTime? createdFromUtc = null, DateTime? createdToUtc = null, int pageIndex = 0, int pageSize = int.MaxValue, bool getOnlyTotalCount = false) { var query = _returnRequestRepository.Table; if (storeId > 0) query = query.Where(rr => storeId == rr.StoreId); if (customerId > 0) query = query.Where(rr => customerId == rr.CustomerId); if (rs.HasValue) { var returnStatusId = (int)rs.Value; query = query.Where(rr => rr.ReturnRequestStatusId == returnStatusId); } if (orderItemId > 0) query = query.Where(rr => rr.OrderItemId == orderItemId); if (!string.IsNullOrEmpty(customNumber)) query = query.Where(rr => rr.CustomNumber == customNumber); if (createdFromUtc.HasValue) query = query.Where(rr => createdFromUtc.Value <= rr.CreatedOnUtc); if (createdToUtc.HasValue) query = query.Where(rr => createdToUtc.Value >= rr.CreatedOnUtc); query = query.OrderByDescending(rr => rr.CreatedOnUtc).ThenByDescending(rr => rr.Id); var returnRequests = await query.ToPagedListAsync(pageIndex, pageSize, getOnlyTotalCount); return returnRequests; } /// /// Gets the return request availability /// /// The order identifier /// The containing the public virtual async Task GetReturnRequestAvailabilityAsync(int orderId) { var result = new ReturnRequestAvailability(); if (orderId > 0) { var cancelledStatusId = (int)ReturnRequestStatus.Cancelled; var requestedOrderItemsForReturn = from rr in _returnRequestRepository.Table where rr.ReturnRequestStatusId != cancelledStatusId group rr by new { rr.OrderItemId } into g select new { OrderItemId = g.Key.OrderItemId, RequestedQuantityForReturn = g.Sum(rr => rr.Quantity) }; var query = from oi in _orderItemRepository.Table join roi in requestedOrderItemsForReturn on oi.Id equals roi.OrderItemId into alreadyRequestedForReturn from aroi in alreadyRequestedForReturn.DefaultIfEmpty() join p in _productRepository.Table on oi.ProductId equals p.Id where !p.NotReturnable && oi.OrderId == orderId select new ReturnableOrderItem { AvailableQuantityForReturn = aroi != null ? Math.Max(oi.Quantity - aroi.RequestedQuantityForReturn, 0) : oi.Quantity, OrderItem = oi }; result.ReturnableOrderItems = await query.ToListAsync(); } return result; } /// /// Delete a return request action /// /// Return request action /// A task that represents the asynchronous operation public virtual async Task DeleteReturnRequestActionAsync(ReturnRequestAction returnRequestAction) { await _returnRequestActionRepository.DeleteAsync(returnRequestAction); } /// /// Gets all return request actions /// /// /// A task that represents the asynchronous operation /// The task result contains the return request actions /// public virtual async Task> GetAllReturnRequestActionsAsync() { return await _returnRequestActionRepository.GetAllAsync(query => { return from rra in query orderby rra.DisplayOrder, rra.Id select rra; }, cache => default); } /// /// Gets a return request action /// /// Return request action identifier /// /// A task that represents the asynchronous operation /// The task result contains the return request action /// public virtual async Task GetReturnRequestActionByIdAsync(int returnRequestActionId) { return await _returnRequestActionRepository.GetByIdAsync(returnRequestActionId, cache => default); } /// /// Inserts a return request /// /// Return request /// A task that represents the asynchronous operation public virtual async Task InsertReturnRequestAsync(ReturnRequest returnRequest) { await _returnRequestRepository.InsertAsync(returnRequest); } /// /// Inserts a return request action /// /// Return request action /// A task that represents the asynchronous operation public virtual async Task InsertReturnRequestActionAsync(ReturnRequestAction returnRequestAction) { await _returnRequestActionRepository.InsertAsync(returnRequestAction); } /// /// Updates the return request /// /// Return request /// A task that represents the asynchronous operation public virtual async Task UpdateReturnRequestAsync(ReturnRequest returnRequest) { await _returnRequestRepository.UpdateAsync(returnRequest); } /// /// Updates the return request action /// /// Return request action /// A task that represents the asynchronous operation public virtual async Task UpdateReturnRequestActionAsync(ReturnRequestAction returnRequestAction) { await _returnRequestActionRepository.UpdateAsync(returnRequestAction); } /// /// Delete a return request reason /// /// Return request reason /// A task that represents the asynchronous operation public virtual async Task DeleteReturnRequestReasonAsync(ReturnRequestReason returnRequestReason) { await _returnRequestReasonRepository.DeleteAsync(returnRequestReason); } /// /// Gets all return request reasons /// /// /// A task that represents the asynchronous operation /// The task result contains the return request reasons /// public virtual async Task> GetAllReturnRequestReasonsAsync() { return await _returnRequestReasonRepository.GetAllAsync(query => { return from rra in query orderby rra.DisplayOrder, rra.Id select rra; }, cache => default); } /// /// Gets a return request reason /// /// Return request reason identifier /// /// A task that represents the asynchronous operation /// The task result contains the return request reason /// public virtual async Task GetReturnRequestReasonByIdAsync(int returnRequestReasonId) { return await _returnRequestReasonRepository.GetByIdAsync(returnRequestReasonId, cache => default); } /// /// Inserts a return request reason /// /// Return request reason /// A task that represents the asynchronous operation public virtual async Task InsertReturnRequestReasonAsync(ReturnRequestReason returnRequestReason) { await _returnRequestReasonRepository.InsertAsync(returnRequestReason); } /// /// Updates the return request reason /// /// Return request reason /// A task that represents the asynchronous operation public virtual async Task UpdateReturnRequestReasonAsync(ReturnRequestReason returnRequestReason) { await _returnRequestReasonRepository.UpdateAsync(returnRequestReason); } #endregion }