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 ValidateIssue : BaseEndpoint> { private readonly IMatrixBLL _bll; public ValidateIssue(IMatrixBLL bll) => _bll = bll; public override void Configure() { Get("/Matrix/ValidateIssue"); AllowAnonymous(); Description(x => x .WithTags("Matrix") .WithSummary("Validate Issue") .WithDescription("Validates whether a material issue is allowed for the given Indent, Item, Lot, and Qty. Checks the active matrix input line for the indent to verify the batch is allocated, the quantity does not exceed the planned amount, and the line is not already fully consumed or cancelled. Returns Allow/Reject with reason and remaining quantities.")); } public record Params( [property: FromHeader] string Login, [property: QueryParam] int IndentId, [property: QueryParam] int ItemId, [property: QueryParam] int LotId, [property: QueryParam] decimal Qty); // ValidateIssue is transactional — no caching (result changes as issues are posted) protected override string? GetCacheKey(Params req, LoginDTO login) => null; protected override async Task> ExecuteAsync( Params req, LoginDTO login, CancellationToken ct) { try { var result = await _bll.ValidateIssueAsync( req.IndentId, req.ItemId, req.LotId, req.Qty, login, ct); return await GB5Shared.ResponseStandard.Response .CreateSuccessResponse(result, CacheKeyLevel.NOT_REQUIRED, login); } catch (Exception ex) { return await GB5Shared.ResponseStandard.Response .CreateExceptionError(ex, CacheKeyLevel.NOT_REQUIRED, login, ex.Message, 500); } } }