From 702efba62e1a75eac78cd220363878fb9dd12a66 Mon Sep 17 00:00:00 2001 From: DeepnaPooja Date: Thu, 8 Oct 2026 12:42:50 +0530 Subject: [PATCH] Add GetNextSerialSequence functionality to Stock services and repository --- .../Features/Stock/IStockRepository.cs | 2 ++ .../Features/Stock/StockController.cs | 8 ++++++++ .../Features/Stock/StockRepository.cs | 20 +++++++++++++++++++ Distribution/Features/Stock/StockService.cs | 4 ++++ 4 files changed, 34 insertions(+) diff --git a/Distribution/Features/Stock/IStockRepository.cs b/Distribution/Features/Stock/IStockRepository.cs index 832ce86..57854ec 100644 --- a/Distribution/Features/Stock/IStockRepository.cs +++ b/Distribution/Features/Stock/IStockRepository.cs @@ -28,5 +28,7 @@ public interface IStockRepository // Serial numbers Task SerialNumberExistsAsync(Guid itemId, string serialNumber); + /// One past the highest numeric suffix among the item's existing serials that start with (1 if none). + Task GetNextSerialSequenceAsync(Guid itemId, string prefix); Task AddItemSerialNumberAsync(ItemSerialNumber serial); } diff --git a/Distribution/Features/Stock/StockController.cs b/Distribution/Features/Stock/StockController.cs index db6ed68..d9af4fd 100644 --- a/Distribution/Features/Stock/StockController.cs +++ b/Distribution/Features/Stock/StockController.cs @@ -37,6 +37,14 @@ public class StockController(StockService service, ICurrentUserService currentUs return Ok(result); } + /// Next free number for auto-generated serials (e.g. after ...-0005 the answer is 6). + [HttpGet("serials/next-sequence")] + public async Task GetNextSerialSequence([FromQuery] Guid itemId, [FromQuery] string prefix = "") + { + var next = await service.GetNextSerialSequenceAsync(itemId, prefix); + return Ok(new { next }); + } + [HttpGet("movements")] public async Task GetMovements( [FromQuery] Guid? locationId, diff --git a/Distribution/Features/Stock/StockRepository.cs b/Distribution/Features/Stock/StockRepository.cs index 087a888..4130c59 100644 --- a/Distribution/Features/Stock/StockRepository.cs +++ b/Distribution/Features/Stock/StockRepository.cs @@ -107,6 +107,26 @@ public class StockRepository(AppDBContext db) : IStockRepository public Task SerialNumberExistsAsync(Guid itemId, string serialNumber) => db.ItemSerialNumbers.AnyAsync(s => s.FK_ItemId == itemId && s.SerialNumber == serialNumber); + public async Task GetNextSerialSequenceAsync(Guid itemId, string prefix) + { + // Only serials of the form count; anything else (a supplier's own serial that + // happens to start with the prefix) is ignored for numbering. + var serials = await db.ItemSerialNumbers + .AsNoTracking() + .Where(s => s.FK_ItemId == itemId && s.SerialNumber.StartsWith(prefix)) + .Select(s => s.SerialNumber) + .ToListAsync(); + + var max = 0L; + foreach (var serial in serials) + { + var suffix = serial[prefix.Length..]; + if (suffix.Length is > 0 and <= 9 && suffix.All(char.IsDigit) && long.TryParse(suffix, out var n)) + max = Math.Max(max, n); + } + return (int)max + 1; + } + public async Task AddItemSerialNumberAsync(ItemSerialNumber serial) => await db.ItemSerialNumbers.AddAsync(serial); } diff --git a/Distribution/Features/Stock/StockService.cs b/Distribution/Features/Stock/StockService.cs index cfca6d1..dd29feb 100644 --- a/Distribution/Features/Stock/StockService.cs +++ b/Distribution/Features/Stock/StockService.cs @@ -96,6 +96,10 @@ public class StockService( b.Quantity, b.Item.ReorderLevel!.Value)).ToList(); } + /// The next unused sequence number for generating serials like "<prefix>0001" for an item. + public Task GetNextSerialSequenceAsync(Guid itemId, string prefix) => + repo.GetNextSerialSequenceAsync(itemId, prefix ?? string.Empty); + public async Task GetItemTotalAsync(Guid itemId) { var item = await itemRepo.GetByIdAsync(itemId);