Browse Source

implemented enhacements for pendinglist and report

main
AJITHKUMAR12 3 months ago
parent
commit
8fd4682601
  1. 305
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/controller/PendinglistApicontroller.java
  2. 11
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/controller/ReportApicontroller.java
  3. 625
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/service/PendinglistService.java
  4. 27
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/service/ReportService.java
  5. 876
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/roadwar/service/RegisterService.java
  6. 793
      gcc_officer_portal/src/main/resources/templates/modules/greencommittee/pendinglist.html
  7. 403
      gcc_officer_portal/src/main/resources/templates/modules/greencommittee/reports.html

305
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/controller/PendinglistApicontroller.java

@ -25,159 +25,158 @@ public class PendinglistApicontroller {
@Autowired
private PendinglistService pendinglistService;
@GetMapping("/getzones")
public List<Map<String, Object>> ViewZoneDropdown() {
return pendinglistService.ViewZoneDropdown();
}
@GetMapping("/getwardbyzone")
public List<Map<String, Object>> ViewWardDropdown(@RequestParam String zone) {
return pendinglistService.ViewWardDropdown(zone);
}
@GetMapping("/dropdown-Event")
public ResponseEntity<List<Map<String, Object>>> ViewDropdownEvent() {
try {
List<Map<String, Object>> result = pendinglistService.ViewDropdownEvent();
return ResponseEntity.ok(result);
} catch (Exception e) {
Map<String, Object> error = new HashMap<>();
error.put("error", "Unable to fetch event list");
error.put("details", e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonList(error));
}
}
// @GetMapping("/getgreencommitteelist")
// public List<Map<String, Object>> getgreencommitteelist(@RequestParam String date,
// @RequestParam String zones) {
//
// List<String> refnums = pendinglistService.getrefnums(date, zones);
// //System.out.println("refnums="+refnums);
// List<Map<String, Object>> savedids=pendinglistService.getvcsavedrefids();
// //System.err.println("savedids="+savedids);
// // Convert to List<String>
// List<String> savedRefIds = savedids.stream()
// .map(m -> m.get("ref_id").toString())
// .toList();
//
// //System.out.println("savedRefIds=" + savedRefIds);
//
// List<Map<String, Object>> finalList = new ArrayList<>();
//
// if (refnums.isEmpty()) {
// return Collections.emptyList();
// }
//
// // REMOVE already saved ref_ids
// List<String> filteredRefIds = refnums.stream()
// .filter(ref -> !savedRefIds.contains(ref))
// .toList();
//
// //System.out.println("filteredRefIds="+filteredRefIds);
//
// for (String ref : filteredRefIds) {
// Map<String, Object> data = pendinglistService.getlistdata(ref);
// if (data != null && !data.isEmpty()) {
// finalList.add(data);
// }
// }
//
// return finalList;
// }
@GetMapping("/getgreencommitteelist")
public List<Map<String, Object>> getgreencommitteelist(
@RequestParam String date, @RequestParam String zones) {
List<Map<String,Object>> refnums = pendinglistService.getrefnums(date, zones);
System.out.println("refnums="+refnums);
List<Map<String,Object>> savedIds = pendinglistService.getvcsavedrefids();
System.out.println("savedIds="+savedIds);
// Convert savedIds → List<String>
List<String> savedRefList = new ArrayList<>();
for (Map<String,Object> m : savedIds) {
savedRefList.add(m.get("ref_id").toString());
}
List<Map<String,Object>> finalList = new ArrayList<>();
for (Map<String,Object> row : refnums) {
String refId = row.get("ref_id").toString();
Integer inspReinsId = row.get("latest_reinspection_id") != null ?
Integer.parseInt(row.get("latest_reinspection_id").toString())
: null;
// Skip if already committee decided
if (savedRefList.contains(refId)) continue;
// Get reinspection latest id
Integer dbLatest = pendinglistService.getLatestReinspectionId(refId);
// Rule: if inspection reinspection ID is NULL but in DB exists → skip
if (inspReinsId == null && dbLatest != null) continue;
// Rule: if BOTH exist AND not equal → skip
if (inspReinsId != null && dbLatest != null && !inspReinsId.equals(dbLatest))
continue;
// 👍 Valid, add final data
Map<String,Object> data = pendinglistService.getlistdata(refId);
if (data != null && !data.isEmpty()) {
System.out.println("inside="+refId);
finalList.add(data);
}
}
return finalList;
}
@GetMapping("/getdetailsbyrefid")
public Map<String, Object> getdetailsbyrefid(@RequestParam String refid) {
return pendinglistService.getdetailsbyrefid(refid);
}
@GetMapping("/getCommitteeActions")
public List<Map<String, Object>> getCommitteeActions() {
return pendinglistService.getCommitteeActions();
}
@PostMapping("/savecommittee")
public Map<String, Object> saveCommittee(@RequestBody Map<String, Object> payload) {
String refId = (String) payload.get("ref_id");
String remarks = (String) payload.get("remarks");
int userId = Integer.parseInt(payload.get("userId").toString());
int meetingid = Integer.parseInt(payload.get("meetingid").toString());
List<Map<String, Object>> decisions = (List<Map<String, Object>>) payload.get("decisions");
return pendinglistService.saveCommittee(refId, remarks, meetingid, userId, decisions);
}
@PostMapping("/savereinspection")
public Map<String, Object> saveReInspection(@RequestBody Map<String, Object> payload) {
String refId = payload.get("ref_id").toString();
int committeeAction = Integer.parseInt(payload.get("committee_action").toString());
int meetingId = Integer.parseInt(payload.get("meeting_id").toString());
String remarks = payload.get("remarks") != null ? payload.get("remarks").toString() : null;
int userId = Integer.parseInt(payload.get("userId").toString());
return pendinglistService.saveReInspection(refId, committeeAction, meetingId, remarks, userId);
}
public List<Map<String, Object>> ViewZoneDropdown() {
return pendinglistService.ViewZoneDropdown();
}
@GetMapping("/getwardbyzone")
public List<Map<String, Object>> ViewWardDropdown(@RequestParam String zone) {
return pendinglistService.ViewWardDropdown(zone);
}
@GetMapping("/dropdown-Event")
public ResponseEntity<List<Map<String, Object>>> ViewDropdownEvent() {
try {
List<Map<String, Object>> result = pendinglistService.ViewDropdownEvent();
return ResponseEntity.ok(result);
} catch (Exception e) {
Map<String, Object> error = new HashMap<>();
error.put("error", "Unable to fetch event list");
error.put("details", e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonList(error));
}
}
// @GetMapping("/getgreencommitteelist")
// public List<Map<String, Object>> getgreencommitteelist(@RequestParam String
// date,
// @RequestParam String zones) {
//
// List<String> refnums = pendinglistService.getrefnums(date, zones);
// //System.out.println("refnums="+refnums);
// List<Map<String, Object>> savedids=pendinglistService.getvcsavedrefids();
// //System.err.println("savedids="+savedids);
// // Convert to List<String>
// List<String> savedRefIds = savedids.stream()
// .map(m -> m.get("ref_id").toString())
// .toList();
//
// //System.out.println("savedRefIds=" + savedRefIds);
//
// List<Map<String, Object>> finalList = new ArrayList<>();
//
// if (refnums.isEmpty()) {
// return Collections.emptyList();
// }
//
// // REMOVE already saved ref_ids
// List<String> filteredRefIds = refnums.stream()
// .filter(ref -> !savedRefIds.contains(ref))
// .toList();
//
// //System.out.println("filteredRefIds="+filteredRefIds);
//
// for (String ref : filteredRefIds) {
// Map<String, Object> data = pendinglistService.getlistdata(ref);
// if (data != null && !data.isEmpty()) {
// finalList.add(data);
// }
// }
//
// return finalList;
// }
@GetMapping("/getgreencommitteelist")
public List<Map<String, Object>> getgreencommitteelist(
@RequestParam String date, @RequestParam String zones) {
List<Map<String, Object>> refnums = pendinglistService.getrefnums(date, zones);
System.out.println("refnums=" + refnums);
List<Map<String, Object>> savedIds = pendinglistService.getvcsavedrefids();
System.out.println("savedIds=" + savedIds);
// Convert savedIds → List<String>
List<String> savedRefList = new ArrayList<>();
for (Map<String, Object> m : savedIds) {
savedRefList.add(m.get("ref_id").toString());
}
List<Map<String, Object>> finalList = new ArrayList<>();
for (Map<String, Object> row : refnums) {
String refId = row.get("ref_id").toString();
Integer inspReinsId = row.get("latest_reinspection_id") != null
? Integer.parseInt(row.get("latest_reinspection_id").toString())
: null;
// Skip if already committee decided
if (savedRefList.contains(refId))
continue;
// Get reinspection latest id
Integer dbLatest = pendinglistService.getLatestReinspectionId(refId);
// Rule: if inspection reinspection ID is NULL but in DB exists → skip
if (inspReinsId == null && dbLatest != null)
continue;
// Rule: if BOTH exist AND not equal → skip
if (inspReinsId != null && dbLatest != null && !inspReinsId.equals(dbLatest))
continue;
// 👍 Valid, add final data
Map<String, Object> data = pendinglistService.getlistdata(refId);
if (data != null && !data.isEmpty()) {
System.out.println("inside=" + refId);
finalList.add(data);
}
}
return finalList;
}
@GetMapping("/getdetailsbyrefid")
public Map<String, Object> getdetailsbyrefid(@RequestParam String refid) {
return pendinglistService.getdetailsbyrefid(refid);
}
@GetMapping("/getCommitteeActions")
public List<Map<String, Object>> getCommitteeActions() {
return pendinglistService.getCommitteeActions();
}
@PostMapping("/savecommittee")
public Map<String, Object> saveCommittee(@RequestBody Map<String, Object> payload) {
String refId = (String) payload.get("ref_id");
String remarks = (String) payload.get("remarks");
int userId = Integer.parseInt(payload.get("userId").toString());
int meetingid = Integer.parseInt(payload.get("meetingid").toString());
List<Map<String, Object>> decisions = (List<Map<String, Object>>) payload.get("decisions");
return pendinglistService.saveCommittee(refId, remarks, meetingid, userId, decisions);
}
@PostMapping("/savereinspection")
public Map<String, Object> saveReInspection(@RequestBody Map<String, Object> payload) {
String refId = payload.get("ref_id").toString();
int committeeAction = Integer.parseInt(payload.get("committee_action").toString());
int meetingId = Integer.parseInt(payload.get("meeting_id").toString());
String remarks = payload.get("remarks") != null ? payload.get("remarks").toString() : null;
int userId = Integer.parseInt(payload.get("userId").toString());
return pendinglistService.saveReInspection(refId, committeeAction, meetingId, remarks, userId);
}
}

11
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/controller/ReportApicontroller.java

