using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.Resource.Response; using GB5Shared.Validation; using System.ComponentModel.DataAnnotations; using System.Text.Json; using TMSDAL.CustomCode.CertRenewalAlert; using TMSDAL.DTO.CertRenewalAlert; namespace TMSBLL.CertRenewalAlert { public class CertRenewalAlertBLL : ICertRenewalAlertBLL { private readonly ICertRenewalAlertDAL _CertRenewalAlertDAL; private readonly IValidation _Validation; public CertRenewalAlertBLL( ICertRenewalAlertDAL certRenewalAlertDAL, IValidation validation) { _CertRenewalAlertDAL = certRenewalAlertDAL; _Validation = validation; } // ===================================================== // GET SINGLE // ===================================================== public async Task GetCertRenewalAlert(int lCertRenewalAlertId, LoginDTO loginDTO) { try { return await _CertRenewalAlertDAL.GetCertRenewalAlert(lCertRenewalAlertId, loginDTO); } catch (Exception) { throw; } } // ===================================================== // GET LIST BY CERTIFICATE // ===================================================== public async Task GetCertRenewalAlertList(int trainingCertificateId, LoginDTO loginDTO) { try { return await _CertRenewalAlertDAL.GetCertRenewalAlertList(trainingCertificateId, loginDTO); } catch (Exception) { throw; } } // ===================================================== // GET SELECTLIST — Criteria Based // ===================================================== public async Task GetSelectListCertRenewalAlert(CriteriaDTO criteriaDTO, LoginDTO loginDTO) => await _CertRenewalAlertDAL.GetSelectListCertRenewalAlert(criteriaDTO, loginDTO); // ===================================================== // SAVE — LOG table // No AutoNumber — IDENTITY PK assigned by SQL Server. // No cache invalidation — log tables are never cached. // No rollback needed — nothing to roll back on IDENTITY insert. // ===================================================== public async Task SaveCertRenewalAlert(CertRenewalAlertDTO dto, LoginDTO loginDTO) { if (dto == null) throw new ArgumentNullException(nameof(dto)); try { // ── Validations ────────────────────────────────────────────── await _Validation.NotEmpty(dto.TrainingCertificateId.ToString(), nameof(dto.TrainingCertificateId)); await _Validation.NotEmpty(dto.ScheduledAt.ToString(), nameof(dto.ScheduledAt)); // ── BLL-managed fields ─────────────────────────────────────── dto.CreatedById = loginDTO.UserId; dto.CreatedOn = DateTime.UtcNow; // ── No AutoNumber — IDENTITY PK set by SQL Server ──────────── await _CertRenewalAlertDAL.SaveCertRenewalAlert(dto, loginDTO); // CertificateNumber/CertificateTitle are joined display fields from the // parent certificate — not sent by the client on insert, so re-fetch. var listJson = await _CertRenewalAlertDAL.GetCertRenewalAlertList(dto.TrainingCertificateId, loginDTO); var list = JsonSerializer.Deserialize>( listJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); var certificate = list?.FirstOrDefault(); return string.Format(SuccessResponse.SaveSuccessWithCodeAndName, certificate?.CertificateNumber, certificate?.CertificateTitle); } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { throw; } } } }