using Distribution.Data; using Distribution.Models; using Microsoft.EntityFrameworkCore; namespace Distribution.Features.LoadingEvent; public class LoadingSheetRepository(AppDBContext context) : ILoadingSheetRepository { public async Task GetByIdAsync(Guid id) => await context.LoadingSheets .Include(s => s.SourceWarehouse) .Include(s => s.Items).ThenInclude(i => i.Item) .FirstOrDefaultAsync(s => s.Id == id); public async Task GetActiveByRideIdAsync(Guid rideId) => await context.LoadingSheets .FirstOrDefaultAsync(s => s.FK_RideId == rideId && s.Status != LoadingSheetStatus.ReceiptConfirmed && s.Status != LoadingSheetStatus.Resolved); public async Task> GetAllAsync(Guid? rideId, LoadingSheetStatus? status, int page, int pageSize) => await context.LoadingSheets .Include(s => s.SourceWarehouse) .Where(s => (rideId == null || s.FK_RideId == rideId) && (status == null || s.Status == status)) .OrderByDescending(s => s.CreatedAt) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); public async Task GetCountAsync(Guid? rideId, LoadingSheetStatus? status) => await context.LoadingSheets .CountAsync(s => (rideId == null || s.FK_RideId == rideId) && (status == null || s.Status == status)); public async Task> GetAggregatedOrderItemsByRouteIdAsync(Guid routeId) { var groups = await context.OrderItems .Where(oi => oi.IsActive && oi.Order.IsActive && oi.Order.Store.FK_RouteId == routeId) .GroupBy(oi => oi.FK_ItemId) .Select(g => new { ItemId = g.Key, TotalQty = g.Sum(oi => (decimal)oi.Quantity) }) .ToListAsync(); return groups.Select(x => (x.ItemId, x.TotalQty)).ToList(); } public async Task AddAsync(LoadingSheet sheet) => await context.LoadingSheets.AddAsync(sheet); public void Update(LoadingSheet sheet) => context.LoadingSheets.Update(sheet); public void RemoveItems(IEnumerable items) => context.LoadingSheetItems.RemoveRange(items); public async Task AddItemsAsync(IEnumerable items) => await context.LoadingSheetItems.AddRangeAsync(items); }