using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using TMSDAL.DTO.TrainingEnrollment; namespace TMSDAL.CustomCode.TrainingEnrollment { public interface ITrainingEnrollmentDAL { // ════════════════════════════════════════════════════════════════════ // READ // ════════════════════════════════════════════════════════════════════ /// Fetch full enrollment record by primary key. Task GetTrainingEnrollment(int enrollmentId, LoginDTO loginDTO); /// /// Fetch ACTIVE enrollment by (InstanceId + EmployeeId + TenantId). /// Returns null if no active enrollment exists. /// Withdrawn / Rejected rows excluded — re-enrollment after those states is allowed. /// Task GetEnrollment(int instanceId, int employeeId, LoginDTO loginDTO); /// All enrollments for a training instance (JSON). Task GetEnrollmentsByInstance(int instanceId, LoginDTO loginDTO); /// All enrollments for an employee (JSON). Task GetEnrollmentsByEmployee(int employeeId, LoginDTO loginDTO); /// Full tenant enrollment list (JSON). Task GetEnrollmentList(LoginDTO loginDTO); /// Paged / filtered dropdown select-list (JSON). Task GetSelectList(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct); /// /// Next available waitlist position for an instance. /// Returns MAX(WaitlistPosition) + 1, or 1 if none waitlisted. /// Task GetNextWaitlistPosition(int instanceId, LoginDTO loginDTO); // ════════════════════════════════════════════════════════════════════ // WRITE // ════════════════════════════════════════════════════════════════════ /// /// Insert a new enrollment. Returns Task — rows-affected not meaningful here. /// Task SaveTrainingEnrollment(TrainingEnrollmentDTO dto, LoginDTO loginDTO); /// /// Unified Manager + HR approval / rejection. /// ApprovalType on the DTO routes to the correct query and column set. /// Task UpdateApproval(ApprovalUpdateDTO approvalDto, LoginDTO loginDTO); /// /// Withdraw an enrollment. /// Status must always be EnrollmentStatus.Withdrawn — enforced by BLL. /// Task WithdrawEnrollment(int enrollmentId, byte status, string? reason, LoginDTO loginDTO); /// /// Soft-delete: sets STATUS = 0. /// Hard delete not permitted — history must be preserved. /// Task DeleteTrainingEnrollment(int enrollmentId, LoginDTO loginDTO); } }