Browse Source

changes added in attendance service and attendance dashboard page

master
yoganandhan 8 months ago
parent
commit
0ac5c83f27
  1. 664
      src/main/java/com/gcc/commissionerreview/service/AttendanceService.java
  2. 6
      src/main/resources/templates/modules/attendance-dashboard.html

664
src/main/java/com/gcc/commissionerreview/service/AttendanceService.java

@ -2,6 +2,8 @@ package com.gcc.commissionerreview.service;
import javax.sql.DataSource; 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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
@ -9,7 +11,9 @@ import org.springframework.stereotype.Service;
import java.sql.Date; import java.sql.Date;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -17,352 +21,398 @@ import java.util.Map;
@Service @Service
public class AttendanceService { public class AttendanceService {
private static final Logger logger = LoggerFactory.getLogger(AttendanceService.class);
@Autowired @Autowired
private JdbcTemplate jdbcTemplate; private JdbcTemplate jdbcTemplate;
@Autowired @Autowired
public void setDataSource(@Qualifier("mysqlNULMDataSource") DataSource dataSource) { 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); private static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy", Locale.ENGLISH);
public List<Map<String, Object>> getAbstractCounts() { public List<Map<String, Object>> 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<Map<String, Object>> getZoneWisePercentage(String fromDateStr, String toDateStr) { public List<Map<String, Object>> 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<Map<String, Object>> getZoneSummary(String empType, String fromDateStr, String toDateStr) { public List<Map<String, Object>> 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<Map<String, Object>> getDetailedList(String empType, String category, String fromDateStr, public List<Map<String, Object>> getDetailedList(String empType, String category, String fromDateStr,
String toDateStr, Integer zone, String parkName) { 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<Object> 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<Object> 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<Object> 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<Object> 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<Object> params = new java.util.ArrayList<>();
params.add(zone); 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<Object> 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<Map<String, Object>> 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<Object> 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 " + "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 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<Object> 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<Map<String, Object>> 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 });
}
} }

6
src/main/resources/templates/modules/attendance-dashboard.html

@ -372,12 +372,12 @@
renderTable(parkTarget, parkData, 'Park'); renderTable(parkTarget, parkData, 'Park');
// Compute Present % (Present + OD) / Total // Compute Present % (Present + OD) / Total
if (Array.isArray(parkData) && parkData.length > 0) { if (Array.isArray(parkData) && parkData.length > 0) {
let totalAll = 0, presentOdAll = 0;
let facialRegisteredAll = 0, presentOdAll = 0;
parkData.forEach(r => { parkData.forEach(r => {
totalAll += (Number(r.TotalCount) || 0);
facialRegisteredAll += (Number(r.facialRegistered) || 0);
presentOdAll += (Number(r.AttendanceMarked) || 0) + (Number(r.ODCount) || 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'); const el = document.getElementById('presentPercent');
if (el) el.textContent = pct + '%'; if (el) el.textContent = pct + '%';
} }

Loading…
Cancel
Save