using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Logging; using GB5Shared.DTO.Framework.Login; using GB5Shared.GB5Exception; using GB5Shared.QueryExecutor; using Microsoft.AspNetCore.SignalR.Protocol; using Newtonsoft.Json; using PayRollDAL.CustomeCode.DailyAttendance; using PayRollDAL.DTO.DailyAttendance; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static GB5Shared.GB5Constant.Constant; namespace PayRollBLL.DailyAttendance { public class DailyAttendanceBLL : IDailyAttendanceBLL { private readonly IDailyAttendanceDAL _DailyAttendanceDAL; public DailyAttendanceBLL(IDailyAttendanceDAL dailyAttendanceDAL) { _DailyAttendanceDAL = dailyAttendanceDAL; } public async Task> GetDailyAttendance( int FirstNumber, int MaxResult, int UpdateDailyAttendance, DailyAttendanceFilterDTO DailyAttendanceFilterDTO, LoginDTO LoginDTO) { try { if (DailyAttendanceFilterDTO == null) throw new NotFoundException(); int firstNumber = FirstNumber == -1 ? 0 : FirstNumber; int maxResult = MaxResult == -1 ? int.MaxValue : MaxResult; var result = await _DailyAttendanceDAL.LoadDailyAttendanceFromPunch( DailyAttendanceFilterDTO, LoginDTO, firstNumber, maxResult, false); return result.ToList(); } catch (Exception) { throw; } } public async Task GetDailyAttendanceCount(DailyAttendanceFilterDTO DailyAttendanceFilterDTO, LoginDTO LoginDTO) { try { if (DailyAttendanceFilterDTO == null) throw new NotFoundException(); var result = await _DailyAttendanceDAL.LoadDailyAttendanceFromPunch( DailyAttendanceFilterDTO, LoginDTO, 0, 0, true); return result.FirstOrDefault()?.Count ?? 0; } catch (Exception) { throw; } } public async Task UpdateDailyAttendanceFromPunch(DailyAttendanceFilterDTO DailyAttendanceFilterDTO, LoginDTO LoginDTO) { try { if (DailyAttendanceFilterDTO == null) throw new NotFoundException(); await _DailyAttendanceDAL.LoadAndUpdateDailyAttendanceFromPunch(DailyAttendanceFilterDTO, LoginDTO); } catch (Exception) { throw; } } // GB4 parity: DailyAttendanceBLL.DayTypeUpdateInAttendance. public async Task UpdateAttendanceDayType(int Type, DailyAttendanceFilterDTO DailyAttendanceFilterDTO, LoginDTO LoginDTO) { try { if (DailyAttendanceFilterDTO == null) throw new NotFoundException(); return await _DailyAttendanceDAL.UpdateAttendanceDayType(Type, DailyAttendanceFilterDTO, LoginDTO); } catch (Exception) { throw; } } // GB4 parity: DailyAttendanceBLL.GetDayTypeBeforeApplyingLevaeOrTimeSlip. // LeaveId comes from CriteriaDTO section 0 (not a method parameter) — mandatory, // used to look up whether that leave type includes holidays/week-offs. public async Task> GetDayTypeBeforeApplyingLeaveOrTimeSlip(int EmployeeId, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { int leaveId = -1; if (CriteriaDTO?.SectionCriteriaList != null && CriteriaDTO.SectionCriteriaList.Count > 0) { var attributes = CriteriaDTO.SectionCriteriaList[0].AttributesCriteriaList ?? new(); foreach (var attr in attributes) { if (string.Equals(attr?.FieldName, "leaveid", StringComparison.OrdinalIgnoreCase)) { int.TryParse(attr?.FieldValue?.ToString(), out leaveId); } } } if (leaveId == -1) throw new MethodNotAllowedException("Leave to be supplied for getting record.. "); byte includeHoliday = await _DailyAttendanceDAL.GetLeaveIncludeHoliday(leaveId, LoginDTO); return await _DailyAttendanceDAL.GetAttendanceDayTypeForEmployee( EmployeeId, CriteriaDTO, LoginDTO, includeHoliday == 0); } catch (Exception) { throw; } } public async Task GetDailyAttendanceEmployeeDetail(int EmployeeId, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { string json = await _DailyAttendanceDAL.GetDailyAttendanceEmployeeDetail(EmployeeId, CriteriaDTO, LoginDTO); List dailyAttendanceDTOs = JsonConvert.DeserializeObject>(json); short shiftMinutes = await _DailyAttendanceDAL.GetEmployeeShift(EmployeeId, LoginDTO); for (int k = 0; k < dailyAttendanceDTOs.Count; k++) { dailyAttendanceDTOs[k].DailyAttendanceCalInTime = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceInTime).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalOutTime = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceOutTime).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalEarlyIn = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceEarlyIn).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalEarlyOut = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceEarlyOut).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalWorkedHours = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceWorkedHours).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalShiftMins = TimeSpan.FromMinutes(shiftMinutes).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalShortHours = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceShortHours).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalExtraHours = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceExtraHours).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalLateIn = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceLateIn).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalLateOut = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceLateOut).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalOtHours = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceOtHours).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalBusHours = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendanceBusHours).ToString(@"hh\:mm"); dailyAttendanceDTOs[k].DailyAttendanceCalPerHours = TimeSpan.FromMinutes(dailyAttendanceDTOs[k].DailyAttendancePerHours).ToString(@"hh\:mm"); } string jsonResult = JsonConvert.SerializeObject(dailyAttendanceDTOs); return jsonResult; } catch (Exception) { throw; } } public async Task<(List Items, int Total)> GetDailyAttendanceMultipleEmployee( int firstNumber, int maxResult, CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct) { return await _DailyAttendanceDAL.GetDailyAttendanceMultipleEmployee( firstNumber, maxResult, criteriaDTO, loginDTO, ct).ConfigureAwait(false); } } }