From 05d44ab9f06869fe72f8bcbacf538417dc7abed3 Mon Sep 17 00:00:00 2001 From: DeepnaPooja Date: Tue, 6 Oct 2026 13:31:19 +0530 Subject: [PATCH] check stock lookup methods --- .../Features/Stock/IStockRepository.cs | 9 ++++++++ .../Features/Stock/StockRepository.cs | 21 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Distribution/Features/Stock/IStockRepository.cs b/Distribution/Features/Stock/IStockRepository.cs index dbc9208..832ce86 100644 --- a/Distribution/Features/Stock/IStockRepository.cs +++ b/Distribution/Features/Stock/IStockRepository.cs @@ -6,6 +6,7 @@ public interface IStockRepository { // Balance Task GetBalanceAsync(Guid itemId, Guid locationId); + Task GetBalanceAsync(Guid itemId, Guid locationId, Guid? itemBatchId, Guid? itemSerialNumberId); Task> GetBalancesByLocationAsync(Guid locationId, LocationType locationType); Task> GetBalancesAsync(Guid? locationId, LocationType? locationType, Guid? itemId, int page, int pageSize); Task GetBalancesCountAsync(Guid? locationId, LocationType? locationType, Guid? itemId); @@ -20,4 +21,12 @@ public interface IStockRepository void UpdateMovement(StockMovement movement); Task> GetMovementsAsync(Guid? locationId, Guid? itemId, MovementType? type, DateTime? from, DateTime? to, int page, int pageSize); Task GetMovementsCountAsync(Guid? locationId, Guid? itemId, MovementType? type, DateTime? from, DateTime? to); + + // Batches — a null batchNumber always creates a fresh expiry-only lot (no dedup possible on null). + Task FindBatchAsync(Guid itemId, string batchNumber); + Task AddItemBatchAsync(ItemBatch batch); + + // Serial numbers + Task SerialNumberExistsAsync(Guid itemId, string serialNumber); + Task AddItemSerialNumberAsync(ItemSerialNumber serial); } diff --git a/Distribution/Features/Stock/StockRepository.cs b/Distribution/Features/Stock/StockRepository.cs index 20ba415..087a888 100644 --- a/Distribution/Features/Stock/StockRepository.cs +++ b/Distribution/Features/Stock/StockRepository.cs @@ -9,7 +9,14 @@ public class StockRepository(AppDBContext db) : IStockRepository public Task GetBalanceAsync(Guid itemId, Guid locationId) => db.StockBalances .Include(b => b.Item) - .FirstOrDefaultAsync(b => b.FK_ItemId == itemId && b.LocationId == locationId); + .FirstOrDefaultAsync(b => b.FK_ItemId == itemId && b.LocationId == locationId + && b.FK_ItemBatchId == null && b.FK_ItemSerialNumberId == null); + + public Task GetBalanceAsync(Guid itemId, Guid locationId, Guid? itemBatchId, Guid? itemSerialNumberId) => + db.StockBalances + .Include(b => b.Item) + .FirstOrDefaultAsync(b => b.FK_ItemId == itemId && b.LocationId == locationId + && b.FK_ItemBatchId == itemBatchId && b.FK_ItemSerialNumberId == itemSerialNumberId); public Task> GetBalancesByLocationAsync(Guid locationId, LocationType locationType) => db.StockBalances @@ -90,4 +97,16 @@ public class StockRepository(AppDBContext db) : IStockRepository if (to.HasValue) query = query.Where(m => m.CreatedAt <= to.Value); return query.CountAsync(); } + + public Task FindBatchAsync(Guid itemId, string batchNumber) => + db.ItemBatches.FirstOrDefaultAsync(b => b.FK_ItemId == itemId && b.BatchNumber == batchNumber); + + public async Task AddItemBatchAsync(ItemBatch batch) => + await db.ItemBatches.AddAsync(batch); + + public Task SerialNumberExistsAsync(Guid itemId, string serialNumber) => + db.ItemSerialNumbers.AnyAsync(s => s.FK_ItemId == itemId && s.SerialNumber == serialNumber); + + public async Task AddItemSerialNumberAsync(ItemSerialNumber serial) => + await db.ItemSerialNumbers.AddAsync(serial); }