diff --git a/src/main/java/com/gcc/commissionerreview/service/AttendanceService.java b/src/main/java/com/gcc/commissionerreview/service/AttendanceService.java index b3da1a8..58f3bf0 100644 --- a/src/main/java/com/gcc/commissionerreview/service/AttendanceService.java +++ b/src/main/java/com/gcc/commissionerreview/service/AttendanceService.java @@ -2,6 +2,8 @@ package com.gcc.commissionerreview.service; import javax.sql.DataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; @@ -9,7 +11,9 @@ import org.springframework.stereotype.Service; import java.sql.Date; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; @@ -17,352 +21,398 @@ import java.util.Map; @Service public class AttendanceService { + private static final Logger logger = LoggerFactory.getLogger(AttendanceService.class); + @Autowired private JdbcTemplate jdbcTemplate; @Autowired public void setDataSource(@Qualifier("mysqlNULMDataSource") DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); + try { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } catch (Exception e) { + logger.error("Method: setDataSource | Parameters: dataSource={} | Date: {} | Exception: {} - {}", + dataSource, LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); + } } private static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy", Locale.ENGLISH); public List> getAbstractCounts() { - String sql = "SELECT emp_type, COUNT(enrollment_id) AS totalCount, " - + "SUM(CASE WHEN facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " - + "SUM(CASE WHEN facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " - + "FROM enrollment_table " - + "WHERE isactive = 1 AND isdelete = 0 AND zone != 0 and emp_type ='Park' " - + "GROUP BY emp_type"; - - return jdbcTemplate.queryForList(sql); + try { + String sql = "SELECT emp_type, COUNT(enrollment_id) AS totalCount, " + + "SUM(CASE WHEN facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " + + "SUM(CASE WHEN facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " + + "FROM enrollment_table " + + "WHERE isactive = 1 AND isdelete = 0 AND zone != 0 and emp_type ='Park' " + + "GROUP BY emp_type"; + + return jdbcTemplate.queryForList(sql); + } catch (Exception e) { + logger.error("Method: getAbstractCounts | Parameters: none | Date: {} | Exception: {} - {}", + LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); + return Collections.emptyList(); + } } public List> getZoneWisePercentage(String fromDateStr, String toDateStr) { - LocalDate fromDate; - LocalDate toDate; + try { + LocalDate fromDate; + LocalDate toDate; + + if (fromDateStr == null || fromDateStr.trim().isEmpty()) { + fromDate = LocalDate.now(); + } else { + fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); + } - if (fromDateStr == null || fromDateStr.trim().isEmpty()) { - fromDate = LocalDate.now(); - } else { - fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); - } + if (toDateStr == null || toDateStr.trim().isEmpty()) { + toDate = LocalDate.now(); + } else { + toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); + } - if (toDateStr == null || toDateStr.trim().isEmpty()) { - toDate = LocalDate.now(); - } else { - toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); - } + String fromDateFormatted = fromDate.toString(); + String toDateFormatted = toDate.toString(); - String fromDateFormatted = fromDate.toString(); - String toDateFormatted = toDate.toString(); - - String sql = "WITH count_data AS ( " - + "SELECT pd.region_id, " - + "COUNT(et.enrollment_id) AS total_count, " - + "SUM(CASE WHEN et.facial_attendance = 1 THEN 1 ELSE 0 END) AS facial_registered_count, " - + "SUM(CASE WHEN att.indatetime IS NOT NULL OR att.oddatetime IS NOT NULL THEN 1 ELSE 0 END) AS present_od_count " - + "FROM enrollment_table et " - + "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " - + "AND (DATE(att.indatetime) BETWEEN ? AND ? " - + "OR DATE(att.oddatetime) BETWEEN ? AND ?) " - + "LEFT JOIN park_details pd ON et.park_id = pd.park_id " - + "WHERE et.isactive = 1 AND et.emp_type = 'Park' AND pd.park_id != '' " - + "GROUP BY pd.region_id " - + ") " - + "SELECT cd.region_id, " - + "CASE WHEN cd.region_id = 1 THEN 'North Zone' " - + "WHEN cd.region_id = 2 THEN 'Central Zone' " - + "WHEN cd.region_id = 3 THEN 'South Zone' END AS ZoneName, " - + "cd.total_count AS totalCount, " - + "cd.facial_registered_count AS facialRegisteredCount, " - + "cd.present_od_count AS presentOdCount, " - + "CASE WHEN cd.total_count > 0 " - + "THEN ROUND((CAST(cd.facial_registered_count AS DECIMAL) / cd.total_count) * 100, 2) " - + "ELSE 0 END AS facialPercentage, " - + "CASE WHEN cd.facial_registered_count > 0 " - + "THEN ROUND((CAST(cd.present_od_count AS DECIMAL) / cd.facial_registered_count) * 100, 2) " - + "ELSE 0 END AS presentPercentage " - + "FROM count_data cd " - + "ORDER BY cd.region_id"; - - return jdbcTemplate.queryForList(sql, new Object[] { - fromDateFormatted, toDateFormatted, - fromDateFormatted, toDateFormatted }); + String sql = "WITH count_data AS ( " + + "SELECT pd.region_id, " + + "COUNT(et.enrollment_id) AS total_count, " + + "SUM(CASE WHEN et.facial_attendance = 1 THEN 1 ELSE 0 END) AS facial_registered_count, " + + "SUM(CASE WHEN att.indatetime IS NOT NULL OR att.oddatetime IS NOT NULL THEN 1 ELSE 0 END) AS present_od_count " + + "FROM enrollment_table et " + + "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " + + "AND (DATE(att.indatetime) BETWEEN ? AND ? " + + "OR DATE(att.oddatetime) BETWEEN ? AND ?) " + + "LEFT JOIN park_details pd ON et.park_id = pd.park_id " + + "WHERE et.isactive = 1 AND et.emp_type = 'Park' AND pd.park_id != '' " + + "GROUP BY pd.region_id " + + ") " + + "SELECT cd.region_id, " + + "CASE WHEN cd.region_id = 1 THEN 'North Zone' " + + "WHEN cd.region_id = 2 THEN 'Central Zone' " + + "WHEN cd.region_id = 3 THEN 'South Zone' END AS ZoneName, " + + "cd.total_count AS totalCount, " + + "cd.facial_registered_count AS facialRegisteredCount, " + + "cd.present_od_count AS presentOdCount, " + + "CASE WHEN cd.total_count > 0 " + + "THEN ROUND((CAST(cd.facial_registered_count AS DECIMAL) / cd.total_count) * 100, 2) " + + "ELSE 0 END AS facialPercentage, " + + "CASE WHEN cd.facial_registered_count > 0 " + + "THEN ROUND((CAST(cd.present_od_count AS DECIMAL) / cd.facial_registered_count) * 100, 2) " + + "ELSE 0 END AS presentPercentage " + + "FROM count_data cd " + + "ORDER BY cd.region_id"; + + return jdbcTemplate.queryForList(sql, new Object[] { + fromDateFormatted, toDateFormatted, + fromDateFormatted, toDateFormatted }); + } catch (Exception e) { + logger.error( + "Method: getZoneWisePercentage | Parameters: fromDateStr={}, toDateStr={} | Date: {} | Exception: {} - {}", + fromDateStr, toDateStr, LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); + return Collections.emptyList(); + } } public List> getZoneSummary(String empType, String fromDateStr, String toDateStr) { - LocalDate fromDate; - LocalDate toDate; + try { + LocalDate fromDate; + LocalDate toDate; + + if (fromDateStr == null || fromDateStr.trim().isEmpty()) { + fromDate = LocalDate.now(); + } else { + fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); + } - if (fromDateStr == null || fromDateStr.trim().isEmpty()) { - fromDate = LocalDate.now(); - } else { - fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); - } + if (toDateStr == null || toDateStr.trim().isEmpty()) { + toDate = LocalDate.now(); + } else { + toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); + } - if (toDateStr == null || toDateStr.trim().isEmpty()) { - toDate = LocalDate.now(); - } else { - toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); + String fromDateTime = fromDate + " 00:00:00"; + String toDateTime = toDate + " 23:59:59"; + + System.out.println("EmpType: " + empType + ", From: " + fromDateTime + ", To: " + toDateTime); + + String sql = "WITH facial_data AS ( " + + "SELECT zone, " + + "SUM(CASE WHEN facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " + + "SUM(CASE WHEN facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " + + "FROM enrollment_table " + + "WHERE isactive = 1 AND isdelete = 0 AND emp_type = ? AND zone != 0 " + + "GROUP BY zone " + + ") " + + "SELECT et.zone, " + + "COUNT(DISTINCT et.enrollment_id) AS TotalCount, " + + "COALESCE(fd.facialRegistered, 0) AS facialRegistered, " + + "COALESCE(fd.facialNotRegistered, 0) AS facialNotRegistered, " + + "COUNT(DISTINCT CASE WHEN att.indatetime >= ? AND att.indatetime <= ? THEN att.enrollment_id END) AS AttendanceMarked, " + + "COUNT(DISTINCT CASE WHEN att.oddatetime >= ? AND att.oddatetime <= ? THEN att.enrollment_id END) AS ODCount, " + + "COUNT(DISTINCT CASE WHEN att.leavedatetime >= ? AND att.leavedatetime <= ? THEN att.enrollment_id END) AS LeaveCount, " + + "COUNT(distinct et.incharge_id) AS SupervisorCount " + + "FROM enrollment_table et " + + "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " + + "LEFT JOIN facial_data fd ON et.zone = fd.zone " + + "LEFT JOIN park_details pd ON et.incharge_id = pd.supervisor_id AND pd.is_active = 1 AND pd.is_delete = 0 " + + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 " + + "GROUP BY et.zone, fd.facialRegistered, fd.facialNotRegistered " + + "ORDER BY et.zone"; + + return jdbcTemplate.queryForList(sql, new Object[] { empType, fromDateTime, toDateTime, fromDateTime, + toDateTime, fromDateTime, toDateTime, empType }); + } catch (Exception e) { + logger.error( + "Method: getZoneSummary | Parameters: empType={}, fromDateStr={}, toDateStr={} | Date: {} | Exception: {} - {}", + empType, fromDateStr, toDateStr, LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); + return Collections.emptyList(); } - - String fromDateTime = fromDate + " 00:00:00"; - String toDateTime = toDate + " 23:59:59"; - - System.out.println("EmpType: " + empType + ", From: " + fromDateTime + ", To: " + toDateTime); - - String sql = "WITH facial_data AS ( " - + "SELECT zone, " - + "SUM(CASE WHEN facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " - + "SUM(CASE WHEN facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " - + "FROM enrollment_table " - + "WHERE isactive = 1 AND isdelete = 0 AND emp_type = ? AND zone != 0 " - + "GROUP BY zone " - + ") " - + "SELECT et.zone, " - + "COUNT(DISTINCT et.enrollment_id) AS TotalCount, " - + "COALESCE(fd.facialRegistered, 0) AS facialRegistered, " - + "COALESCE(fd.facialNotRegistered, 0) AS facialNotRegistered, " - + "COUNT(DISTINCT CASE WHEN att.indatetime >= ? AND att.indatetime <= ? THEN att.enrollment_id END) AS AttendanceMarked, " - + "COUNT(DISTINCT CASE WHEN att.oddatetime >= ? AND att.oddatetime <= ? THEN att.enrollment_id END) AS ODCount, " - + "COUNT(DISTINCT CASE WHEN att.leavedatetime >= ? AND att.leavedatetime <= ? THEN att.enrollment_id END) AS LeaveCount, " - + "COUNT(distinct et.incharge_id) AS SupervisorCount " - + "FROM enrollment_table et " - + "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " - + "LEFT JOIN facial_data fd ON et.zone = fd.zone " - + "LEFT JOIN park_details pd ON et.incharge_id = pd.supervisor_id AND pd.is_active = 1 AND pd.is_delete = 0 " - + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 " - + "GROUP BY et.zone, fd.facialRegistered, fd.facialNotRegistered " - + "ORDER BY et.zone"; - - return jdbcTemplate.queryForList(sql, new Object[] { empType, fromDateTime, toDateTime, fromDateTime, - toDateTime, fromDateTime, toDateTime, empType }); } public List> getDetailedList(String empType, String category, String fromDateStr, String toDateStr, Integer zone, String parkName) { - LocalDate fromDate; - LocalDate toDate; - - if (fromDateStr == null || fromDateStr.trim().isEmpty()) { - fromDate = LocalDate.now(); - } else { - fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); - } - - if (toDateStr == null || toDateStr.trim().isEmpty()) { - toDate = LocalDate.now(); - } else { - toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); - } - - String fromDateTime = fromDate + " 00:00:00"; - String toDateTime = toDate + " 23:59:59"; - - String dateColumn; - String filterDateColumn; - - if (category != null && category.equalsIgnoreCase("notmarked")) { - dateColumn = "att.indatetime"; - filterDateColumn = "att.indatetime"; - - String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, " - + "COALESCE(pd.park_name, '') AS park_name, et.park_id, emp.image as image " - + " FROM enrollment_table et " - + " LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " - + " LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " - + " WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 AND et.facial_attendance = 1 " - + " AND et.enrollment_id NOT IN (SELECT enrollment_id FROM attendance WHERE date(indatetime) BETWEEN ? AND ? " - + " OR date(oddatetime) BETWEEN ? AND ? OR date(leavedatetime) BETWEEN ? AND ?)"; - java.util.List params = new java.util.ArrayList<>(); - params.add(empType); - params.add(fromDate); - params.add(toDate); - params.add(fromDate); - params.add(toDate); - params.add(fromDate); - params.add(toDate); - - if (zone != null) { - sql += " AND et.zone = ? "; - params.add(zone); + try { + LocalDate fromDate; + LocalDate toDate; + + if (fromDateStr == null || fromDateStr.trim().isEmpty()) { + fromDate = LocalDate.now(); + } else { + fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); } - if (parkName != null && !parkName.isEmpty() && !parkName.equals("-")) { - sql += " AND et.park_id = ? "; - params.add(parkName); + if (toDateStr == null || toDateStr.trim().isEmpty()) { + toDate = LocalDate.now(); + } else { + toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); } - // sql += " order by " + dateColumn + " desc "; - - System.out.println("EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " - + toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); - return jdbcTemplate.queryForList(sql, params.toArray()); - } else if (category != null && category.equals("notregistered")) { - - String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, " - + "COALESCE(pd.park_name, '') AS park_name, et.park_id, emp.image as image " - + " FROM enrollment_table et " - + " LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " - + " LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " - + " WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 AND facial_attendance = 0 "; - java.util.List params = new java.util.ArrayList<>(); - params.add(empType); - - if (zone != null) { - sql += " AND et.zone = ? "; + String fromDateTime = fromDate + " 00:00:00"; + String toDateTime = toDate + " 23:59:59"; + + String dateColumn; + String filterDateColumn; + + if (category != null && category.equalsIgnoreCase("notmarked")) { + dateColumn = "att.indatetime"; + filterDateColumn = "att.indatetime"; + + String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, " + + "COALESCE(pd.park_name, '') AS park_name, et.park_id, emp.image as image " + + " FROM enrollment_table et " + + " LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " + + " LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " + + " WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 AND et.facial_attendance = 1 " + + " AND et.enrollment_id NOT IN (SELECT enrollment_id FROM attendance WHERE date(indatetime) BETWEEN ? AND ? " + + " OR date(oddatetime) BETWEEN ? AND ? OR date(leavedatetime) BETWEEN ? AND ?)"; + java.util.List params = new java.util.ArrayList<>(); + params.add(empType); + params.add(fromDate); + params.add(toDate); + params.add(fromDate); + params.add(toDate); + params.add(fromDate); + params.add(toDate); + + if (zone != null) { + sql += " AND et.zone = ? "; + params.add(zone); + } + + if (parkName != null && !parkName.isEmpty() && !parkName.equals("-")) { + sql += " AND et.park_id = ? "; + params.add(parkName); + } + + // sql += " order by " + dateColumn + " desc "; + + System.out.println( + "EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " + + toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); + return jdbcTemplate.queryForList(sql, params.toArray()); + } else if (category != null && category.equals("notregistered")) { + + String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, " + + "COALESCE(pd.park_name, '') AS park_name, et.park_id, emp.image as image " + + " FROM enrollment_table et " + + " LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " + + " LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " + + " WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 AND facial_attendance = 0 "; + java.util.List params = new java.util.ArrayList<>(); + params.add(empType); + + if (zone != null) { + sql += " AND et.zone = ? "; + params.add(zone); + } + + if (parkName != null && !parkName.isEmpty() && !parkName.equals("-")) { + sql += " AND et.park_id = ? "; + params.add(parkName); + } + + // sql += " order by " + dateColumn + " desc "; + + System.out.println( + "EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " + + toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); + return jdbcTemplate.queryForList(sql, params.toArray()); + + } else if (category != null && category.equalsIgnoreCase("supervisor")) { + + // String sql = "SELECT et.enrollment_id, et.name, et.designation, + // et.department, et.incharge_name, et.incharge_phoneno, emp.image as image " + // + "FROM enrollment_table et " + // + "LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " + // + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone + // != 0 " + // + "AND et.enrollment_id IN (SELECT supervisor_id FROM park_details WHERE + // is_active = 1 AND is_delete = 0) "; + String sql = "SELECT pd.supervisor_id, pd.supervisor_name as name, pd.supervisor_designation AS designation, " + + + " et.department, et.incharge_name, et.incharge_phoneno " + + "FROM ( " + + " SELECT DISTINCT supervisor_id, supervisor_name, supervisor_designation " + + " FROM park_details " + + " WHERE is_active = 1 AND is_delete = 0 AND zone = ? " + + ") pd " + + "LEFT JOIN ( " + + " SELECT DISTINCT incharge_id, department, incharge_name, incharge_phoneno " + + " FROM enrollment_table " + + " WHERE isactive = 1 AND isdelete = 0 and emp_type = ? " + + ") et ON pd.supervisor_id = et.incharge_id"; + java.util.List params = new java.util.ArrayList<>(); params.add(zone); + params.add(empType); + + // if (zone != null) { + // sql += " AND et.zone = ? "; + // params.add(zone); + // } + + // sql += " ORDER BY et.name "; + + System.out.println("Supervisor - EmpType: " + empType + ", From: " + fromDateTime + ", To: " + + toDateTime + ", Zone: " + zone); + return jdbcTemplate.queryForList(sql, params.toArray()); + + } else { + + switch (category == null ? "present" : category.toLowerCase()) { + case "od": + dateColumn = "att.oddatetime"; + filterDateColumn = "att.oddatetime"; + break; + case "leave": + dateColumn = "att.leavedatetime"; + filterDateColumn = "att.leavedatetime"; + break; + default: + dateColumn = "att.indatetime"; + filterDateColumn = "att.indatetime"; + } + + String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, et.emp_id, " + + "COALESCE(pd.park_name, '') AS park_name, et.park_id, " + + "IFNULL(att.appversion,'') as appversion, IFNULL(att.apptype,'') as apptype, IFNULL(att.location,'') as location, " + + "DATE_FORMAT(att.indatetime, '%d-%m-%Y %h:%i %p') as intime, att.inphoto as inphoto, att.inby, " + + "DATE_FORMAT(att.outdatetime, '%d-%m-%Y %h:%i %p') as outtime, att.outphoto as outphoto, att.outby, " + + "DATE_FORMAT(att.oddatetime, '%d-%m-%Y %h:%i %p') as odtime, att.odby, et.zone, " + + "DATE_FORMAT(att.leavedatetime, '%d-%m-%Y %h:%i %p') as leavedatetime, att.leaveby " + + "FROM enrollment_table et " + + "LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " + + "INNER JOIN attendance att ON et.enrollment_id = att.enrollment_id " + + " AND " + filterDateColumn + " >= ? AND " + filterDateColumn + " <= ? " + + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 " + + " AND " + filterDateColumn + " IS NOT NULL "; + + java.util.List params = new java.util.ArrayList<>(); + params.add(fromDateTime); + params.add(toDateTime); + params.add(empType); + + if (zone != null) { + sql += " AND et.zone = ? "; + params.add(zone); + } + + if (parkName != null && !parkName.isEmpty()) { + sql += " AND et.park_id = ? "; + params.add(parkName); + } + + sql += " order by " + dateColumn + " desc "; + + System.out.println( + "EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " + + toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); + return jdbcTemplate.queryForList(sql, params.toArray()); } + } catch (Exception e) { + logger.error( + "Method: getDetailedList | Parameters: empType={}, category={}, fromDateStr={}, toDateStr={}, zone={}, parkName={} | Date: {} | Exception: {} - {}", + empType, category, fromDateStr, toDateStr, zone, parkName, LocalDateTime.now(), + e.getClass().getName(), e.getMessage(), e); + return Collections.emptyList(); + } + } - if (parkName != null && !parkName.isEmpty() && !parkName.equals("-")) { - sql += " AND et.park_id = ? "; - params.add(parkName); + public List> getParkWiseSummary(String fromDateStr, String toDateStr, Integer zone) { + try { + LocalDate fromDate; + LocalDate toDate; + + if (fromDateStr == null || fromDateStr.trim().isEmpty()) { + fromDate = LocalDate.now(); + } else { + fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); } - // sql += " order by " + dateColumn + " desc "; - - System.out.println("EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " - + toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); - return jdbcTemplate.queryForList(sql, params.toArray()); - - } else if (category != null && category.equalsIgnoreCase("supervisor")) { - - // String sql = "SELECT et.enrollment_id, et.name, et.designation, - // et.department, et.incharge_name, et.incharge_phoneno, emp.image as image " - // + "FROM enrollment_table et " - // + "LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " - // + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone - // != 0 " - // + "AND et.enrollment_id IN (SELECT supervisor_id FROM park_details WHERE - // is_active = 1 AND is_delete = 0) "; - String sql = "SELECT pd.supervisor_id, pd.supervisor_name as name, pd.supervisor_designation AS designation, " - + - " et.department, et.incharge_name, et.incharge_phoneno " + - "FROM ( " + - " SELECT DISTINCT supervisor_id, supervisor_name, supervisor_designation " + - " FROM park_details " + - " WHERE is_active = 1 AND is_delete = 0 AND zone = ? " + - ") pd " + - "LEFT JOIN ( " + - " SELECT DISTINCT incharge_id, department, incharge_name, incharge_phoneno " + - " FROM enrollment_table " + - " WHERE isactive = 1 AND isdelete = 0 and emp_type = ? " + - ") et ON pd.supervisor_id = et.incharge_id"; - java.util.List params = new java.util.ArrayList<>(); - params.add(zone); - params.add(empType); - - // if (zone != null) { - // sql += " AND et.zone = ? "; - // params.add(zone); - // } - - // sql += " ORDER BY et.name "; - - System.out.println("Supervisor - EmpType: " + empType + ", From: " + fromDateTime + ", To: " - + toDateTime + ", Zone: " + zone); - return jdbcTemplate.queryForList(sql, params.toArray()); - - } else { - - switch (category == null ? "present" : category.toLowerCase()) { - case "od": - dateColumn = "att.oddatetime"; - filterDateColumn = "att.oddatetime"; - break; - case "leave": - dateColumn = "att.leavedatetime"; - filterDateColumn = "att.leavedatetime"; - break; - default: - dateColumn = "att.indatetime"; - filterDateColumn = "att.indatetime"; + if (toDateStr == null || toDateStr.trim().isEmpty()) { + toDate = LocalDate.now(); + } else { + toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); } - String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, et.emp_id, " - + "COALESCE(pd.park_name, '') AS park_name, et.park_id, " - + "IFNULL(att.appversion,'') as appversion, IFNULL(att.apptype,'') as apptype, IFNULL(att.location,'') as location, " - + "DATE_FORMAT(att.indatetime, '%d-%m-%Y %h:%i %p') as intime, att.inphoto as inphoto, att.inby, " - + "DATE_FORMAT(att.outdatetime, '%d-%m-%Y %h:%i %p') as outtime, att.outphoto as outphoto, att.outby, " - + "DATE_FORMAT(att.oddatetime, '%d-%m-%Y %h:%i %p') as odtime, att.odby, et.zone, " - + "DATE_FORMAT(att.leavedatetime, '%d-%m-%Y %h:%i %p') as leavedatetime, att.leaveby " + String fromDateTime = fromDate + " 00:00:00"; + String toDateTime = toDate + " 23:59:59"; + + System.out.println("Zone: " + zone + ", From: " + fromDateTime + ", To: " + toDateTime); + + String sql = "WITH facial_data AS ( " + + "SELECT et2.park_id, " + + "SUM(CASE WHEN et2.facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " + + "SUM(CASE WHEN et2.facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " + + "FROM enrollment_table et2 " + + "WHERE et2.isactive = 1 AND et2.isdelete = 0 AND et2.emp_type = 'Park' AND et2.zone = ? " + + "GROUP BY et2.park_id " + + ") " + + "SELECT et.park_id, COALESCE(pd.park_name, '') AS park_name, " + + "COUNT(DISTINCT et.enrollment_id) AS TotalCount, " + + "COALESCE(pd.supervisor_name, '') AS supervisor_name, COALESCE(pd.supervisor_mobile, '') AS supervisor_mobile, " + + "COALESCE(fd.facialRegistered, 0) AS facialRegistered, COALESCE(fd.facialNotRegistered, 0) AS facialNotRegistered, " + + "COUNT(DISTINCT CASE WHEN att.indatetime >= ? AND att.indatetime <= ? THEN att.enrollment_id END) AS AttendanceMarked, " + + "COUNT(DISTINCT CASE WHEN att.oddatetime >= ? AND att.oddatetime <= ? THEN att.enrollment_id END) AS ODCount, " + + "COUNT(DISTINCT CASE WHEN att.leavedatetime >= ? AND att.leavedatetime <= ? THEN att.enrollment_id END) AS LeaveCount, " + + "COUNT(distinct et.incharge_id) AS SupervisorCount " + "FROM enrollment_table et " + "LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " - + "INNER JOIN attendance att ON et.enrollment_id = att.enrollment_id " - + " AND " + filterDateColumn + " >= ? AND " + filterDateColumn + " <= ? " - + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 " - + " AND " + filterDateColumn + " IS NOT NULL "; - - java.util.List params = new java.util.ArrayList<>(); - params.add(fromDateTime); - params.add(toDateTime); - params.add(empType); - - if (zone != null) { - sql += " AND et.zone = ? "; - params.add(zone); - } - - if (parkName != null && !parkName.isEmpty()) { - sql += " AND et.park_id = ? "; - params.add(parkName); - } - - sql += " order by " + dateColumn + " desc "; - - System.out.println("EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " - + toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); - return jdbcTemplate.queryForList(sql, params.toArray()); + + "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " + + "LEFT JOIN facial_data fd ON et.park_id = fd.park_id " + + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = 'Park' AND et.zone != 0 AND et.zone = ? " + + "GROUP BY et.park_id, pd.park_name, pd.supervisor_name, pd.supervisor_mobile, fd.facialRegistered, fd.facialNotRegistered " + + "ORDER BY pd.park_name"; + + return jdbcTemplate.queryForList(sql, + new Object[] { zone, fromDateTime, toDateTime, fromDateTime, toDateTime, + fromDateTime, toDateTime, zone }); + } catch (Exception e) { + logger.error( + "Method: getParkWiseSummary | Parameters: fromDateStr={}, toDateStr={}, zone={} | Date: {} | Exception: {} - {}", + fromDateStr, toDateStr, zone, LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); + return Collections.emptyList(); } } - - public List> getParkWiseSummary(String fromDateStr, String toDateStr, Integer zone) { - LocalDate fromDate; - LocalDate toDate; - - if (fromDateStr == null || fromDateStr.trim().isEmpty()) { - fromDate = LocalDate.now(); - } else { - fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); - } - - if (toDateStr == null || toDateStr.trim().isEmpty()) { - toDate = LocalDate.now(); - } else { - toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); - } - - String fromDateTime = fromDate + " 00:00:00"; - String toDateTime = toDate + " 23:59:59"; - - System.out.println("Zone: " + zone + ", From: " + fromDateTime + ", To: " + toDateTime); - - String sql = "WITH facial_data AS ( " - + "SELECT et2.park_id, " - + "SUM(CASE WHEN et2.facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " - + "SUM(CASE WHEN et2.facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " - + "FROM enrollment_table et2 " - + "WHERE et2.isactive = 1 AND et2.isdelete = 0 AND et2.emp_type = 'Park' AND et2.zone = ? " - + "GROUP BY et2.park_id " - + ") " - + "SELECT et.park_id, COALESCE(pd.park_name, '') AS park_name, " - + "COUNT(DISTINCT et.enrollment_id) AS TotalCount, " - + "COALESCE(pd.supervisor_name, '') AS supervisor_name, COALESCE(pd.supervisor_mobile, '') AS supervisor_mobile, " - + "COALESCE(fd.facialRegistered, 0) AS facialRegistered, COALESCE(fd.facialNotRegistered, 0) AS facialNotRegistered, " - + "COUNT(DISTINCT CASE WHEN att.indatetime >= ? AND att.indatetime <= ? THEN att.enrollment_id END) AS AttendanceMarked, " - + "COUNT(DISTINCT CASE WHEN att.oddatetime >= ? AND att.oddatetime <= ? THEN att.enrollment_id END) AS ODCount, " - + "COUNT(DISTINCT CASE WHEN att.leavedatetime >= ? AND att.leavedatetime <= ? THEN att.enrollment_id END) AS LeaveCount, " - + "COUNT(distinct et.incharge_id) AS SupervisorCount " - + "FROM enrollment_table et " - + "LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " - + "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " - + "LEFT JOIN facial_data fd ON et.park_id = fd.park_id " - + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = 'Park' AND et.zone != 0 AND et.zone = ? " - + "GROUP BY et.park_id, pd.park_name, pd.supervisor_name, pd.supervisor_mobile, fd.facialRegistered, fd.facialNotRegistered " - + "ORDER BY pd.park_name"; - - return jdbcTemplate.queryForList(sql, new Object[] { zone, fromDateTime, toDateTime, fromDateTime, toDateTime, - fromDateTime, toDateTime, zone }); - } } diff --git a/src/main/resources/templates/modules/attendance-dashboard.html b/src/main/resources/templates/modules/attendance-dashboard.html index 338a156..3d124c7 100644 --- a/src/main/resources/templates/modules/attendance-dashboard.html +++ b/src/main/resources/templates/modules/attendance-dashboard.html @@ -372,12 +372,12 @@ renderTable(parkTarget, parkData, 'Park'); // Compute Present % (Present + OD) / Total if (Array.isArray(parkData) && parkData.length > 0) { - let totalAll = 0, presentOdAll = 0; + let facialRegisteredAll = 0, presentOdAll = 0; parkData.forEach(r => { - totalAll += (Number(r.TotalCount) || 0); + facialRegisteredAll += (Number(r.facialRegistered) || 0); presentOdAll += (Number(r.AttendanceMarked) || 0) + (Number(r.ODCount) || 0); }); - const pct = totalAll > 0 ? ((presentOdAll / totalAll) * 100).toFixed(1) : '0.0'; + const pct = facialRegisteredAll > 0 ? ((presentOdAll / facialRegisteredAll) * 100).toFixed(1) : '0.0'; const el = document.getElementById('presentPercent'); if (el) el.textContent = pct + '%'; }