6 changed files with 1678 additions and 2 deletions
-
29src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java
-
10src/main/java/com/gcc/commissionerreview/controller/MainController.java
-
46src/main/java/com/gcc/commissionerreview/controller/StreetVendorApiController.java
-
475src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java
-
543src/main/resources/templates/modules/streetvendor/inspectiondetails.html
-
577src/main/resources/templates/modules/streetvendor/overalldetails.html
@ -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<Map<String, Object>> getzoneoveralldetails(@RequestParam String fromdate,@RequestParam String todate) |
||||
|
{ |
||||
|
|
||||
|
return stvservice.getzoneoveralldetails(fromdate,todate); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/getwardoveralldetails") |
||||
|
public List<Map<String, Object>> getwardoveralldetails(@RequestParam String fromdate,@RequestParam String todate,@RequestParam String zone) |
||||
|
{ |
||||
|
return stvservice.getwardoveralldetails(fromdate, todate, zone); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/getzoneinspectiondetails") |
||||
|
public List<Map<String, Object>> getzoneinspectiondetails(@RequestParam String fromdate,@RequestParam String todate) |
||||
|
{ |
||||
|
return stvservice.getzoneinspectiondetails(fromdate,todate); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/getwardinspectiondetails") |
||||
|
public List<Map<String, Object>> getwardinspectiondetails(@RequestParam String fromdate,@RequestParam String todate,@RequestParam String zone) |
||||
|
{ |
||||
|
return stvservice.getwardinspectiondetails(fromdate,todate,zone); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -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<Map<String, Object>> 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<Object> 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<Map<String, Object>> reportList = |
||||
|
gccstrTemplate.queryForList(sql.toString(), params.toArray()); |
||||
|
|
||||
|
Map<String, Object> response = new LinkedHashMap<>(); |
||||
|
response.put("status", "Success"); |
||||
|
response.put("message", "Zone-wise Report"); |
||||
|
response.put("data", reportList); |
||||
|
|
||||
|
return Collections.singletonList(response); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public List<Map<String, Object>> 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<Object> 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<Map<String, Object>> reportList = |
||||
|
gccstrTemplate.queryForList(sql.toString(), params.toArray()); |
||||
|
|
||||
|
Map<String, Object> 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<Map<String, Object>> 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<Object> 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<Map<String, Object>> reportList = |
||||
|
gccstrTemplate.queryForList(sql.toString(), params.toArray()); |
||||
|
|
||||
|
Map<String, Object> 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<Map<String, Object>> 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<Object> 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<Map<String, Object>> reportList = |
||||
|
gccstrTemplate.queryForList(sql.toString(), params.toArray()); |
||||
|
|
||||
|
Map<String, Object> response = new LinkedHashMap<>(); |
||||
|
response.put("status", "Success"); |
||||
|
response.put("message","Zone:"+ zone+" Ward-wise Inspection Report"); |
||||
|
response.put("data", reportList); |
||||
|
|
||||
|
return Collections.singletonList(response); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
@ -0,0 +1,543 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org"> |
||||
|
<head> |
||||
|
<title>StreetVendor Inspection Details</title> |
||||
|
|
||||
|
<!-- Bootstrap 5 CSS --> |
||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"> |
||||
|
|
||||
|
<!-- DataTables CSS --> |
||||
|
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet"/> |
||||
|
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet"/> |
||||
|
|
||||
|
<style> |
||||
|
|
||||
|
.filter-section { |
||||
|
background: #fff; |
||||
|
padding: 15px; |
||||
|
border-radius: 8px; |
||||
|
/* box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); */ |
||||
|
margin-bottom: 20px; |
||||
|
} |
||||
|
table.dataTable th, table.dataTable td { |
||||
|
text-align: center; |
||||
|
vertical-align: middle; |
||||
|
border: 1px solid #000; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
table.dataTable th{ |
||||
|
background-color: #003366 !important; |
||||
|
color: white; |
||||
|
} |
||||
|
|
||||
|
.dataTables_wrapper .dt-buttons { |
||||
|
margin-bottom: 10px; |
||||
|
} |
||||
|
|
||||
|
.dataTables_filter { |
||||
|
margin-bottom: 25px; /* adjust as needed */ |
||||
|
} |
||||
|
|
||||
|
.page-header-title h4 { |
||||
|
margin: 20px 0; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
#zoneDetailsTable_wrapper .dataTables_scrollBody { |
||||
|
border: none !important; |
||||
|
} |
||||
|
|
||||
|
#zoneDetailsTable td, #zoneDetailsTable th { |
||||
|
vertical-align: middle; |
||||
|
text-align: center; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
</style> |
||||
|
</head> |
||||
|
<body> |
||||
|
|
||||
|
<div class="page-header-title"> |
||||
|
<h4>Street Vendor - Inspection Report (LI)</h4> |
||||
|
</div> |
||||
|
|
||||
|
<div class="filter-section d-flex justify-content-center align-items-end gap-3 flex-wrap"> |
||||
|
<div> |
||||
|
<label for="fromDate" class="form-label fw-bold">From Date:</label> |
||||
|
<input type="date" id="fromDate" class="form-control" onclick="this.showPicker()"> |
||||
|
</div> |
||||
|
<div> |
||||
|
<label for="toDate" class="form-label fw-bold">To Date:</label> |
||||
|
<input type="date" id="toDate" class="form-control" onclick="this.showPicker()"> |
||||
|
</div> |
||||
|
<div> |
||||
|
<button id="btnSearch" class="btn btn-primary px-4"><i class="fa-solid fa-search"></i> Search</button> |
||||
|
</div> |
||||
|
<div> |
||||
|
<button id="btnReset" class="btn btn-secondary px-4"> Reset</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div id="opSummaryTable" style="display: block;width: 100%;" class="container"> |
||||
|
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th class="text-center">Zone</th> |
||||
|
<th class="text-center">Application Received</th> |
||||
|
<th class="text-center">LI Processed</th> |
||||
|
<th class="text-center">LI Pending </th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
|
||||
|
|
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
|
||||
|
<div class="modal fade" id="zoneDetailsModal" tabindex="-1" aria-labelledby="zoneDetailsLabel" aria-hidden="true" data-bs-keyboard="false" data-bs-backdrop="static"> |
||||
|
<div class="modal-dialog modal-xl"> |
||||
|
<div class="modal-content"> |
||||
|
<div class="modal-header"> |
||||
|
<h5 class="modal-title" id="zoneModalTitle">Zone Details</h5> |
||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
||||
|
</div> |
||||
|
<div class="modal-body"> |
||||
|
|
||||
|
<table id="WardDatatable" class="table table-striped table-bordered display nowrap w-100"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th class="text-center">Ward</th> |
||||
|
<th class="text-center">Application Received</th> |
||||
|
<th class="text-center">LI Processed</th> |
||||
|
<th class="text-center">LI Pending </th> |
||||
|
</tr> |
||||
|
|
||||
|
</thead> |
||||
|
<tbody> |
||||
|
|
||||
|
|
||||
|
</tbody> |
||||
|
</table> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
<div id="pageLoader" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;"> |
||||
|
<div style="position: relative; top: 50%; transform: translateY(-50%);"> |
||||
|
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;"> |
||||
|
<span class="sr-only"></span> |
||||
|
</div> |
||||
|
<!-- Add the 'Please wait' text below the spinner --> |
||||
|
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please wait...</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<!-- Scripts --> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script> |
||||
|
|
||||
|
<!-- DataTables JS --> |
||||
|
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script> |
||||
|
|
||||
|
<!-- SweetAlert --> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> |
||||
|
|
||||
|
<script> |
||||
|
|
||||
|
$('#fromDate, #toDate').on('change', function () { |
||||
|
|
||||
|
let fromDate = $('#fromDate').val(); |
||||
|
let toDate = $('#toDate').val(); |
||||
|
|
||||
|
// Both dates selected |
||||
|
if (fromDate && toDate) { |
||||
|
|
||||
|
if (new Date(fromDate) > new Date(toDate)) { |
||||
|
|
||||
|
Swal.fire({ |
||||
|
icon: 'warning', |
||||
|
title: 'Invalid Date Range', |
||||
|
text: 'From Date should not be greater than To Date' |
||||
|
}); |
||||
|
|
||||
|
$(this).val(''); |
||||
|
return; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Set min/max dynamically |
||||
|
$('#toDate').attr('min', fromDate); |
||||
|
|
||||
|
$('#fromDate').attr('max', toDate); |
||||
|
}); |
||||
|
|
||||
|
$('#btnReset').click(function () { |
||||
|
|
||||
|
$('#fromDate').val(''); |
||||
|
$('#toDate').val(''); |
||||
|
|
||||
|
|
||||
|
}); |
||||
|
|
||||
|
$('#btnSearch').click(function () { |
||||
|
|
||||
|
var fromDate = $('#fromDate').val() || ''; |
||||
|
var toDate = $('#toDate').val() || ''; |
||||
|
|
||||
|
loadZoneReport(fromDate,toDate); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
function loadZoneReport(fromdate,todate) { |
||||
|
|
||||
|
$('#pageLoader').show(); |
||||
|
$.ajax({ |
||||
|
url: '/commissionerreview/api/streetvendor/getzoneinspectiondetails', |
||||
|
method: 'GET', |
||||
|
data:{fromdate:fromdate,todate:todate}, |
||||
|
success: function(response) { |
||||
|
|
||||
|
// Safely extract data whether it's an array or an object |
||||
|
var res = Array.isArray(response) ? response[0] : response; |
||||
|
console.log("Response:", res); |
||||
|
|
||||
|
$('#pageLoader').hide(); |
||||
|
|
||||
|
if (res.status === "Success") { |
||||
|
|
||||
|
if (Array.isArray(res.data) && res.data.length > 0) { |
||||
|
console.log("Details Array:", response); |
||||
|
|
||||
|
let table = $('#ZoneOpDatatable').DataTable({ |
||||
|
destroy: true, |
||||
|
autoWidth: true, |
||||
|
info: true, |
||||
|
data: res.data, // using response directly |
||||
|
columns: [ |
||||
|
{ |
||||
|
data: 'zone', |
||||
|
render: function (data, type, row) { |
||||
|
|
||||
|
|
||||
|
return `<a href="#" onclick="openZoneModal('${data}')" style="text-decoration: underline;">${data}</a>`; |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
{ data: 'application_received', defaultContent: '-', className: 'text-center' }, |
||||
|
|
||||
|
{ data: 'li_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'li_pending', defaultContent: '-', className: 'text-center' } |
||||
|
], |
||||
|
dom: 'Bfrtip', |
||||
|
buttons: [ |
||||
|
|
||||
|
{ |
||||
|
extend: 'excelHtml5', |
||||
|
text: 'Export Excel', |
||||
|
title: 'Street Vendor Inspection Zone Wise Report', |
||||
|
exportOptions: { |
||||
|
columns: ':visible' |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
extend: 'pdfHtml5', |
||||
|
text: 'Export PDF', |
||||
|
title: 'Street Vendor Inspection Zone Wise Report', |
||||
|
pageSize: 'A4', |
||||
|
exportOptions: { |
||||
|
columns: ':visible' |
||||
|
}, |
||||
|
customize: function (doc) { |
||||
|
|
||||
|
doc.styles.tableHeader.alignment = 'center'; |
||||
|
doc.defaultStyle.fontSize = 9; |
||||
|
|
||||
|
doc.content[1].table.widths = [ |
||||
|
'*', '*', '*', '*', '*' |
||||
|
]; |
||||
|
|
||||
|
// Center align all table cells |
||||
|
let rowCount = doc.content[1].table.body.length; |
||||
|
|
||||
|
for (let i = 0; i < rowCount; i++) { |
||||
|
|
||||
|
let row = doc.content[1].table.body[i]; |
||||
|
|
||||
|
for (let j = 0; j < row.length; j++) { |
||||
|
|
||||
|
row[j].alignment = 'center'; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
], |
||||
|
lengthMenu: [ |
||||
|
[50, 100, 200, 500, -1], |
||||
|
['50 rows', '100 rows', '200 rows', 'Show all'] |
||||
|
], |
||||
|
scrollY: 'auto', |
||||
|
scrollX: true, |
||||
|
responsive: false, |
||||
|
searching: false, |
||||
|
ordering: false |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
else if(Array.isArray(res.data) && res.data.length === 0) { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("No data available."); |
||||
|
|
||||
|
Swal.fire({ |
||||
|
icon: 'info', |
||||
|
title: 'No Data', |
||||
|
text: 'No data available.', |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
else { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Error: " + response.message); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: 'Error', |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
else { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Error: " + response.message); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: res.message, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
error: function(xhr, status, error) { |
||||
|
$('#pageLoader').hide(); |
||||
|
// alert("Request failed: " + error); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: error, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
$(document).ready(function () { |
||||
|
|
||||
|
loadZoneReport("",""); |
||||
|
|
||||
|
|
||||
|
$('#zoneDetailsModal').on('shown.bs.modal', function () { |
||||
|
if ($.fn.DataTable.isDataTable('#WardDatatable')) { |
||||
|
let questionDatatable = $('#WardDatatable').DataTable(); |
||||
|
questionDatatable.columns.adjust().draw(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
|
||||
|
function openZoneModal(zoneCode) { |
||||
|
console.log("Opening modal for zone:", zoneCode); |
||||
|
|
||||
|
var fromDate = $('#fromDate').val() || ''; |
||||
|
var toDate = $('#toDate').val() || ''; |
||||
|
|
||||
|
$('#pageLoader').show(); |
||||
|
|
||||
|
// Set data in modal (example) |
||||
|
$('#zoneModalTitle').text('Zone ' + zoneCode + ' Details'); |
||||
|
|
||||
|
|
||||
|
$.ajax({ |
||||
|
url: '/commissionerreview/api/streetvendor/getwardinspectiondetails', |
||||
|
method: 'GET', |
||||
|
data:{fromdate:fromDate,todate:toDate,zone:zoneCode}, |
||||
|
success: function(response) { |
||||
|
|
||||
|
var res = Array.isArray(response) ? response[0] : response; |
||||
|
console.log("Response:", res); |
||||
|
|
||||
|
$('#pageLoader').hide(); |
||||
|
|
||||
|
if (res.status === "Success") { |
||||
|
|
||||
|
if (Array.isArray(res.data) && res.data.length > 0){ |
||||
|
console.log("Details Array:", response); |
||||
|
|
||||
|
|
||||
|
let table = $('#WardDatatable').DataTable({ |
||||
|
destroy: true, |
||||
|
autoWidth: true, |
||||
|
info: true, |
||||
|
data: res.data, // using response directly |
||||
|
columns: [ |
||||
|
{ data: 'ward', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'application_received', defaultContent: '-', className: 'text-center' }, |
||||
|
|
||||
|
{ data: 'li_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'li_pending', defaultContent: '-', className: 'text-center' } |
||||
|
|
||||
|
], |
||||
|
dom: 'Bfrtip', |
||||
|
lengthMenu: [ |
||||
|
[50, 100, 200, 500, -1], |
||||
|
['50 rows', '100 rows', '200 rows', 'Show all'] |
||||
|
], |
||||
|
scrollY: '400px', |
||||
|
scrollX: true, |
||||
|
responsive: false, |
||||
|
searching: false, |
||||
|
ordering: false, |
||||
|
buttons: [ |
||||
|
|
||||
|
{ |
||||
|
extend: 'excelHtml5', |
||||
|
text: 'Export Excel', |
||||
|
title: 'Street Vendor Inspection Zone: '+zoneCode+' ward wise Report', |
||||
|
exportOptions: { |
||||
|
columns: ':visible' |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
extend: 'pdfHtml5', |
||||
|
text: 'Export PDF', |
||||
|
title: 'Street Vendor Inspection Zone: '+zoneCode+' ward wise Report', |
||||
|
pageSize: 'A4', |
||||
|
exportOptions: { |
||||
|
columns: ':visible' |
||||
|
}, |
||||
|
customize: function (doc) { |
||||
|
|
||||
|
doc.styles.tableHeader.alignment = 'center'; |
||||
|
doc.defaultStyle.fontSize = 9; |
||||
|
|
||||
|
doc.content[1].table.widths = [ |
||||
|
'*', '*', '*', '*', '*' |
||||
|
]; |
||||
|
|
||||
|
// Center align all table cells |
||||
|
let rowCount = doc.content[1].table.body.length; |
||||
|
|
||||
|
for (let i = 0; i < rowCount; i++) { |
||||
|
|
||||
|
let row = doc.content[1].table.body[i]; |
||||
|
|
||||
|
for (let j = 0; j < row.length; j++) { |
||||
|
|
||||
|
row[j].alignment = 'center'; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
] |
||||
|
|
||||
|
|
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
$('#zoneDetailsModal').modal('show'); |
||||
|
} |
||||
|
else if (Array.isArray(res.data) && res.data.length === 0){ |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("No data available."); |
||||
|
|
||||
|
Swal.fire({ |
||||
|
icon: 'info', |
||||
|
title: 'No Data', |
||||
|
text: 'No data available.', |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
} |
||||
|
else{ |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Error: " + response.message); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: res.message, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Error: " + response.message); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: res.message, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
error: function(xhr, status, error) { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Request failed: " + error); |
||||
|
|
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: error, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
</script> |
||||
|
|
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,577 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org"> |
||||
|
<head> |
||||
|
<title>StreetVendor Overall Details</title> |
||||
|
|
||||
|
<!-- Bootstrap 5 CSS --> |
||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"> |
||||
|
|
||||
|
<!-- DataTables CSS --> |
||||
|
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet"/> |
||||
|
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet"/> |
||||
|
|
||||
|
<style> |
||||
|
|
||||
|
.filter-section { |
||||
|
background: #fff; |
||||
|
padding: 15px; |
||||
|
border-radius: 8px; |
||||
|
/* box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); */ |
||||
|
margin-bottom: 20px; |
||||
|
} |
||||
|
table.dataTable th, table.dataTable td { |
||||
|
text-align: center; |
||||
|
vertical-align: middle; |
||||
|
border: 1px solid #000; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
table.dataTable th{ |
||||
|
background-color: #003366 !important; |
||||
|
color: white; |
||||
|
} |
||||
|
|
||||
|
.dataTables_wrapper .dt-buttons { |
||||
|
margin-bottom: 10px; |
||||
|
} |
||||
|
|
||||
|
.dataTables_filter { |
||||
|
margin-bottom: 25px; /* adjust as needed */ |
||||
|
} |
||||
|
|
||||
|
.page-header-title h4 { |
||||
|
margin: 20px 0; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
#zoneDetailsTable_wrapper .dataTables_scrollBody { |
||||
|
border: none !important; |
||||
|
} |
||||
|
|
||||
|
#zoneDetailsTable td, #zoneDetailsTable th { |
||||
|
vertical-align: middle; |
||||
|
text-align: center; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
</style> |
||||
|
</head> |
||||
|
<body> |
||||
|
|
||||
|
<div class="page-header-title"> |
||||
|
<h4>Street Vendor - Zonewise Report</h4> |
||||
|
</div> |
||||
|
|
||||
|
<div class="filter-section d-flex justify-content-center align-items-end gap-3 flex-wrap"> |
||||
|
<div> |
||||
|
<label for="fromDate" class="form-label fw-bold">From Date:</label> |
||||
|
<input type="date" id="fromDate" class="form-control" onclick="this.showPicker()"> |
||||
|
</div> |
||||
|
<div> |
||||
|
<label for="toDate" class="form-label fw-bold">To Date:</label> |
||||
|
<input type="date" id="toDate" class="form-control" onclick="this.showPicker()"> |
||||
|
</div> |
||||
|
<div> |
||||
|
<button id="btnSearch" class="btn btn-primary px-4"><i class="fa-solid fa-search"></i> Search</button> |
||||
|
</div> |
||||
|
<div> |
||||
|
<button id="btnReset" class="btn btn-secondary px-4"> Reset</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div id="opSummaryTable" style="display: block;width: 100%;" class="container"> |
||||
|
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th rowspan="2" class="text-center">Zone</th> |
||||
|
<th rowspan="2" class="text-center">Application Received</th> |
||||
|
<th colspan="5" class="text-center">Application Processed</th> |
||||
|
<th rowspan="2" class="text-center">Total Processed</th> |
||||
|
<th rowspan="2" class="text-center">Pending </th> |
||||
|
<th rowspan="2" class="text-center">Processed within 30 days</th> |
||||
|
|
||||
|
</tr> |
||||
|
<tr> |
||||
|
<th class="text-center">Assistant Processed</th> |
||||
|
<th class="text-center">LI Processed</th> |
||||
|
<th class="text-center">ARO Processed</th> |
||||
|
<th class="text-center">EE Processed</th> |
||||
|
<th class="text-center">Committee Processed</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
|
||||
|
|
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
|
||||
|
<div class="modal fade" id="zoneDetailsModal" tabindex="-1" aria-labelledby="zoneDetailsLabel" aria-hidden="true" data-bs-keyboard="false" data-bs-backdrop="static"> |
||||
|
<div class="modal-dialog modal-xl"> |
||||
|
<div class="modal-content"> |
||||
|
<div class="modal-header"> |
||||
|
<h5 class="modal-title" id="zoneModalTitle">Zone Details</h5> |
||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
||||
|
</div> |
||||
|
<div class="modal-body"> |
||||
|
|
||||
|
<table id="WardDatatable" class="table table-striped table-bordered display nowrap w-100"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th rowspan="2" class="text-center">Ward</th> |
||||
|
<th rowspan="2" class="text-center">Application Received</th> |
||||
|
<th colspan="5" class="text-center">Application Processed</th> |
||||
|
<th rowspan="2" class="text-center">Total Processed</th> |
||||
|
<th rowspan="2" class="text-center">Pending </th> |
||||
|
<th rowspan="2" class="text-center">Processed within 30 days</th> |
||||
|
|
||||
|
</tr> |
||||
|
<tr> |
||||
|
<th class="text-center">Assistant Processed</th> |
||||
|
<th class="text-center">LI Processed</th> |
||||
|
<th class="text-center">ARO Processed</th> |
||||
|
<th class="text-center">EE Processed</th> |
||||
|
<th class="text-center">Committee Processed</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
|
||||
|
|
||||
|
</tbody> |
||||
|
</table> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
<div id="pageLoader" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;"> |
||||
|
<div style="position: relative; top: 50%; transform: translateY(-50%);"> |
||||
|
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;"> |
||||
|
<span class="sr-only"></span> |
||||
|
</div> |
||||
|
<!-- Add the 'Please wait' text below the spinner --> |
||||
|
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please wait...</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
<!-- Scripts --> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script> |
||||
|
|
||||
|
<!-- DataTables JS --> |
||||
|
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script> |
||||
|
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script> |
||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script> |
||||
|
|
||||
|
<!-- SweetAlert --> |
||||
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> |
||||
|
|
||||
|
<script> |
||||
|
|
||||
|
$('#fromDate, #toDate').on('change', function () { |
||||
|
|
||||
|
let fromDate = $('#fromDate').val(); |
||||
|
let toDate = $('#toDate').val(); |
||||
|
|
||||
|
// Both dates selected |
||||
|
if (fromDate && toDate) { |
||||
|
|
||||
|
if (new Date(fromDate) > new Date(toDate)) { |
||||
|
|
||||
|
Swal.fire({ |
||||
|
icon: 'warning', |
||||
|
title: 'Invalid Date Range', |
||||
|
text: 'From Date should not be greater than To Date' |
||||
|
}); |
||||
|
|
||||
|
$(this).val(''); |
||||
|
return; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Set min/max dynamically |
||||
|
$('#toDate').attr('min', fromDate); |
||||
|
|
||||
|
$('#fromDate').attr('max', toDate); |
||||
|
}); |
||||
|
|
||||
|
$('#btnReset').click(function () { |
||||
|
|
||||
|
$('#fromDate').val(''); |
||||
|
$('#toDate').val(''); |
||||
|
|
||||
|
|
||||
|
}); |
||||
|
|
||||
|
$('#btnSearch').click(function () { |
||||
|
|
||||
|
var fromDate = $('#fromDate').val() || ''; |
||||
|
var toDate = $('#toDate').val() || ''; |
||||
|
|
||||
|
loadZoneReport(fromDate,toDate); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
function loadZoneReport(fromdate,todate) { |
||||
|
|
||||
|
$('#pageLoader').show(); |
||||
|
$.ajax({ |
||||
|
url: '/commissionerreview/api/streetvendor/getzoneoveralldetails', |
||||
|
method: 'GET', |
||||
|
data:{fromdate:fromdate,todate:todate}, |
||||
|
success: function(response) { |
||||
|
|
||||
|
// Safely extract data whether it's an array or an object |
||||
|
var res = Array.isArray(response) ? response[0] : response; |
||||
|
console.log("Response:", res); |
||||
|
|
||||
|
$('#pageLoader').hide(); |
||||
|
|
||||
|
if (res.status === "Success") { |
||||
|
|
||||
|
if (Array.isArray(res.data) && res.data.length > 0) { |
||||
|
console.log("Details Array:", response); |
||||
|
|
||||
|
let table = $('#ZoneOpDatatable').DataTable({ |
||||
|
destroy: true, |
||||
|
autoWidth: true, |
||||
|
info: true, |
||||
|
data: res.data, // using response directly |
||||
|
columns: [ |
||||
|
{ |
||||
|
data: 'zone', |
||||
|
render: function (data, type, row) { |
||||
|
|
||||
|
|
||||
|
return `<a href="#" onclick="openZoneModal('${data}')" style="text-decoration: underline;">${data}</a>`; |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
{ data: 'application_received', defaultContent: '-', className: 'text-center' }, |
||||
|
|
||||
|
{ data: 'assistant_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'li_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'aro_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'ee_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'committee_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'total_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'pending', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'processed_within_30_days', defaultContent: '-', className: 'text-center' } |
||||
|
], |
||||
|
dom: 'Bfrtip', |
||||
|
buttons: [ |
||||
|
|
||||
|
{ |
||||
|
extend: 'excelHtml5', |
||||
|
text: 'Export Excel', |
||||
|
title: 'Street Vendor - Zone Wise Report', |
||||
|
exportOptions: { |
||||
|
columns: ':visible' |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
extend: 'pdfHtml5', |
||||
|
text: 'Export PDF', |
||||
|
title: 'Street Vendor - Zone Wise Report', |
||||
|
orientation: 'landscape', |
||||
|
pageSize: 'A4', |
||||
|
exportOptions: { |
||||
|
columns: ':visible' |
||||
|
}, |
||||
|
customize: function (doc) { |
||||
|
|
||||
|
doc.styles.tableHeader.alignment = 'center'; |
||||
|
doc.defaultStyle.fontSize = 9; |
||||
|
|
||||
|
doc.content[1].table.widths = [ |
||||
|
'*', '*', '*', '*', '*', |
||||
|
'*', '*', '*', '*', '*' |
||||
|
]; |
||||
|
|
||||
|
// Center align all table cells |
||||
|
let rowCount = doc.content[1].table.body.length; |
||||
|
|
||||
|
for (let i = 0; i < rowCount; i++) { |
||||
|
|
||||
|
let row = doc.content[1].table.body[i]; |
||||
|
|
||||
|
for (let j = 0; j < row.length; j++) { |
||||
|
|
||||
|
row[j].alignment = 'center'; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
], |
||||
|
lengthMenu: [ |
||||
|
[50, 100, 200, 500, -1], |
||||
|
['50 rows', '100 rows', '200 rows', 'Show all'] |
||||
|
], |
||||
|
scrollY: 'auto', |
||||
|
scrollX: true, |
||||
|
responsive: false, |
||||
|
searching: false, |
||||
|
ordering: false |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
else if(Array.isArray(res.data) && res.data.length === 0) { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("No data available."); |
||||
|
|
||||
|
Swal.fire({ |
||||
|
icon: 'info', |
||||
|
title: 'No Data', |
||||
|
text: 'No data available.', |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
else { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Error: " + response.message); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: 'Error', |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
else { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Error: " + response.message); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: res.message, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
}, |
||||
|
error: function(xhr, status, error) { |
||||
|
$('#pageLoader').hide(); |
||||
|
// alert("Request failed: " + error); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: error, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
$(document).ready(function () { |
||||
|
|
||||
|
loadZoneReport("",""); |
||||
|
|
||||
|
|
||||
|
$('#zoneDetailsModal').on('shown.bs.modal', function () { |
||||
|
if ($.fn.DataTable.isDataTable('#WardDatatable')) { |
||||
|
let questionDatatable = $('#WardDatatable').DataTable(); |
||||
|
questionDatatable.columns.adjust().draw(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
|
||||
|
function openZoneModal(zoneCode) { |
||||
|
console.log("Opening modal for zone:", zoneCode); |
||||
|
|
||||
|
var fromDate = $('#fromDate').val() || ''; |
||||
|
var toDate = $('#toDate').val() || ''; |
||||
|
|
||||
|
$('#pageLoader').show(); |
||||
|
|
||||
|
// Set data in modal (example) |
||||
|
$('#zoneModalTitle').text('Zone ' + zoneCode + ' Details'); |
||||
|
|
||||
|
|
||||
|
$.ajax({ |
||||
|
url: '/commissionerreview/api/streetvendor/getwardoveralldetails', |
||||
|
method: 'GET', |
||||
|
data:{fromdate:fromDate,todate:toDate,zone:zoneCode}, |
||||
|
success: function(response) { |
||||
|
|
||||
|
var res = Array.isArray(response) ? response[0] : response; |
||||
|
console.log("Response:", res); |
||||
|
|
||||
|
$('#pageLoader').hide(); |
||||
|
|
||||
|
if (res.status === "Success") { |
||||
|
|
||||
|
if (Array.isArray(res.data) && res.data.length > 0){ |
||||
|
console.log("Details Array:", response); |
||||
|
|
||||
|
|
||||
|
let table = $('#WardDatatable').DataTable({ |
||||
|
destroy: true, |
||||
|
autoWidth: true, |
||||
|
info: true, |
||||
|
data: res.data, // using response directly |
||||
|
columns: [ |
||||
|
{ data: 'ward', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'application_received', defaultContent: '-', className: 'text-center' }, |
||||
|
|
||||
|
{ data: 'assistant_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'li_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'aro_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'ee_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'committee_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'total_processed', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'pending', defaultContent: '-', className: 'text-center' }, |
||||
|
{ data: 'processed_within_30_days', defaultContent: '-', className: 'text-center' } |
||||
|
], |
||||
|
dom: 'Bfrtip', |
||||
|
lengthMenu: [ |
||||
|
[50, 100, 200, 500, -1], |
||||
|
['50 rows', '100 rows', '200 rows', 'Show all'] |
||||
|
], |
||||
|
scrollY: '400px', |
||||
|
scrollX: true, |
||||
|
responsive: false, |
||||
|
searching: false, |
||||
|
ordering: false, |
||||
|
buttons: [ |
||||
|
|
||||
|
{ |
||||
|
extend: 'excelHtml5', |
||||
|
text: 'Export Excel', |
||||
|
title: 'Street Vendor - Zone: '+zoneCode+' ward wise Report', |
||||
|
exportOptions: { |
||||
|
columns: ':visible' |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
{ |
||||
|
extend: 'pdfHtml5', |
||||
|
text: 'Export PDF', |
||||
|
title: 'Street Vendor - Zone: '+zoneCode+' ward wise Report', |
||||
|
orientation: 'landscape', |
||||
|
pageSize: 'A4', |
||||
|
exportOptions: { |
||||
|
columns: ':visible' |
||||
|
}, |
||||
|
customize: function (doc) { |
||||
|
|
||||
|
doc.styles.tableHeader.alignment = 'center'; |
||||
|
doc.defaultStyle.fontSize = 9; |
||||
|
|
||||
|
doc.content[1].table.widths = [ |
||||
|
'*', '*', '*', '*', '*', |
||||
|
'*', '*', '*', '*', '*' |
||||
|
]; |
||||
|
|
||||
|
// Center align all table cells |
||||
|
let rowCount = doc.content[1].table.body.length; |
||||
|
|
||||
|
for (let i = 0; i < rowCount; i++) { |
||||
|
|
||||
|
let row = doc.content[1].table.body[i]; |
||||
|
|
||||
|
for (let j = 0; j < row.length; j++) { |
||||
|
|
||||
|
row[j].alignment = 'center'; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
] |
||||
|
|
||||
|
|
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
$('#zoneDetailsModal').modal('show'); |
||||
|
} |
||||
|
else if (Array.isArray(res.data) && res.data.length === 0){ |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("No data available."); |
||||
|
|
||||
|
Swal.fire({ |
||||
|
icon: 'info', |
||||
|
title: 'No Data', |
||||
|
text: 'No data available.', |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
} |
||||
|
else{ |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Error: " + response.message); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: res.message, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Error: " + response.message); |
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: res.message, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
error: function(xhr, status, error) { |
||||
|
$('#pageLoader').hide(); |
||||
|
//alert("Request failed: " + error); |
||||
|
|
||||
|
Swal.fire({ |
||||
|
icon: 'error', |
||||
|
title: 'Error', |
||||
|
text: error, |
||||
|
showConfirmButton: true, |
||||
|
timer: 3000 |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
</script> |
||||
|
|
||||
|
</body> |
||||
|
</html> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue