diff --git a/pom.xml b/pom.xml index 0799679..e2d6682 100644 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,47 @@ 5.5.13.3 + + + + net.sf.jasperreports + jasperreports + 6.21.0 + + + + net.sf.jasperreports + jasperreports-fonts + 6.21.0 + + + + com.opencsv + opencsv + 5.9 + + + + com.itextpdf + itextpdf + 5.5.13.3 + + + + + + + net.sf.jasperreports + jasperreports + 6.21.0 + + + + net.sf.jasperreports + jasperreports-fonts + 6.21.0 + + diff --git a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java index 72b892d..8140a18 100644 --- a/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java +++ b/src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java @@ -17,12 +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 @@ -180,7 +179,40 @@ public class DataSourceConfig { return dataSource; } - ////////////////////////////// News Feed ///////////////// + ////////// 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; + } + + ////////// GCC Street Vendor////////////////////// + @Bean(name = "mysqlStreetVendorDataSource") + public DataSource mysqlStreetVendorDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://" + host + "/gcc_street_vendor"); + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } + + ////////// Vending Committee ////////////////////// + @Bean(name = "mysqlVendingCommitteeDataSource") + public DataSource mysqlVendingCommitteeDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://" + host + "/vendingcommitte"); + dataSource.setUsername("root"); + dataSource.setPassword(dbpassword); + return dataSource; + } + + ////////// News Feed////////////////////// @Bean(name = "mysqlNewsFeedDataSource") public DataSource mysqlNewsFeedDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); diff --git a/src/main/java/com/gcc/commissionerreview/controller/BannerRemovalApiController.java b/src/main/java/com/gcc/commissionerreview/controller/BannerRemovalApiController.java new file mode 100644 index 0000000..738e9a6 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/BannerRemovalApiController.java @@ -0,0 +1,79 @@ +package com.gcc.commissionerreview.controller; + +import com.gcc.commissionerreview.service.BannerApiService; +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 java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/commissionerreview/api/bannerremoval") + +public class BannerRemovalApiController { + + @Autowired + private BannerApiService bannerApiService ; + + + @GetMapping("/zone-wise") + public ResponseEntity> getZoneData( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate) { + + Map data = + bannerApiService.fetchZoneData(assetTypeId, fromDate, toDate); + + return ResponseEntity.ok(data); + } + + + + @GetMapping("/ward-wise") + public ResponseEntity> getWardData( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String zone) { + + Map data = + bannerApiService.fetchWardData(assetTypeId, fromDate, toDate,zone); + + return ResponseEntity.ok(data); + } + + @GetMapping("/street-wise") + public ResponseEntity> getStreetData( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String zone, + @RequestParam String ward) { + + Map data = + bannerApiService.fetchStreetData(assetTypeId, fromDate, toDate,zone,ward); + + return ResponseEntity.ok(data); + } + + @GetMapping("/street-details") + public ResponseEntity>> getStreetDetails( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String zone, + @RequestParam String ward, + @RequestParam String streetid) { + + List> data = + bannerApiService.fetchStreetDetails(assetTypeId, fromDate, toDate, zone, ward, streetid); + + return ResponseEntity.ok(data); + } + +} diff --git a/src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java b/src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java index a7c53fc..fab2faa 100644 --- a/src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java +++ b/src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java @@ -84,4 +84,54 @@ 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, + @RequestParam(required = false) String status) { + + return ResponseEntity.ok( + iecomplaintservice.getvendorComplaintDetails(zone, ward, complaintId, fromDate, toDate, status)); + } + + @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 bdbaece..caa1222 100644 --- a/src/main/java/com/gcc/commissionerreview/controller/MainController.java +++ b/src/main/java/com/gcc/commissionerreview/controller/MainController.java @@ -311,4 +311,29 @@ public class MainController { return "modules/fooddistribution/fooddistributiondetailedreport"; } + @GetMapping("/posterreport") + public String posterdetailedreport(Model model) { + return "modules/poster/posterReport"; + } + + @GetMapping("/bannerreport") + public String bannerdetailedreport(Model model) { + return "modules/poster/bannerReport"; + } + + @GetMapping("/vendorreport") + public String vendorreport(Model model) { + return "modules/vendorreport"; + } + + @GetMapping("/stvendor/overallreport") + public String stvendor_overallreport(Model model) { + return "modules/streetvendor/overalldetails"; + } + + @GetMapping("/stvendor/inspectiondetails") + public String stvendor_inspectiondetails(Model model) { + return "modules/streetvendor/inspectiondetails"; + } + } diff --git a/src/main/java/com/gcc/commissionerreview/controller/PosterRemovalApiController.java b/src/main/java/com/gcc/commissionerreview/controller/PosterRemovalApiController.java new file mode 100644 index 0000000..a91c023 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/PosterRemovalApiController.java @@ -0,0 +1,128 @@ +package com.gcc.commissionerreview.controller; + +import com.gcc.commissionerreview.service.PosterReportService; +import jakarta.servlet.http.HttpServletResponse; +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 java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/commissionerreview/api/posterremoval") + +public class PosterRemovalApiController { + + + @Autowired + private PosterReportService posterReportService; + + + @GetMapping("/zone-wise") + public ResponseEntity> getZoneData( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate) { + + Map data = + posterReportService.fetchZoneData(assetTypeId, fromDate, toDate); + + return ResponseEntity.ok(data); + } + + + + @GetMapping("/ward-wise") + public ResponseEntity> getWardData( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String zone) { + + Map data = + posterReportService.fetchWardData(assetTypeId, fromDate, toDate,zone); + + return ResponseEntity.ok(data); + } + + @GetMapping("/street-wise") + public ResponseEntity> getStreetData( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String zone, + @RequestParam String ward) { + + Map data = + posterReportService.fetchStreetData(assetTypeId, fromDate, toDate,zone,ward); + + return ResponseEntity.ok(data); + } + + @GetMapping("/street-details") + public ResponseEntity>> getStreetDetails( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String zone, + @RequestParam String ward, + @RequestParam String streetid) { + + List> data = + posterReportService.fetchStreetDetails(assetTypeId, fromDate, toDate, zone, ward, streetid); + + return ResponseEntity.ok(data); + } + + + +// add using jrxml format + + @GetMapping("/download-street-report") + public void downloadStreetReport( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String zone, + @RequestParam String ward, + @RequestParam String streetid, + HttpServletResponse response) throws Exception { + + posterReportService.downloadStreetReport( + assetTypeId, + fromDate, + toDate, + zone, + ward, + streetid, + response); + } + + + + @GetMapping("/download-street-pdf-report") + public void downloadStreetPdfReport( + @RequestParam Integer assetTypeId, + @RequestParam String fromDate, + @RequestParam String toDate, + @RequestParam String zone, + @RequestParam String ward, + @RequestParam String streetid, + HttpServletResponse response) throws Exception { + + posterReportService.downloadStreetPdfReport( + assetTypeId, + fromDate, + toDate, + zone, + ward, + streetid, + response); + } + + +} diff --git a/src/main/java/com/gcc/commissionerreview/controller/StreetVendorApiController.java b/src/main/java/com/gcc/commissionerreview/controller/StreetVendorApiController.java new file mode 100644 index 0000000..0e19ad2 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/StreetVendorApiController.java @@ -0,0 +1,46 @@ +package com.gcc.commissionerreview.controller; + +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.StreetVendorService; + +@RestController +@RequestMapping("/commissionerreview/api/streetvendor") +public class StreetVendorApiController { + + @Autowired + private StreetVendorService stvservice; + + @GetMapping("/getzoneoveralldetails") + public List> getzoneoveralldetails(@RequestParam String fromdate,@RequestParam String todate) + { + + return stvservice.getzoneoveralldetails(fromdate,todate); + } + + @GetMapping("/getwardoveralldetails") + public List> getwardoveralldetails(@RequestParam String fromdate,@RequestParam String todate,@RequestParam String zone) + { + return stvservice.getwardoveralldetails(fromdate, todate, zone); + } + + @GetMapping("/getzoneinspectiondetails") + public List> getzoneinspectiondetails(@RequestParam String fromdate,@RequestParam String todate) + { + return stvservice.getzoneinspectiondetails(fromdate,todate); + } + + @GetMapping("/getwardinspectiondetails") + public List> getwardinspectiondetails(@RequestParam String fromdate,@RequestParam String todate,@RequestParam String zone) + { + return stvservice.getwardinspectiondetails(fromdate,todate,zone); + } + +} 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..f9c94b3 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/controller/TenementController.java @@ -0,0 +1,100 @@ +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 status, + + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate) { + + return tenementService.getComplaintDetails( + ward, + schemeid, + status, + + fromDate, + toDate); + } + +} diff --git a/src/main/java/com/gcc/commissionerreview/service/BannerApiService.java b/src/main/java/com/gcc/commissionerreview/service/BannerApiService.java new file mode 100644 index 0000000..7aa30dd --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/BannerApiService.java @@ -0,0 +1,164 @@ +package com.gcc.commissionerreview.service; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class BannerApiService { + + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private ObjectMapper objectMapper; + + + public Map fetchZoneData(Integer assetTypeId, + String fromDate, + String toDate) { + + try { + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + String url = "https://gccservices.in/gccofficialapp/api/asset/filterReports" + + "?assetTypeId=" + assetTypeId + + "&fromDate=" + formattedFromDate + + "&toDate=" + formattedToDate; + + String response = restTemplate.getForObject(url, String.class); + + return objectMapper.readValue(response, Map.class); + + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + return new HashMap<>(); + } + } + + + public Map fetchWardData(Integer assetTypeId, + String fromDate, + String toDate,String zone) { + + try { + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + String url = "https://gccservices.in/gccofficialapp/api/asset/filterReports?" + + "assetTypeId=" + assetTypeId + + "&fromDate=" + formattedFromDate + + "&toDate=" + formattedToDate + + "&zone=" + zone; + + String response = restTemplate.getForObject(url, String.class); + + return objectMapper.readValue(response, Map.class); + + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + return new HashMap<>(); + } + } + + + public Map fetchStreetData(Integer assetTypeId, + String fromDate, + String toDate,String zone,String ward) { + + try { + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + String url = "https://gccservices.in/gccofficialapp/api/asset/filterReports?" + + "assetTypeId=" + assetTypeId + + "&fromDate=" + formattedFromDate + + "&toDate=" + formattedToDate + + "&zone=" + zone + + "&ward=" + ward ; + + String response = restTemplate.getForObject(url, String.class); + + return objectMapper.readValue(response, Map.class); + + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + return new HashMap<>(); + } + } + + + public List> fetchStreetDetails(Integer assetTypeId, + String fromDate, + String toDate, + String zone, + String ward, + String streetid) { + + try { + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + String url = "https://gccservices.in/gccofficialapp/api/asset/filterReportsByDate?" + + "assetTypeId=" + assetTypeId + + "&fromDate=" + formattedFromDate + + "&toDate=" + formattedToDate + + "&zone=" + zone + + "&ward=" + ward + + "&streetid=" + streetid; + + String response = restTemplate.getForObject(url, String.class); + + Object parsed = objectMapper.readValue(response, Object.class); + + + if (parsed instanceof List) { + return (List>) parsed; + } + + Map result = (Map) parsed; + + if (result.containsKey("data")) { + return (List>) result.get("data"); + } + + if (result.containsKey("zoneWise")) { + return (List>) result.get("zoneWise"); + } + + // fallback + return new ArrayList<>(); + + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java b/src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java index 2dd78b4..e97a57a 100644 --- a/src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java +++ b/src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java @@ -529,6 +529,831 @@ 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, "); + + // TOTAL + 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, "); + + // COMPLETED = VERIFIED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status = 'verified' "); + + 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 completed_count, "); + + // PENDING = PENDING + COMPLETED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status IN ('pending','completed') "); + + 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 (3,4,6,12) "); + + if (complaintId != null) { + + sql.append("AND cd.complaint_id = ? "); + params.add(complaintId); + } + + 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"); + response.put("message", e.getMessage()); + } + + return response; + } + + public Map getvendorZoneActivitywithoutcompletedandpending(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 { + + System.out.println("zone:" + zone); + System.out.println("complaintId:" + complaintId); + System.out.println("fromDate:" + fromDate); + System.out.println("toDate:" + toDate); + + StringBuilder sql = new StringBuilder(); + List params = new ArrayList<>(); + + sql.append("SELECT "); + sql.append("wm.ward_name AS ward, "); + + // TOTAL + sql.append("COUNT(DISTINCT cd.ref_id) AS total_count, "); + + // VENDOR PENDING + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status IN ('pending') "); + + sql.append("THEN cd.ref_id END) AS vendor_pending_count, "); + + // IE PENDING = COMPLETED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status IN ('completed') "); + + sql.append("THEN cd.ref_id END) AS ie_pending_count, "); + + // COMPLETED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status = 'verified' "); + + sql.append("THEN cd.ref_id END) AS completed_count "); + + sql.append("FROM gcc_street_vendor.ward_master wm "); + + sql.append("LEFT JOIN complaint_details cd "); + sql.append("ON wm.ward_name = cd.ward "); + 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 (3,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 DATE(cd.cdate) BETWEEN ? AND ? "); + params.add(fromDate); + params.add(toDate); + } + + 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", e.getMessage()); + } + + return response; + } + + public Map getvendorWardActivitywithoutvendorpendingandiepending( + String zone, + String complaintId, + String fromDate, + String toDate) { + System.out.println("zone:" + zone); + System.out.println("complaintId:" + complaintId); + System.out.println("fromDate:" + fromDate); + System.out.println("toDate:" + toDate); + + Map response = new HashMap<>(); + + try { + + StringBuilder sql = new StringBuilder(); + List params = new ArrayList<>(); + + sql.append("SELECT "); + sql.append("wm.ward_name AS ward, "); + + // TOTAL + sql.append("COUNT(DISTINCT cd.ref_id) AS total_count, "); + + // COMPLETED = VERIFIED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status = 'verified' "); + + sql.append("THEN cd.ref_id END) AS completed_count, "); + + // PENDING = PENDING + COMPLETED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status IN ('pending','completed') "); + + sql.append("THEN cd.ref_id END) AS pending_count "); + + sql.append("FROM gcc_street_vendor.ward_master wm "); + + sql.append("LEFT JOIN complaint_details cd "); + sql.append("ON wm.ward_name = cd.ward "); + 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); + } + 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("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", e.getMessage()); + } + + return response; + } + + public Map getvendorWardActivitywithoutcompletedandpending(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, String status) { + + 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( + "CASE " + + "WHEN cd.status = 'verified' THEN 'Completed' " + + "WHEN cd.status IN ('completed') THEN 'Pending' " + + "ELSE cd.status " + + "END AS ie_status, "); + + 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("cd.remarks AS complaint_remarks, "); + + /* + * sql.append( + * "IFNULL(DATE_FORMAT(comp.cdate,'%d-%m-%Y'),'Pending') AS completion_date, "); + */ + + sql.append( + "CONCAT('" + fileBaseUrl + + "/gccofficialapp/files'," + + beforeImageColumn + + ") AS before_image, "); + + /* + * sql.append( + * "CASE " + + * "WHEN comp.image_path IS NOT NULL " + + * "THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', comp.image_path) " + + * "ELSE '' " + + * "END AS after_image "); + */ + + // Completion Remarks + sql.append( + "CASE " + + "WHEN cd.status IN ('completed','verified') " + + "THEN IFNULL(comp.street_name,'') " + + "ELSE 'Pending' " + + "END AS completion_street_name, "); + + // Completion Date + sql.append( + "CASE " + + "WHEN cd.status IN ('completed','verified') " + + "THEN DATE_FORMAT(comp.cdate,'%d-%m-%Y') " + + "ELSE 'Pending' " + + "END AS completion_date, "); + + // After Image + sql.append( + "CASE " + + "WHEN cd.status IN ('completed','verified') " + + "AND comp.image_path IS NOT NULL " + + "THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', comp.image_path) " + + "ELSE 'Pending' " + + "END AS after_image, "); + // complete remarks + sql.append( + "CASE WHEN cd.status IN ('completed','verified') THEN comp.remarks ELSE 'Pending' END AS completion_remarks "); + + 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("LEFT JOIN completion comp "); + sql.append("ON comp.id = ( "); + sql.append(" SELECT MAX(c1.id) "); + sql.append(" FROM completion c1 "); + sql.append(" WHERE c1.ref_id = cd.ref_id "); + sql.append(") "); + + 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 (3,4,6,12) "); + + if (complaintId != null && !complaintId.isEmpty()) { + + sql.append("AND cd.complaint_id = ? "); + params.add(complaintId); + } + + // Updated status logic + if (status != null && !status.equalsIgnoreCase("all")) { + + if (status.equalsIgnoreCase("verified")) { + + sql.append("AND cd.status = 'verified' "); + + } else if (status.equalsIgnoreCase("pending")) { + + sql.append("AND cd.status IN ('pending') "); + } else if (status.equalsIgnoreCase("completed")) { + + sql.append("AND cd.status IN ('completed') "); + } + + } + + 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("ORDER BY cd.cdate 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; + } + + public Map getvendorComplaintDetailswithoutcompletedandpending(String zone, String ward, + String complaintId, String fromDate, String toDate, String status) { + + 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 (status != null && !status.equalsIgnoreCase("all")) { + + if (status.equalsIgnoreCase("completed")) { + + sql.append(" AND comp.ref_id IS NOT NULL "); + + } else if (status.equalsIgnoreCase("pending")) { + + sql.append(" AND comp.ref_id IS NULL "); + } + } + + 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, "); + sql.append("cm.complaint_name, "); + + // TOTAL + sql.append("COUNT(DISTINCT cd.ref_id) AS total_count, "); + + // COMPLETED = VERIFIED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status = 'verified' "); + + 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 completed_count, "); + + // PENDING = PENDING + COMPLETED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN cd.status IN ('pending','completed') "); + + 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("WHERE cm.complaint_id IN (3,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 getvendorComplaintDashboardwithoutcompletedandpending(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/PosterReportService.java b/src/main/java/com/gcc/commissionerreview/service/PosterReportService.java new file mode 100644 index 0000000..ce980b2 --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/PosterReportService.java @@ -0,0 +1,511 @@ +package com.gcc.commissionerreview.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletResponse; +import net.sf.jasperreports.engine.*; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter; +import net.sf.jasperreports.export.SimpleExporterInput; +import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput; +import net.sf.jasperreports.export.SimpleXlsxReportConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.io.InputStream; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class PosterReportService { + + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private ObjectMapper objectMapper; + + + public Map fetchZoneData(Integer assetTypeId, + String fromDate, + String toDate) { + + try { + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + String url = "https://gccservices.in/gccofficialapp/api/asset/filterReports" + + "?assetTypeId=" + assetTypeId + + "&fromDate=" + formattedFromDate + + "&toDate=" + formattedToDate; + + String response = restTemplate.getForObject(url, String.class); + + return objectMapper.readValue(response, Map.class); + + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + return new HashMap<>(); + } + } + + + public Map fetchWardData(Integer assetTypeId, + String fromDate, + String toDate,String zone) { + + try { + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + String url = "https://gccservices.in/gccofficialapp/api/asset/filterReports?" + + "assetTypeId=" + assetTypeId + + "&fromDate=" + formattedFromDate + + "&toDate=" + formattedToDate + + "&zone=" + zone; + + String response = restTemplate.getForObject(url, String.class); + + return objectMapper.readValue(response, Map.class); + + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + return new HashMap<>(); + } + } + + + public Map fetchStreetData(Integer assetTypeId, + String fromDate, + String toDate,String zone,String ward) { + + try { + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + String url = "https://gccservices.in/gccofficialapp/api/asset/filterReports?" + + "assetTypeId=" + assetTypeId + + "&fromDate=" + formattedFromDate + + "&toDate=" + formattedToDate + + "&zone=" + zone + + "&ward=" + ward ; + + String response = restTemplate.getForObject(url, String.class); + + return objectMapper.readValue(response, Map.class); + + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + return new HashMap<>(); + } + } + + + public List> fetchStreetDetails(Integer assetTypeId, + String fromDate, + String toDate, + String zone, + String ward, + String streetid) { + + try { + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + String url = "https://gccservices.in/gccofficialapp/api/asset/filterReportsByDate?" + + "assetTypeId=" + assetTypeId + + "&fromDate=" + formattedFromDate + + "&toDate=" + formattedToDate + + "&zone=" + zone + + "&ward=" + ward + + "&streetid=" + streetid; + + String response = restTemplate.getForObject(url, String.class); + + Object parsed = objectMapper.readValue(response, Object.class); + + + if (parsed instanceof List) { + return (List>) parsed; + } + + Map result = (Map) parsed; + + if (result.containsKey("data")) { + return (List>) result.get("data"); + } + + if (result.containsKey("zoneWise")) { + return (List>) result.get("zoneWise"); + } + + // fallback + return new ArrayList<>(); + + } catch (Exception e) { + System.out.println("Error: " + e.getMessage()); + return new ArrayList<>(); + } + } + + + public void downloadStreetReport( + Integer assetTypeId, + String fromDate, + String toDate, + String zone, + String ward, + String streetid, + HttpServletResponse response) throws Exception { + + // EXISTING METHOD CALL + List> data = + fetchStreetDetails( + assetTypeId, + fromDate, + toDate, + zone, + ward, + streetid); + + + + List> finalList = new ArrayList<>(); + + for (Map row : data) { + + String beforeImage = ""; + String afterImage = ""; + + Object feedbackObj = row.get("feedback_file"); + + if (feedbackObj instanceof List) { + + List feedbackFiles = (List) feedbackObj; + + for (Object obj : feedbackFiles) { + + if (obj instanceof Map fileMap) { + + String action = ""; + + if (fileMap.get("fileaction") != null) { + action = + String.valueOf( + fileMap.get("fileaction")); + } + + String imageUrl = ""; + + if (fileMap.get("imageUrl") != null) { + imageUrl = + String.valueOf( + fileMap.get("imageUrl")); + } + + // BEFORE IMAGE + if ("before".equalsIgnoreCase(action)) { + beforeImage = imageUrl; + } + + // AFTER IMAGE + if ("after".equalsIgnoreCase(action)) { + afterImage = imageUrl; + } + } + } + } + + + + Map jasperMap = + new HashMap<>(); + + jasperMap.put("zone", + row.get("zone")); + + jasperMap.put("ward", + row.get("ward")); + + jasperMap.put("streetname", + row.get("streetname")); + + jasperMap.put("beforeImage", + beforeImage); + + jasperMap.put("afterImage", + afterImage); + + finalList.add(jasperMap); + } + + + + JRBeanCollectionDataSource dataSource = + new JRBeanCollectionDataSource(finalList); + + InputStream inputStream = + getClass().getResourceAsStream( + "/templates/modules/poster/street_details.jrxml"); + + JasperReport jasperReport = + JasperCompileManager.compileReport(inputStream); + + Map params = new HashMap<>(); + + JasperPrint jasperPrint = + JasperFillManager.fillReport( + jasperReport, + params, + dataSource); + + response.setContentType( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + + response.setHeader( + "Content-Disposition", + "attachment; filename=Street_Details_Report.xlsx"); + + JRXlsxExporter exporter = new JRXlsxExporter(); + + exporter.setExporterInput( + new SimpleExporterInput(jasperPrint)); + + exporter.setExporterOutput( + new SimpleOutputStreamExporterOutput( + response.getOutputStream())); + + SimpleXlsxReportConfiguration configuration = + new SimpleXlsxReportConfiguration(); + + configuration.setOnePagePerSheet(false); + configuration.setDetectCellType(true); + configuration.setCollapseRowSpan(false); + configuration.setRemoveEmptySpaceBetweenRows(true); + configuration.setWhitePageBackground(false); + + exporter.setConfiguration(configuration); + + exporter.exportReport(); + + response.flushBuffer(); + } + + + public void downloadStreetPdfReport( + Integer assetTypeId, + String fromDate, + String toDate, + String zone, + String ward, + String streetid, + HttpServletResponse response) throws Exception { + + List> data = + fetchStreetDetails( + assetTypeId, + fromDate, + toDate, + zone, + ward, + streetid); + + + + List> finalList = + new ArrayList<>(); + + for (Map row : data) { + + String beforeImage = ""; + String afterImage = ""; + String removalDate = ""; + + + String enumeratedDate = ""; + + if (row.get("cdate") != null) { + + String fullDate = String.valueOf(row.get("cdate")); + + if (fullDate.contains("T")) { + String datePart = fullDate.split("T")[0]; + String[] parts = datePart.split("-"); + enumeratedDate = parts[2] + "-" + parts[1] + "-" + parts[0]; + } else { + enumeratedDate = fullDate; + } + } + + // LATITUDE + String latitude = ""; + + if (row.get("latitude") != null) { + latitude = String.valueOf(row.get("latitude")); + } + + // LONGITUDE + String longitude = ""; + + if (row.get("longitude") != null) { + longitude = String.valueOf(row.get("longitude")); + } + + Object feedbackObj = row.get("feedback_file"); + + if (feedbackObj instanceof List) { + + List feedbackFiles = (List) feedbackObj; + + for (Object obj : feedbackFiles) { + + if (obj instanceof Map fileMap) { + + String action = ""; + + if (fileMap.get("fileaction") != null) { + action = + String.valueOf( + fileMap.get("fileaction")); + } + + String imageUrl = ""; + + if (fileMap.get("imageUrl") != null) { + imageUrl = + String.valueOf( + fileMap.get("imageUrl")); + } + + // BEFORE IMAGE + if ("before".equalsIgnoreCase(action)) { + beforeImage = imageUrl; + } + + // AFTER IMAGE + REMOVAL DATE + if ("after".equalsIgnoreCase(action)) { + + afterImage = imageUrl; + + if (fileMap.get("cdate") != null) { + + String removeDate = String.valueOf( + fileMap.get("cdate")); + + if (removeDate.contains("T")) { + String datePart = removeDate.split("T")[0]; + String[] parts = datePart.split("-"); + + removalDate = parts[2] + "-" + parts[1] + "-" + parts[0]; + } else { + removalDate = removeDate; + } + } + } + } + } + } + + + + Map jasperMap = + new HashMap<>(); + + jasperMap.put("zone", + row.get("zone")); + + jasperMap.put("ward", + row.get("ward")); + + jasperMap.put("latitude", + latitude); + + jasperMap.put("longitude", + longitude); + + jasperMap.put("streetname", + row.get("streetname")); + + jasperMap.put("enumeratedDate", + enumeratedDate); + + jasperMap.put("removalDate", + removalDate); + + jasperMap.put("beforeImage", + beforeImage); + + jasperMap.put("afterImage", + afterImage); + + finalList.add(jasperMap); + } + + + + + + JRBeanCollectionDataSource dataSource = + new JRBeanCollectionDataSource(finalList); + + InputStream inputStream = + getClass().getResourceAsStream( + "/templates/modules/poster/street_details.jrxml"); + + JasperReport jasperReport = + JasperCompileManager.compileReport(inputStream); + + Map params = new HashMap<>(); + + DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + String formattedFromDate = LocalDate.parse(fromDate, inputFormat).format(outputFormat); + String formattedToDate = LocalDate.parse(toDate, inputFormat).format(outputFormat); + + params.put("zone", zone); + params.put("ward", ward); + params.put("fromDate", formattedFromDate); + params.put("toDate", formattedToDate); + + JasperPrint jasperPrint = + JasperFillManager.fillReport( + jasperReport, + params, + dataSource); + + response.setContentType("application/pdf"); + + response.setHeader( + "Content-Disposition", + "attachment; filename=Street_Details_Report.pdf"); + + JasperExportManager.exportReportToPdfStream( + jasperPrint, + response.getOutputStream()); + + response.flushBuffer(); + } + +} diff --git a/src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java b/src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java new file mode 100644 index 0000000..beac4ca --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java @@ -0,0 +1,475 @@ +package com.gcc.commissionerreview.service; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.List; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.env.Environment; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class StreetVendorService { + + private final Environment environment; + + private String fileBaseUrl; + + @Autowired + private JdbcTemplate gccstrTemplate; + + @Autowired + private JdbcTemplate vendingcommitteTemplate; + + public StreetVendorService(Environment environment) { + this.environment = environment; + this.fileBaseUrl = environment.getProperty("fileBaseUrl"); + } + + @Autowired + public void setDataSource1(@Qualifier("mysqlVendingCommitteeDataSource") DataSource dataSource) { + this.vendingcommitteTemplate = new JdbcTemplate(dataSource); + } + + @Autowired + public void setDataSource2(@Qualifier("mysqlStreetVendorDataSource") DataSource dataSource) { + this.gccstrTemplate = new JdbcTemplate(dataSource); + } + + public List> getzoneoveralldetails(String fromdate, String todate) { + + StringBuilder sql = new StringBuilder(); + + sql.append(" SELECT "); + sql.append(" vd.zone AS zone, "); + + // 1. Application Received + sql.append(" COUNT(DISTINCT vd.id) AS application_received, "); + + // 2. Assistant Processed + 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_processed, "); + + // 3. LI Processed + sql.append(" COUNT(DISTINCT va1.vdid) AS li_processed, "); + + // 4. ARO Processed + sql.append(" COUNT(DISTINCT va2.vdid) AS aro_processed, "); + + // 5. EE Processed + sql.append(" COUNT(DISTINCT va3.vdid) AS ee_processed, "); + + // 6. Committee Processed + 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) AS committee_processed, "); + + // 7. Total Processed + 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(" ) 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 + sql.append(" COUNT(DISTINCT CASE "); + sql.append(" WHEN vrl.cdate IS NOT NULL "); + sql.append(" AND DATEDIFF(vrl.cdate, vd.cdate) <= 30 "); + sql.append(" THEN vd.id "); + + sql.append(" WHEN vpl.cdate IS NOT NULL "); + sql.append(" AND DATEDIFF(vpl.cdate, vd.cdate) <= 30 "); + sql.append(" THEN vd.id "); + + sql.append(" END) AS processed_within_30_days "); + + sql.append(" FROM gcc_street_vendor.vendor_details vd "); + + sql.append(" LEFT JOIN gcc_street_vendor.vendor_approval_level_1 va1 "); + sql.append(" ON va1.vdid = vd.id "); + + sql.append(" LEFT JOIN gcc_street_vendor.vendor_approval_level_2 va2 "); + sql.append(" ON va2.vdid = vd.id "); + + sql.append(" LEFT JOIN gcc_street_vendor.vendor_approval_level_3 va3 "); + sql.append(" ON va3.vdid = vd.id "); + + sql.append(" LEFT JOIN vendingcommitte.vendor_request_list vrl "); + sql.append(" ON vrl.vdid = vd.id "); + + sql.append(" LEFT JOIN vendingcommitte.vendor_postponed_list vpl "); + sql.append(" ON vpl.vdid = vd.id "); + + sql.append(" WHERE vd.isactive = 1 "); + + List params = new ArrayList<>(); + + if (fromdate != null && !fromdate.isEmpty() + && todate != null && !todate.isEmpty()) { + + sql.append(" AND DATE(vd.cdate) BETWEEN ? AND ? "); + params.add(fromdate); + params.add(todate); + } + + sql.append(" AND vd.zone IS NOT NULL "); + + sql.append(" GROUP BY vd.zone "); + sql.append(" ORDER BY vd.zone "); + + List> reportList = + gccstrTemplate.queryForList(sql.toString(), params.toArray()); + + Map response = new LinkedHashMap<>(); + response.put("status", "Success"); + response.put("message", "Zone-wise Report"); + response.put("data", reportList); + + return Collections.singletonList(response); + } + + + public List> getwardoveralldetails(String fromdate, String todate, String zone) { + + + StringBuilder sql = new StringBuilder(); + + sql.append(" SELECT "); + sql.append(" vd.ward AS ward, "); + + // 1. Application Received + sql.append(" COUNT(DISTINCT vd.id) AS application_received, "); + + // 2. Assistant Processed + 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_processed, "); + + // 3. LI Processed + sql.append(" COUNT(DISTINCT va1.vdid) AS li_processed, "); + + // 4. ARO Processed + sql.append(" COUNT(DISTINCT va2.vdid) AS aro_processed, "); + + // 5. EE Processed + sql.append(" COUNT(DISTINCT va3.vdid) AS ee_processed, "); + + // 6. Committee Processed + 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) AS committee_processed, "); + + // 7. Total Processed + 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(" ) 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 + sql.append(" COUNT(DISTINCT CASE "); + sql.append(" WHEN vrl.cdate IS NOT NULL "); + sql.append(" AND DATEDIFF(vrl.cdate, vd.cdate) <= 30 "); + sql.append(" THEN vd.id "); + + sql.append(" WHEN vpl.cdate IS NOT NULL "); + sql.append(" AND DATEDIFF(vpl.cdate, vd.cdate) <= 30 "); + sql.append(" THEN vd.id "); + + sql.append(" END) AS processed_within_30_days "); + + sql.append(" FROM gcc_street_vendor.vendor_details vd "); + + sql.append(" LEFT JOIN gcc_street_vendor.vendor_approval_level_1 va1 "); + sql.append(" ON va1.vdid = vd.id "); + + sql.append(" LEFT JOIN gcc_street_vendor.vendor_approval_level_2 va2 "); + sql.append(" ON va2.vdid = vd.id "); + + sql.append(" LEFT JOIN gcc_street_vendor.vendor_approval_level_3 va3 "); + sql.append(" ON va3.vdid = vd.id "); + + sql.append(" LEFT JOIN vendingcommitte.vendor_request_list vrl "); + sql.append(" ON vrl.vdid = vd.id "); + + sql.append(" LEFT JOIN vendingcommitte.vendor_postponed_list vpl "); + sql.append(" ON vpl.vdid = vd.id "); + + sql.append(" WHERE vd.isactive = 1 "); + + List params = new ArrayList<>(); + + if (fromdate != null && !fromdate.isEmpty() + && todate != null && !todate.isEmpty()) { + + sql.append(" AND DATE(vd.cdate) BETWEEN ? AND ? "); + params.add(fromdate); + params.add(todate); + } + + if(zone != null && !zone.isEmpty()) { + sql.append(" AND vd.zone = ? "); + params.add(zone); + } + + sql.append(" AND vd.zone IS NOT NULL AND vd.ward IS NOT NULL "); + + + sql.append(" GROUP BY vd.ward "); + sql.append(" ORDER BY vd.ward "); + + List> reportList = + gccstrTemplate.queryForList(sql.toString(), params.toArray()); + + Map response = new LinkedHashMap<>(); + response.put("status", "Success"); + response.put("message","Zone:"+ zone+" Ward-wise Report"); + response.put("data", reportList); + + return Collections.singletonList(response); + + } + + public List> getzoneinspectiondetails(String fromdate, String todate) { + + StringBuilder sql = new StringBuilder(); + + sql.append(" SELECT "); + sql.append(" vd.zone AS zone, "); + + // 1. Application Received + sql.append(" COUNT(DISTINCT vd.id) AS application_received, "); + + // 2. LI Processed + 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) "); + + + sql.append(" ) AS li_pending "); + + + sql.append(" FROM gcc_street_vendor.vendor_details vd "); + + sql.append(" LEFT JOIN gcc_street_vendor.vendor_approval_level_1 va1 "); + sql.append(" ON va1.vdid = vd.id "); + + + sql.append(" WHERE vd.isactive = 1 "); + + List params = new ArrayList<>(); + + if (fromdate != null && !fromdate.isEmpty() + && todate != null && !todate.isEmpty()) { + + sql.append(" AND DATE(vd.cdate) BETWEEN ? AND ? "); + params.add(fromdate); + params.add(todate); + } + + sql.append(" AND vd.zone IS NOT NULL "); + + sql.append(" GROUP BY vd.zone "); + sql.append(" ORDER BY vd.zone "); + + List> reportList = + gccstrTemplate.queryForList(sql.toString(), params.toArray()); + + Map response = new LinkedHashMap<>(); + response.put("status", "Success"); + response.put("message", "LI Inspection Zone-wise Report"); + response.put("data", reportList); + + return Collections.singletonList(response); + } + + public List> getwardinspectiondetails(String fromdate, String todate, String zone) { + + StringBuilder sql = new StringBuilder(); + + sql.append(" SELECT "); + sql.append(" vd.ward AS ward, "); + + // 1. Application Received + sql.append(" COUNT(DISTINCT vd.id) AS application_received, "); + + // 2. LI Processed + sql.append(" COUNT(DISTINCT va1.vdid) AS li_processed, "); + + + // 8. Pending + sql.append(" ( "); + sql.append(" COUNT(DISTINCT vd.id) - "); + + sql.append(" ( "); + + sql.append(" COUNT(DISTINCT va1.vdid) "); + + sql.append(" ) "); + + sql.append(" ) AS li_pending "); + + + sql.append(" FROM gcc_street_vendor.vendor_details vd "); + + sql.append(" LEFT JOIN gcc_street_vendor.vendor_approval_level_1 va1 "); + sql.append(" ON va1.vdid = vd.id "); + + + sql.append(" WHERE vd.isactive = 1 "); + + List params = new ArrayList<>(); + + if (fromdate != null && !fromdate.isEmpty() + && todate != null && !todate.isEmpty()) { + + sql.append(" AND DATE(vd.cdate) BETWEEN ? AND ? "); + params.add(fromdate); + params.add(todate); + } + + if(zone != null && !zone.isEmpty()) { + sql.append(" AND vd.zone = ? "); + params.add(zone); + } + + sql.append(" AND vd.zone IS NOT NULL AND vd.ward IS NOT NULL "); + + sql.append(" GROUP BY vd.ward "); + sql.append(" ORDER BY vd.ward "); + + List> reportList = + gccstrTemplate.queryForList(sql.toString(), params.toArray()); + + Map response = new LinkedHashMap<>(); + response.put("status", "Success"); + response.put("message","Zone:"+ zone+" Ward-wise Inspection Report"); + response.put("data", reportList); + + return Collections.singletonList(response); + + } + + +} 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..f8de61d --- /dev/null +++ b/src/main/java/com/gcc/commissionerreview/service/TenementService.java @@ -0,0 +1,988 @@ +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; + + // WITHOUT DATE FILTER + if (fromDate == null || fromDate.isBlank() + || toDate == null || toDate.isBlank()) { + + sql = "SELECT " + + + "'Tenement' AS complaint_name, " + + + // TOTAL + "COUNT(*) AS total_count, " + + + // COMPLETED = VERIFIED + "COUNT(CASE " + + "WHEN final_status = 'verified' " + + "THEN 1 END) AS completed_count, " + + + // PENDING = CREATED + COMPLETED + "COUNT(CASE " + + "WHEN final_status IN ('created','completed') " + + "THEN 1 END) AS pending_count " + + + "FROM issue_list1"; + + result = jdbcTemplate.queryForList(sql); + + } else { + + sql = "SELECT " + + + "'Tenement' AS complaint_name, " + + + // TOTAL + "COUNT(*) AS total_count, " + + + // COMPLETED = VERIFIED + "COUNT(CASE " + + "WHEN final_status = 'verified' " + + "THEN 1 END) AS completed_count, " + + + // PENDING = CREATED + COMPLETED + "COUNT(CASE " + + "WHEN final_status IN ('created','completed') " + + "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 getTenementDashboardwithoutcompletedandpending( + + 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; + + if (fromDate == null || fromDate.isBlank() + || toDate == null || toDate.isBlank()) { + + sql = "SELECT " + + "am.zone, " + + + "COUNT(DISTINCT il1.id) AS total_complaint_count, " + + + // COMPLETED = VERIFIED + "COUNT(DISTINCT CASE " + + "WHEN il1.final_status = 'verified' " + + "THEN il1.id END) " + + "AS total_complaint_closed_count, " + + + // PENDING = CREATED + COMPLETED + "COUNT(DISTINCT CASE " + + "WHEN il1.final_status IN ('created','completed') " + + "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 { + + sql = "SELECT " + + "am.zone, " + + + "COUNT(DISTINCT il1.id) AS total_complaint_count, " + + + // COMPLETED = VERIFIED + "COUNT(DISTINCT CASE " + + "WHEN il1.final_status = 'verified' " + + "THEN il1.id END) " + + "AS total_complaint_closed_count, " + + + // PENDING = CREATED + COMPLETED + "COUNT(DISTINCT CASE " + + "WHEN il1.final_status IN ('created','completed') " + + "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 getZoneActivitywithoutcompletedandpending( + + 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("wm.ward_name AS ward, "); + + sql.append("COUNT(DISTINCT il1.id) "); + sql.append("AS total_complaint_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status = 'verified' "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_closed_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status = 'created' "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_vendor_pending_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status = 'completed' "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_ie_pending_count "); + + sql.append("FROM gcc_street_vendor.ward_master wm "); + + sql.append("LEFT JOIN asset_master am "); + sql.append("ON wm.ward_name = am.ward "); + sql.append("AND am.zone = ? "); + params.add(zone); + + 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 "); + + 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("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", e.getMessage()); + } + + return response; + } + + public Map getWardActivitywithoutcompletedandpending( + + 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 = VERIFIED ONLY + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status = 'verified' "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_verified_count, "); + + // PENDING = CREATED + COMPLETED + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status IN ('created') "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_vendor_pending_count, "); + + sql.append("COUNT(DISTINCT CASE "); + sql.append("WHEN il1.final_status IN ('completed') "); + sql.append("THEN il1.id END) "); + sql.append("AS total_complaint_ie_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 getSchemeWiseReportwithcompletedandpending( + + 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 status, + 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( + "CASE " + + "WHEN il1.final_status = 'verified' THEN 'Completed' " + + "WHEN il1.final_status IN ('created','completed') THEN 'Pending' " + + "ELSE il1.final_status " + + "END AS ie_status, "); + + sql.append("DATE_FORMAT(il1.cdate,'%d-%m-%Y') 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'),'Pending') AS completed_date, "); + * + * sql.append( + * "IFNULL(il2.remarks,'Pending') 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, "); + */ + // Completed Date + sql.append( + "CASE " + + "WHEN il2.cdate IS NOT NULL " + + "THEN DATE_FORMAT(il2.cdate,'%d-%m-%Y') " + + "ELSE 'Pending' " + + "END AS completed_date, "); + + // Completed Remarks + sql.append( + "CASE " + + "WHEN il2.cdate IS NOT NULL " + + "THEN IFNULL(il2.remarks,'') " + + "ELSE 'Pending' " + + "END AS completed_remarks, "); + + // After Image + 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'),'') 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("AND il2.final_status = 'completed' "); + + 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); + + // 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); + } + + // Updated Status Filter + if (status != null && !status.isEmpty()) { + + if ("verified".equalsIgnoreCase(status)) { + + sql.append("AND il1.final_status = 'verified' "); + + } else if ("created".equalsIgnoreCase(status)) { + + sql.append("AND il1.final_status = 'created' "); + } + + else if ("completed".equalsIgnoreCase(status)) { + + sql.append("AND il1.final_status = 'completed' "); + } + + } + + 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; + } + + public Map getComplaintDetailswithoutcompletedandpending( + + String ward, + String schemeid, + String status, + 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); + } + + // STATUS FILTER + if (status != null && !status.isEmpty()) { + + sql.append("AND il1.final_status = ? "); + params.add(status); + } + + 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/pet/petreport.html b/src/main/resources/templates/modules/pet/petreport.html index 945c74a..b294943 100644 --- a/src/main/resources/templates/modules/pet/petreport.html +++ b/src/main/resources/templates/modules/pet/petreport.html @@ -71,6 +71,15 @@ #summaryTable thead tr.dt-hidden-header { display: none !important; } + + #wardTable { + width: 100% !important; + } + + #wardTable th, + #wardTable td { + white-space: nowrap; + } @@ -201,7 +210,7 @@ Zone - License + License Pet Vaccination Community Vaccination @@ -209,6 +218,7 @@ Total Completed Pending + Rejected Total Completed Pending @@ -228,6 +238,7 @@ 0 0 0 + 0 0 0 0 @@ -265,6 +276,7 @@ Total Approved Pending + Rejected @@ -597,7 +609,7 @@ $('#pageLoader').hide(); let i = 1; - let licT = 0, licC = 0, licP = 0; + let licT = 0, licC = 0, licP = 0, licR = 0; let petT = 0, petC = 0, petP = 0; let comT = 0, comC = 0, comP = 0; @@ -627,6 +639,7 @@ ${lic.approved_Licenses} ${lic.pending_Licenses} + ${lic.rejected_Licenses} @@ -656,6 +669,7 @@ licT += lic.total_licensesApplied; licC += lic.approved_Licenses; licP += lic.pending_Licenses; + licR += lic.rejected_Licenses; petT += vacc.total; petC += vacc.completed; @@ -673,6 +687,7 @@ $(".lic-total").text(licT); $(".lic-completed").text(licC); $(".lic-pending").text(licP); + $(".lic-rejected").text(licR); $(".pet-total").text(petT); $(".pet-completed").text(petC); @@ -764,6 +779,7 @@ async function openWardModal(type, zoneNo) { $("#wardTableBody").empty(); + $("#rejectedHeader").hide(); // Destroy previous DataTable if ($.fn.DataTable.isDataTable('#wardTable')) { @@ -782,8 +798,10 @@ let title = ''; let wardList = []; + /* ================= LICENSE ================= */ if (type === 'LICENSE') { + $("#rejectedHeader").show(); title = `Zone ${zoneNo} – License`; $("#modalZone").text(title); @@ -800,7 +818,8 @@ wardName: obj.wardName, total: obj.total_licensesApplied, completed: obj.approved_Licenses, - pending: obj.pending_Licenses + pending: obj.pending_Licenses, + rejected: obj.rejected_Licenses || 0 }); } }); @@ -867,6 +886,11 @@ /* ================= RENDER MODAL TABLE ================= */ let i = 1; wardList.forEach(w => { + let rejectedColumn = ''; + + + + $("#wardTableBody").append(` @@ -874,15 +898,35 @@ ${w.total} ${w.completed} ${w.pending} + ${w.rejected || 0} + `); }); + // Show rejected column only for License + if (type === 'LICENSE') { + $("#rejectedHeader").show(); + $(".rejected-col").show(); + } else { + $("#rejectedHeader").hide(); + $(".rejected-col").hide(); + } /* ================= EXPORT ================= */ initWardExport( title.replace(/\s+/g, '_') + (fromDate && toDate ? `_${fromDate}_to_${toDate}` : '') ); + if ($.fn.DataTable.isDataTable('#wardTable')) { + + const table = $('#wardTable').DataTable(); + + if (type === 'LICENSE') { + table.column(4).visible(true); + } else { + table.column(4).visible(false); + } + } new bootstrap.Modal(document.getElementById("wardModal")).show(); } @@ -1035,10 +1079,11 @@ // 🔹 Make table use full width doc.content[1].table.widths = [ - '25%', // Ward - '25%', // Total - '25%', // Approved - '25%' // Pending + '20%', // Ward + '20%', // Total + '20%', // Approved + '20%', // Pending + '20%' // Rejected ]; // 🔹 Reduce margins to gain width diff --git a/src/main/resources/templates/modules/poster/bannerReport.html b/src/main/resources/templates/modules/poster/bannerReport.html new file mode 100644 index 0000000..926a0c8 --- /dev/null +++ b/src/main/resources/templates/modules/poster/bannerReport.html @@ -0,0 +1,887 @@ + + + + Banner Removal Report + + + + + + + + + + + + + + + + + +
+ +

