using System.ComponentModel.DataAnnotations; using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.Validation; using TMSDAL.CustomCode.TrainingAttendance; using TMSDAL.DTO.TrainingAttendance; using TMSDAL.Enums; namespace TMSBLL.TrainingAttendance { public class TrainingAttendanceBLL : ITrainingAttendanceBLL { private readonly ITrainingAttendanceDAL _TrainingAttendanceDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; public TrainingAttendanceBLL(ITrainingAttendanceDAL trainingAttendanceDAL, AutoNumber autoNumber, IValidation validation) { _TrainingAttendanceDAL = trainingAttendanceDAL; _AutoNumber = autoNumber; _Validation = validation; } public async Task GetSessionAttendance(int instanceSessionId, LoginDTO loginDTO) { try { return await _TrainingAttendanceDAL.GetSessionAttendance(instanceSessionId, loginDTO); } catch (Exception) { throw; } } public async Task GetTrainingAttendanceList(LoginDTO loginDTO) { try { return await _TrainingAttendanceDAL.GetTrainingAttendanceList(loginDTO); } catch (Exception) { throw; } } public async Task SaveAttendanceBulk(AttendanceBulkDTO dto, LoginDTO loginDTO) { if (dto == null) throw new ArgumentNullException(nameof(dto)); try { if (dto.InstanceSessionId == 0) throw new ValidationException("InstanceSessionId is required."); if (dto.Records == null || dto.Records.Count == 0) throw new ValidationException("At least one attendance record is required."); var markedOn = DateTime.UtcNow; var autoNumber = await _AutoNumber.GetAutoNumber(dto.Records.Count, "TRAININGATTENDANCE", loginDTO); int nextId = autoNumber.StartNumber; foreach (var record in dto.Records) { record.AttendanceId = nextId++; record.InstanceSessionId = dto.InstanceSessionId; record.RecordedById = loginDTO.UserId; record.RecordedOn = markedOn; if (!Enum.IsDefined(typeof(AttendanceStatus), record.AttendanceStatus)) throw new ValidationException($"Invalid AttendanceStatus for this AttendanceId {record.AttendanceId}."); } // Delete existing records for the session then bulk insert await _TrainingAttendanceDAL.DeleteSessionAttendance(dto.InstanceSessionId, loginDTO); await _TrainingAttendanceDAL.SaveAttendanceBulk(dto.Records, loginDTO); return $"{SuccessResponse.SaveSuccessMessage} {dto.Records.Count} records"; } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { throw; } } } }