@ -10,6 +10,7 @@ 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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.greencommittee.service.ReportService;
@ -23,9 +24,9 @@ public class ReportApicontroller {
@GetMapping("/getgreencommitteelist")
public List<Map<String, Object>> getgreencommitteelist(@RequestParam String meetingid,
@RequestParam String zones) {
@RequestParam String zones, @RequestParam String deptid, @RequestParam String appType) {
List<String> refnums = reportService.getrefnums(meetingid, zones);
List<String> refnums = reportService.getrefnums(meetingid, zones, deptid, appType);
System.out.println("refnums=" + refnums);
List<Map<String, Object>> finalList = new ArrayList<>();
@ -130,4 +131,10 @@ public class ReportApicontroller {
return response;
}
@GetMapping("/getDepartments")
@ResponseBody
public List<Map<String, Object>> getDepartments() {
return reportService.getDepartments();
}
}

625
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/service/PendinglistService.java

@ -4,10 +4,13 @@ import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.sql.DataSource;
@ -37,365 +40,385 @@ public class PendinglistService {
public List<Map<String, Object>> ViewWardDropdown(String zone) {
String sql = "SELECT ward_name "
+ "FROM ward_master "
+ "WHERE is_active=1 AND is_delete=0 AND zone_id=?";
try {
return jdbcTemplate.queryForList(sql,zone);
+ "FROM ward_master "
+ "WHERE is_active=1 AND is_delete=0 AND zone_id=?";
try {
return jdbcTemplate.queryForList(sql, zone);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
e.printStackTrace();
return Collections.emptyList();
}
}
public List<Map<String, Object>> ViewZoneDropdown() {
String sql = "SELECT zone_name "
+ "FROM zone_master "
+ "WHERE is_active=1 AND is_delete=0";
try {
return jdbcTemplate.queryForList(sql);
+ "FROM zone_master "
+ "WHERE is_active=1 AND is_delete=0";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
e.printStackTrace();
return Collections.emptyList();
}
}
public List<Map<String, Object>> ViewDropdownEvent() {
String sql = "SELECT * FROM create_meeting WHERE isactive=1 AND isdelete=0";
return jdbcTemplate.queryForList(sql);
String sql = "SELECT * FROM create_meeting WHERE isactive=1 AND isdelete=0";
return jdbcTemplate.queryForList(sql);
}
// public List<String> getrefnums(String date, String zones) {
//
// try {
//
// StringBuilder sql = new StringBuilder(
// "SELECT t.ref_id " +
// "FROM ( " +
// " SELECT ref_id, inspection_by, MAX(cdate) AS latest_date " +
// " FROM inspection_data " +
// " WHERE DATE(cdate) <= STR_TO_DATE(?, '%d-%m-%Y') " +
// " AND isactive = 1 "
// );
//
// List<Object> params = new ArrayList<>();
// params.add(date);
//
// if (zones != null && !zones.isEmpty()) {
// sql.append(" AND zone = ? ");
// params.add(zones);
// }
//
// sql.append(
// " GROUP BY ref_id, inspection_by " +
// ") AS t " +
// "GROUP BY t.ref_id " +
// "HAVING COUNT(DISTINCT t.inspection_by) = 3 " +
// "ORDER BY MAX(t.latest_date) DESC"
// );
//
// return jdbcTemplate.queryForList(sql.toString(), params.toArray(), String.class);
//
// } catch (Exception e) {
//
// System.err.println("Error in getrefums(): " + e.getMessage());
// e.printStackTrace();
// return Collections.emptyList();
// }
// }
// public List<String> getrefnums(String date, String zones) {
//
// try {
//
// StringBuilder sql = new StringBuilder(
// "SELECT t.ref_id " +
// "FROM ( " +
// " SELECT ref_id, inspection_by, MAX(cdate) AS latest_date " +
// " FROM inspection_data " +
// " WHERE DATE(cdate) <= STR_TO_DATE(?, '%d-%m-%Y') " +
// " AND isactive = 1 "
// );
//
// List<Object> params = new ArrayList<>();
// params.add(date);
//
// if (zones != null && !zones.isEmpty()) {
// sql.append(" AND zone = ? ");
// params.add(zones);
// }
//
// sql.append(
// " GROUP BY ref_id, inspection_by " +
// ") AS t " +
// "GROUP BY t.ref_id " +
// "HAVING COUNT(DISTINCT t.inspection_by) = 3 " +
// "ORDER BY MAX(t.latest_date) DESC"
// );
//
// return jdbcTemplate.queryForList(sql.toString(), params.toArray(),
// String.class);
//
// } catch (Exception e) {
//
// System.err.println("Error in getrefums(): " + e.getMessage());
// e.printStackTrace();
// return Collections.emptyList();
// }
// }
public List<Map<String, Object>> getrefnums(String date, String zones) {
System.out.println(date + " " + zones);
try {
StringBuilder sql = new StringBuilder(
"SELECT ref_id, " +
" MAX(latest_reinspection_id) AS latest_reinspection_id " +
"FROM ( " +
" SELECT ref_id, inspection_by, " +
" MAX(cdate) AS latest_date, " +
" MAX(reinspection_id) AS latest_reinspection_id " +
" FROM inspection_data " +
" WHERE DATE(cdate) <= STR_TO_DATE(?, '%d-%m-%Y') " +
" AND isactive = 1 "
);
List<Object> params = new ArrayList<>();
params.add(date);
if (zones != null && !zones.isEmpty()) {
sql.append(" AND zone = ? ");
params.add(zones);
}
sql.append(
" GROUP BY ref_id, inspection_by " +
") AS x " +
"GROUP BY ref_id " +
"HAVING COUNT(DISTINCT inspection_by) = 3 " +
"ORDER BY MAX(latest_date) DESC"
);
return jdbcTemplate.queryForList(sql.toString(), params.toArray());
} catch (Exception e) {
e.printStackTrace();
return Collections.emptyList();
}
}
try {
StringBuilder sql = new StringBuilder(
"SELECT ref_id, " +
" MAX(latest_reinspection_id) AS latest_reinspection_id " +
"FROM ( " +
" SELECT ref_id, inspection_by, " +
" MAX(cdate) AS latest_date, " +
" MAX(reinspection_id) AS latest_reinspection_id " +
" FROM inspection_data " +
" WHERE DATE(cdate) <= STR_TO_DATE(?, '%d-%m-%Y') " +
" AND isactive = 1 ");
List<Object> params = new ArrayList<>();
params.add(date);
if (zones != null && !zones.isEmpty()) {
sql.append(" AND zone = ? ");
params.add(zones);
}
sql.append(
" GROUP BY ref_id, inspection_by " +
") AS x " +
"GROUP BY ref_id " +
"HAVING COUNT(DISTINCT inspection_by) >= 2 " +
"ORDER BY MAX(latest_date) DESC");
public Integer getLatestReinspectionId(String refId) {
try {
String sql = "SELECT id FROM reinspection WHERE ref_id=? ORDER BY id DESC LIMIT 1";
return jdbcTemplate.queryForObject(sql, Integer.class, refId);
} catch (Exception e) {
return null;
}
}
return jdbcTemplate.queryForList(sql.toString(), params.toArray());
} catch (Exception e) {
e.printStackTrace();
return Collections.emptyList();
}
}
public Integer getLatestReinspectionId(String refId) {
try {
String sql = "SELECT id FROM reinspection WHERE ref_id=? ORDER BY id DESC LIMIT 1";
return jdbcTemplate.queryForObject(sql, Integer.class, refId);
} catch (Exception e) {
return null;
}
}
public Map<String, Object> getlistdata(String ref) {
Map<String, Object> regDetails = getRegDetails(ref);
Map<String, Object> regDetails = getRegDetails(ref);
List<Map<String, Object>> compDetails = getComplaintDetails(ref);
List<Map<String, Object>> compDetails = getComplaintDetails(ref);
regDetails.put("comp_details", compDetails);
regDetails.put("comp_details", compDetails);
return regDetails;
return regDetails;
}
public Map<String, Object> getRegDetails(String ref) {
String sql = "SELECT * FROM reg_details WHERE is_active = 1 AND ref_id = ?";
return jdbcTemplate.queryForMap(sql, ref);
String sql = "SELECT * FROM reg_details WHERE is_active = 1 AND ref_id = ?";
return jdbcTemplate.queryForMap(sql, ref);
}
public List<Map<String, Object>> getComplaintDetails(String ref) {
String sql = "SELECT cn.name AS nature, SUM(cd.no_of_trees) AS total_trees " +
"FROM complaint_details cd " +
"JOIN comp_nature cn ON cn.id = cd.comp_nature_id " +
"WHERE cd.is_active = 1 AND cd.ref_id = ? " +
"GROUP BY cn.name";
String sql = "SELECT cn.name AS nature, SUM(cd.no_of_trees) AS total_trees " +
"FROM complaint_details cd " +
"JOIN comp_nature cn ON cn.id = cd.comp_nature_id " +
"WHERE cd.is_active = 1 AND cd.ref_id = ? " +
"GROUP BY cn.name";
return jdbcTemplate.queryForList(sql, ref);
return jdbcTemplate.queryForList(sql, ref);
}
public Map<String, Object> getdetailsbyrefid(String refId) {
Map<String, Object> response = new HashMap<>();
// 1 — Application details
Map<String, Object> app = jdbcTemplate.queryForMap(
"SELECT *,DATE_FORMAT(cdate, '%d-%m-%Y %l:%i %p') as r_Cdate FROM reg_details WHERE ref_id=? AND is_active=1",
refId
);
// 2 — Complaint details (grouped)
List<Map<String, Object>> complaints = jdbcTemplate.queryForList(
"SELECT cn.name AS nature, SUM(cd.no_of_trees) AS count " +
"FROM complaint_details cd JOIN comp_nature cn ON cn.id=cd.comp_nature_id " +
"WHERE cd.ref_id=? GROUP BY cn.name", refId
);
// 3 — Complaint images
List<String> compImages = jdbcTemplate.queryForList(
"SELECT img_path FROM img_uploads WHERE ref_id=? AND is_active=1",
new Object[]{refId}, String.class
).stream()
.map(path -> fileBaseUrl + "/gccofficialapp/files" + path)
.collect(Collectors.toList());
app.put("complaints", complaints);
app.put("images", compImages);
response.put("application", app);
// 4 — Inspection details
List<Map<String, Object>> inspectionList = new ArrayList<>();
String sql =
"SELECT id.*, um.name AS inspector_name, " +
" DATE_FORMAT(id.cdate, '%d-%m-%Y %l:%i %p') AS f_Cdate " +
"FROM inspection_data id " +
"LEFT JOIN user_maping um ON um.userid = id.cby " +
"INNER JOIN ( " +
" SELECT inspection_by, MAX(cdate) AS latest_date " +
" FROM inspection_data " +
" WHERE ref_id = ? AND isactive = 1 " +
" GROUP BY inspection_by " +
") latest ON id.inspection_by = latest.inspection_by " +
" AND id.cdate = latest.latest_date " +
"WHERE id.ref_id = ? AND id.isactive = 1 " +
"ORDER BY FIELD(id.inspection_by, 'GCC', 'NGO', 'TNFD')";
List<Map<String, Object>> rows = jdbcTemplate.queryForList(
sql, refId, refId
);
for (Map<String, Object> row : rows) {
Integer inspId = (Integer) row.get("inspection_data_id");
// 4a — Recommendation details
List<Map<String, Object>> recommend = jdbcTemplate.queryForList(
"SELECT rm.name, itd.nooftrees AS count,itd.treename as treename " +
"FROM inspection_tree_data itd " +
"JOIN inspection_recommend_master rm ON rm.rid = itd.action " +
"WHERE itd.inspection_data_id=? AND itd.isactive=1",
inspId
);
row.put("recommendations", recommend);
// 4b — Images (thumbnail list)
List<String> imgs = new ArrayList<>();
if (row.get("file_1") != null) {
imgs.add(fileBaseUrl + "/gccofficialapp/files" + row.get("file_1").toString());
}
if (row.get("file_2") != null) {
imgs.add(fileBaseUrl + "/gccofficialapp/files" + row.get("file_2").toString());
}
if (row.get("file_3") != null) {
imgs.add(fileBaseUrl + "/gccofficialapp/files" + row.get("file_3").toString());
}
row.put("images", imgs);
inspectionList.add(row);
}
response.put("inspections", inspectionList);
// 5 — Re-Inspection Details
String reSql =
"SELECT r.id AS reins_id, r.committee_action, r.remarks AS reins_remarks, " +
" DATE_FORMAT(r.cdate, '%d-%m-%Y %l:%i %p') AS reins_date, " +
" cm.event_name, DATE_FORMAT(cm.event_date, '%d-%m-%Y') AS event_date " +
"FROM reinspection r " +
"LEFT JOIN create_meeting cm ON cm.id = r.meeting_id " +
"WHERE r.ref_id = ? AND r.isactive = 1 " +
"ORDER BY r.id DESC";
List<Map<String, Object>> reinspectionList = jdbcTemplate.queryForList(reSql, refId);
response.put("reinspections", reinspectionList);
return response;
Map<String, Object> response = new HashMap<>();
// 1 — Application details
Map<String, Object> app = jdbcTemplate.queryForMap(
"SELECT *,DATE_FORMAT(cdate, '%d-%m-%Y %l:%i %p') as r_Cdate FROM reg_details WHERE ref_id=? AND is_active=1",
refId);
// 2 — Complaint details (grouped)
List<Map<String, Object>> complaints = jdbcTemplate.queryForList(
"SELECT cn.name AS nature, SUM(cd.no_of_trees) AS count " +
"FROM complaint_details cd JOIN comp_nature cn ON cn.id=cd.comp_nature_id " +
"WHERE cd.ref_id=? GROUP BY cn.name",
refId);
// 3 — Complaint images
List<String> compImages = jdbcTemplate.queryForList(
"SELECT img_path FROM img_uploads WHERE ref_id=? AND is_active=1",
new Object[] { refId }, String.class).stream()
.map(path -> fileBaseUrl + "/gccofficialapp/files" + path)
.collect(Collectors.toList());
app.put("complaints", complaints);
app.put("images", compImages);
response.put("application", app);
// 4 — Inspection details
List<Map<String, Object>> inspectionList = new ArrayList<>();
String sql = "SELECT id.*, um.name AS inspector_name, " +
" DATE_FORMAT(id.cdate, '%d-%m-%Y %l:%i %p') AS f_Cdate " +
"FROM inspection_data id " +
"LEFT JOIN user_maping um ON um.userid = id.cby " +
"INNER JOIN ( " +
" SELECT inspection_by, MAX(cdate) AS latest_date " +
" FROM inspection_data " +
" WHERE ref_id = ? AND isactive = 1 " +
" GROUP BY inspection_by " +
") latest ON id.inspection_by = latest.inspection_by " +
" AND id.cdate = latest.latest_date " +
"WHERE id.ref_id = ? AND id.isactive = 1 " +
"ORDER BY FIELD(id.inspection_by, 'GCC', 'NGO', 'TNFD')";
List<Map<String, Object>> rows = jdbcTemplate.queryForList(
sql, refId, refId);
for (Map<String, Object> row : rows) {
Integer inspId = (Integer) row.get("inspection_data_id");
// 4a — Recommendation details
List<Map<String, Object>> recommend = jdbcTemplate.queryForList(
"SELECT rm.name, itd.nooftrees AS count,itd.treename as treename " +
"FROM inspection_tree_data itd " +
"JOIN inspection_recommend_master rm ON rm.rid = itd.action " +
"WHERE itd.inspection_data_id=? AND itd.isactive=1",
inspId);
row.put("recommendations", recommend);
// 4b — Images (thumbnail list)
List<String> imgs = new ArrayList<>();
if (row.get("file_1") != null) {
imgs.add(fileBaseUrl + "/gccofficialapp/files" + row.get("file_1").toString());
}
if (row.get("file_2") != null) {
imgs.add(fileBaseUrl + "/gccofficialapp/files" + row.get("file_2").toString());
}
if (row.get("file_3") != null) {
imgs.add(fileBaseUrl + "/gccofficialapp/files" + row.get("file_3").toString());
}
row.put("images", imgs);
inspectionList.add(row);
}
// ak
// Expected inspection stages
List<String> expected = Arrays.asList("GCC", "NGO", "TNFD");
// Completed stages
Set<String> completed = inspectionList.stream()
.map(m -> String.valueOf(m.get("inspection_by")))
.collect(Collectors.toSet());
// Add pending cards
for (String type : expected) {
if (!completed.contains(type)) {
Map<String, Object> pending = new HashMap<>();
pending.put("inspection_by", type);
pending.put("status", "PENDING");
pending.put("inspector_name", "");
pending.put("f_Cdate", "");
pending.put("remarks", "");
pending.put("recommendations", new ArrayList<>());
pending.put("images", new ArrayList<>());
inspectionList.add(pending);
}
}
// Sort in order GCC -> NGO -> TNFD
Map<String, Integer> order = new HashMap<>();
order.put("GCC", 1);
order.put("NGO", 2);
order.put("TNFD", 3);
inspectionList.sort(
Comparator.comparingInt(
m -> order.getOrDefault(String.valueOf(m.get("inspection_by")), 99)));
response.put("inspections", inspectionList);
// 5 — Re-Inspection Details
String reSql = "SELECT r.id AS reins_id, r.committee_action, r.remarks AS reins_remarks, " +
" DATE_FORMAT(r.cdate, '%d-%m-%Y %l:%i %p') AS reins_date, " +
" cm.event_name, DATE_FORMAT(cm.event_date, '%d-%m-%Y') AS event_date " +
"FROM reinspection r " +
"LEFT JOIN create_meeting cm ON cm.id = r.meeting_id " +
"WHERE r.ref_id = ? AND r.isactive = 1 " +
"ORDER BY r.id DESC";
List<Map<String, Object>> reinspectionList = jdbcTemplate.queryForList(reSql, refId);
response.put("reinspections", reinspectionList);
return response;
}
public List<Map<String, Object>> getCommitteeActions() {
String sql = "SELECT id,name "
+ "FROM committee_recommend_master "
+ "WHERE isactive=1 AND isdelete=0 "
+ "ORDER BY orderby";
try {
return jdbcTemplate.queryForList(sql);
+ "FROM committee_recommend_master "
+ "WHERE isactive=1 AND isdelete=0 "
+ "ORDER BY orderby";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
e.printStackTrace();
return Collections.emptyList();
}
}
public Map<String, Object> saveCommittee(
String refId,
String remarks,
int meetingid,
int userId,
List<Map<String, Object>> decisions
) {
String refId,
String remarks,
int meetingid,
int userId,
List<Map<String, Object>> decisions) {
Map<String, Object> response = new HashMap<>();
Map<String, Object> response = new HashMap<>();
try {
// 1️⃣ Save committee_data and get generated ID
int committeeDataId = saveCommitteeData(refId, remarks, meetingid, userId);
try {
// 1️⃣ Save committee_data and get generated ID
int committeeDataId = saveCommitteeData(refId, remarks, meetingid, userId);
List<Integer> insertedTreeIds = saveCommitteeTreeData(decisions, committeeDataId, refId, userId);
List<Integer> insertedTreeIds = saveCommitteeTreeData(decisions, committeeDataId, refId, userId);
response.put("committee_data_id", committeeDataId);
response.put("tree_ids", insertedTreeIds);
response.put("status", "success");
response.put("message", "Committee decision saved!");
response.put("committee_data_id", committeeDataId);
response.put("tree_ids", insertedTreeIds);
response.put("status", "success");
response.put("message", "Committee decision saved!");
} catch (Exception e) {
response.put("status", "error");
response.put("message", e.getMessage());
}
} catch (Exception e) {
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
return response;
}
public int saveCommitteeData(String refId, String remarks, int meetingid, int userId) {
String remarksValue = (remarks == null || remarks.trim().isEmpty()) ? null : remarks.trim();
String remarksValue = (remarks == null || remarks.trim().isEmpty()) ? null : remarks.trim();
String sql = "INSERT INTO committee_data (ref_id, meeting_id, remarks, cby) VALUES (?, ?, ?, ?)";
String sql = "INSERT INTO committee_data (ref_id, meeting_id, remarks, cby) VALUES (?, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, refId);
ps.setInt(2, meetingid);
if (remarksValue == null) {
ps.setNull(3, Types.VARCHAR);
} else {
ps.setString(3, remarksValue);
}
ps.setInt(4, userId);
return ps;
}, keyHolder);
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, refId);
ps.setInt(2, meetingid);
if (remarksValue == null) {
ps.setNull(3, Types.VARCHAR);
} else {
ps.setString(3, remarksValue);
}
ps.setInt(4, userId);
return ps;
}, keyHolder);
return keyHolder.getKey().intValue(); // generated committee_data.id
return keyHolder.getKey().intValue(); // generated committee_data.id
}
public List<Integer> saveCommitteeTreeData(
List<Map<String, Object>> decisions,
int committeeDataId,
String refId,
int userId
) {
List<Map<String, Object>> decisions,
int committeeDataId,
String refId,
int userId) {
String sql = "INSERT INTO committee_tree_data (nooftrees, committee_action, committee_data_id, ref_id, cby) " +
"VALUES (?, ?, ?, ?, ?)";
String sql = "INSERT INTO committee_tree_data (nooftrees, committee_action, committee_data_id, ref_id, cby) " +
"VALUES (?, ?, ?, ?, ?)";
List<Integer> insertedIds = new ArrayList<>();
List<Integer> insertedIds = new ArrayList<>();
for (Map<String, Object> row : decisions) {
for (Map<String, Object> row : decisions) {
int actionId = Integer.parseInt(row.get("id").toString());
int count = Integer.parseInt(row.get("count").toString());
int actionId = Integer.parseInt(row.get("id").toString());
int count = Integer.parseInt(row.get("count").toString());
KeyHolder keyHolder = new GeneratedKeyHolder();
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, count);
ps.setInt(2, actionId);
ps.setInt(3, committeeDataId);
ps.setString(4, refId);
ps.setInt(5, userId);
return ps;
}, keyHolder);
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, count);
ps.setInt(2, actionId);
ps.setInt(3, committeeDataId);
ps.setString(4, refId);
ps.setInt(5, userId);
return ps;
}, keyHolder);
insertedIds.add(keyHolder.getKey().intValue());
}
insertedIds.add(keyHolder.getKey().intValue());
}
return insertedIds;
return insertedIds;
}
public List<Map<String, Object>> getvcsavedrefids() {
String sql="SELECT ref_id FROM committee_data WHERE isactive=1";
String sql = "SELECT ref_id FROM committee_data WHERE isactive=1";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
@ -408,19 +431,19 @@ public class PendinglistService {
@Transactional
public Map<String, Object> saveReInspection(String refId, int action, int meetingId,
String remarks, int userId) {
String remarks, int userId) {
Map<String, Object> response = new HashMap<>();
Map<String, Object> response = new HashMap<>();
try {
// Insert into reinspection table
String sql = "INSERT INTO reinspection (ref_id, committee_action, meeting_id, remarks, cby) " +
"VALUES (?, ?, ?, ?, ?)";
// Insert into reinspection table
String sql = "INSERT INTO reinspection (ref_id, committee_action, meeting_id, remarks, cby) " +
"VALUES (?, ?, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, refId);
ps.setInt(2, action);
@ -428,30 +451,26 @@ public class PendinglistService {
ps.setString(4, remarks);
ps.setInt(5, userId);
return ps;
}, keyHolder);
}, keyHolder);
int generatedId = keyHolder.getKey().intValue();
int generatedId = keyHolder.getKey().intValue();
// Update reg_details.reinspection_id
jdbcTemplate.update("UPDATE reg_details SET reinspection_id=? WHERE ref_id=?",generatedId, refId);
// Update reg_details.reinspection_id
jdbcTemplate.update("UPDATE reg_details SET reinspection_id=? WHERE ref_id=?", generatedId, refId);
jdbcTemplate.update("UPDATE inspection_data SET isactive=0,isdelete=1 WHERE ref_id=?", refId);
jdbcTemplate.update("UPDATE inspection_data SET isactive=0,isdelete=1 WHERE ref_id=?", refId);
response.put("status", "success");
response.put("message", "Committee decision saved!");
response.put("reinspection_id", generatedId);
response.put("status", "success");
response.put("message", "Committee decision saved!");
response.put("reinspection_id", generatedId);
}
catch (Exception e)
{
response.put("status", "error");
response.put("message", e.getMessage());
} catch (Exception e) {
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
}
}