Banner Removal Report

+ + +
+ + + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/templates/modules/poster/posterReport.html b/src/main/resources/templates/modules/poster/posterReport.html new file mode 100644 index 0000000..b792e91 --- /dev/null +++ b/src/main/resources/templates/modules/poster/posterReport.html @@ -0,0 +1,917 @@ + + + + Poster Removal Report + + + + + + + + + + + + + + + + + +
+ +

Poster Removal Report

+ + +
+ + + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/templates/modules/poster/street_details.jrxml b/src/main/resources/templates/modules/poster/street_details.jrxml new file mode 100644 index 0000000..e71422d --- /dev/null +++ b/src/main/resources/templates/modules/poster/street_details.jrxml @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <band height="90"> + + <!-- REPORT TITLE --> + <textField> + <reportElement x="0" y="0" width="1180" height="25"/> + <textElement textAlignment="Center" verticalAlignment="Middle"> + <font size="18" isBold="true"/> + </textElement> + <textFieldExpression><![CDATA["Street Details Report"]]></textFieldExpression> + </textField> + + <!-- ZONE + WARD --> + <textField> + <reportElement x="0" y="30" width="1180" height="20"/> + <textElement textAlignment="Center" verticalAlignment="Middle"> + <font size="14" isBold="true"/> + </textElement> + <textFieldExpression><![CDATA[ + "Zone: " + $P{zone} + " Ward: " + $P{ward} + ]]></textFieldExpression> + </textField> + + <!-- FROM DATE + TO DATE --> + <textField> + <reportElement x="0" y="55" width="1180" height="20"/> + <textElement textAlignment="Center" verticalAlignment="Middle"> + <font size="12"/> + </textElement> + <textFieldExpression><![CDATA[ + "From Date: " + $P{fromDate} + " To Date: " + $P{toDate} + ]]></textFieldExpression> + </textField> + + </band> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/modules/streetvendor/inspectiondetails.html b/src/main/resources/templates/modules/streetvendor/inspectiondetails.html new file mode 100644 index 0000000..e700960 --- /dev/null +++ b/src/main/resources/templates/modules/streetvendor/inspectiondetails.html @@ -0,0 +1,543 @@ + + + + StreetVendor Inspection Details + + + + + + + + + + + + +
+

Street Vendor - Inspection Report (LI)

+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + +
ZoneApplication ReceivedLI ProcessedLI Pending
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/modules/streetvendor/overalldetails.html b/src/main/resources/templates/modules/streetvendor/overalldetails.html new file mode 100644 index 0000000..2ca5020 --- /dev/null +++ b/src/main/resources/templates/modules/streetvendor/overalldetails.html @@ -0,0 +1,577 @@ + + + + StreetVendor Overall Details + + + + + + + + + + + + +
+

Street Vendor - Zonewise Report

+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
ZoneApplication ReceivedApplication ProcessedTotal ProcessedPending Processed within 30 days
Assistant ProcessedLI ProcessedARO ProcessedEE ProcessedCommittee Processed
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/modules/vendorreport.html b/src/main/resources/templates/modules/vendorreport.html new file mode 100644 index 0000000..6a20cbe --- /dev/null +++ b/src/main/resources/templates/modules/vendorreport.html @@ -0,0 +1,2995 @@ + + + + + IE Complaints Report + + + + + + + + + + + + + +
+

IE Complaints Report

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