using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.Validation; using System.ComponentModel.DataAnnotations; using System.Text.Json; using TMSDAL.CustomCode.EvaluationInstance; using TMSDAL.DTO.Evaluation; using TMSDAL.DTO.EvaluationInstance; namespace TMSBLL.EvaluationInstance { public class EvaluationInstanceBLL : IEvaluationInstanceBLL { private readonly IEvaluationInstanceDAL _EvaluationInstanceDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; public EvaluationInstanceBLL( IEvaluationInstanceDAL evaluationInstanceDAL, AutoNumber autoNumber, IValidation validation) { _EvaluationInstanceDAL = evaluationInstanceDAL; _AutoNumber = autoNumber; _Validation = validation; } public async Task GetEvaluationInstance(int evaluationInstanceId, LoginDTO loginDTO) { try { return await _EvaluationInstanceDAL.GetEvaluationInstance(evaluationInstanceId, loginDTO); } catch (Exception) { throw; } } public async Task GetEvaluationInstanceList(CriteriaDTO criteriaDTO, LoginDTO loginDTO) => await _EvaluationInstanceDAL.GetEvaluationInstanceList(criteriaDTO, loginDTO); public async Task SaveEvaluationInstance(EvaluationInstanceDTO dto, LoginDTO loginDTO) { if (dto == null) throw new ArgumentNullException(nameof(dto)); AutoNumberDTO? autoNumberDTO = null; try { await _Validation.NotEmpty(dto.EvaluationPlanId.ToString(), nameof(dto.EvaluationPlanId)); await _Validation.NotEmpty(dto.EvaluationTemplateId.ToString(), nameof(dto.EvaluationTemplateId)); await _Validation.NotEmpty(dto.EmployeeId.ToString(), nameof(dto.EmployeeId)); dto.TenantId = loginDTO.ClientId; dto.ModifiedById = loginDTO.UserId; dto.ModifiedOn = DateTime.UtcNow; dto.EvalStatus = 0; dto.ReminderSentCount = 0; dto.SourceType = 5; autoNumberDTO = await _AutoNumber.GetAutoNumber(1, "EVALUATIONINSTANCE", loginDTO); dto.EvaluationInstanceId = autoNumberDTO.StartNumber; dto.CreatedById = loginDTO.UserId; dto.CreatedOn = DateTime.UtcNow; await _EvaluationInstanceDAL.SaveEvaluationInstance(dto, loginDTO); var savedJson = await _EvaluationInstanceDAL.GetEvaluationInstance(dto.EvaluationInstanceId, loginDTO); var saved = JsonSerializer.Deserialize( savedJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); return string.Format(SuccessResponse.SaveSuccessWithName, saved?.EmployeeName); } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { if (autoNumberDTO != null && dto.EvaluationInstanceId > 0) await _AutoNumber.RollbackAutoNumber("EVALUATIONINSTANCE", dto.EvaluationInstanceId, loginDTO); throw; } } public async Task UpdateEvaluationInstanceStatus(EvaluationInstanceDTO dto, LoginDTO loginDTO) { if (dto == null) throw new ArgumentNullException(nameof(dto)); try { dto.TenantId = loginDTO.ClientId; dto.ModifiedById = loginDTO.UserId; dto.ModifiedOn = DateTime.UtcNow; await _EvaluationInstanceDAL.UpdateEvaluationInstanceStatus(dto, loginDTO); var savedJson = await _EvaluationInstanceDAL.GetEvaluationInstance(dto.EvaluationInstanceId, loginDTO); var saved = JsonSerializer.Deserialize( savedJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); return string.Format(SuccessResponse.UpdateSuccessWithName, saved?.EmployeeName); } catch (Exception) { throw; } } public async Task DeleteEvaluationInstance(int evaluationInstanceId, LoginDTO loginDTO) { try { return await _EvaluationInstanceDAL.DeleteEvaluationInstance(evaluationInstanceId, loginDTO); } catch (Exception) { throw; } } } }