Add GetNextSerialSequence functionality to Stock services and repository
This commit is contained in:
@@ -107,6 +107,26 @@ public class StockRepository(AppDBContext db) : IStockRepository
|
||||
public Task<bool> SerialNumberExistsAsync(Guid itemId, string serialNumber) =>
|
||||
db.ItemSerialNumbers.AnyAsync(s => s.FK_ItemId == itemId && s.SerialNumber == serialNumber);
|
||||
|
||||
public async Task<int> GetNextSerialSequenceAsync(Guid itemId, string prefix)
|
||||
{
|
||||
// Only serials of the form <prefix><digits> 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user