using Distribution.Data; using Distribution.Models; using Microsoft.EntityFrameworkCore; namespace Distribution.Features.Order; public class OrderRepository(AppDBContext context) : IOrderRepository { public async Task GetByIdAsync(Guid id) => await context.Orders.FindAsync(id); public async Task> GetAllAsync() => await context.Orders.ToListAsync(); public async Task GetBySaleIdAsync(Guid saleId) => await context.Orders.FirstOrDefaultAsync(o => o.FK_SaleId == saleId && o.IsActive); public async Task AddAsync(Models.Order entity) => await context.Orders.AddAsync(entity); public void Update(Models.Order entity) => context.Orders.Update(entity); public void Remove(Models.Order entity) { entity.Status = Models.OrderStatus.Cancelled; entity.IsActive = false; context.Orders.Update(entity); } public async Task> GetItemsByOrderIdAsync(Guid orderId, bool includeHistory = false) => await context.OrderItems .Where(oi => oi.FK_OrderId == orderId && (includeHistory || oi.IsActive)) .ToListAsync(); public async Task> GetByStoreIdAsync(Guid storeId) => await context.Orders.Where(o => o.FK_StoreId == storeId && o.IsActive).ToListAsync(); public async Task AddItemsAsync(IEnumerable items) => await context.OrderItems.AddRangeAsync(items); public async Task> GetPendingByRouteIdAsync(Guid routeId) => await context.Orders .Include(o => o.Store) .Include(o => o.OrderItems.Where(i => i.IsActive)) .ThenInclude(i => i.Item) .Where(o => o.IsActive && o.Store.FK_RouteId == routeId && (o.Status == OrderStatus.Pending || o.Status == OrderStatus.PartiallyFulfilled)) .ToListAsync(); public async Task> GetConfirmedAsync(Guid? agentId, Guid? routeId, Guid? storeId) => await context.Orders .Include(o => o.Store) .Where(o => o.IsActive && o.ConfirmedAt != null && o.Status != OrderStatus.Cancelled && (agentId == null || o.CreatedByUserId == agentId) && (routeId == null || o.Store.FK_RouteId == routeId) && (storeId == null || o.FK_StoreId == storeId)) .ToListAsync(); }