using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using MMDAL.CustomCode.ParameterPartyOverride; using MMDAL.DTO.ParameterPartyOverride; using System; using System.Threading; using System.Threading.Tasks; namespace MMBLL.ParameterPartyOverride { public class ParameterPartyOverrideBLL : IParameterPartyOverrideBLL { private readonly IParameterPartyOverrideDAL _dal; private readonly AutoNumber _autoNumber; public ParameterPartyOverrideBLL(IParameterPartyOverrideDAL dal, AutoNumber autoNumber) { _dal = dal; _autoNumber = autoNumber; } public async Task GetParameterPartyOverride(int parameterPartyOverrideId, LoginDTO loginDTO, CancellationToken ct) { try { return await _dal.GetParameterPartyOverride(parameterPartyOverrideId, loginDTO, ct).ConfigureAwait(false); } catch (Exception) { throw; } } public async Task GetParameterPartyOverrideList(int? partyId, int? itemId, int? parameterSetId, LoginDTO loginDTO, CancellationToken ct) { try { return await _dal.GetParameterPartyOverrideList(partyId, itemId, parameterSetId, loginDTO, ct).ConfigureAwait(false); } catch (Exception) { throw; } } // Upsert by (PartyId, ItemId, ParameterSetId, ParameterId) — the caller edits // Min/Max on the Inspection Parameters screen and never needs to know whether // an override row already exists; this resolves that for them. public async Task SaveParameterThreshold(ParameterPartyOverrideDTO dto, LoginDTO loginDTO, CancellationToken ct) { if (dto == null) throw new ArgumentNullException(nameof(dto)); // PartyId is a real AutoNumber ID here (negative, e.g. -1499997477) — only // 0 (unset) is invalid. Do NOT reject negative values. if (dto.PartyId == 0) throw new ArgumentException("PartyId is required.", nameof(dto.PartyId)); if (dto.ParameterSetId == 0) throw new ArgumentException("ParameterSetId is required.", nameof(dto.ParameterSetId)); if (dto.ParameterId == 0) throw new ArgumentException("ParameterId is required.", nameof(dto.ParameterId)); if (dto.ItemId == 0) dto.ItemId = -1; AutoNumberDTO? autoNumberDTO = null; try { var existing = await _dal.GetParameterPartyOverrideByScope( dto.PartyId, dto.ItemId, dto.ParameterSetId, dto.ParameterId, loginDTO, ct).ConfigureAwait(false); dto.ModifiedById = loginDTO.UserId; dto.ModifiedOn = DateTime.UtcNow; if (existing == null) { autoNumberDTO = await _autoNumber.GetNumberAsync(1, "PARAMETERPARTYOVERRIDE", loginDTO); dto.ParameterPartyOverrideId = autoNumberDTO.StartNumber; dto.Status = 1; dto.Version = 1; dto.CreatedById = loginDTO.UserId; dto.CreatedOn = DateTime.UtcNow; await _dal.SaveParameterPartyOverride(dto, loginDTO, ct).ConfigureAwait(false); return $"{SuccessResponse.SaveSuccess}"; } else { dto.ParameterPartyOverrideId = existing.ParameterPartyOverrideId; dto.Version = (short)(existing.Version + 1); await _dal.UpdateParameterPartyOverride(dto, loginDTO, ct).ConfigureAwait(false); return $"{SuccessResponse.UpdateSuccess}"; } } catch { if (autoNumberDTO != null && dto.ParameterPartyOverrideId > 0) await _autoNumber.RollbackAutoNumber("PARAMETERPARTYOVERRIDE", autoNumberDTO.StartNumber, loginDTO); throw; } } public async Task DeleteParameterPartyOverride(int parameterPartyOverrideId, LoginDTO loginDTO, CancellationToken ct) { try { await _dal.DeleteParameterPartyOverride(parameterPartyOverrideId, loginDTO, ct).ConfigureAwait(false); return $"{SuccessResponse.DeleteSuccessMessage}"; } catch (Exception ex) { throw new Exception($"Error deleting ParameterPartyOverride ID {parameterPartyOverrideId}", ex); } } } }