using System; using System.ComponentModel.DataAnnotations; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using FrameworkDAL.CustomCode.Validation; using FrameworkDAL.DTO.Validation; namespace FrameworkBLL.Validation { public class ValidationCriteriaBLL : IValidationCriteriaBLL { private readonly IValidationCriteriaDAL _ValidationCriteriaDAL; private readonly AutoNumber _AutoNumber; public ValidationCriteriaBLL(IValidationCriteriaDAL validationCriteriaDAL, AutoNumber autoNumber) { _ValidationCriteriaDAL = validationCriteriaDAL; _AutoNumber = autoNumber; } public async Task GetValidationCriteria(int validationCriteriaId, LoginDTO loginDTO) { try { return await _ValidationCriteriaDAL.GetValidationCriteria(validationCriteriaId, loginDTO); } catch (Exception) { throw; } } public async Task GetSelectListValidationCriteria(LoginDTO loginDTO) { try { return await _ValidationCriteriaDAL.GetSelectListValidationCriteria(loginDTO); } catch (Exception) { throw; } } public async Task SaveValidationCriteria(ValidationCriteriaDTO dto, LoginDTO loginDTO) { if (dto == null) throw new ArgumentNullException(nameof(dto)); AutoNumberDTO? autoNumberDTO = null; try { if (dto.ValidationType < 1 || dto.ValidationType > 4) throw new ValidationException("ValidationType must be 1 (Skill), 2 (Quiz), 3 (ProgrammeAssessment), or 4 (Certification)."); if (dto.TargetId <= 0) throw new ValidationException("TargetId must be selected."); dto.TenantId = loginDTO.ClientId; dto.ModifiedById = loginDTO.UserId; dto.ModifiedOn = DateTime.UtcNow; string message; if (dto.ValidationCriteriaId == 0) { autoNumberDTO = await _AutoNumber.GetAutoNumber(1, "VALIDATIONCRITERIA", loginDTO); dto.ValidationCriteriaId = autoNumberDTO.StartNumber; dto.CreatedById = loginDTO.UserId; dto.CreatedOn = DateTime.UtcNow; dto.SourceType = loginDTO.SourceType; await _ValidationCriteriaDAL.SaveValidationCriteria(dto, loginDTO); message = $"{SuccessResponse.SaveSuccessMessage} {dto.ValidationCriteriaId}"; } else { await _ValidationCriteriaDAL.UpdateValidationCriteria(dto, loginDTO); message = $"{SuccessResponse.UpdateSuccessMessage} {dto.ValidationCriteriaId}"; } return message; } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { if (autoNumberDTO != null && dto.ValidationCriteriaId > 0) await _AutoNumber.RollbackAutoNumber("VALIDATIONCRITERIA", dto.ValidationCriteriaId, loginDTO); throw; } } public async Task DeleteValidationCriteria(int validationCriteriaId, LoginDTO loginDTO) { try { return await _ValidationCriteriaDAL.DeleteValidationCriteria(validationCriteriaId, loginDTO); } catch (Exception) { throw; } } } }