using Distribution.Models; namespace Distribution.Features.Stock; public interface IStockRepository { // Balance Task GetBalanceAsync(Guid itemId, Guid locationId); Task GetBalanceAsync(Guid itemId, Guid locationId, Guid? itemBatchId, Guid? itemSerialNumberId); /// Positive balances for the item at the location in pick order: batches by earliest expiry, serials oldest first, untracked last. Task> GetAllocatableBalancesAsync(Guid itemId, Guid locationId); 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); Task> GetBalancesByItemAsync(Guid itemId); Task> GetLowStockAsync(Guid? locationId); Task AddBalanceAsync(StockBalance balance); void UpdateBalance(StockBalance balance); // Movements Task AddMovementAsync(StockMovement movement); Task GetMovementByIdAsync(Guid id); void UpdateMovement(StockMovement movement); Task> GetMovementsAsync(MovementFilter filter, int page, int pageSize); Task GetMovementsCountAsync(MovementFilter filter); /// Opening balance, quantity in/out within [from, toExclusive), closing balance, and the live balance to reconcile against. Task GetMovementSummaryAsync(Guid itemId, Guid locationId, DateTime from, DateTime toExclusive); Task> GetMovementsByReferenceAsync(Guid referenceId, Guid itemId, MovementType type); /// The warehouse the item most recently arrived at from, or null if it never did. Task GetLastWarehouseSourceAsync(Guid vehicleId, Guid itemId); // 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 GetSerialAsync(Guid serialId); 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); }