using Distribution.Data; using Microsoft.EntityFrameworkCore; namespace Distribution.Features.Grn; public class GrnRepository(AppDBContext context) : IGrnRepository { public async Task GetByIdAsync(Guid id) => await context.GoodsReceipts .Include(gr => gr.Warehouse) .Include(gr => gr.Supplier) .Include(gr => gr.Items).ThenInclude(i => i.Item) .Include(gr => gr.Items).ThenInclude(i => i.PurchaseOrderItem).ThenInclude(poi => poi!.Item) .Include(gr => gr.Items).ThenInclude(i => i.Batches).ThenInclude(b => b.ItemBatch) .Include(gr => gr.Items).ThenInclude(i => i.Serials).ThenInclude(s => s.ItemSerialNumber) .FirstOrDefaultAsync(gr => gr.Id == id); public async Task> GetAllAsync(Guid? purchaseOrderId, int page, int pageSize) => await context.GoodsReceipts .Include(gr => gr.Warehouse) .Include(gr => gr.Supplier) .Include(gr => gr.Items).ThenInclude(i => i.Item) .Include(gr => gr.Items).ThenInclude(i => i.PurchaseOrderItem).ThenInclude(poi => poi!.Item) .Include(gr => gr.Items).ThenInclude(i => i.Batches).ThenInclude(b => b.ItemBatch) .Include(gr => gr.Items).ThenInclude(i => i.Serials).ThenInclude(s => s.ItemSerialNumber) .Where(gr => gr.IsActive && (purchaseOrderId == null || gr.FK_PurchaseOrderId == purchaseOrderId)) .OrderByDescending(gr => gr.ReceivedAt) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); public async Task GetCountAsync(Guid? purchaseOrderId) => await context.GoodsReceipts .Where(gr => gr.IsActive && (purchaseOrderId == null || gr.FK_PurchaseOrderId == purchaseOrderId)) .CountAsync(); public async Task> GetByPurchaseOrderIdAsync(Guid purchaseOrderId) => await context.GoodsReceipts .Include(gr => gr.Warehouse) .Include(gr => gr.Supplier) .Include(gr => gr.Items).ThenInclude(i => i.Item) .Include(gr => gr.Items).ThenInclude(i => i.PurchaseOrderItem).ThenInclude(poi => poi!.Item) .Include(gr => gr.Items).ThenInclude(i => i.Batches).ThenInclude(b => b.ItemBatch) .Include(gr => gr.Items).ThenInclude(i => i.Serials).ThenInclude(s => s.ItemSerialNumber) .Where(gr => gr.FK_PurchaseOrderId == purchaseOrderId && gr.IsActive) .OrderByDescending(gr => gr.ReceivedAt) .ToListAsync(); public async Task AddAsync(Models.GoodsReceipt entity) => await context.GoodsReceipts.AddAsync(entity); public async Task HasAnyForPurchaseOrderAsync(Guid purchaseOrderId) => await context.GoodsReceipts.AnyAsync(gr => gr.FK_PurchaseOrderId == purchaseOrderId && gr.IsActive); public async Task> GetAcceptedTotalsByItemAsync(Guid purchaseOrderId) => await context.GoodsReceiptItems .Include(i => i.PurchaseOrderItem) .Where(i => i.PurchaseOrderItem!.FK_PurchaseOrderId == purchaseOrderId && i.IsActive) .GroupBy(i => i.PurchaseOrderItem!.FK_ItemId) .Select(g => new { ItemId = g.Key, Total = g.Sum(i => i.AcceptedQuantity) }) .ToDictionaryAsync(x => x.ItemId, x => x.Total); }