diff --git a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java index 3a9feb8..b9caad9 100644 --- a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java +++ b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java @@ -17,11 +17,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement public class DataSourceConfig { -// private static String host = "localhost:3306"; -// private static String dbpassword = "root"; + private static String host = "localhost:3306"; + private static String dbpassword = "root"; - private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306"; - private static String dbpassword = "gcc-facial-password"; +// private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306"; +// private static String dbpassword = "gcc-facial-password"; public static class MyDataSourceConfig { @Primary @@ -345,5 +345,16 @@ public class DataSourceConfig { dataSource.setPassword(dbpassword); return dataSource; } + + ////////// DBFOT TOILETS ////////////////////// + @Bean(name = "mysqlDBFOT_TOILETSDataSource") + public DataSource mysqlDBFOT_TOILETSDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://" + host + "/dbfot_toilets"); + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } } diff --git a/src/main/java/com/gcc/commissionerreview/controller/DbfotApiController.java b/src/main/java/com/gcc/commissionerreview/controller/DbfotApiController.java new file mode 100644 index 0000000..4837cc4 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/DbfotApiController.java @@ -0,0 +1,160 @@ +package com.gcc.commissionerreview.controller; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.gcc.commissionerreview.service.DbfotService; + +@RestController +@RequestMapping("/commissionerreview/api/dbfot") +public class DbfotApiController { + + @Autowired + private DbfotService dbfotService; + + + + + @GetMapping("/getzones") + public Map ViewZoneDropdown() { + + Map response = new HashMap<>(); + + List> zones = dbfotService.ViewZoneDropdown(); + + if (!zones.isEmpty()) { + response.put("status", true); + response.put("message", "Zone list fetched successfully"); + response.put("data", zones); + } else { + response.put("status", false); + response.put("message", "No zones found"); + response.put("data", Collections.emptyList()); + } + + return response; + } + + @GetMapping("/getwardbyzone") + public Map ViewWardDropdown(@RequestParam String zone) { + + Map response = new HashMap<>(); + + List> wards = dbfotService.ViewWardDropdown(zone); + + if (!wards.isEmpty()) { + response.put("status", true); + response.put("message", "Ward list fetched successfully"); + response.put("data", wards); + } else { + response.put("status", false); + response.put("message", "No wards found"); + response.put("data", Collections.emptyList()); + } + + return response; + } + + @GetMapping("/getpctstatus") + public Map ViewPctStatusDropdown() { + + Map response = new HashMap<>(); + + List> status = dbfotService.ViewPctStatusDropdown(); + + if (!status.isEmpty()) { + response.put("status", true); + response.put("message", "Pct Status fetched successfully"); + response.put("data", status); + } else { + response.put("status", false); + response.put("message", "No Pct Status found"); + response.put("data", Collections.emptyList()); + } + + return response; + } + + // location overview + + @GetMapping("/getdashboardsummary") + public Map getDashboardSummary(@RequestParam(required = false) String date, + @RequestParam(required = false) String zone, @RequestParam(required = false) String ward, + @RequestParam(required = false) String status, @RequestParam(required = false) String searchAddress) { + + return dbfotService.getDashboardSummary(date, zone, ward, status, searchAddress); + } + + + @GetMapping("/getpctcomplaints") + public Map getPctComplaints(@RequestParam String pct, @RequestParam(required = false) String date, + @RequestParam(required = false) String zone, @RequestParam(required = false) String ward, + @RequestParam(required = false) String status, @RequestParam(required = false) String searchAddress, + @RequestParam(required = false, defaultValue = "ALL") String complaintStatus) { + + return dbfotService.getPctComplaints(pct, date, zone, ward, status, searchAddress, complaintStatus); + } + + @GetMapping("/getcomplainttimeline") + public Map getComplaintTimeline( + @RequestParam("complaint_id") String complaintId) { + + return dbfotService.getComplaintTimeline(complaintId); + } + + @GetMapping("/getmanpowerdetails") + public Map getManpowerDetails(@RequestParam("pct") String pct, + @RequestParam(required = false) String date, @RequestParam(required = false) String zone, + @RequestParam(required = false) String ward, @RequestParam(required = false) String status, + @RequestParam(required = false) String searchAddress) { + + return dbfotService.getManpowerDetails(pct, date, zone, ward, status, searchAddress); + } + + // complaints overview + + @GetMapping("/getlocationsbyward") + public Map ViewLocationDropdown(@RequestParam String ward) { + + Map response = new HashMap<>(); + + List> wards = dbfotService.ViewLocationDropdown(ward); + + if (!wards.isEmpty()) { + response.put("status", true); + response.put("message", "Location list fetched successfully"); + response.put("data", wards); + } else { + response.put("status", false); + response.put("message", "No Location found"); + response.put("data", Collections.emptyList()); + } + + return response; + } + + @GetMapping("/getcomplaintsoverview") + public Map getComplaintsOverview(@RequestParam String date, + @RequestParam(required = false) String zone, @RequestParam(required = false) String ward, + @RequestParam(required = false) String location, @RequestParam(required = false) String status, + @RequestParam(required = false) String source, @RequestParam(required = false) String searchAddress) { + + if (date == null || date.trim().isEmpty()) { + Map response = new HashMap<>(); + response.put("status", "Failed"); + response.put("message", "Date is mandatory"); + return response; + } + + return dbfotService.getComplaintsOverview(date, zone, ward, location, status, source, searchAddress); + } + +} diff --git a/src/main/java/com/gcc/commissionerreview/controller/MainController.java b/src/main/java/com/gcc/commissionerreview/controller/MainController.java index 6e8858a..e8258ee 100644 --- a/src/main/java/com/gcc/commissionerreview/controller/MainController.java +++ b/src/main/java/com/gcc/commissionerreview/controller/MainController.java @@ -446,5 +446,15 @@ public class MainController { return "modules/roadwarweb/roadwarregisterdashboard"; } + @GetMapping("/dbfot/locDetails") + public String locDetails(){ + return "modules/dbfot/locDetails"; + } + + @GetMapping("/dbfot/CompDetails") + public String CompDetails(){ + return "modules/dbfot/CompDetails"; + } + } diff --git a/src/main/java/com/gcc/commissionerreview/controller/RoadWarApiController.java b/src/main/java/com/gcc/commissionerreview/controller/RoadWarApiController.java index b7c0240..e0d28d5 100644 --- a/src/main/java/com/gcc/commissionerreview/controller/RoadWarApiController.java +++ b/src/main/java/com/gcc/commissionerreview/controller/RoadWarApiController.java @@ -158,6 +158,23 @@ public class RoadWarApiController { //for road war register dashboard + @GetMapping("/getTotalRoadByGIS") + public Map getTotalRoadByGIS(){ + + Map response = new HashMap<>(); + List> roads = roadWarService.getTotalRoadByGIS(); + if (!roads.isEmpty()) { + response.put("status", true); + response.put("message", "Total Road counts By GIS fetched successfully"); + response.put("data", roads); + } else { + response.put("status", false); + response.put("message", "No roads counts found"); + response.put("data", Collections.emptyList()); + } + return response; + } + @GetMapping("/getdashboardsummary") public Map getDashboardSummary(@RequestParam(required = false) String zone, @RequestParam(required = false) String ward, @RequestParam(required = false) Integer roadType, diff --git a/src/main/java/com/gcc/commissionerreview/service/DbfotService.java b/src/main/java/com/gcc/commissionerreview/service/DbfotService.java new file mode 100644 index 0000000..50b65c4 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/DbfotService.java @@ -0,0 +1,832 @@ +package com.gcc.commissionerreview.service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class DbfotService { + + @Autowired + @Value("${fileBaseUrl}") + + private String fileBaseUrl; + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + private Environment environment; + + + + @Autowired + public void setDataSource(@Qualifier("mysqlDBFOT_TOILETSDataSource") DataSource DataSource) { + this.jdbcTemplate = new JdbcTemplate(DataSource); + + } + + public DbfotService(Environment environment) { + + this.environment = environment; + + this.fileBaseUrl = environment.getProperty("fileBaseUrl"); + } + + public List> ViewZoneDropdown() { + String sql = "SELECT DISTINCT(zone) " + + "FROM pct_master " + + "WHERE isactive=1 AND isdelete=0 ORDER BY zone"; + try { + return jdbcTemplate.queryForList(sql); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + return Collections.emptyList(); + } + } + + public List> ViewWardDropdown(String zone) { + String sql = "SELECT DISTINCT(ward) " + + "FROM pct_master " + + "WHERE isactive=1 AND isdelete=0 AND zone=? ORDER BY ward"; + try { + return jdbcTemplate.queryForList(sql,zone); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + return Collections.emptyList(); + } + } + + public List> ViewPctStatusDropdown() { + String sql = "SELECT DISTINCT(status) " + + "FROM pct_master " + + "WHERE isactive=1 AND isdelete=0 ORDER BY status"; + try { + return jdbcTemplate.queryForList(sql); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + return Collections.emptyList(); + } + } + + + public Map getDashboardSummary(String date, String zone, String ward, String status, + String searchAddress) { + + Map response = new HashMap<>(); + + try { + + // Default date to today + String selectedDate = (date == null || date.trim().isEmpty()) ? java.time.LocalDate.now().toString() + : date.trim(); + + // ========================================== + // 1. OVERALL COUNTS - NO FILTERS + // ========================================== + + String totalLocationsSql = "SELECT COUNT(*) FROM pct_master " + "WHERE isactive = 1 AND isdelete = 0"; + + Integer totalLocations = jdbcTemplate.queryForObject(totalLocationsSql, Integer.class); + + String activeLocationsSql = "SELECT COUNT(*) FROM pct_master " + "WHERE UPPER(TRIM(status)) = 'ACTIVE' " + + "AND isactive = 1 AND isdelete = 0"; + + Integer totalActiveLocations = jdbcTemplate.queryForObject(activeLocationsSql, Integer.class); + + String totalComplaintsSql = "SELECT COUNT(*) FROM complaints_details " + + "WHERE isactive = 1 AND isdelete = 0"; + + Integer totalComplaints = jdbcTemplate.queryForObject(totalComplaintsSql, Integer.class); + + // ========================================== + // 2. BUILD FILTERS AND PARAMETERS + // ========================================== + + StringBuilder filters = new StringBuilder(); + List filterParams = new ArrayList<>(); + + if (zone != null && !zone.trim().isEmpty() && !"ALL".equalsIgnoreCase(zone.trim())) { + + filters.append(" AND pm.zone = ? "); + filterParams.add(zone.trim()); + } + + if (ward != null && !ward.trim().isEmpty() && !"ALL".equalsIgnoreCase(ward.trim())) { + + filters.append(" AND pm.ward = ? "); + filterParams.add(ward.trim()); + } + + if (status != null && !status.trim().isEmpty() && !"ALL".equalsIgnoreCase(status.trim())) { + + filters.append(" AND UPPER(TRIM(pm.status)) = ? "); + + filterParams.add(status.trim().toUpperCase()); + } + + if (searchAddress != null && !searchAddress.trim().isEmpty()) { + + filters.append(" AND pm.address LIKE ? "); + + filterParams.add("%" + searchAddress.trim() + "%"); + } + + // ========================================== + // 3. LOCATION TABLE + // ========================================== + + String locationsSql = "SELECT " + " pm.id, " + " pm.pct, " + " pm.zone, " + " pm.ward, " + " pm.address, " + + " pm.status, " + " COALESCE(mp.manpower_count, 0) AS manpower, " + + " COALESCE(cc.total_complaints, 0) AS total_complaints, " + " COALESCE(cc.opened, 0) AS opened, " + + " COALESCE(cc.under_review, 0) AS under_review, " + + " COALESCE(cc.pending_closure, 0) AS pending_closure, " + " COALESCE(cc.closed, 0) AS closed " + + + "FROM pct_master pm " + + + // Manpower present per PCT on selected date + "LEFT JOIN ( " + " SELECT me.pct, COUNT(*) AS manpower_count " + " FROM man_power_employees me " + + " WHERE me.att_date >= ? " + " AND me.att_date < DATE_ADD(?, INTERVAL 1 DAY) " + + " AND me.isactive = 1 AND me.isdelete = 0 " + " AND EXISTS ( " + + " SELECT 1 FROM man_power_details md " + " WHERE md.pct = me.pct " + + " AND md.isactive = 1 AND md.isdelete = 0 " + " ) " + " GROUP BY me.pct " + + ") mp ON mp.pct = pm.pct " + + + // Complaint counts per PCT + "LEFT JOIN ( " + " SELECT " + " cd.pct, " + " COUNT(*) AS total_complaints, " + + + " SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'OPEN' " + + " THEN 1 ELSE 0 END) AS opened, " + + + " SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'UNDER REVIEW' " + + " THEN 1 ELSE 0 END) AS under_review, " + + + " SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'PENDING CLOSURE' " + + " THEN 1 ELSE 0 END) AS pending_closure, " + + + " SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'CLOSED' " + + " THEN 1 ELSE 0 END) AS closed " + + + " FROM complaints_details cd " + " WHERE cd.isactive = 1 AND cd.isdelete = 0 " + +" AND cd.complaint_raised_on >= ? " + + " AND cd.complaint_raised_on < DATE_ADD(?, INTERVAL 1 DAY) " + + " GROUP BY cd.pct " + ") cc ON cc.pct = pm.pct " + + + "WHERE pm.isactive = 1 AND pm.isdelete = 0 " + filters + " ORDER BY pm.zone, pm.ward, pm.address"; + + // The first two parameters belong to the manpower subquery. + List locationParams = new ArrayList<>(); + + locationParams.add(java.sql.Date.valueOf(selectedDate)); + locationParams.add(java.sql.Date.valueOf(selectedDate)); + + locationParams.add(java.sql.Date.valueOf(selectedDate)); + locationParams.add(java.sql.Date.valueOf(selectedDate)); + + + // Append filter parameters in SQL order. + locationParams.addAll(filterParams); + + List> locations = jdbcTemplate.queryForList(locationsSql, locationParams.toArray()); + + // ========================================== + // 4. TODAY'S COMPLAINTS - FILTERED + // ========================================== + + String todayComplaintsSql = "SELECT COUNT(*) " + "FROM complaints_details cd " + + "INNER JOIN pct_master pm ON pm.pct = cd.pct " + "WHERE cd.complaint_raised_on >= ? " + + "AND cd.complaint_raised_on < DATE_ADD(?, INTERVAL 1 DAY) " + + "AND cd.isactive = 1 AND cd.isdelete = 0 " + "AND pm.isactive = 1 AND pm.isdelete = 0 " + filters; + + List todayParams = new ArrayList<>(); + + todayParams.add(java.sql.Date.valueOf(selectedDate)); + todayParams.add(java.sql.Date.valueOf(selectedDate)); + todayParams.addAll(filterParams); + + Integer todaysComplaints = jdbcTemplate.queryForObject(todayComplaintsSql, Integer.class, + todayParams.toArray()); + + // ========================================== + // 5. MANPOWER PRESENT - FILTERED TOTAL + // ========================================== + + int manpowerPresent = 0; + + for (Map row : locations) { + + Object manpower = row.get("manpower"); + + if (manpower instanceof Number) { + manpowerPresent += ((Number) manpower).intValue(); + } + } + + // ========================================== + // 6. RESPONSE + // ========================================== + + response.put("totalLocations", totalLocations != null ? totalLocations : 0); + + response.put("totalActiveLocations", totalActiveLocations != null ? totalActiveLocations : 0); + + response.put("totalComplaints", totalComplaints != null ? totalComplaints : 0); + + response.put("todaysComplaints", todaysComplaints != null ? todaysComplaints : 0); + + response.put("manpowerPresent", manpowerPresent); + + response.put("locations", locations); + + response.put("status", "Success"); + response.put("message", "Fetched dashboard summary Successfully"); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "Failed"); + response.put("message", "Error while fetching dashboard summary"); + } + + return response; + } + + + public Map getPctComplaints(String pct, String date, String zone, String ward, String status, + String searchAddress, String complaintStatus) { + + Map response = new HashMap<>(); + + try { + + if (pct == null || pct.trim().isEmpty()) { + response.put("status", "Failed"); + response.put("message", "PCT is required"); + return response; + } + + String pctValue = pct.trim(); + + // ========================================== + // 1. FETCH PCT DETAILS + // ========================================== + + String pctSql = "SELECT id, pct, zone, ward, address, status " + "FROM pct_master " + + "WHERE pct = ? AND isactive = 1 AND isdelete = 0"; + + List> pctList = jdbcTemplate.queryForList(pctSql, pctValue); + + if (pctList.isEmpty()) { + response.put("status", "Failed"); + response.put("message", "PCT not found"); + return response; + } + + Map pctDetails = pctList.get(0); + + // ========================================== + // 2. BUILD COMMON FILTERS + // ========================================== + + StringBuilder conditions = new StringBuilder(); + + List commonParams = new ArrayList<>(); + + conditions.append(" AND cd.pct = ? "); + commonParams.add(pctValue); + + conditions.append(" AND cd.isactive = 1 AND cd.isdelete = 0 "); + conditions.append(" AND pm.isactive = 1 AND pm.isdelete = 0 "); + + if (date != null && !date.trim().isEmpty()) { + + java.sql.Date selectedDate = java.sql.Date.valueOf(date.trim()); + + conditions.append(" AND cd.complaint_raised_on >= ? " + + " AND cd.complaint_raised_on < DATE_ADD(?, INTERVAL 1 DAY) "); + + commonParams.add(selectedDate); + commonParams.add(selectedDate); + } + + if (zone != null && !zone.trim().isEmpty() && !"ALL".equalsIgnoreCase(zone.trim())) { + + conditions.append(" AND pm.zone = ? "); + commonParams.add(zone.trim()); + } + + if (ward != null && !ward.trim().isEmpty() && !"ALL".equalsIgnoreCase(ward.trim())) { + + conditions.append(" AND pm.ward = ? "); + commonParams.add(ward.trim()); + } + + if (status != null && !status.trim().isEmpty() && !"ALL".equalsIgnoreCase(status.trim())) { + + conditions.append(" AND UPPER(TRIM(pm.status)) = ? "); + commonParams.add(status.trim().toUpperCase()); + } + + if (searchAddress != null && !searchAddress.trim().isEmpty()) { + + conditions.append(" AND pm.address LIKE ? "); + commonParams.add("%" + searchAddress.trim() + "%"); + } + + String baseFrom = " FROM complaints_details cd " + " LEFT JOIN pct_master pm ON pm.pct = cd.pct " + + " WHERE 1 = 1 " + conditions; + + // ========================================== + // 3. COUNTS FOR ALL FIVE TABS + // ========================================== + + String countsSql = "SELECT " + " COUNT(*) AS all_count, " + + + " COALESCE(SUM(CASE " + " WHEN UPPER(TRIM(cd.status)) = 'OPEN' " + + " THEN 1 ELSE 0 END), 0) AS opened, " + + + " COALESCE(SUM(CASE " + " WHEN UPPER(TRIM(cd.status)) = 'UNDER REVIEW' " + + " THEN 1 ELSE 0 END), 0) AS under_review, " + + + " COALESCE(SUM(CASE " + " WHEN UPPER(TRIM(cd.status)) = 'PENDING CLOSURE' " + + " THEN 1 ELSE 0 END), 0) AS pending_closure, " + + + " COALESCE(SUM(CASE " + " WHEN UPPER(TRIM(cd.status)) = 'CLOSED' " + + " THEN 1 ELSE 0 END), 0) AS closed " + + + baseFrom; + + Map tabCounts = jdbcTemplate.queryForMap(countsSql, commonParams.toArray()); + + // ========================================== + // 4. FETCH COMPLAINTS FOR SELECTED TAB + // ========================================== + + StringBuilder complaintStatusCondition = new StringBuilder(); + List complaintParams = new ArrayList<>(commonParams); + + if (complaintStatus != null && !complaintStatus.trim().isEmpty() + && !"ALL".equalsIgnoreCase(complaintStatus.trim())) { + + String normalizedStatus = complaintStatus.trim().toUpperCase(); + + List allowedStatuses = Arrays.asList("OPEN", "UNDER REVIEW", "PENDING CLOSURE", "CLOSED"); + + if (!allowedStatuses.contains(normalizedStatus)) { + response.put("status", "Failed"); + response.put("message", "Invalid complaint status"); + return response; + } + + complaintStatusCondition.append(" AND UPPER(TRIM(cd.status)) = ? "); + + complaintParams.add(normalizedStatus); + } + + String complaintsSql = "SELECT " + " cd.id, " + " cd.pct, " + " cd.complaint_id, " + + " cd.status AS complaint_status, " + " cd.source, " + " cd.description, " + + " cd.complaint_raised_on, " + " cd.turn_around_time, " + " cd.created_date, " + " cd.location, " + + " cd.address " + baseFrom + complaintStatusCondition + + " ORDER BY cd.complaint_raised_on DESC, cd.id DESC"; + + List> complaints = jdbcTemplate.queryForList(complaintsSql, complaintParams.toArray()); + + // ========================================== + // 5. RESPONSE + // ========================================== + + response.put("status", "Success"); + response.put("pctDetails", pctDetails); + response.put("tabCounts", tabCounts); + response.put("complaints", complaints); + response.put("selectedComplaintStatus", complaintStatus == null ? "ALL" : complaintStatus.toUpperCase()); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "Failed"); + response.put("message", "Error while fetching PCT complaints"); + } + + return response; + } + + public Map getComplaintTimeline(String complaintId) { + + Map response = new HashMap<>(); + + try { + + if (complaintId == null || complaintId.trim().isEmpty()) { + response.put("status", "Failed"); + response.put("message", "Complaint ID is required"); + return response; + } + + String sql = + "SELECT " + + " cd.id AS complaint_detail_id, " + + " cd.complaint_id, " + + " cd.status AS current_status, " + + " cd.description, " + + " cd.source, " + + " cd.location, " + + " cd.address, " + + " cd.complaint_raised_on AS current_raised_on, " + + " cd.turn_around_time, " + + " ch.id AS history_id, " + + " ch.status AS history_status, " + + " ch.remarks, " + + " ch.complaint_raised_on, " + + " ch.complaint_raised_by, " + + " ch.complaint_updated_on, " + + " ch.complaint_updated_by, " + + + " CASE " + + " WHEN ch.imgfile IS NOT NULL AND TRIM(ch.imgfile) <> '' " + + " THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', ch.imgfile) " + + " ELSE NULL " + + " END AS imgfile " + + "FROM complaints_details cd " + + + "LEFT JOIN complaints_history ch " + + " ON ch.complaint_id = cd.complaint_id " + + " AND ch.isactive = 1 " + + " AND ch.isdelete = 0 " + + + "WHERE cd.complaint_id = ? " + + " AND cd.isactive = 1 " + + " AND cd.isdelete = 0 " + + + "ORDER BY ch.complaint_updated_on DESC, ch.id DESC"; + + List> rows = + jdbcTemplate.queryForList(sql, complaintId.trim()); + + if (rows.isEmpty()) { + response.put("status", "Failed"); + response.put("message", "Complaint not found"); + return response; + } + + // Header information from complaints_details. + Map firstRow = rows.get(0); + + Map complaint = new HashMap<>(); + + complaint.put("complaint_id", firstRow.get("complaint_id")); + complaint.put("current_status", firstRow.get("current_status")); + complaint.put("description", firstRow.get("description")); + complaint.put("source", firstRow.get("source")); + complaint.put("location", firstRow.get("location")); + complaint.put("address", firstRow.get("address")); + complaint.put("turn_around_time",firstRow.get("turn_around_time")); + complaint.put("complaint_raised_on", + firstRow.get("current_raised_on")); + + // Timeline records from complaints_history. + List> timeline = new ArrayList<>(); + + for (Map row : rows) { + + // LEFT JOIN may return a complaint without history. + if (row.get("history_id") == null) { + continue; + } + + Map history = new HashMap<>(); + + history.put("id", row.get("history_id")); + history.put("status", row.get("history_status")); + history.put("remarks", row.get("remarks")); + + history.put("complaint_raised_on", + row.get("complaint_raised_on")); + + history.put("complaint_raised_by", + row.get("complaint_raised_by")); + + history.put("complaint_updated_on", + row.get("complaint_updated_on")); + + history.put("complaint_updated_by", + row.get("complaint_updated_by")); + + history.put("imgfile", row.get("imgfile")); + + timeline.add(history); + } + + response.put("status", "Success"); + response.put("complaint", complaint); + response.put("timeline", timeline); + response.put("message", "Complaint timeline fetched successfully"); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "Failed"); + response.put("message", "Error while fetching complaint timeline"); + } + + return response; + } + + public Map getManpowerDetails(String pct, String date, String zone, String ward, String status, + String searchAddress) { + + Map response = new HashMap<>(); + + try { + if (pct == null || pct.trim().isEmpty()) { + response.put("status", "Failed"); + response.put("message", "PCT is required"); + return response; + } + + String selectedDate = (date == null || date.trim().isEmpty()) ? java.time.LocalDate.now().toString() + : date.trim(); + + java.sql.Date attendanceDate = java.sql.Date.valueOf(selectedDate); + + StringBuilder filters = new StringBuilder(); + List params = new ArrayList<>(); + + // Attendance date parameters + params.add(attendanceDate); + params.add(attendanceDate); + + // The selected PCT + filters.append(" AND pm.pct = ? "); + params.add(pct.trim()); + + // Same dashboard filters + if (zone != null && !zone.trim().isEmpty() && !"ALL".equalsIgnoreCase(zone.trim())) { + filters.append(" AND pm.zone = ? "); + params.add(zone.trim()); + } + + if (ward != null && !ward.trim().isEmpty() && !"ALL".equalsIgnoreCase(ward.trim())) { + filters.append(" AND pm.ward = ? "); + params.add(ward.trim()); + } + + if (status != null && !status.trim().isEmpty() && !"ALL".equalsIgnoreCase(status.trim())) { + filters.append(" AND UPPER(TRIM(pm.status)) = ? "); + params.add(status.trim().toUpperCase()); + } + + if (searchAddress != null && !searchAddress.trim().isEmpty()) { + filters.append(" AND pm.address LIKE ? "); + params.add("%" + searchAddress.trim() + "%"); + } + + String sql = "SELECT " + " pm.id AS pct_id, " + " pm.pct, " + " pm.address, " + " pm.zone, " + " pm.ward, " + + " pm.status AS pct_status, " + " me.id AS employee_id, " + " me.emp_name, " + + " me.mobile_number, " + " me.att_date, " + " me.location, " + " CASE " + + " WHEN me.imgfile IS NOT NULL " + " AND TRIM(me.imgfile) <> '' " + " THEN CONCAT('" + + fileBaseUrl + "/gccofficialapp/files', me.imgfile) " + " ELSE NULL " + " END AS file_url " + + + "FROM pct_master pm " + + + "LEFT JOIN man_power_employees me " + " ON me.pct = pm.pct " + " AND me.att_date >= ? " + + " AND me.att_date < DATE_ADD(?, INTERVAL 1 DAY) " + " AND me.isactive = 1 " + + " AND me.isdelete = 0 " + + + "WHERE pm.isactive = 1 " + " AND pm.isdelete = 0 " + + + " AND EXISTS ( " + " SELECT 1 FROM man_power_details md " + " WHERE md.pct = pm.pct " + + " AND md.isactive = 1 " + " AND md.isdelete = 0 " + " ) " + + + filters + + + " ORDER BY me.att_date DESC, me.id DESC"; + + List> rows = jdbcTemplate.queryForList(sql, params.toArray()); + + if (rows.isEmpty()) { + response.put("status", "Failed"); + response.put("message", "No manpower attendance found for the selected PCT and date"); + response.put("employees", Collections.emptyList()); + return response; + } + + Map firstRow = rows.get(0); + + Map pctDetails = new HashMap<>(); + pctDetails.put("pct_id", firstRow.get("pct_id")); + pctDetails.put("pct", firstRow.get("pct")); + pctDetails.put("address", firstRow.get("address")); + pctDetails.put("zone", firstRow.get("zone")); + pctDetails.put("ward", firstRow.get("ward")); + pctDetails.put("status", firstRow.get("pct_status")); + pctDetails.put("date", selectedDate); + + List> employees = new ArrayList<>(); + + for (Map row : rows) { + Map employee = new HashMap<>(); + + employee.put("id", row.get("employee_id")); + employee.put("emp_name", row.get("emp_name")); + employee.put("mobile_number", row.get("mobile_number")); + employee.put("att_date", row.get("att_date")); + employee.put("location", row.get("location")); + employee.put("imgfile", row.get("file_url")); + + employees.add(employee); + } + + response.put("status", "Success"); + response.put("message", "Manpower details fetched successfully"); + response.put("pctDetails", pctDetails); + response.put("employees", employees); + + } catch (Exception e) { + e.printStackTrace(); + + response.put("status", "Failed"); + response.put("message", "Error while fetching manpower details"); + } + + return response; + } + + // complainyts overview + + public List> ViewLocationDropdown(String ward) { + String sql = "SELECT DISTINCT(address),pct " + + "FROM pct_master " + + "WHERE isactive=1 AND isdelete=0 AND ward=? ORDER BY address"; + try { + return jdbcTemplate.queryForList(sql,ward); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + return Collections.emptyList(); + } + } + + public Map getComplaintsOverview( + String date, + String zone, + String ward, + String location, + String status, + String source, + String searchAddress) { + + Map response = new HashMap<>(); + + try { + java.time.LocalDate selectedDate = + java.time.LocalDate.parse(date.trim()); + + StringBuilder filters = new StringBuilder(); + List params = new ArrayList<>(); + + filters.append(" AND cd.complaint_raised_on >= ? "); + filters.append(" AND cd.complaint_raised_on < DATE_ADD(?, INTERVAL 1 DAY) "); + + params.add(java.sql.Date.valueOf(selectedDate)); + params.add(java.sql.Date.valueOf(selectedDate)); + + if (zone != null && !zone.trim().isEmpty() + && !"ALL".equalsIgnoreCase(zone.trim())) { + filters.append(" AND pm.zone = ? "); + params.add(zone.trim()); + } + + if (ward != null && !ward.trim().isEmpty() + && !"ALL".equalsIgnoreCase(ward.trim())) { + filters.append(" AND pm.ward = ? "); + params.add(ward.trim()); + } + + if (location != null && !location.trim().isEmpty() + && !"ALL".equalsIgnoreCase(location.trim())) { + filters.append(" AND pm.pct = ? "); + params.add(location.trim()); + } + + if (status != null && !status.trim().isEmpty() + && !"ALL".equalsIgnoreCase(status.trim())) { + filters.append(" AND UPPER(TRIM(cd.status)) = ? "); + params.add(status.trim().toUpperCase()); + } + + if (source != null && !source.trim().isEmpty() + && !"ALL".equalsIgnoreCase(source.trim())) { + filters.append(" AND LOWER(TRIM(cd.source)) = LOWER(?) "); + params.add(source.trim()); + } + + if (searchAddress != null && !searchAddress.trim().isEmpty()) { + filters.append(" AND pm.address LIKE ? "); + params.add("%" + searchAddress.trim() + "%"); + } + + String baseWhere = + " FROM complaints_details cd " + + " INNER JOIN pct_master pm ON pm.pct = cd.pct " + + " WHERE cd.isactive = 1 AND cd.isdelete = 0 " + + " AND pm.isactive = 1 AND pm.isdelete = 0 " + + filters; + + // 1. Summary cards: all filters apply. + String summarySql = + "SELECT COUNT(*) AS total_complaints, " + + "COALESCE(SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'OPEN' " + + "THEN 1 ELSE 0 END), 0) AS opened, " + + "COALESCE(SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'UNDER REVIEW' " + + "THEN 1 ELSE 0 END), 0) AS under_review, " + + "COALESCE(SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'PENDING CLOSURE' " + + "THEN 1 ELSE 0 END), 0) AS pending_closure, " + + "COALESCE(SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'CLOSED' " + + "THEN 1 ELSE 0 END), 0) AS closed " + + baseWhere; + + Map summary = + jdbcTemplate.queryForMap(summarySql, params.toArray()); + + // 2. DataTable: one row per complaint. + // The history subquery returns at most one row per complaint ID. + String tableSql = + "SELECT " + + " pm.pct, pm.zone, pm.ward, pm.address, " + + " cd.id AS complaint_detail_id, " + + " cd.complaint_id, cd.description, " + + " cd.turn_around_time, cd.source, cd.status, " + + " cd.complaint_raised_on AS raised_on, " + + " ch.closed_on " + + baseWhere + + " LEFT JOIN ( " + + " SELECT complaint_id, MAX(complaint_updated_on) AS closed_on " + + " FROM complaints_history " + + " WHERE UPPER(TRIM(status)) = 'CLOSED' " + + " AND isactive = 1 AND isdelete = 0 " + + " GROUP BY complaint_id " + + " ) ch ON ch.complaint_id = cd.complaint_id " + + " ORDER BY cd.complaint_raised_on DESC, cd.id DESC"; + + // Put the history join before WHERE in the final SQL. + tableSql = + "SELECT pm.pct, pm.zone, pm.ward, pm.address, " + + "cd.id AS complaint_detail_id, cd.complaint_id, " + + "cd.description, cd.turn_around_time, cd.source, cd.status, " + + "cd.complaint_raised_on AS raised_on, ch.closed_on " + + "FROM complaints_details cd " + + "INNER JOIN pct_master pm ON pm.pct = cd.pct " + + "LEFT JOIN ( " + + " SELECT complaint_id, MAX(complaint_updated_on) AS closed_on " + + " FROM complaints_history " + + " WHERE UPPER(TRIM(status)) = 'CLOSED' " + + " AND isactive = 1 AND isdelete = 0 " + + " GROUP BY complaint_id " + + ") ch ON ch.complaint_id = cd.complaint_id " + + "WHERE cd.isactive = 1 AND cd.isdelete = 0 " + + "AND pm.isactive = 1 AND pm.isdelete = 0 " + + filters + + " ORDER BY cd.complaint_raised_on DESC, cd.id DESC"; + + List> complaints = + jdbcTemplate.queryForList(tableSql, params.toArray()); + + response.put("totalComplaints", summary.get("total_complaints")); + response.put("opened", summary.get("opened")); + response.put("underReview", summary.get("under_review")); + response.put("pendingClosure", summary.get("pending_closure")); + response.put("closed", summary.get("closed")); + response.put("complaints", complaints); + response.put("status", "Success"); + response.put("message", "Complaints overview fetched successfully"); + + } catch (Exception e) { + e.printStackTrace(); + response.put("status", "Failed"); + response.put("message", "Error while fetching complaints overview"); + } + + return response; + } + +} diff --git a/src/main/java/com/gcc/commissionerreview/service/RoadWarService.java b/src/main/java/com/gcc/commissionerreview/service/RoadWarService.java index 959b2d9..6e1f5cb 100644 --- a/src/main/java/com/gcc/commissionerreview/service/RoadWarService.java +++ b/src/main/java/com/gcc/commissionerreview/service/RoadWarService.java @@ -1,6 +1,9 @@ package com.gcc.commissionerreview.service; +import java.net.URI; import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -19,6 +22,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; @@ -26,8 +30,8 @@ import com.itextpdf.text.Paragraph; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.pdf.PdfWriter; - - +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chunk; import com.itextpdf.text.Font; @@ -1522,6 +1526,40 @@ public class RoadWarService { // for road war register dashboard + + public List> getTotalRoadByGIS() { + try { + String url = "https://gisgcc.chennaicorporation.gov.in/Java/proxy.jsp?https://gisgcc.chennaicorporation.gov.in/server/rest/services/GCCDepts/IT_API/FeatureServer/0/query?where=interior_brr+IN+%28%27BRR%27%2C%27Interior%27%29&fullText=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=4326&defaultSR=4326&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Meter&relationParam=&outFields=&returnGeometry=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&gdbVersion=&historicMoment=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22objectid%22%2C%22outStatisticFieldName%22%3A%22count%22%7D%5D&returnZ=false&returnM=false&multipatchOption=xyFootprint&resultOffset=&resultRecordCount=&returnTrueCurves=false&returnExceededLimitFeatures=false&quantizationParameters=&returnCentroid=false&returnEnvelope=false&timeReferenceUnknownClient=false&maxRecordCountFactor=&sqlFormat=none&resultType=&featureEncoding=esriDefault&datumTransformation=&cacheHint=false&f=pjson"; + + RestTemplate restTemplate = new RestTemplate(); + String responseBody = restTemplate.getForObject(URI.create(url), String.class); + + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode root = objectMapper.readTree(responseBody); + JsonNode features = root.path("features"); + + List> roadList = new ArrayList<>(); + if (features.isArray()) { + for (JsonNode feature : features) { + JsonNode props = feature.path("attributes"); + String roadCount = props.path("count").asText(); + + Map roadInfo = new HashMap<>(); + roadInfo.put("roadCount", roadCount); + roadList.add(roadInfo); + } + } + return roadList; + + } catch (Exception e) { + e.printStackTrace(); + return Collections.emptyList(); + } + } + + + + public Map getDashboardSummary( String zone, String ward, diff --git a/src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java b/src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java index beac4ca..fa50848 100644 --- a/src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java +++ b/src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java @@ -79,9 +79,21 @@ public class StreetVendorService { sql.append(" THEN vd.id "); sql.append(" END) AS committee_processed, "); - // 7. Total Processed - sql.append(" ( "); - + + // 7. Assistant Pending + sql.append(" (COUNT(DISTINCT vd.id) - "); + sql.append(" COUNT(DISTINCT CASE "); + sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); + sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); + sql.append(" AND vd.tamil_landmark IS NOT NULL AND vd.tamil_landmark <> '' "); + sql.append(" AND vd.tamil_gender IS NOT NULL AND vd.tamil_gender <> '' "); + sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); + sql.append(" AND vd.tamil_vending_category IS NOT NULL "); + sql.append(" THEN vd.id "); + sql.append(" END)) AS assistant_pending, "); + + // 8. LI Pending = Assistant Processed - LI Processed + sql.append(" GREATEST(0, "); sql.append(" COUNT(DISTINCT CASE "); sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); @@ -90,49 +102,29 @@ public class StreetVendorService { sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); sql.append(" AND vd.tamil_vending_category IS NOT NULL "); sql.append(" THEN vd.id "); - sql.append(" END) "); - - sql.append(" + COUNT(DISTINCT va1.vdid) "); - sql.append(" + COUNT(DISTINCT va2.vdid) "); - sql.append(" + COUNT(DISTINCT va3.vdid) "); - - sql.append(" + COUNT(DISTINCT CASE "); + sql.append(" END) - COUNT(DISTINCT va1.vdid) "); + sql.append(" ) AS li_pending, "); + + // 9. ARO Pending = LI Processed - ARO Processed + sql.append(" GREATEST(0, "); + sql.append(" COUNT(DISTINCT va1.vdid) - COUNT(DISTINCT va2.vdid) "); + sql.append(" ) AS aro_pending, "); + + // 10. EE Pending = ARO Processed - EE Processed + sql.append(" GREATEST(0, "); + sql.append(" COUNT(DISTINCT va2.vdid) - COUNT(DISTINCT va3.vdid) "); + sql.append(" ) AS ee_pending, "); + + // 11. Committee Pending = EE Processed - Committee Processed + sql.append(" GREATEST(0, "); + sql.append(" COUNT(DISTINCT va3.vdid) - "); + sql.append(" COUNT(DISTINCT CASE "); sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL "); sql.append(" THEN vd.id "); sql.append(" END) "); + sql.append(" ) AS committee_pending, "); - sql.append(" ) AS total_processed, "); - - // 8. Pending - sql.append(" ( "); - sql.append(" COUNT(DISTINCT vd.id) - "); - - sql.append(" ( "); - - sql.append(" COUNT(DISTINCT CASE "); - sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); - sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); - sql.append(" AND vd.tamil_landmark IS NOT NULL AND vd.tamil_landmark <> '' "); - sql.append(" AND vd.tamil_gender IS NOT NULL AND vd.tamil_gender <> '' "); - sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); - sql.append(" AND vd.tamil_vending_category IS NOT NULL "); - sql.append(" THEN vd.id "); - sql.append(" END) "); - - sql.append(" + COUNT(DISTINCT va1.vdid) "); - sql.append(" + COUNT(DISTINCT va2.vdid) "); - sql.append(" + COUNT(DISTINCT va3.vdid) "); - - sql.append(" + COUNT(DISTINCT CASE "); - sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL "); - sql.append(" THEN vd.id "); - sql.append(" END) "); - - sql.append(" ) "); - - sql.append(" ) AS pending, "); - - // 9. Processed within 30 days + // 12. Processed within 30 days sql.append(" COUNT(DISTINCT CASE "); sql.append(" WHEN vrl.cdate IS NOT NULL "); sql.append(" AND DATEDIFF(vrl.cdate, vd.cdate) <= 30 "); @@ -227,9 +219,20 @@ public class StreetVendorService { sql.append(" THEN vd.id "); sql.append(" END) AS committee_processed, "); - // 7. Total Processed - sql.append(" ( "); - + // 7. Assistant Pending + sql.append(" (COUNT(DISTINCT vd.id) - "); + sql.append(" COUNT(DISTINCT CASE "); + sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); + sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); + sql.append(" AND vd.tamil_landmark IS NOT NULL AND vd.tamil_landmark <> '' "); + sql.append(" AND vd.tamil_gender IS NOT NULL AND vd.tamil_gender <> '' "); + sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); + sql.append(" AND vd.tamil_vending_category IS NOT NULL "); + sql.append(" THEN vd.id "); + sql.append(" END)) AS assistant_pending, "); + + // 8. LI Pending = Assistant Processed - LI Processed + sql.append(" GREATEST(0, "); sql.append(" COUNT(DISTINCT CASE "); sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); @@ -238,47 +241,27 @@ public class StreetVendorService { sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); sql.append(" AND vd.tamil_vending_category IS NOT NULL "); sql.append(" THEN vd.id "); - sql.append(" END) "); - - sql.append(" + COUNT(DISTINCT va1.vdid) "); - sql.append(" + COUNT(DISTINCT va2.vdid) "); - sql.append(" + COUNT(DISTINCT va3.vdid) "); - - sql.append(" + COUNT(DISTINCT CASE "); + sql.append(" END) - COUNT(DISTINCT va1.vdid) "); + sql.append(" ) AS li_pending, "); + + // 9. ARO Pending = LI Processed - ARO Processed + sql.append(" GREATEST(0, "); + sql.append(" COUNT(DISTINCT va1.vdid) - COUNT(DISTINCT va2.vdid) "); + sql.append(" ) AS aro_pending, "); + + // 10. EE Pending = ARO Processed - EE Processed + sql.append(" GREATEST(0, "); + sql.append(" COUNT(DISTINCT va2.vdid) - COUNT(DISTINCT va3.vdid) "); + sql.append(" ) AS ee_pending, "); + + // 11. Committee Pending = EE Processed - Committee Processed + sql.append(" GREATEST(0, "); + sql.append(" COUNT(DISTINCT va3.vdid) - "); + sql.append(" COUNT(DISTINCT CASE "); sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL "); sql.append(" THEN vd.id "); sql.append(" END) "); - - sql.append(" ) AS total_processed, "); - - // 8. Pending - sql.append(" ( "); - sql.append(" COUNT(DISTINCT vd.id) - "); - - sql.append(" ( "); - - sql.append(" COUNT(DISTINCT CASE "); - sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); - sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); - sql.append(" AND vd.tamil_landmark IS NOT NULL AND vd.tamil_landmark <> '' "); - sql.append(" AND vd.tamil_gender IS NOT NULL AND vd.tamil_gender <> '' "); - sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); - sql.append(" AND vd.tamil_vending_category IS NOT NULL "); - sql.append(" THEN vd.id "); - sql.append(" END) "); - - sql.append(" + COUNT(DISTINCT va1.vdid) "); - sql.append(" + COUNT(DISTINCT va2.vdid) "); - sql.append(" + COUNT(DISTINCT va3.vdid) "); - - sql.append(" + COUNT(DISTINCT CASE "); - sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL "); - sql.append(" THEN vd.id "); - sql.append(" END) "); - - sql.append(" ) "); - - sql.append(" ) AS pending, "); + sql.append(" ) AS committee_pending, "); // 9. Processed within 30 days sql.append(" COUNT(DISTINCT CASE "); @@ -358,15 +341,17 @@ public class StreetVendorService { sql.append(" COUNT(DISTINCT va1.vdid) AS li_processed, "); - // 8. Pending - sql.append(" ( "); - sql.append(" COUNT(DISTINCT vd.id) - "); - - - - sql.append(" COUNT(DISTINCT va1.vdid) "); - - + // 8. LI Pending = Assistant Processed - LI Processed + sql.append(" GREATEST(0, "); + sql.append(" COUNT(DISTINCT CASE "); + sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); + sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); + sql.append(" AND vd.tamil_landmark IS NOT NULL AND vd.tamil_landmark <> '' "); + sql.append(" AND vd.tamil_gender IS NOT NULL AND vd.tamil_gender <> '' "); + sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); + sql.append(" AND vd.tamil_vending_category IS NOT NULL "); + sql.append(" THEN vd.id "); + sql.append(" END) - COUNT(DISTINCT va1.vdid) "); sql.append(" ) AS li_pending "); @@ -419,15 +404,16 @@ public class StreetVendorService { // 8. Pending - sql.append(" ( "); - sql.append(" COUNT(DISTINCT vd.id) - "); - - sql.append(" ( "); - - sql.append(" COUNT(DISTINCT va1.vdid) "); - - sql.append(" ) "); - + sql.append(" GREATEST(0, "); + sql.append(" COUNT(DISTINCT CASE "); + sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); + sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); + sql.append(" AND vd.tamil_landmark IS NOT NULL AND vd.tamil_landmark <> '' "); + sql.append(" AND vd.tamil_gender IS NOT NULL AND vd.tamil_gender <> '' "); + sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); + sql.append(" AND vd.tamil_vending_category IS NOT NULL "); + sql.append(" THEN vd.id "); + sql.append(" END) - COUNT(DISTINCT va1.vdid) "); sql.append(" ) AS li_pending "); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 196b48f..7470be5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,2 +1,2 @@ -spring.profiles.active=prod -#spring.profiles.active=dev \ No newline at end of file +#spring.profiles.active=prod +spring.profiles.active=dev \ No newline at end of file diff --git a/src/main/resources/templates/modules/dbfot/CompDetails.html b/src/main/resources/templates/modules/dbfot/CompDetails.html new file mode 100644 index 0000000..411ad94 --- /dev/null +++ b/src/main/resources/templates/modules/dbfot/CompDetails.html @@ -0,0 +1,1311 @@ + + + + DBFOT Complaints Based Dashboard Details + + + + + + + + + + + +
+
+ +
+

Complaints Overview

+

Track and analyze complaints data across all locations.

+
+ + + +
+ + +
+
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + +
+ +
+
+ + +
+
+ +
+
+ +
+ + +
+ + +
+
+
+
+ +
+
+
0
+
Total Complaints
+
+
+
+
+ + +
+
+
+
+ +
+
+
0
+
Opened
+
+
+
+
+ + +
+
+
+
+ +
+
+
0
+
Under Review
+
+
+
+
+ + +
+
+
+
+ +
+
+
0
+
Pending Closure
+
+
+
+
+ + +
+
+
+
+ +
+
+
0
+
Closed
+
+
+
+
+ +
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoZoneWardPCTComplaint IDDescriptionTurnAround TimeSourceStatusRaised OnClosed On
+ +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/modules/dbfot/locDetails.html b/src/main/resources/templates/modules/dbfot/locDetails.html new file mode 100644 index 0000000..f56251d --- /dev/null +++ b/src/main/resources/templates/modules/dbfot/locDetails.html @@ -0,0 +1,2023 @@ + + + + DBFOT Location Based Dashboard Details + + + + + + + + + + + + +
+ +
+ +
+

Locations Overview

+

Get a quick overview of locations, complaints and workforce status.

+
+ + + +
+ + + +
+
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+
+ + +
+
+ +
+
+ +
+ + +
+ + +
+
+
+
+ +
+
+
0
+
Total Locations
+
+
+
+
+ + +
+
+
+
+ +
+
+
0
+
Total Active Locations
+
+
+
+
+ + +
+
+
+
+ +
+
+
0
+
Total Complaints
+
+
+
+
+ + +
+
+
+
+ +
+
+
0
+
Today's Complaints
+
+
+
+
+ + +
+
+
+
+ +
+
+
0
+
Manpower Present
+
+
+
+
+ +
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoPCTZoneWardAddressStatusManpowerTotal ComplaintsOpenedUnder ReviewPending ClosureClosed
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/modules/roadwarweb/roadwarregisterdashboard.html b/src/main/resources/templates/modules/roadwarweb/roadwarregisterdashboard.html index 4bfd60a..9164757 100644 --- a/src/main/resources/templates/modules/roadwarweb/roadwarregisterdashboard.html +++ b/src/main/resources/templates/modules/roadwarweb/roadwarregisterdashboard.html @@ -577,7 +577,7 @@
GCC TOTAL ROADS
-
36807
+
0
@@ -1169,7 +1169,7 @@