using FastEndpoints; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Framework.ResponseStandard; using GB5Shared.FastEndPoint; using QMSBLL.Matrix; using static GB5Shared.GB5Constant.Constant; namespace QMSSL.EndPoints.Matrix; public class GetAvailableBatches : BaseEndpoint> { private readonly IMatrixBLL _bll; public GetAvailableBatches(IMatrixBLL bll) => _bll = bll; public override void Configure() { Get("/Matrix/GetAvailableBatches"); AllowAnonymous(); Description(x => x .WithTags("Matrix") .WithSummary("Get Available Batches") .WithDescription("Returns available RM/BO stock batches for a given Item and SKU. Optionally filter by RequiredQty to surface shortage information. Used on the matrix input line to let the user pick which batch to allocate for consumption. Returns FreeQty (current stock) and ShortageQty per batch.")); } public record Params( [property: FromHeader] string Login, [property: QueryParam] int ItemId, [property: QueryParam] int SkuId, [property: QueryParam] decimal? RequiredQty); protected override string? GetCacheKey(Params req, LoginDTO login) => KeyGenerator.KeyGeneration( new { req.ItemId, req.SkuId, req.RequiredQty }, 0, CacheKeyLevel.CLIENT_LEVEL, login); protected override async Task> ExecuteAsync( Params req, LoginDTO login, CancellationToken ct) { try { var result = await _bll.GetAvailableBatchesAsync( req.ItemId, req.SkuId, req.RequiredQty, login, ct); return await GB5Shared.ResponseStandard.Response .CreateSuccessResponse(result, CacheKeyLevel.CLIENT_LEVEL, login); } catch (Exception ex) { return await GB5Shared.ResponseStandard.Response .CreateExceptionError(ex, CacheKeyLevel.CLIENT_LEVEL, login, ex.Message, 500); } } }