27
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/service/ReportService.java

@ -29,7 +29,7 @@ public class ReportService {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<String> getrefnums(String meetingid, String zones) {
public List<String> getrefnums(String meetingid, String zones, String deptid, String appType) {
try {
StringBuilder sql = new StringBuilder(
@ -80,6 +80,22 @@ public class ReportService {
params.add(zones);
}
if (deptid != null && !deptid.isEmpty()) {
sql.append(
" AND ref_id IN ( " +
" SELECT ref_id FROM reg_details WHERE dept_id = ? " +
" ) ");
params.add(deptid);
}
if (appType != null && !appType.isEmpty()) {
sql.append(
" AND ref_id IN ( " +
" SELECT ref_id FROM reg_details WHERE cby = ? " +
" ) ");
params.add(appType);
}
return jdbcTemplate.queryForList(
sql.toString(),
params.toArray(),
@ -182,7 +198,7 @@ public class ReportService {
}
public Map<String, Object> getRegDetails(String ref) {
String sql = "SELECT * FROM reg_details WHERE is_active = 1 AND ref_id = ?";
String sql = "SELECT rd.*,dm.name as department_name FROM reg_details rd left join dept_master dm on dm.id=rd.dept_id WHERE rd.is_active = 1 AND rd.ref_id = ?";
return jdbcTemplate.queryForMap(sql, ref);
}
@ -518,4 +534,11 @@ public class ReportService {
return response;
}
public List<Map<String, Object>> getDepartments() {
String sql = "SELECT id, name FROM dept_master WHERE is_active = 1 ORDER BY id";
return jdbcTemplate.queryForList(sql);
}
}

876
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/roadwar/service/RegisterService.java

@ -34,41 +34,39 @@ public class RegisterService {
private JdbcTemplate jdbcTemplate;
@Autowired
private Environment environment;
private Environment environment;
@Autowired
public void setDataSource(@Qualifier("mysqlRoadWarDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> ViewZoneDropdown() {
String sql = "SELECT zone_name "
+ "FROM zone_master "
+ "WHERE is_active=1 AND is_delete=0";
try {
return jdbcTemplate.queryForList(sql);
+ "FROM zone_master "
+ "WHERE is_active=1 AND is_delete=0";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
e.printStackTrace();
return Collections.emptyList();
}
}
public List<Map<String, Object>> ViewWardDropdown(String zone) {
String sql = "SELECT ward_name "
+ "FROM ward_master "
+ "WHERE is_active=1 AND is_delete=0 AND zone_id=?";
try {
return jdbcTemplate.queryForList(sql,zone);
+ "FROM ward_master "
+ "WHERE is_active=1 AND is_delete=0 AND zone_id=?";
try {
return jdbcTemplate.queryForList(sql, zone);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
e.printStackTrace();
return Collections.emptyList();
}
}
public List<Map<String, Object>> getRoadNamesByWard(String ward) {
try {
String encodedWard = URLEncoder.encode("'" + ward + "'", StandardCharsets.UTF_8.toString());
@ -90,7 +88,7 @@ public class RegisterService {
for (JsonNode feature : features) {
JsonNode props = feature.path("properties");
Map<String, Object> roadInfo = new HashMap<>();
roadInfo.put("road_id", props.path("road_id").asText());
roadInfo.put("road_id", props.path("road_id").asText());
roadInfo.put("road_name", props.path("road_name").asText());
roadList.add(roadInfo);
}
@ -103,8 +101,6 @@ public class RegisterService {
}
}
public List<Map<String, Object>> getRoadType() {
String sql = "Select id,road_type as roadType from road_type_master where is_active = 1 and is_delete = 0";
try {
@ -115,7 +111,6 @@ public class RegisterService {
}
}
public List<Map<String, Object>> getRoadTypeMaterial() {
String sql = "Select id,roadtype_material from roadtype_material_master where is_active = 1 and is_delete = 0";
try {
@ -146,7 +141,6 @@ public class RegisterService {
}
}
public List<Map<String, Object>> getMonthList() {
String sql = "SELECT id, month_name FROM month_master WHERE is_active = 1 AND is_delete = 0 ORDER BY id";
try {
@ -157,7 +151,6 @@ public class RegisterService {
}
}
public List<Map<String, Object>> getYearList() {
String sql = "SELECT id, year_name FROM year_master WHERE is_active = 1 AND is_delete = 0 ORDER BY id DESC";
try {
@ -168,10 +161,28 @@ public class RegisterService {
}
}
public Map<String, Object> saveRoadWarDetails(Map<String, Object> payload) {
Map<String, Object> result = new HashMap<>();
try {
String roadId = String.valueOf(payload.get("road_id"));
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) " +
"FROM road_details_master " +
"WHERE road_id = ? " +
"AND is_active = 1 " +
"AND is_delete = 0",
Integer.class,
roadId);
if (count != null && count > 0) {
result.put("status", false);
result.put("message",
"Selected road is already mapped to another Road War record");
return result;
}
String insertRoad = "INSERT INTO road_details_master "
+ "(zone, ward, road_name, road_type, road_length, road_avg_width, road_area, "
@ -194,7 +205,7 @@ public class RegisterService {
ps.setObject(2, payload.get("ward"));
ps.setObject(3, payload.get("road_name"));
ps.setObject(4, payload.get("road_type"));
// ps.setObject(5, payload.get("highway_ans"));
// ps.setObject(5, payload.get("highway_ans"));
ps.setObject(5, payload.get("road_length"));
ps.setObject(6, payload.get("road_avg_width"));
ps.setObject(7, payload.get("road_area"));
@ -301,467 +312,452 @@ public class RegisterService {
return result;
}
public List<Map<String, Object>> getAllRoadWarDetails(
String userid,
String zone,
String ward,
String roadId) {
StringBuilder sql = new StringBuilder(" SELECT rdm.*,rtm.road_type as road_type_name,rtmm.roadtype_material as roadtype_material_name,ftm.footpath_type_name as footpath_material_name FROM road_details_master rdm " +
" LEFT JOIN road_type_master rtm ON rtm.id= rdm.road_type " +
" LEFT JOIN roadtype_material_master rtmm ON rtmm.id= rdm.road_type_material " +
" LEFT JOIN footpath_type_master ftm ON ftm.id= rdm.footpath_material " +
" WHERE 1=1 ");
List<Object> params = new ArrayList<>();
if (userid != null && !userid.isEmpty()) {
sql.append(" AND rdm.cby = ?");
params.add(userid);
}
String zone,
String ward,
String roadId) {
StringBuilder sql = new StringBuilder(
" SELECT rdm.*,rtm.road_type as road_type_name,rtmm.roadtype_material as roadtype_material_name,ftm.footpath_type_name as footpath_material_name FROM road_details_master rdm "
+
" LEFT JOIN road_type_master rtm ON rtm.id= rdm.road_type " +
" LEFT JOIN roadtype_material_master rtmm ON rtmm.id= rdm.road_type_material " +
" LEFT JOIN footpath_type_master ftm ON ftm.id= rdm.footpath_material " +
" WHERE 1=1 ");
List<Object> params = new ArrayList<>();
if (userid != null && !userid.isEmpty()) {
sql.append(" AND rdm.cby = ?");
params.add(userid);
}
if (zone != null && !zone.isEmpty()) {
sql.append(" AND rdm.zone = ?");
params.add(zone);
}
if (zone != null && !zone.isEmpty()) {
sql.append(" AND rdm.zone = ?");
params.add(zone);
}
if (ward != null && !ward.isEmpty()) {
sql.append(" AND rdm.ward = ?");
params.add(ward);
}
if (ward != null && !ward.isEmpty()) {
sql.append(" AND rdm.ward = ?");
params.add(ward);
}
if (roadId != null && !roadId.isEmpty()) {
sql.append(" AND rdm.road_id = ?");
params.add(roadId);
}
if (roadId != null && !roadId.isEmpty()) {
sql.append(" AND rdm.road_id = ?");
params.add(roadId);
}
sql.append(" AND rdm.is_active=1 AND rdm.is_delete=0 ");
sql.append(" AND rdm.is_active=1 AND rdm.is_delete=0 ");
sql.append(" ORDER BY rdm.id DESC");
sql.append(" ORDER BY rdm.id DESC");
return jdbcTemplate.queryForList(sql.toString(), params.toArray());
return jdbcTemplate.queryForList(sql.toString(), params.toArray());
}
public Map<String, Object> getRoadWarDetailsById(String refid) {
Map<String, Object> result = new HashMap<>();
Map<String, Object> result = new HashMap<>();
try {
try {
String sql =
"SELECT rdm.*, rtm.road_type As road_type_name,rtmm.roadtype_material as roadtype_material,ftm.footpath_type_name as footpath_material_name " +
"FROM road_details_master rdm " +
"LEFT JOIN road_type_master rtm ON rtm.id = rdm.road_type " +
"LEFT JOIN roadtype_material_master rtmm ON rtmm.id = rdm.road_type_material " +
"LEFT JOIN footpath_type_master ftm ON ftm.id= rdm.footpath_material " +
"WHERE rdm.ref_id = ? AND rdm.is_active=1 AND rdm.is_delete=0 ";
String sql = "SELECT rdm.*, rtm.road_type As road_type_name,rtmm.roadtype_material as roadtype_material,ftm.footpath_type_name as footpath_material_name "
+
"FROM road_details_master rdm " +
"LEFT JOIN road_type_master rtm ON rtm.id = rdm.road_type " +
"LEFT JOIN roadtype_material_master rtmm ON rtmm.id = rdm.road_type_material " +
"LEFT JOIN footpath_type_master ftm ON ftm.id= rdm.footpath_material " +
"WHERE rdm.ref_id = ? AND rdm.is_active=1 AND rdm.is_delete=0 ";
Map<String, Object> road =
jdbcTemplate.queryForMap(sql, refid);
Map<String, Object> road = jdbcTemplate.queryForMap(sql, refid);
result.putAll(road);
result.putAll(road);
List<Map<String, Object>> relayingDetails =
jdbcTemplate.queryForList(
" SELECT rd.*,mm.month_name,ym.year_name,rtmm.roadtype_material "
+ " FROM relaying_details rd "
+ " LEFT JOIN month_master mm on mm.id = rd.relay_month "
+ " LEFT JOIN year_master ym on ym.id = rd.relay_year "
+ " LEFT JOIN roadtype_material_master rtmm on rtmm.id = rd.road_type_material "
+ " WHERE rd.road_ref_id = ? AND rd.is_active=1 AND rd.is_delete=0 ",
refid);
List<Map<String, Object>> relayingDetails = jdbcTemplate.queryForList(
" SELECT rd.*,mm.month_name,ym.year_name,rtmm.roadtype_material "
+ " FROM relaying_details rd "
+ " LEFT JOIN month_master mm on mm.id = rd.relay_month "
+ " LEFT JOIN year_master ym on ym.id = rd.relay_year "
+ " LEFT JOIN roadtype_material_master rtmm on rtmm.id = rd.road_type_material "
+ " WHERE rd.road_ref_id = ? AND rd.is_active=1 AND rd.is_delete=0 ",
refid);
result.put("relayingDetails", relayingDetails);
result.put("status", true);
result.put("relayingDetails", relayingDetails);
result.put("status", true);
} catch (Exception e) {
} catch (Exception e) {
result.put("status", false);
result.put("message", e.getMessage());
result.put("status", false);
result.put("message", e.getMessage());
}
}
return result;
return result;
}
public Map<String, Object> checkRoadExists(Integer roadId) {
Map<String, Object> response = new HashMap<>();
Map<String, Object> response = new HashMap<>();
try {
try {
String sql = " SELECT COUNT(*) FROM road_details_master "
String sql = " SELECT COUNT(*) FROM road_details_master "
+ " WHERE road_id = ? AND is_active=1 AND is_delete = 0 ";
+ " WHERE road_id = ? AND is_active=1 AND is_delete = 0 ";
Integer count = jdbcTemplate.queryForObject(
sql,
Integer.class,
roadId
);
Integer count = jdbcTemplate.queryForObject(
sql,
Integer.class,
roadId);
response.put("status", true);
response.put("exists", count != null && count > 0);
response.put("status", true);
response.put("exists", count != null && count > 0);
} catch (Exception e) {
} catch (Exception e) {
e.printStackTrace();
e.printStackTrace();
response.put("status", false);
response.put("message", "Error while checking road");
response.put("status", false);
response.put("message", "Error while checking road");
}
}
return response;
return response;
}
@Transactional
public Map<String, Object> updateRoadWarDetails(Map<String, Object> payload) {
Map<String, Object> result = new HashMap<>();
try {
String refId = String.valueOf(payload.get("ref_id"));
String updatedBy = String.valueOf(payload.get("updated_by"));
String roadId = String.valueOf(payload.get("road_id"));
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) " +
"FROM road_details_master " +
"WHERE road_id = ? " +
"AND ref_id <> ? " +
"AND is_active = 1 " +
"AND is_delete = 0",
Integer.class,
roadId,
refId
);
if (count != null && count > 0) {
result.put("status", false);
result.put("message",
"Selected road is already mapped to another Road War record");
return result;
}
//COPY CURRENT RECORD TO LOG TABLE
String logSql =
"INSERT INTO road_details_master_log (" +
"id, zone, ward, road_id, road_name,area_name,locality_name, road_type,road_type_material, highway_ans, " +
"road_length,road_row_width, road_avg_width,road_min_width,road_max_width, road_area, " +
"road_from,road_to,is_footpath,footpath_at, "+
"footpath_material, footpath_length, footpath_width, " +
"r_footpath_material, r_footpath_length, r_footpath_width, " +
"footpath_from_location, footpath_to_location, " +
"swd_at,rhs_swdlength,rhs_swdsize,scp_at,rhs_scpCount,manhole_at,r_mhCount,cp_at,r_cpCount,rwh_at,r_rwCount, "+
"is_swd, swd_from, swd_to, swd_length, swd_size, " +
"is_scp, scp_count, is_manhole, manhole_count, manhole_location, " +
"is_cpipe, cpipe_count, is_rwh, rwh_count, " +
"sewer_length, sewer_size, is_electric_poles, ep_count, is_hml,hml_count, " +
"is_streetlight_poles,streetlight_poles_count,is_mml,mml_count, "+
"culvert_bridge_count, details, is_busshelter, busshelter_count, " +
"is_centermedian, erp_asset_code, ref_id, cdate, cby, " +
"updated_date, updated_by, is_active, is_delete) " +
"SELECT " +
"id, zone, ward, road_id, road_name,area_name,locality_name, road_type,road_type_material, highway_ans, " +
"road_length,road_row_width, road_avg_width,road_min_width,road_max_width, road_area, " +
"road_from,road_to,is_footpath,footpath_at, "+
"footpath_material, footpath_length, footpath_width, " +
"r_footpath_material, r_footpath_length, r_footpath_width, " +
"footpath_from_location, footpath_to_location, " +
"swd_at,rhs_swdlength,rhs_swdsize,scp_at,rhs_scpCount,manhole_at,r_mhCount,cp_at,r_cpCount,rwh_at,r_rwCount, "+
"is_swd, swd_from, swd_to, swd_length, swd_size, " +
"is_scp, scp_count, is_manhole, manhole_count, manhole_location, " +
"is_cpipe, cpipe_count, is_rwh, rwh_count, " +
"sewer_length, sewer_size, is_electric_poles, ep_count, is_hml,hml_count, " +
"is_streetlight_poles,streetlight_poles_count,is_mml,mml_count, "+
"culvert_bridge_count, details, is_busshelter, busshelter_count, " +
"is_centermedian, erp_asset_code, ref_id, cdate, cby, " +
"updated_date, updated_by, is_active, is_delete " +
"FROM road_details_master " +
"WHERE ref_id=?";
jdbcTemplate.update(logSql, refId);
// 3. UPDATE ROAD MASTER
String updateSql =
"UPDATE road_details_master SET " +
"zone=?, " +
"ward=?, " +
"road_id=?, " +
"road_name=?, " +
"area_name=?, " +
"locality_name=?, " +
"road_type=?, " +
"road_type_material=?, " +
"road_length=?, " +
"road_row_width=?, "+
"road_avg_width=?, " +
"road_min_width=?, " +
"road_max_width=?, " +
"road_area=?, " +
"road_from=?, "+
"road_to=?, "+
"is_footpath=?, "+
"footpath_at=?, "+
"footpath_material=?, " +
"footpath_length=?, " +
"footpath_width=?, " +
"r_footpath_material=?, " +
"r_footpath_length=?, " +
"r_footpath_width=?, " +
"footpath_from_location=?, " +
"footpath_to_location=?, " +
"is_swd=?, " +
"swd_from=?, " +
"swd_to=?, " +
"swd_at=?,"+
"swd_length=?, " +
"swd_size=?, " +
"rhs_swdlength=?, " +
"rhs_swdsize=?, " +
"is_scp=?, " +
"scp_at=?, " +
"scp_count=?, " +
"rhs_scpCount=?,"+
"is_manhole=?, " +
"manhole_count=?, " +
"manhole_at=?, " +
"r_mhCount=?, " +
"is_cpipe=?, " +
"cpipe_count=?, " +
"cp_at=?, " +
"r_cpCount=?, " +
"is_rwh=?, " +
"rwh_count=?, " +
"rwh_at=?, " +
"r_rwCount=?, " +
"sewer_length=?, " +
"sewer_size=?, " +
"is_electric_poles=?, " +
"ep_count=?, " +
"is_hml=?, " +
"hml_count=?, " +
"is_streetlight_poles=?, " +
"streetlight_poles_count=?, " +
"is_mml=?, " +
"mml_count=?, " +
"culvert_bridge_count=?, " +
"details=?, " +
"is_busshelter=?, " +
"busshelter_count=?, " +
"is_centermedian=?, " +
"updated_date=NOW(), " +
"updated_by=? " +
"WHERE ref_id=?";
jdbcTemplate.update(updateSql,
payload.get("zone"),
payload.get("ward"),
payload.get("road_id"),
payload.get("road_name"),
payload.get("road_areaname"),
payload.get("road_localityname"),
payload.get("road_type"),
payload.get("road_type_material"),
payload.get("road_length"),
payload.get("road_row_width"),
payload.get("road_avg_width"),
payload.get("road_min_width"),
payload.get("road_max_width"),
payload.get("road_area"),
payload.get("road_from"),
payload.get("road_to"),
payload.get("is_footpath"),
payload.get("footpath_at"),
payload.get("footpath_material"),
payload.get("footpath_length"),
payload.get("footpath_width"),
payload.get("rhs_footpathDropdown"),
payload.get("rhs_fplength"),
payload.get("rhs_fpwidth"),
payload.get("footpath_from_location"),
payload.get("footpath_to_location"),
payload.get("is_swd"),
payload.get("swd_from"),
payload.get("swd_to"),
payload.get("swd_at"),
payload.get("swd_length"),
payload.get("swd_size"),
payload.get("rhs_swdlength"),
payload.get("rhs_swdsize"),
payload.get("is_scp"),
payload.get("scp_at"),
payload.get("scp_count"),
payload.get("rhs_scpCount"),
payload.get("is_manhole"),
payload.get("manhole_count"),
payload.get("manhole_at"),
payload.get("r_mhCount"),
payload.get("is_cpipe"),
payload.get("cpipe_count"),
payload.get("cp_at"),
payload.get("r_cpCount"),
payload.get("is_rwh"),
payload.get("rwh_count"),
payload.get("rwh_at"),
payload.get("r_rwCount"),
payload.get("sewer_length"),
payload.get("sewer_size"),
payload.get("is_electric_poles"),
payload.get("ep_count"),
payload.get("is_hml"),
payload.get("hml_count"),
payload.get("is_streetlight_poles"),
payload.get("streetlight_poles_count"),
payload.get("is_mml"),
payload.get("mml_count"),
payload.get("culvert_bridge_count"),
payload.get("details"),
payload.get("is_busshelter"),
payload.get("busshelter_count"),
payload.get("is_centermedian"),
updatedBy,
refId
);
// 4. SOFT DELETE OLD RELAYING RECORDS
jdbcTemplate.update(
"UPDATE relaying_details " +
"SET is_active=0, " +
"is_delete=1, " +
"updated_date=NOW(), " +
"updated_by=? " +
"WHERE road_ref_id=? " +
"AND is_active=1",
updatedBy,
refId
);
// 5. INSERT NEW RELAYING RECORDS
@SuppressWarnings("unchecked")
List<Map<String, Object>> relays =
(List<Map<String, Object>>) payload.get("relaying_details");
String insertRelay =
"INSERT INTO relaying_details " +
"(road_ref_id, relay_month, relay_year,road_type_material, cr_value, road_type, remarks, cby) " +
"VALUES (?,?,?,?,?,?,?,?)";
if (relays != null) {
for (Map<String, Object> relay : relays) {
jdbcTemplate.update(
insertRelay,
refId,
relay.get("relay_month"),
relay.get("relay_year"),
relay.get("road_type_material"),
relay.get("cr_value"),
relay.get("road_type"),
relay.get("remarks"),
updatedBy
);
}
}
result.put("status", true);
result.put("message", "Road details updated successfully");
} catch (Exception e) {
e.printStackTrace();
result.put("status", false);
result.put("message", e.getMessage());
}
return result;
}
Map<String, Object> result = new HashMap<>();
try {
String refId = String.valueOf(payload.get("ref_id"));
String updatedBy = String.valueOf(payload.get("updated_by"));
String roadId = String.valueOf(payload.get("road_id"));
Integer count = jdbcTemplate.queryForObject(
"SELECT COUNT(*) " +
"FROM road_details_master " +
"WHERE road_id = ? " +
"AND ref_id <> ? " +
"AND is_active = 1 " +
"AND is_delete = 0",
Integer.class,
roadId,
refId);
if (count != null && count > 0) {
result.put("status", false);
result.put("message",
"Selected road is already mapped to another Road War record");
return result;
}
// COPY CURRENT RECORD TO LOG TABLE
String logSql = "INSERT INTO road_details_master_log (" +
"id, zone, ward, road_id, road_name,area_name,locality_name, road_type,road_type_material, highway_ans, "
+
"road_length,road_row_width, road_avg_width,road_min_width,road_max_width, road_area, " +
"road_from,road_to,is_footpath,footpath_at, " +
"footpath_material, footpath_length, footpath_width, " +
"r_footpath_material, r_footpath_length, r_footpath_width, " +
"footpath_from_location, footpath_to_location, " +
"swd_at,rhs_swdlength,rhs_swdsize,scp_at,rhs_scpCount,manhole_at,r_mhCount,cp_at,r_cpCount,rwh_at,r_rwCount, "
+
"is_swd, swd_from, swd_to, swd_length, swd_size, " +
"is_scp, scp_count, is_manhole, manhole_count, manhole_location, " +
"is_cpipe, cpipe_count, is_rwh, rwh_count, " +
"sewer_length, sewer_size, is_electric_poles, ep_count, is_hml,hml_count, " +
"is_streetlight_poles,streetlight_poles_count,is_mml,mml_count, " +
"culvert_bridge_count, details, is_busshelter, busshelter_count, " +
"is_centermedian, erp_asset_code, ref_id, cdate, cby, " +
"updated_date, updated_by, is_active, is_delete) " +
"SELECT " +
"id, zone, ward, road_id, road_name,area_name,locality_name, road_type,road_type_material, highway_ans, "
+
"road_length,road_row_width, road_avg_width,road_min_width,road_max_width, road_area, " +
"road_from,road_to,is_footpath,footpath_at, " +
"footpath_material, footpath_length, footpath_width, " +
"r_footpath_material, r_footpath_length, r_footpath_width, " +
"footpath_from_location, footpath_to_location, " +
"swd_at,rhs_swdlength,rhs_swdsize,scp_at,rhs_scpCount,manhole_at,r_mhCount,cp_at,r_cpCount,rwh_at,r_rwCount, "
+
"is_swd, swd_from, swd_to, swd_length, swd_size, " +
"is_scp, scp_count, is_manhole, manhole_count, manhole_location, " +
"is_cpipe, cpipe_count, is_rwh, rwh_count, " +
"sewer_length, sewer_size, is_electric_poles, ep_count, is_hml,hml_count, " +
"is_streetlight_poles,streetlight_poles_count,is_mml,mml_count, " +
"culvert_bridge_count, details, is_busshelter, busshelter_count, " +
"is_centermedian, erp_asset_code, ref_id, cdate, cby, " +
"updated_date, updated_by, is_active, is_delete " +
"FROM road_details_master " +
"WHERE ref_id=?";
jdbcTemplate.update(logSql, refId);
// 3. UPDATE ROAD MASTER
String updateSql = "UPDATE road_details_master SET " +
"zone=?, " +
"ward=?, " +
"road_id=?, " +
"road_name=?, " +
"area_name=?, " +
"locality_name=?, " +
"road_type=?, " +
"road_type_material=?, " +
"road_length=?, " +
"road_row_width=?, " +
"road_avg_width=?, " +
"road_min_width=?, " +
"road_max_width=?, " +
"road_area=?, " +
"road_from=?, " +
"road_to=?, " +
"is_footpath=?, " +
"footpath_at=?, " +
"footpath_material=?, " +
"footpath_length=?, " +
"footpath_width=?, " +
"r_footpath_material=?, " +
"r_footpath_length=?, " +
"r_footpath_width=?, " +
"footpath_from_location=?, " +
"footpath_to_location=?, " +
"is_swd=?, " +
"swd_from=?, " +
"swd_to=?, " +
"swd_at=?," +
"swd_length=?, " +
"swd_size=?, " +
"rhs_swdlength=?, " +
"rhs_swdsize=?, " +
"is_scp=?, " +
"scp_at=?, " +
"scp_count=?, " +
"rhs_scpCount=?," +
"is_manhole=?, " +
"manhole_count=?, " +
"manhole_at=?, " +
"r_mhCount=?, " +
"is_cpipe=?, " +
"cpipe_count=?, " +
"cp_at=?, " +
"r_cpCount=?, " +
"is_rwh=?, " +
"rwh_count=?, " +
"rwh_at=?, " +
"r_rwCount=?, " +
"sewer_length=?, " +
"sewer_size=?, " +
"is_electric_poles=?, " +
"ep_count=?, " +
"is_hml=?, " +
"hml_count=?, " +
"is_streetlight_poles=?, " +
"streetlight_poles_count=?, " +
"is_mml=?, " +
"mml_count=?, " +
"culvert_bridge_count=?, " +
"details=?, " +
"is_busshelter=?, " +
"busshelter_count=?, " +
"is_centermedian=?, " +
"updated_date=NOW(), " +
"updated_by=? " +
"WHERE ref_id=?";
jdbcTemplate.update(updateSql,
payload.get("zone"),
payload.get("ward"),
payload.get("road_id"),
payload.get("road_name"),
payload.get("road_areaname"),
payload.get("road_localityname"),
payload.get("road_type"),
payload.get("road_type_material"),
payload.get("road_length"),
payload.get("road_row_width"),
payload.get("road_avg_width"),
payload.get("road_min_width"),
payload.get("road_max_width"),
payload.get("road_area"),
payload.get("road_from"),
payload.get("road_to"),
payload.get("is_footpath"),
payload.get("footpath_at"),
payload.get("footpath_material"),
payload.get("footpath_length"),
payload.get("footpath_width"),
payload.get("rhs_footpathDropdown"),
payload.get("rhs_fplength"),
payload.get("rhs_fpwidth"),
payload.get("footpath_from_location"),
payload.get("footpath_to_location"),
payload.get("is_swd"),
payload.get("swd_from"),
payload.get("swd_to"),
payload.get("swd_at"),
payload.get("swd_length"),
payload.get("swd_size"),
payload.get("rhs_swdlength"),
payload.get("rhs_swdsize"),
payload.get("is_scp"),
payload.get("scp_at"),
payload.get("scp_count"),
payload.get("rhs_scpCount"),
payload.get("is_manhole"),
payload.get("manhole_count"),
payload.get("manhole_at"),
payload.get("r_mhCount"),
payload.get("is_cpipe"),
payload.get("cpipe_count"),
payload.get("cp_at"),
payload.get("r_cpCount"),
payload.get("is_rwh"),
payload.get("rwh_count"),
payload.get("rwh_at"),
payload.get("r_rwCount"),
payload.get("sewer_length"),
payload.get("sewer_size"),
payload.get("is_electric_poles"),
payload.get("ep_count"),
payload.get("is_hml"),
payload.get("hml_count"),
payload.get("is_streetlight_poles"),
payload.get("streetlight_poles_count"),
payload.get("is_mml"),
payload.get("mml_count"),
payload.get("culvert_bridge_count"),
payload.get("details"),
payload.get("is_busshelter"),
payload.get("busshelter_count"),
payload.get("is_centermedian"),
updatedBy,
refId);
// 4. SOFT DELETE OLD RELAYING RECORDS
jdbcTemplate.update(
"UPDATE relaying_details " +
"SET is_active=0, " +
"is_delete=1, " +
"updated_date=NOW(), " +
"updated_by=? " +
"WHERE road_ref_id=? " +
"AND is_active=1",
updatedBy,
refId);
// 5. INSERT NEW RELAYING RECORDS
@SuppressWarnings("unchecked")
List<Map<String, Object>> relays = (List<Map<String, Object>>) payload.get("relaying_details");
String insertRelay = "INSERT INTO relaying_details " +
"(road_ref_id, relay_month, relay_year,road_type_material, cr_value, road_type, remarks, cby) " +
"VALUES (?,?,?,?,?,?,?,?)";
if (relays != null) {
for (Map<String, Object> relay : relays) {
jdbcTemplate.update(
insertRelay,
refId,
relay.get("relay_month"),
relay.get("relay_year"),
relay.get("road_type_material"),
relay.get("cr_value"),
relay.get("road_type"),
relay.get("remarks"),
updatedBy);
}
}
result.put("status", true);
result.put("message", "Road details updated successfully");
} catch (Exception e) {
e.printStackTrace();
result.put("status", false);
result.put("message", e.getMessage());
}
return result;
}
public Map<String, Object> deleteRoadWarDetails(String refId, String updatedby) {
Map<String, Object> result = new HashMap<>();
try {
int roadUpdated = jdbcTemplate.update(
"UPDATE road_details_master " +
"SET is_active=0, " +
"is_delete=1, " +
"updated_by=?, "+
"updated_date=NOW() " +
"WHERE ref_id=? " +
"AND is_active=1",
updatedby,refId
);
jdbcTemplate.update(
"UPDATE relaying_details " +
"SET is_active=0, " +
"is_delete=1, " +
"updated_by=?, "+
"updated_date=NOW() " +
"WHERE road_ref_id=? " +
"AND is_active=1",
updatedby,refId
);
if (roadUpdated > 0) {
result.put("status", true);
result.put("message",
"Road War details deleted successfully");
} else {
result.put("status", false);
result.put("message","Record not found");
}
} catch (Exception e) {
e.printStackTrace();
result.put("status", false);
result.put("message",
"Failed to delete Road War details");
}
return result;
Map<String, Object> result = new HashMap<>();
try {
int roadUpdated = jdbcTemplate.update(
"UPDATE road_details_master " +
"SET is_active=0, " +
"is_delete=1, " +
"updated_by=?, " +
"updated_date=NOW() " +
"WHERE ref_id=? " +
"AND is_active=1",
updatedby, refId);
jdbcTemplate.update(
"UPDATE relaying_details " +
"SET is_active=0, " +
"is_delete=1, " +
"updated_by=?, " +
"updated_date=NOW() " +
"WHERE road_ref_id=? " +
"AND is_active=1",
updatedby, refId);
if (roadUpdated > 0) {
result.put("status", true);
result.put("message",
"Road War details deleted successfully");
} else {
result.put("status", false);
result.put("message", "Record not found");
}
} catch (Exception e) {
e.printStackTrace();
result.put("status", false);
result.put("message",
"Failed to delete Road War details");
}
return result;
}
}

793
gcc_officer_portal/src/main/resources/templates/modules/greencommittee/pendinglist.html

@ -1,198 +1,212 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/modules/base/head :: head}"></head>
<style>
.thumb-img {
width: 90px;
height: 70px;
object-fit: cover;
cursor: pointer;
border: 2px solid #ddd;
margin-right: 5px;
}
.thumb-img:hover {
border-color: #007bff;
}
#viewModal .modal-body {
max-height: 70vh; /* Limit the height to 70% of the viewport */
overflow-y: auto; /* Enable vertical scrolling */
.thumb-img {
width: 90px;
height: 70px;
object-fit: cover;
cursor: pointer;
border: 2px solid #ddd;
margin-right: 5px;
}
.thumb-img:hover {
border-color: #007bff;
}
/* #imageViewModal .modal-body {
#viewModal .modal-body {
max-height: 70vh;
/* Limit the height to 70% of the viewport */
overflow-y: auto;
/* Enable vertical scrolling */
}
/* #imageViewModal .modal-body {
max-height: 60vh;
overflow-y: auto;
} */
.full-image-modal {
width: 50%;
height: 70vh; /* fixed height */
object-fit: cover; /* fills modal without distortion */
object-position: center;
background-color: #000; /* if image is smaller */
}
width: 50%;
height: 70vh;
/* fixed height */
object-fit: cover;
/* fills modal without distortion */
object-position: center;
background-color: #000;
/* if image is smaller */
}
</style>
<body>
<div class="wrapper">
<!-- header top menu Start -->
<header th:replace="~{fragments/modules/base/header :: header}"></header>
<!-- header top menu end -->
<div class="page-wrap">
<!--=============== Left Menu side Start ================-->
<div th:replace="~{fragments/modules/base/menu :: menu}"></div>
<!--=============== Left side End ================-->
<div class="main-content">
<div class="container-fluid">
<div class="page-header mb-2">
<div class="row align-items-end">
<div class="col-lg-8">
<div class="page-header-title">
<i class="far fa-calendar-plus bg-blue"></i>
<div class="d-inline">
<h5>Pending Application</h5>
<span>Green Committee</span>
</div>
</div>
</div>
<div class="col-lg-4">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/gcc/index"><i
class="ik ik-home"></i></a></li>
<li class="breadcrumb-item" aria-current="page">Green Committee</li>
<li class="breadcrumb-item active" aria-current="page">Pending List</li>
</ol>
</nav>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12" >
<div class="card">
<div class="card-block">
<div class="row">
<div class="form-group col-sm-8">
<label for="dropdownevent">Select Meeting
<span class="text-danger">*</span></label>
<select id="dropdownevent" class="form-control">
</select>
</div>
<div class="form-group col-sm-4">
<label for="zonedropdown">Select Zone
</label>
<select id="zonedropdown" class="form-control">
<option value="">Select Zone </option>
</select>
</div>
</div>
<div class="page-header-title" >
<h5 style="margin: 0;font-weight: bold;">Green Committee Pending List</h5><span th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span><hr>
</div>
<div>
<table id="RequestListDatatable" class="table table-striped table-bordered table-hover dataTable" role="grid">
<thead class="thead-dark">
<tr role="row">
<th class="text-center">S.No</th>
<th class="text-center">Application No</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Type</th>
<th class="text-center">Name</th>
<th class="text-center">Mobile</th>
<th class="text-center">Address</th>
<th class="text-center">Remarks</th>
<th class="text-center">No of trees</th>
<th class="text-center">Details of Complaints</th>
<th class="text-center no-sort">Action</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<body>
<div class="wrapper">
<!-- header top menu Start -->
<header th:replace="~{fragments/modules/base/header :: header}"></header>
<!-- header top menu end -->
<div class="page-wrap">
<!--=============== Left Menu side Start ================-->
<div th:replace="~{fragments/modules/base/menu :: menu}"></div>
<!--=============== Left side End ================-->
<div class="main-content">
<div class="container-fluid">
<div class="page-header mb-2">
<div class="row align-items-end">
<div class="col-lg-8">
<div class="page-header-title">
<i class="far fa-calendar-plus bg-blue"></i>
<div class="d-inline">
<h5>Pending Application</h5>
<span>Green Committee</span>
</div>
</div>
</div>
<div class="col-lg-4">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/gcc/index"><i class="ik ik-home"></i></a>
</li>
<li class="breadcrumb-item" aria-current="page">Green Committee</li>
<li class="breadcrumb-item active" aria-current="page">Pending List</li>
</ol>
</nav>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-block">
<div class="row">
<div class="form-group col-sm-8">
<label for="dropdownevent">Select Meeting
<span class="text-danger">*</span></label>
<select id="dropdownevent" class="form-control">
</select>
</div>
<div class="form-group col-sm-4">
<label for="zonedropdown">Select Zone
</label>
<select id="zonedropdown" class="form-control">
<option value="">Select Zone </option>
</select>
</div>
</div>
<div class="page-header-title">
<h5 style="margin: 0;font-weight: bold;">Green Committee Pending List</h5><span
th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span>
<hr>
</div>
<div>
<table id="RequestListDatatable"
class="table table-striped table-bordered table-hover dataTable"
role="grid">
<thead class="thead-dark">
<tr role="row">
<th class="text-center">S.No</th>
<th class="text-center">Application No</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Type</th>
<th class="text-center">Name</th>
<th class="text-center">Mobile</th>
<th class="text-center">Address</th>
<th class="text-center">Remarks</th>
<th class="text-center">No of trees</th>
<th class="text-center">Details of Complaints</th>
<th class="text-center no-sort">Action</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--View Modal -->
<div class="modal fade" id="viewModal" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="viewModalLabel">Request Details</h5>
<button type="button" class="close" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<div class="modal-body" id="modalBodyContent"></div>
<div class="modal-footer">
<button class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!--Image Modal -->
<div class="modal fade" id="imageViewModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-body text-center p-0">
<img id="fullImagePreview" src="" class="full-image-modal" />
</div>
<div class="modal-footer">
<button class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!--View Modal -->
<div class="modal fade" id="viewModal" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="viewModalLabel">Request Details</h5>
<button type="button" class="close" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<div class="modal-body" id="modalBodyContent"></div>
<div class="modal-footer">
<button class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!--Image Modal -->
<div class="modal fade" id="imageViewModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-body text-center p-0">
<img id="fullImagePreview" src="" class="full-image-modal" />
</div>
<div class="modal-footer">
<button class="btn btn-secondary" data-dismiss="modal">Close</button>
</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">Loading...</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>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</div>
</div>
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script src="node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js"></script>
<script type="text/javascript">
<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">Loading...</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>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</div>
</div>
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script src="node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js"></script>
<script type="text/javascript">
let userId = document.getElementById('userIdSpan').textContent;
@ -201,15 +215,15 @@
$("#imageViewModal").modal("show");
}
$(document).ready(function() {
var table = $('#RequestListDatatable').DataTable({
$(document).ready(function () {
var table = $('#RequestListDatatable').DataTable({
dom: 'Bftip',
columnDefs: [
{ width: "150px", targets: 7 },
{width: "350px", targets: 8}
],
{ width: "150px", targets: 7 },
{ width: "350px", targets: 8 }
],
lengthMenu: [
[200, 400, -1],
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
scrollY: '50vh',
@ -254,26 +268,26 @@
});
fetchEventDropdown();
fetchZones();
fetchEventDropdown();
fetchZones();
$('#dropdownevent').on('change', function () {
$('#dropdownevent').on('change', function () {
$('#zonedropdown').val("");
$('#zonedropdown').val("");
fetchgreenCommitteeList();
});
$('#zonedropdown').on('change', function () {
let miss_meet=$('#dropdownevent').val();
$('#zonedropdown').on('change', function () {
let miss_meet = $('#dropdownevent').val();
if(!miss_meet){
Swal.fire("Warning", "Please select an meeting!", "warning");
return;
}
fetchgreenCommitteeList();
if (!miss_meet) {
Swal.fire("Warning", "Please select an meeting!", "warning");
return;
}
fetchgreenCommitteeList();
});
@ -282,152 +296,152 @@
$(document).on("click", "#btnCommitteeSave", function () {
const $submitBtn = $(this); // ONLY this button
const $submitBtn = $(this); // ONLY this button
$submitBtn.prop('disabled', true).text('Saving...');
let refId = $("#selectedRefId").val();
let finalTotalTrees = parseInt($("#finaltotaltrees").val());
let remarks = $("#committeeRemarks").val();
let meetingid = $('#dropdownevent').val();
// Check if user selected only Re-Inspection (ID = 8)
let isReInspection = $(".decision-check[value='8']").is(":checked");
if (isReInspection) {
// Ignore other validations → Call separate AJAX
saveReInspection(refId, meetingid, remarks, userId, $submitBtn);
return;
}
let selected = [];
let hasError = false;
let emptyField = null;
$("#decisionInputs input").each(function () {
let count = $(this).val().trim();
let id = $(this).data("id");
// If empty count → validation fail
if (count === "") {
hasError = true;
emptyField = this; // store input element
return false; // break loop
}
// Add to final data
selected.push({
id: id,
count: parseInt(count)
});
});
// Validation failed
if (hasError) {
$submitBtn.prop('disabled', false).text('Save');
Swal.fire({
icon: "warning",
title: "Missing Count",
text: "Please enter number of trees for all selected decisions!",
});
// optional highlight
$(emptyField).addClass("border-danger");
setTimeout(() => {
$(emptyField).removeClass("border-danger");
}, 2000);
return; // stop further processing
}
// If selected is empty – user selected nothing
if (selected.length === 0) {
$submitBtn.prop('disabled', false).text('Save');
Swal.fire({
icon: "warning",
title: "No Decision Selected",
text: "Please select at least one committee decision!",
});
return;
}
let sumCounts = selected.reduce((sum, item) => sum + item.count, 0);
if (sumCounts !== finalTotalTrees) {
$submitBtn.prop('disabled', false).text('Save');
Swal.fire({
icon: "warning",
title: "Count Mismatch",
text: `Total entered trees (${sumCounts}) must equal total trees (${finalTotalTrees}).`
});
return;
}
console.log("Final Submit:",
"Ref ID:", refId,
"meetingid:",meetingid,
"userId:",userId,
"Selected decisions:", selected,
"Remarks:", remarks
);
let refId = $("#selectedRefId").val();
let finalTotalTrees = parseInt($("#finaltotaltrees").val());
let remarks = $("#committeeRemarks").val();
let meetingid = $('#dropdownevent').val();
// Check if user selected only Re-Inspection (ID = 8)
let isReInspection = $(".decision-check[value='8']").is(":checked");
if (isReInspection) {
// Ignore other validations → Call separate AJAX
saveReInspection(refId, meetingid, remarks, userId, $submitBtn);
return;
}
let selected = [];
let hasError = false;
let emptyField = null;
$("#decisionInputs input").each(function () {
let count = $(this).val().trim();
let id = $(this).data("id");
// If empty count → validation fail
if (count === "") {
hasError = true;
emptyField = this; // store input element
return false; // break loop
}
// Add to final data
selected.push({
id: id,
count: parseInt(count)
});
});
// Validation failed
if (hasError) {
$submitBtn.prop('disabled', false).text('Save');
Swal.fire({
icon: "warning",
title: "Missing Count",
text: "Please enter number of trees for all selected decisions!",
});
// optional highlight
$(emptyField).addClass("border-danger");
setTimeout(() => {
$(emptyField).removeClass("border-danger");
}, 2000);
return; // stop further processing
}
// If selected is empty – user selected nothing
if (selected.length === 0) {
$submitBtn.prop('disabled', false).text('Save');
Swal.fire({
icon: "warning",
title: "No Decision Selected",
text: "Please select at least one committee decision!",
});
return;
}
let sumCounts = selected.reduce((sum, item) => sum + item.count, 0);
if (sumCounts !== finalTotalTrees) {
$submitBtn.prop('disabled', false).text('Save');
Swal.fire({
icon: "warning",
title: "Count Mismatch",
text: `Total entered trees (${sumCounts}) must equal total trees (${finalTotalTrees}).`
});
return;
}
console.log("Final Submit:",
"Ref ID:", refId,
"meetingid:", meetingid,
"userId:", userId,
"Selected decisions:", selected,
"Remarks:", remarks
);
// 4️ Example AJAX send
$.ajax({
url: '/gcc/api/greencommittee/pendinglist/savecommittee',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({
ref_id: refId,
decisions: selected,
remarks: remarks,
userId: userId,
meetingid: meetingid
}),
success: function (res) {
$submitBtn.prop('disabled', false).text('Save');
if (res.status === "success") {
Swal.fire({
icon: 'success',
title: 'Success',
text: res.message,
allowOutsideClick: false,
allowEscapeKey: false,
allowEnterKey: false,
showConfirmButton: true,
}).then((result) => {
if (result.isConfirmed) {
$("#viewModal").modal("hide");
console.log("ok button");
fetchgreenCommitteeList();
}
});
} else {
// If backend sent error response
Swal.fire({
icon: "error",
title: "Save Failed",
text: res.message || "Something went wrong.",
});
}
},
error: function (xhr) {
$submitBtn.prop('disabled', false).text('Save');
Swal.fire({
icon: "error",
title: "Error Occurred",
text: "Failed to save committee details. Please try again.",
});
console.error("Error in saving details:", xhr.responseText);
}
});
$.ajax({
url: '/gcc/api/greencommittee/pendinglist/savecommittee',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({
ref_id: refId,
decisions: selected,
remarks: remarks,
userId: userId,
meetingid: meetingid
}),
success: function (res) {
$submitBtn.prop('disabled', false).text('Save');
if (res.status === "success") {
Swal.fire({
icon: 'success',
title: 'Success',
text: res.message,
allowOutsideClick: false,
allowEscapeKey: false,
allowEnterKey: false,
showConfirmButton: true,
}).then((result) => {
if (result.isConfirmed) {
$("#viewModal").modal("hide");
console.log("ok button");
fetchgreenCommitteeList();
}
});
} else {
// If backend sent error response
Swal.fire({
icon: "error",
title: "Save Failed",
text: res.message || "Something went wrong.",
});
}
},
error: function (xhr) {
$submitBtn.prop('disabled', false).text('Save');
Swal.fire({
icon: "error",
title: "Error Occurred",
text: "Failed to save committee details. Please try again.",
});
console.error("Error in saving details:", xhr.responseText);
}
});
});
@ -445,7 +459,7 @@
remarks: remarks,
userId: userId
}),
success: function(res) {
success: function (res) {
$submitBtn.prop("disabled", false).text("Save");
if (res.status === "success") {
@ -466,7 +480,7 @@
});
}
},
error: function(xhr) {
error: function (xhr) {
$submitBtn.prop("disabled", false).text("Save");
Swal.fire({
@ -487,7 +501,7 @@
let inspections = details.inspections;
let reinspections = details.reinspections;
// Conditional fields for Petitioner section
// Conditional fields for Petitioner section
let petitionerHtml = "";
if (app.cby === "public") {
@ -565,6 +579,60 @@
// Inspection Cards
let inspCards = inspections.map(ins => {
// Pending card
if (ins.status === "PENDING") {
return `
<div class="col-md-4">
<div class="card mb-3 shadow-sm">
<div class="card-header text-white text-center" style="background:#404e67">
<strong>${ins.inspection_by}</strong>
</div>
<div class="card-body text-center">
<h5 class="text-warning">
<i class="fa fa-clock-o"></i> Pending
</h5>
<p class="text-muted mb-0">
Inspection is yet to be completed.
</p>
</div>
</div>
</div>
`;
}
// Completed card
let recChips = (ins.recommendations || []).map(r =>
`<span class="badge badge-warning mr-1 mb-2">
${r.name}: ${r.count} (${r.treename})
</span>`
).join("");
let inspThumbs = (ins.images || []).map(i =>
`<img src="${i}" class="img-thumbnail thumb-img mb-1"
onclick="openFullImage('${i}')">`
).join("");
return `
<div class="col-md-4">
<div class="card mb-3 shadow-sm">
<div class="card-header text-white text-center" style="background:#404e67">
<strong>${ins.inspection_by}</strong>
</div>
<div class="card-body">
<p><strong>Inspector:</strong> ${ins.inspector_name}</p>
<p><strong>Date:</strong> ${ins.f_Cdate}</p>
<p><strong>Remarks:</strong> ${ins.remarks}</p>
<p><strong>Recommendation:</strong><br>${recChips}</p>
<p><strong>Images (${ins.images.length}):</strong><br>${inspThumbs}</p>
</div>
</div>
</div>
`;
}).join("");
/*let inspCards = inspections.map(ins => {
let recChips = ins.recommendations.map(r =>
`<span class="badge badge-warning mr-1 mb-2">${r.name}: ${r.count} (${r.treename})</span>`
).join("");
@ -591,7 +659,7 @@
</div>
</div>
`;
}).join("");
}).join("");*/
let content = `
<h5>Application Information</h5>
@ -668,9 +736,9 @@
function fetchgreenCommitteeList(){
function fetchgreenCommitteeList() {
const selectedOption = $('#dropdownevent option:selected').text();
const selectedOption = $('#dropdownevent option:selected').text();
// Assuming the format is: "Event Name - yyyy-mm-dd"
const eventDateRaw = selectedOption.split(' - ')[1];
@ -690,19 +758,19 @@
const formattedDate = `${dateParts[2]}-${dateParts[1]}-${dateParts[0]}`;
// Read zone dropdown value
// Read zone dropdown value
let selectedZone = $('#zonedropdown').val();
$('#pageLoader').show();
$.ajax({
url: '/gcc/api/greencommittee/pendinglist/getgreencommitteelist',
data: { date: formattedDate,zones:selectedZone },
data: { date: formattedDate, zones: selectedZone },
method: 'GET',
contentType: 'application/json',
success: function (data) {
$('#pageLoader').hide();
$('#pageLoader').hide();
let tableContainer = $('#RequestListDatatable');
// Destroy any existing DataTable instance
@ -710,7 +778,7 @@
tableContainer.DataTable().destroy();
}
// Initialize DataTable
// Initialize DataTable
tableContainer.DataTable({
destroy: true,
searching: true,
@ -783,14 +851,14 @@
{ extend: 'pdfHtml5', text: 'PDF', className: 'btn btn-secondary' }
],
columnDefs: [
{ width: "150px", targets: 7 },
{width: "350px", targets: 8}
],
{ width: "150px", targets: 7 },
{ width: "350px", targets: 8 }
],
lengthMenu: [
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
lengthMenu: [
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
scrollY: '80vh',
scrollX: true,
@ -827,7 +895,7 @@
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
$('#pageLoader').hide();
console.error("Error fetching data:", error);
alert("Failed to load green committe list.");
}
@ -839,7 +907,7 @@
$.ajax({
url: "/gcc/api/greencommittee/pendinglist/getCommitteeActions", // your API endpoint
method: "GET",
success: function(list) {
success: function (list) {
let html = "";
@ -945,11 +1013,11 @@
data.forEach(function (res) {
zoneDropdown.append(
$('<option></option>')
.val(res.zone_name)
.text(`${res.zone_name}`)
);
zoneDropdown.append(
$('<option></option>')
.val(res.zone_name)
.text(`${res.zone_name}`)
);
});
},
@ -1003,6 +1071,7 @@
});
</script>
</body>
</script>
</body>
</html>

403
gcc_officer_portal/src/main/resources/templates/modules/greencommittee/reports.html

@ -1,143 +1,167 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/modules/base/head :: head}"></head>
<style>
</style>
<body>
<div class="wrapper">
<!-- header top menu Start -->
<header th:replace="~{fragments/modules/base/header :: header}"></header>
<!-- header top menu end -->
<div class="page-wrap">
<!--=============== Left Menu side Start ================-->
<div th:replace="~{fragments/modules/base/menu :: menu}"></div>
<!--=============== Left side End ================-->
<div class="main-content">
<div class="container-fluid">
<div class="page-header mb-2">
<div class="row align-items-end">
<div class="col-lg-8">
<div class="page-header-title">
<i class="far fa-calendar-plus bg-blue"></i>
<div class="d-inline">
<h5>Reports</h5>
<span>Green Committee</span>
</div>
</div>
</div>
<div class="col-lg-4">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/gcc/index"><i
class="ik ik-home"></i></a></li>
<li class="breadcrumb-item" aria-current="page">Green Committee</li>
<li class="breadcrumb-item active" aria-current="page">Reports</li>
</ol>
</nav>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<div class="card" style="margin-top: 0px;"><span th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span>
<div class="card-block">
<div class="row">
<div class="form-group col-sm-8">
<label for="dropdownevent">Select Meeting
</label>
<select id="dropdownevent" class="form-control">
</select>
</div>
<div class="form-group col-sm-4">
<label for="zonedropdown">Select Zone
</label>
<select id="zonedropdown" class="form-control">
<option value="">Select Zone </option>
</select>
</div>
</div>
<div class="page-header-title" >
<h5 style="margin: 0;font-weight: bold;">Green Committee Reports</h5><span th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span><hr>
</div>
<div>
<table id="RequestListDatatable" class="table table-striped table-bordered table-hover dataTable" role="grid">
<thead class="thead-dark">
<tr role="row">
<th class="text-center" rowspan="2">S.No</th>
<th class="text-center" rowspan="2">Application No</th>
<th class="text-center" rowspan="2">Name</th>
<th class="text-center" rowspan="2">Address</th>
<th class="text-center" rowspan="2">Reason</th>
<th class="text-center" rowspan="2">No of trees</th>
<th class="text-center" colspan="3">Inspected</th>
<th class="text-center" rowspan="2">Committee Decision</th>
</tr>
<tr>
<th class="text-center">TNFD</th>
<th class="text-center">GCC</th>
<th class="text-center">NGO</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<body>
<div class="wrapper">
<!-- header top menu Start -->
<header th:replace="~{fragments/modules/base/header :: header}"></header>
<!-- header top menu end -->
<div class="page-wrap">
<!--=============== Left Menu side Start ================-->
<div th:replace="~{fragments/modules/base/menu :: menu}"></div>
<!--=============== Left side End ================-->
<div class="main-content">
<div class="container-fluid">
<div class="page-header mb-2">
<div class="row align-items-end">
<div class="col-lg-8">
<div class="page-header-title">
<i class="far fa-calendar-plus bg-blue"></i>
<div class="d-inline">
<h5>Reports</h5>
<span>Green Committee</span>
</div>
</div>
</div>
<div class="col-lg-4">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/gcc/index"><i class="ik ik-home"></i></a>
</li>
<li class="breadcrumb-item" aria-current="page">Green Committee</li>
<li class="breadcrumb-item active" aria-current="page">Reports</li>
</ol>
</nav>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<div class="card" style="margin-top: 0px;"><span th:text="${LoginUserId}" id="userIdSpan"
style="display: none;"></span>
<div class="card-block">
<div class="row">
<div class="form-group col-sm-8">
<label for="dropdownevent">Select Meeting
</label>
<select id="dropdownevent" class="form-control">
</select>
</div>
<div class="form-group col-sm-4">
<label for="zonedropdown">Select Zone
</label>
<select id="zonedropdown" class="form-control">
<option value="">Select Zone </option>
</select>
</div>
<div class="form-group col-sm-4">
<label for="applicationType">Application Type</label>
<select id="applicationType" class="form-control">
<option value="">Select Application Type</option>
<option value="Department">Department</option>
<option value="Public">Public</option>
</select>
</div>
<div class="form-group col-sm-4" id="departmentdropdownDiv">
<label for="departmentdropdown">Select Department</label>
<select id="departmentdropdown" class="form-control">
<option value="">Select All</option>
</select>
</div>
</div>
<div class="page-header-title">
<h5 style="margin: 0;font-weight: bold;">Green Committee Reports</h5><span
th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span>
<hr>
</div>
<div>
<table id="RequestListDatatable"
class="table table-striped table-bordered table-hover dataTable"
role="grid">
<thead class="thead-dark">
<tr role="row">
<th class="text-center" rowspan="2">S.No</th>
<th class="text-center" rowspan="2">Application No</th>
<th class="text-center" rowspan="2">Department Name</th>
<th class="text-center" rowspan="2">Name</th>
<th class="text-center" rowspan="2">Address</th>
<th class="text-center" rowspan="2">Reason</th>
<th class="text-center" rowspan="2">No of trees</th>
<th class="text-center" colspan="3">Inspected</th>
<th class="text-center" rowspan="2">Committee Decision</th>
</tr>
<tr>
<th class="text-center">TNFD</th>
<th class="text-center">GCC</th>
<th class="text-center">NGO</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</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">Loading...</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>
<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">Loading...</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>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</div>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</div>
</div>
</div>
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script src="node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js"></script>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script src="node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js"></script>
<script type="text/javascript">
<script type="text/javascript">
$(document).ready(function() {
var table = $('#RequestListDatatable').DataTable({
$(document).ready(function () {
var table = $('#RequestListDatatable').DataTable({
dom: 'Bftip',
columnDefs: [
{ width: "150px", targets: 3 },
{width: "350px", targets: 4}
],
{ width: "150px", targets: 3 },
{ width: "350px", targets: 4 }
],
lengthMenu: [
[200, 400, -1],
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
scrollY: '50vh',
@ -182,31 +206,66 @@
});
fetchEventDropdown();
fetchZones();
fetchgreenCommitteeList();
fetchEventDropdown();
fetchZones();
loadDepartments();
fetchgreenCommitteeList();
$('#dropdownevent').on('change', function () {
$('#dropdownevent').on('change', function () {
$('#zonedropdown').val("");
$('#zonedropdown').val("");
fetchgreenCommitteeList();
});
function loadDepartments() {
$.ajax({
url: "/gcc/api/greencommittee/report/getDepartments",
type: "GET",
success: function (data) {
$("#departmentdropdown").empty();
$("#departmentdropdown").append('<option value="">Select All</option>');
$.each(data, function (i, dept) {
$("#departmentdropdown").append(
'<option value="' + dept.id + '">' +
dept.name +
'</option>'
);
});
}
});
}
$('#departmentdropdown').on('change', function () {
fetchgreenCommitteeList();
});
$('#zonedropdown').on('change', function () {
let miss_meet=$('#dropdownevent').val();
$('#zonedropdown').on('change', function () {
let miss_meet = $('#dropdownevent').val();
if(!miss_meet){
Swal.fire("Warning", "Please select an meeting!", "warning");
return;
}
fetchgreenCommitteeList();
if (!miss_meet) {
Swal.fire("Warning", "Please select an meeting!", "warning");
return;
}
fetchgreenCommitteeList();
});
});
$('#applicationType').on('change', function () {
if ($('#applicationType').val() == "Public") {
$('#departmentdropdown').val("");
$('#departmentdropdownDiv').hide();
} else {
$('#departmentdropdownDiv').show();
}
fetchgreenCommitteeList();
});
function fetchZones() {
@ -221,11 +280,11 @@
data.forEach(function (res) {
zoneDropdown.append(
$('<option></option>')
.val(res.zone_name)
.text(`${res.zone_name}`)
);
zoneDropdown.append(
$('<option></option>')
.val(res.zone_name)
.text(`${res.zone_name}`)
);
});
},
@ -263,34 +322,39 @@
});
}
function fetchgreenCommitteeList(){
function fetchgreenCommitteeList() {
let selectedevent = $('#dropdownevent').val();
let selectedappType = $('#applicationType').val();
let selectedevent = $('#dropdownevent').val();
let selecteddepartment = $('#departmentdropdown').val();
console.log("selecteddepartment=" + selecteddepartment);
// Read zone dropdown value
// Read zone dropdown value
let selectedZone = $('#zonedropdown').val();
console.log("selectedevent="+selectedevent+"AND selectedZone"+selectedZone);
console.log("selectedevent=" + selectedevent + "AND selectedZone" + selectedZone);
$('#pageLoader').show();
$.ajax({
$.ajax({
url: '/gcc/api/greencommittee/report/getgreencommitteelist',
data: { meetingid: selectedevent,zones:selectedZone },
data: { meetingid: selectedevent, zones: selectedZone, deptid: selecteddepartment, appType: selectedappType },
method: 'GET',
contentType: 'application/json',
success: function (data) {
console.log(data);
$('#pageLoader').hide();
$('#pageLoader').hide();
let tableContainer = $('#RequestListDatatable');
let tableContainer = $('#RequestListDatatable');
// Destroy any existing DataTable instance
if ($.fn.DataTable.isDataTable(tableContainer)) {
tableContainer.DataTable().destroy();
}
// Initialize DataTable
// Initialize DataTable
tableContainer.DataTable({
destroy: true,
searching: true,
@ -306,13 +370,21 @@
},
{ data: 'ref_id', className: 'text-center' },
{
data: null,className: 'text-center',
data: 'department_name',
className: 'text-center',
render: function (data) {
return (data === null || data === undefined || data.trim() === '') ? '-' : data;
}
},
// { data: 'department_name', className: 'text-center' },
{
data: null, className: 'text-center',
render: d => d.p_name && d.p_name.trim() !== '' ? d.p_name : d.dept_name || '-'
},
{ data: 'address',className: 'text-center' },
{ data: 'address', className: 'text-center' },
// Reason
{ data: 'remarks',className: 'text-center' },
{ data: 'remarks', className: 'text-center' },
// No of trees
{ data: 'total_trees', className: 'text-center' },
@ -380,18 +452,20 @@
],
columnDefs: [
{ width: "150px", targets: 3 },
{width: "350px", targets: 4},
{ width: "120px", targets: 6 },
{ width: "120px", targets: 7 },
{ width: "120px", targets: 8 },
{ width: "120px", targets: 9 }
],
lengthMenu: [
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
{ width: "150px", targets: 3 },
{ width: "150px", targets: 4 },
{ width: "350px", targets: 5 },
{ width: "120px", targets: 6 },
{ width: "120px", targets: 7 },
{ width: "120px", targets: 8 },
{ width: "120px", targets: 9 }
],
lengthMenu: [
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
scrollY: '80vh',
scrollX: true,
@ -401,7 +475,7 @@
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
$('#pageLoader').hide();
console.error("Error fetching data:", error);
alert("Failed to load green committe list.");
}
@ -434,7 +508,7 @@
// Case 2: committee empty → reinspections details
if ((!row.committee || Object.keys(row.committee).length === 0) && Array.isArray(row.reinspections)
&& row.reinspections.length > 0) {
&& row.reinspections.length > 0) {
let r = row.reinspections[0];
return `
${r.event_name}<br>
@ -480,6 +554,7 @@
</script>
</body>
</script>
</body>
</html>
Loading…
Cancel
Save