From b948f92d8b8af2a85e869d41bb7d3cc044b961ed Mon Sep 17 00:00:00 2001 From: AJITHKUMAR12 <48044092+AJITHKUMAR12@users.noreply.github.com> Date: Tue, 26 May 2026 10:25:27 +0530 Subject: [PATCH] Implemented report module for three ie complaint and tenment complaint --- .../configuration/DataSourceConfig.java | 20 +- .../controller/IeComplaintsApiController.java | 49 + .../controller/MainController.java | 6 +- .../controller/TenementController.java | 98 + .../service/IeComplaintsService.java | 318 +++ .../service/TenementService.java | 489 ++++ .../templates/modules/vendorreport.html | 2209 +++++++++++++++++ 7 files changed, 3182 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gcc/commissionerreview/controller/TenementController.java create mode 100644 src/main/java/com/gcc/commissionerreview/service/TenementService.java create mode 100644 src/main/resources/templates/modules/vendorreport.html diff --git a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java index 30c39fc..38cde82 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 @@ -179,7 +179,15 @@ public class DataSourceConfig { return dataSource; } - - + ////////// Tenements////////////////////// + @Bean(name = "mysqlTenementDataSource") + public DataSource mysqlTenementDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://" + host + "/gcc_tenements"); + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } } diff --git a/src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java b/src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java index a7c53fc..08cd1ff 100644 --- a/src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java +++ b/src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java @@ -84,4 +84,53 @@ public class IeComplaintsApiController { iecomplaintservice.getComplaintDetails(zone, ward, complaintId, fromDate, toDate)); } + @GetMapping("/vendorzoneActivity") + public ResponseEntity> vendorzoneActivity( + + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate, + @RequestParam(required = false) Integer complaintId) { + + return ResponseEntity.ok( + iecomplaintservice.getvendorZoneActivity(fromDate, toDate, complaintId)); + + } + + @GetMapping("/vendorwardActivity") + public ResponseEntity> vendorwardActivity( + + @RequestParam String zone, + @RequestParam(required = false) String complaintId, + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return ResponseEntity.ok( + iecomplaintservice.getvendorWardActivity(zone, complaintId, fromDate, toDate)); + + } + + @GetMapping("/vendorcomplaintDetails") + public ResponseEntity> vendorcomplaintDetails( + + @RequestParam String zone, + @RequestParam String ward, + @RequestParam(required = false) String complaintId, + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return ResponseEntity.ok( + iecomplaintservice.getvendorComplaintDetails(zone, ward, complaintId, fromDate, toDate)); + } + + @GetMapping("/vendorcomplaintDashboard") + public ResponseEntity> vendorcomplaintDashboard( + + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return ResponseEntity.ok( + iecomplaintservice.getvendorComplaintDashboard(fromDate, toDate)); + + } + } diff --git a/src/main/java/com/gcc/commissionerreview/controller/MainController.java b/src/main/java/com/gcc/commissionerreview/controller/MainController.java index 4d8a4a9..0561e6b 100644 --- a/src/main/java/com/gcc/commissionerreview/controller/MainController.java +++ b/src/main/java/com/gcc/commissionerreview/controller/MainController.java @@ -311,7 +311,6 @@ public class MainController { return "modules/fooddistribution/fooddistributiondetailedreport"; } - @GetMapping("/posterreport") public String posterdetailedreport(Model model) { return "modules/poster/posterReport"; @@ -322,4 +321,9 @@ public class MainController { return "modules/poster/bannerReport"; } + @GetMapping("/vendorreport") + public String vendorreport(Model model) { + return "modules/vendorreport"; + } + } diff --git a/src/main/java/com/gcc/commissionerreview/controller/TenementController.java b/src/main/java/com/gcc/commissionerreview/controller/TenementController.java new file mode 100644 index 0000000..2221723 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/TenementController.java @@ -0,0 +1,98 @@ +package com.gcc.commissionerreview.controller; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +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.IeComplaintsService; +import com.gcc.commissionerreview.service.TenementService; + +@RestController +@RequestMapping("/commissionerreview/api/tenement") + +public class TenementController { + + @Autowired + private TenementService tenementService; + + @GetMapping("/tenementDashboard") + public ResponseEntity> getTenementDashboard( + + @RequestParam String fromDate, + @RequestParam String toDate) { + + return ResponseEntity.ok( + tenementService.getTenementDashboard( + fromDate, + toDate)); + } + + @GetMapping("/zoneActivity") + public ResponseEntity> zoneActivity( + + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return ResponseEntity.ok( + tenementService.getZoneActivity(fromDate, toDate)); + } + + @GetMapping("/wardActivity") + public ResponseEntity> wardActivity( + + @RequestParam String zone, + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return ResponseEntity.ok( + tenementService.getWardActivity( + zone, + fromDate, + toDate)); + } + // ================= CONTROLLER ================= + + @GetMapping("/getSchemeWiseReport") + public ResponseEntity> getSchemeWiseReport( + + @RequestParam String ward, + + @RequestParam(required = false) String fromDate, + + @RequestParam(required = false) String toDate) { + + return ResponseEntity.ok( + + tenementService.getSchemeWiseReport( + ward, + fromDate, + toDate)); + } + + @GetMapping("/getComplaintDetails") + public Map getComplaintDetails( + + @RequestParam String ward, + @RequestParam String schemeid, + + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return tenementService.getComplaintDetails( + ward, + schemeid, + + fromDate, + toDate); + } + +} diff --git a/src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java b/src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java index 2dd78b4..c89cd67 100644 --- a/src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java +++ b/src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java @@ -529,6 +529,324 @@ public class IeComplaintsService { return response; } + // vendor api + public Map getvendorZoneActivity(String fromDate, String toDate, Integer complaintId) { + + Map response = new HashMap<>(); + + try { + + StringBuilder sql = new StringBuilder(); + List params = new ArrayList<>(); + + sql.append("SELECT "); + sql.append("zm.zone_name, "); + + sql.append("COUNT(DISTINCT CASE "); + + if (fromDate != null && !fromDate.isEmpty() + && toDate != null && !toDate.isEmpty()) { + + sql.append("WHEN DATE(cd.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + + } else { + + sql.append("WHEN 1=1 "); + } + + sql.append("THEN cd.ref_id END) AS total_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN comp.ref_id IS NOT NULL "); + + if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) { + sql.append("AND DATE(comp.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append("THEN comp.ref_id END) AS completed_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN comp.ref_id IS NULL "); + + if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) { + sql.append("AND DATE(cd.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append("THEN cd.ref_id END) AS pending_count "); + + sql.append("FROM gcc_street_vendor.zone_master zm "); + + sql.append("LEFT JOIN complaint_details cd "); + sql.append("ON zm.zone_name = cd.zone "); + sql.append("AND cd.is_delete = 0 "); + sql.append("AND cd.is_active = 1 "); + sql.append("AND cd.complaint_id IN (4,6,12)"); + + if (complaintId != null) { + sql.append("AND cd.complaint_id = ? "); + params.add(complaintId); + } + + sql.append("LEFT JOIN completion comp "); + sql.append("ON comp.ref_id = cd.ref_id "); + + sql.append("GROUP BY zm.zone_name "); + sql.append("ORDER BY zm.zone_name "); + + List> result = jdbcTemplate.queryForList(sql.toString(), params.toArray()); + + response.put("status", "Success"); + response.put("data", result); + + } catch (Exception e) { + e.printStackTrace(); + response.put("status", "Error"); + } + + return response; + } + + public Map getvendorWardActivity(String zone, String complaintId, + String fromDate, String toDate) { + + Map response = new HashMap<>(); + + try { + + StringBuilder sql = new StringBuilder(); + List params = new ArrayList<>(); + + sql.append("SELECT "); + sql.append("wm.ward_name AS ward, "); + + sql.append("COUNT(DISTINCT cd.ref_id) AS total_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN comp.ref_id IS NOT NULL "); + + if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) { + sql.append("AND DATE(comp.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append("THEN comp.ref_id END) AS completed_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN comp.ref_id IS NULL "); + + if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) { + sql.append("AND DATE(cd.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append("THEN cd.ref_id END) AS pending_count "); + + sql.append("FROM gcc_street_vendor.ward_master wm "); + + // Complaint details join + sql.append("LEFT JOIN complaint_details cd "); + sql.append("ON wm.ward_name = cd.ward "); + // this below condition is here because if to get all the ward if no data for + // that ward also + sql.append("AND cd.zone = ? "); + params.add(zone); + + sql.append("AND cd.is_delete = 0 "); + sql.append("AND cd.is_active = 1 "); + sql.append("AND cd.complaint_id IN (4,6,12)"); + + if (complaintId != null && !complaintId.isEmpty()) { + sql.append("AND cd.complaint_id = ? "); + params.add(complaintId); + } + + // Completion join + sql.append("LEFT JOIN completion comp "); + sql.append("ON comp.ref_id = cd.ref_id "); + + // Zone filter + sql.append("WHERE wm.zone_id = ? "); + params.add(zone); + + sql.append("GROUP BY wm.ward_name "); + sql.append("ORDER BY wm.ward_name "); + + List> result = jdbcTemplate.queryForList(sql.toString(), params.toArray()); + + response.put("status", "Success"); + response.put("data", result); + + } catch (Exception e) { + + e.printStackTrace(); + response.put("status", "Error"); + response.put("message", "Something went wrong"); + } + + return response; + } + + public Map getvendorComplaintDetails(String zone, String ward, + String complaintId, String fromDate, String toDate) { + + Map response = new HashMap<>(); + + try { + + StringBuilder sql = new StringBuilder(); + List params = new ArrayList<>(); + + String beforeImageColumn = "cd.image_path"; + String afterImageColumn = "comp.image_path"; + + sql.append("SELECT "); + sql.append("cm.complaint_name, "); + sql.append("cd.street_name, "); + sql.append("cd.status, "); + sql.append("cd.street_name AS complaint_street_name, "); + sql.append("comp.street_name AS completion_street_name, "); + + sql.append("DATE_FORMAT(cd.cdate,'%d-%m-%Y') AS complaint_created_date, "); + sql.append("IFNULL(DATE_FORMAT(comp.cdate,'%d-%m-%Y'),'Pending') AS completion_date, "); + /* + * sql.append("DATE(cd.cdate) AS complaint_created_date, "); + * sql.append("IFNULL(DATE(comp.cdate),'Pending') AS completion_date, "); + */ + + sql.append( + "CONCAT('" + fileBaseUrl + "/gccofficialapp/files'," + beforeImageColumn + ") AS before_image, "); + sql.append("CONCAT('" + fileBaseUrl + "/gccofficialapp/files'," + afterImageColumn + ") AS after_image "); + + sql.append("FROM complaint_details cd "); + + sql.append("LEFT JOIN complaint_master cm "); + sql.append("ON cm.complaint_id = cd.complaint_id "); + + sql.append("LEFT JOIN completion comp "); + sql.append("ON comp.ref_id = cd.ref_id "); + + sql.append("WHERE cd.zone = ? "); + params.add(zone); + + sql.append("AND cd.ward = ? "); + params.add(ward); + + sql.append("AND cd.is_delete = 0 "); + sql.append("AND cd.is_active = 1 "); + sql.append("AND cd.complaint_id IN (4,6,12)"); + + if (complaintId != null && !complaintId.isEmpty()) { + sql.append("AND cd.complaint_id = ? "); + params.add(complaintId); + } + + if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) { + + sql.append("AND ( "); + + sql.append("(comp.ref_id IS NOT NULL AND DATE(comp.cdate) BETWEEN ? AND ?) "); + + sql.append("OR "); + + sql.append("(comp.ref_id IS NULL AND DATE(cd.cdate) BETWEEN ? AND ?) "); + + sql.append(") "); + + params.add(fromDate); + params.add(toDate); + params.add(fromDate); + params.add(toDate); + } + + List> result = jdbcTemplate.queryForList(sql.toString(), params.toArray()); + + response.put("status", "Success"); + response.put("data", result); + + } catch (Exception e) { + + e.printStackTrace(); + response.put("status", "Error"); + } + + return response; + } + + public Map getvendorComplaintDashboard(String fromDate, String toDate) { + + Map response = new HashMap<>(); + + try { + + StringBuilder sql = new StringBuilder(); + + List params = new ArrayList<>(); + + sql.append("SELECT "); + sql.append("cm.complaint_id, cm.complaint_name, "); + + sql.append("COUNT(DISTINCT cd.ref_id) AS total_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN comp.ref_id IS NOT NULL "); + sql.append("AND cd.complaint_id IN (4,6,12) "); + + if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) { + sql.append("AND DATE(comp.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append("THEN comp.ref_id END) AS completed_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN comp.ref_id IS NULL "); + sql.append("AND cd.complaint_id IN (4,6,12) "); + + if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) { + sql.append("AND DATE(cd.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append("THEN cd.ref_id END) AS pending_count "); + + sql.append("FROM complaint_master cm "); + + sql.append("LEFT JOIN complaint_details cd "); + sql.append("ON cm.complaint_id = cd.complaint_id "); + + sql.append("LEFT JOIN completion comp "); + sql.append("ON comp.ref_id = cd.ref_id "); + sql.append("WHERE cm.complaint_id IN (4,6,12) "); + + sql.append("GROUP BY cm.complaint_id, cm.complaint_name "); + sql.append("ORDER BY cm.complaint_id"); + + List> result = jdbcTemplate.queryForList(sql.toString(), params.toArray()); + + response.put("status", "Success"); + response.put("data", result); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "Error"); + response.put("message", "Something went wrong"); + } + + return response; + } + /* * public Map getComplaintDetails(String zone, String ward, * String complaintId, String fromDate, String toDate) { diff --git a/src/main/java/com/gcc/commissionerreview/service/TenementService.java b/src/main/java/com/gcc/commissionerreview/service/TenementService.java new file mode 100644 index 0000000..feddca9 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/TenementService.java @@ -0,0 +1,489 @@ +package com.gcc.commissionerreview.service; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +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.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service + +public class TenementService { + + @Autowired + @Value("${fileBaseUrl}") + + private String fileBaseUrl; + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private Environment environment; + + @Autowired + public void setDataSource(@Qualifier("mysqlTenementDataSource") DataSource tenementDataSource) { + this.jdbcTemplate = new JdbcTemplate(tenementDataSource); + } + + public TenementService(Environment environment) { + + this.environment = environment; + + this.fileBaseUrl = environment.getProperty("fileBaseUrl"); + } + + public Map getTenementDashboard( + + String fromDate, + String toDate) { + + Map response = new HashMap<>(); + + try { + + String sql = ""; + List> result; + + // ✅ if no date filter + if (fromDate == null || fromDate.isBlank() + || toDate == null || toDate.isBlank()) { + + sql = "SELECT " + + + "'Tenement' AS complaint_name, " + + + "COUNT(*) AS total_count, " + + + "COUNT(CASE " + + "WHEN final_status IN ('completed','verified') " + + "THEN 1 END) AS completed_count, " + + + "COUNT(CASE " + + "WHEN final_status = 'created' " + + "THEN 1 END) AS pending_count " + + + "FROM issue_list1"; + + result = jdbcTemplate.queryForList(sql); + + } else { + + // ✅ with date filter + sql = "SELECT " + + + "'Tenement' AS complaint_name, " + + + "COUNT(*) AS total_count, " + + + "COUNT(CASE " + + "WHEN final_status IN ('completed','verified') " + + "THEN 1 END) AS completed_count, " + + + "COUNT(CASE " + + "WHEN final_status = 'created' " + + "THEN 1 END) AS pending_count " + + + "FROM issue_list1 " + + + "WHERE DATE(cdate) BETWEEN ? AND ?"; + + result = jdbcTemplate.queryForList( + sql, + fromDate, + toDate); + } + + response.put("status", "Success"); + response.put("data", result); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "Error"); + response.put("message", e.getMessage()); + } + + return response; + } + + public Map getZoneActivity( + + String fromDate, + String toDate) { + + Map response = new HashMap<>(); + + try { + + String sql = ""; + + List> result; + + // ✅ PAGE LOAD -> fetch all data without date filter + if (fromDate == null || fromDate.isBlank() + || toDate == null || toDate.isBlank()) { + + sql = + + "SELECT " + + + "am.zone, " + + + // ✅ total complaints + "COUNT(DISTINCT il1.id) AS total_complaint_count, " + + + // ✅ completed + "COUNT(DISTINCT CASE " + + "WHEN il1.final_status IN ('completed','verified') " + + "THEN il1.id END) " + + "AS total_complaint_closed_count, " + + + // ✅ pending + "COUNT(DISTINCT CASE " + + "WHEN il1.final_status = 'created' " + + "THEN il1.id END) " + + "AS total_complaint_pending_count " + + + "FROM asset_master am " + + + "LEFT JOIN asset_list al " + + "ON al.am_id = am.id " + + + "LEFT JOIN issue_list1 il1 " + + "ON il1.assetlist_id = al.id " + + + "GROUP BY am.zone " + + + "ORDER BY am.zone"; + + result = jdbcTemplate.queryForList(sql); + + } else { + + // ✅ SEARCH BUTTON -> apply date filter + sql = + + "SELECT " + + + "am.zone, " + + + // ✅ total complaints + "COUNT(DISTINCT il1.id) AS total_complaint_count, " + + + // ✅ completed + "COUNT(DISTINCT CASE " + + "WHEN il1.final_status IN ('completed','verified') " + + "THEN il1.id END) " + + "AS total_complaint_closed_count, " + + + // ✅ pending + "COUNT(DISTINCT CASE " + + "WHEN il1.final_status = 'created' " + + "THEN il1.id END) " + + "AS total_complaint_pending_count " + + + "FROM asset_master am " + + + "LEFT JOIN asset_list al " + + "ON al.am_id = am.id " + + + "LEFT JOIN issue_list1 il1 " + + "ON il1.assetlist_id = al.id " + + "AND DATE(il1.cdate) BETWEEN ? AND ? " + + + "GROUP BY am.zone " + + + "ORDER BY am.zone"; + + result = jdbcTemplate.queryForList( + sql, + fromDate, + toDate); + } + + response.put("status", "success"); + response.put("data", result); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "error"); + response.put("message", e.getMessage()); + } + + return response; + } + + public Map getWardActivity( + + String zone, + String fromDate, + String toDate) { + + Map response = new HashMap<>(); + + try { + + StringBuilder sql = new StringBuilder(); + List params = new ArrayList<>(); + + sql.append("SELECT "); + sql.append("am.ward, "); + + // total + sql.append("COUNT(DISTINCT il1.id) "); + sql.append("AS total_complaint_count, "); + + // completed + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status IN ('completed','verified') "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_closed_count, "); + + // pending + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status = 'created' "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_pending_count "); + + sql.append("FROM asset_master am "); + + sql.append("LEFT JOIN asset_list al "); + sql.append("ON al.am_id = am.id "); + + sql.append("LEFT JOIN issue_list1 il1 "); + sql.append("ON il1.assetlist_id = al.id "); + + sql.append("WHERE am.zone = ? "); + params.add(zone); + + // date filter + if (fromDate != null && !fromDate.isBlank() + && toDate != null && !toDate.isBlank()) { + + sql.append("AND DATE(il1.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + sql.append("GROUP BY am.ward "); + sql.append("ORDER BY am.ward "); + + List> result = jdbcTemplate.queryForList( + sql.toString(), + params.toArray()); + + response.put("status", "success"); + response.put("data", result); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "error"); + response.put("message", e.getMessage()); + } + + return response; + } + // ================= SERVICE ================= + + public Map getSchemeWiseReport( + + String ward, + String fromDate, + String toDate) { + + Map response = new HashMap<>(); + + try { + + StringBuilder sql = new StringBuilder(); + + List params = new ArrayList<>(); + + sql.append("SELECT "); + + sql.append("am.scheme_name, "); + sql.append("am.id as schemeid, "); + + // TOTAL + sql.append("COUNT(DISTINCT il1.id) "); + sql.append("AS total_complaint_count, "); + + // COMPLETED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status IN ('completed','verified') "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_closed_count, "); + + // PENDING + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status = 'created' "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_pending_count "); + + sql.append("FROM asset_master am "); + + sql.append("LEFT JOIN asset_list al "); + sql.append("ON al.am_id = am.id "); + + sql.append("LEFT JOIN issue_list1 il1 "); + sql.append("ON il1.assetlist_id = al.id "); + + sql.append("WHERE am.ward = ? "); + params.add(ward); + + // DATE FILTER + if (fromDate != null && !fromDate.isBlank() + && toDate != null && !toDate.isBlank()) { + + sql.append("AND DATE(il1.cdate) BETWEEN ? AND ? "); + + params.add(fromDate); + params.add(toDate); + } + + sql.append("GROUP BY am.scheme_name, am.id "); + + sql.append("ORDER BY am.scheme_name "); + + List> result = jdbcTemplate.queryForList( + sql.toString(), + params.toArray()); + + response.put("status", "success"); + response.put("data", result); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "error"); + response.put("message", e.getMessage()); + } + + return response; + } + + public Map getComplaintDetails( + + String ward, + String schemeid, + String fromDate, + String toDate) { + + Map response = new HashMap<>(); + + try { + + StringBuilder sql = new StringBuilder(); + + List params = new ArrayList<>(); + + sql.append("SELECT "); + + sql.append("il1.id AS issuelist1_id, "); + sql.append("il1.final_status, "); + sql.append("DATE_FORMAT(il1.cdate,'%d-%m-%Y') AS created_date,"); + + // sql.append( + // "IFNULL(DATE_FORMAT(il1.cdate,'%d-%m-%Y %h:%i %p'),'') AS created_date, "); + + sql.append("IFNULL(il1.remarks,'') AS created_remarks, "); + + sql.append( + "CASE " + + "WHEN il1.before_image IS NOT NULL " + + "THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', il1.before_image) " + + "ELSE '' END AS before_image, "); + + /* + * sql.append( + * "IFNULL(DATE_FORMAT(il2.cdate,'%d-%m-%Y %h:%i %p'),'') AS completed_date, "); + */ + sql.append("DATE_FORMAT(il2.cdate,'%d-%m-%Y') AS completed_date,"); + + sql.append( + "IFNULL(il2.remarks,'') AS completed_remarks, "); + + sql.append( + "CASE " + + "WHEN il2.after_image IS NOT NULL " + + "THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', il2.after_image) " + + "ELSE '' END AS after_image, "); + + sql.append( + "IFNULL(DATE_FORMAT(il3.cdate,'%d-%m-%Y %h:%i %p'),'') AS verified_date, "); + + sql.append( + "IFNULL(il3.remarks,'') AS verified_remarks, "); + + sql.append( + "CASE " + + "WHEN il3.Verify_image IS NOT NULL " + + "THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', il3.Verify_image) " + + "ELSE '' END AS verify_image "); + + sql.append("FROM issue_list1 il1 "); + + sql.append("LEFT JOIN asset_list al "); + sql.append("ON al.id = il1.assetlist_id "); + + sql.append("LEFT JOIN issue_list2 il2 "); + sql.append("ON il2.issuelist1_id = il1.id "); + + sql.append("LEFT JOIN issue_list3 il3 "); + sql.append("ON il3.issuelist1_id = il1.id "); + + sql.append("WHERE il1.ward = ? "); + params.add(ward); + + sql.append("AND al.am_id = ? "); + params.add(schemeid); + + // ✅ only if dates available + if (fromDate != null && !fromDate.isBlank() + && toDate != null && !toDate.isBlank()) { + + sql.append("AND DATE(il1.cdate) BETWEEN ? AND ? "); + + params.add(fromDate); + params.add(toDate); + } + + sql.append("ORDER BY il1.id DESC "); + + List> result = jdbcTemplate.queryForList( + sql.toString(), + params.toArray()); + + response.put("status", "success"); + response.put("data", result); + + } catch (Exception e) { + + e.printStackTrace(); + + response.put("status", "error"); + response.put("message", e.getMessage()); + } + + return response; + } + +} diff --git a/src/main/resources/templates/modules/vendorreport.html b/src/main/resources/templates/modules/vendorreport.html new file mode 100644 index 0000000..3ef6ba3 --- /dev/null +++ b/src/main/resources/templates/modules/vendorreport.html @@ -0,0 +1,2209 @@ + + + + + IE Complaints Report + + + + + + + + + + + + + +
+

IE Complaints Report

+
+ +
+ + + + + +
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ +
+ +
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Zone + + Hotspot + + RC Bin Overflow + + Unauthorized garbage dumping + + Tenement +
ComplaintsCompletedPendingComplaintsCompletedPendingComplaintsCompletedPendingComplaintsCompletedPending
+ +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file