Browse Source

pet license mis report added

master
Hariprasath S 12 months ago
parent
commit
eda6a7c8fe
  1. 7
      pom.xml
  2. 6
      src/main/java/com/gcc/commissionerreview/controller/MainController.java
  3. 161
      src/main/java/com/gcc/commissionerreview/controller/PetLicenseApiController.java
  4. 1
      src/main/java/com/gcc/commissionerreview/controller/SofaBedCollectionApiController.java
  5. 473
      src/main/java/com/gcc/commissionerreview/service/SofaBedCollectionService.java
  6. 301
      src/main/resources/templates/modules/pet/petlicense.html
  7. 133
      src/main/resources/templates/modules/sofa_bed/zonewise1.html

7
pom.xml

@ -7,6 +7,7 @@
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gcc</groupId>
<artifactId>dashboardservice</artifactId>
@ -49,6 +50,12 @@
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20240303</version>
</dependency>
<!--<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>

6
src/main/java/com/gcc/commissionerreview/controller/MainController.java

@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = {"/commissionerreview"})
public class MainController {
@GetMapping("/uphcreport")
@ -148,5 +149,10 @@ public class MainController {
return "modules/sofa_bed/zonewise1";
}
@GetMapping("/petlicense")
public String petReport(Model model) {
return "modules/pet/petlicense";
}
}

161
src/main/java/com/gcc/commissionerreview/controller/PetLicenseApiController.java

@ -0,0 +1,161 @@
package com.gcc.commissionerreview.controller;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
@RestController
@RequestMapping("/commissionerreview/api/petlicense")
public class PetLicenseApiController {
@GetMapping("/getzonewisedata")
public ResponseEntity<String> getZonewiseData() {
try {
// Step 1: Login and get session token
String loginUrl = "https://petservice.gccservices.in/api/v1/iam/login";
String loginPayload = "{ \"username\": \"admin@getryt.io\", \"password\": \"Reset@123\" }";
String sessionToken = getSessionToken(loginUrl, loginPayload);
//System.out.println("✅ Session Token: " + sessionToken);
// Step 2: Fetch License Dashboard Data
String dashboardUrl = "https://petservice.gccservices.in/api/v1/dashboard/license-dashboard";
String dashboardResponse = getDashboardData(dashboardUrl, sessionToken);
String dashboardUrl2 = "https://petservice.gccservices.in/api/v1/dashboard/vaccination-dashboard";
String dashboardResponse2 = getDashboardData(dashboardUrl2, sessionToken);
String dashboardUrl3 = "https://petservice.gccservices.in/api/v1/dashboard/microchip-dashboard";
String dashboardResponse3 = getDashboardData(dashboardUrl3, sessionToken);
// System.out.println("dashboardResponse="+dashboardResponse);
// System.out.println("dashboardResponse2="+dashboardResponse2);
// System.out.println("dashboardResponse3="+dashboardResponse3);
ObjectMapper mapper = new ObjectMapper();
ObjectNode wrapper = mapper.createObjectNode();
ArrayNode errors = mapper.createArrayNode();
wrapper.put("status", true);
JsonNode root = mapper.readTree(dashboardResponse);
JsonNode root2 = mapper.readTree(dashboardResponse2);
JsonNode root3 = mapper.readTree(dashboardResponse3);
// Check if "success" is true
if (root.has("success") && root.get("success").asBoolean()) {
wrapper.set("licensedata", root);
} else {
errors.add("License dashboard returned success=false");
}
if (root2.has("success") && root2.get("success").asBoolean()) {
wrapper.set("vaccinationdata", root2);
} else {
errors.add("Vaccination dashboard returned success=false");
}
if (root3.has("success") && root3.get("success").asBoolean()) {
wrapper.set("microchipdata", root3);
} else {
errors.add("Microchip dashboard returned success=false");
}
// --- If any failed, mark status false but still return data ---
if (!errors.isEmpty()) {
wrapper.put("status", false);
wrapper.set("errors", errors);
}
return ResponseEntity.ok()
.header("Content-Type", "application/json")
.body(mapper.writeValueAsString(wrapper));
}catch (Exception e) {
e.printStackTrace();
ObjectNode error = new ObjectMapper().createObjectNode();
error.put("status", false);
error.put("message", "Error fetching dashboard data: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(error.toString());
}
}
// Step 1: Get session token
private static String getSessionToken(String urlString, String jsonInput) throws Exception {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
os.write(jsonInput.getBytes("UTF-8"));
}
int responseCode = conn.getResponseCode();
if (responseCode == 201) {
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = in.readLine()) != null) response.append(line);
in.close();
JSONObject jsonResponse = new JSONObject(response.toString());
JSONObject data = jsonResponse.optJSONObject("data");
if (data != null && data.has("session")) {
return data.getString("session");
} else {
throw new RuntimeException("Session not found in response: " + response);
}
} else {
throw new RuntimeException("Login failed. HTTP Code: " + responseCode);
}
}
// Step 2: Fetch dashboard data
private static String getDashboardData(String urlString, String sessionToken) throws Exception {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer " + sessionToken);
conn.setRequestProperty("Accept", "application/json");
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = in.readLine()) != null) response.append(line);
in.close();
return response.toString();
} else {
throw new RuntimeException("Dashboard fetch failed. HTTP Code: " + responseCode);
}
}
}

1
src/main/java/com/gcc/commissionerreview/controller/SofaBedCollectionApiController.java

@ -13,6 +13,7 @@ import com.gcc.commissionerreview.service.SofaBedCollectionService;
@RestController
@RequestMapping("/commissionerreview/api/sofabedcollection")
public class SofaBedCollectionApiController {

473
src/main/java/com/gcc/commissionerreview/service/SofaBedCollectionService.java

@ -15,6 +15,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class SofaBedCollectionService {
@Autowired
@ -22,50 +23,122 @@ public class SofaBedCollectionService {
@Autowired
public void setDatasource(@Qualifier("mysqlSofaBedCollectionDataSource") DataSource datasource) {
this.jdbcDomesticWasteTemplate=new JdbcTemplate(datasource);
this.jdbcDomesticWasteTemplate = new JdbcTemplate(datasource);
}
@Transactional(readOnly = true)
public List<Map<String, Object>> getZoneReport() {
String sql = """
WITH date_limits AS (
SELECT
DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY) AS week_start,
DATE_ADD(DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY), INTERVAL 7 DAY) AS week_end
)
SELECT
COALESCE(ur.zone, 'TOTAL') AS zone,
zone AS zone,
COUNT(*) AS total_request,
-- Requests created this week
SUM(CASE WHEN ur.cdate >= d.week_start AND ur.cdate < d.week_end THEN 1 ELSE 0 END) AS this_week_requests,
SUM(
CASE
WHEN cdate >= DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
AND cdate < DATE_ADD(
DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY),
INTERVAL 7 DAY
)
THEN 1 ELSE 0
END
) AS this_week_requests,
SUM(
CASE
WHEN cdate < DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
THEN 1 ELSE 0
END
) AS older_requests,
SUM(
CASE
WHEN status = 2 THEN 1 ELSE 0
END
) AS completed,
SUM(
CASE
WHEN status = 4 THEN 1 ELSE 0
END
) AS user_cancel,
SUM(
CASE
WHEN status = 5 THEN 1 ELSE 0
END
) AS officer_cancel,
SUM(
CASE
WHEN status IN (1, 3) THEN 1 ELSE 0
END
) AS pending
-- Older requests
SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END) AS older_requests,
FROM user_request_table
WHERE is_active = 1
AND is_delete = 0
GROUP BY zone
-- Status-based counts
SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed,
SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel,
SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel,
UNION ALL
-- Pending = older_requests - (completed + cancels)
(
SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END)
- SUM(CASE WHEN ur.status IN (2,4,5) THEN 1 ELSE 0 END)
SELECT
'TOTAL' AS zone,
COUNT(*) AS total_request,
SUM(
CASE
WHEN cdate >= DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
AND cdate < DATE_ADD(
DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY),
INTERVAL 7 DAY
)
THEN 1 ELSE 0
END
) AS this_week_requests,
SUM(
CASE
WHEN cdate < DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
THEN 1 ELSE 0
END
) AS older_requests,
SUM(
CASE
WHEN status = 2 THEN 1 ELSE 0
END
) AS completed,
SUM(
CASE
WHEN status = 4 THEN 1 ELSE 0
END
) AS user_cancel,
SUM(
CASE
WHEN status = 5 THEN 1 ELSE 0
END
) AS officer_cancel,
SUM(
CASE
WHEN status IN (1, 3) THEN 1 ELSE 0
END
) AS pending
FROM
user_request_table ur
CROSS JOIN date_limits d
WHERE
ur.is_active = 1
AND ur.is_delete = 0
GROUP BY
ur.zone WITH ROLLUP
FROM user_request_table
WHERE is_active = 1
AND is_delete = 0
ORDER BY
CASE WHEN ur.zone IS NULL THEN 999 ELSE ur.zone END;
CASE
WHEN zone = 'TOTAL' THEN 99999
ELSE CAST(zone AS UNSIGNED)
END;
""";
List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql);
@ -78,153 +151,110 @@ public class SofaBedCollectionService {
return Collections.singletonList(response);
}
// @Transactional
// public List<Map<String, Object>> getZoneReport(String fromDate, String toDate) {
// String sql = """
// WITH date_limits AS (
// SELECT
// STR_TO_DATE(?, '%d-%m-%Y') AS start_date,
// STR_TO_DATE(?, '%d-%m-%Y') AS end_date,
// DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY) AS week_start,
// DATE_ADD(DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY), INTERVAL 7 DAY) AS week_end
// )
// SELECT
// COALESCE(ur.zone, 'TOTAL') AS zone,
// COUNT(*) AS total_request,
// -- Requests created this week
// SUM(CASE WHEN ur.cdate >= d.week_start AND ur.cdate < d.week_end THEN 1 ELSE 0 END) AS this_week_requests,
// -- Older requests
// SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END) AS older_requests,
// -- Status-based counts
// SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed,
// SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel,
// SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel,
// -- Pending = older_requests - (completed + cancels)
// (
// SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END)
// - SUM(CASE WHEN ur.status IN (2,4,5) THEN 1 ELSE 0 END)
// ) AS pending
// FROM
// user_request_table ur
// CROSS JOIN date_limits d
// WHERE
// ur.is_active = 1
// AND ur.is_delete = 0
// AND ur.cdate BETWEEN d.start_date AND d.end_date
// GROUP BY
// ur.zone WITH ROLLUP
// ORDER BY
// CASE WHEN ur.zone IS NULL THEN 999 ELSE ur.zone END;
// """;
// List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, fromDate, toDate);
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "Success");
// response.put("message", "Zone-wise Report");
// response.put("data", reportList);
// return Collections.singletonList(response);
// }
// @Transactional(readOnly = true)
// public List<Map<String, Object>> getWardReport(String fromDate, String toDate, String zone) {
// String sql =
// "("
// + " SELECT "
// + " ur.division AS division, "
// + " COUNT(*) AS total_request, "
// + " SUM(CASE WHEN ur.status = 1 THEN 1 ELSE 0 END) AS open, "
// + " SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed, "
// + " SUM(CASE WHEN ur.status = 3 THEN 1 ELSE 0 END) AS pending, "
// + " SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel, "
// + " SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel "
// + " FROM user_request_table ur "
// + " WHERE ur.is_active = 1 AND ur.is_delete = 0 AND ur.zone = ? "
// + " GROUP BY ur.division "
// + ") "
// + "UNION ALL "
// + "("
// + " SELECT "
// + " 'TOTAL' AS division, "
// + " COUNT(*) AS total_request, "
// + " SUM(CASE WHEN ur.status = 1 THEN 1 ELSE 0 END) AS open, "
// + " SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed, "
// + " SUM(CASE WHEN ur.status = 3 THEN 1 ELSE 0 END) AS pending, "
// + " SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel, "
// + " SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel "
// + " FROM user_request_table ur "
// + " WHERE ur.is_active = 1 AND ur.is_delete = 0 AND ur.zone = ? "
// + ") "
// + "ORDER BY "
// + " CASE WHEN division = 'TOTAL' THEN 999 ELSE CAST(division AS UNSIGNED) END";
// List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, zone, zone);
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "Success");
// response.put("message", "Ward-wise Report");
// response.put("data", reportList);
// return Collections.singletonList(response);
// }
@Transactional(readOnly = true)
public List<Map<String, Object>> getWardReport(String zone) {
String sql = """
WITH date_limits AS (
SELECT
DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY) AS week_start,
DATE_ADD(DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY), INTERVAL 7 DAY) AS week_end
)
SELECT
COALESCE(ur.division, 'TOTAL') AS division,
zone AS zone,
division AS division,
COUNT(*) AS total_request,
-- Requests created this week
SUM(CASE WHEN ur.cdate >= d.week_start AND ur.cdate < d.week_end THEN 1 ELSE 0 END) AS this_week_requests,
SUM(
CASE
WHEN cdate >= DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
AND cdate < DATE_ADD(
DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY),
INTERVAL 7 DAY
)
THEN 1 ELSE 0
END
) AS this_week_requests,
SUM(
CASE
WHEN cdate < DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
THEN 1 ELSE 0
END
) AS older_requests,
SUM(
CASE WHEN status = 2 THEN 1 ELSE 0 END
) AS completed,
SUM(
CASE WHEN status = 4 THEN 1 ELSE 0 END
) AS user_cancel,
SUM(
CASE WHEN status = 5 THEN 1 ELSE 0 END
) AS officer_cancel,
SUM(
CASE WHEN status IN (1, 3) THEN 1 ELSE 0 END
) AS pending
FROM user_request_table
WHERE is_active = 1
AND is_delete = 0
AND zone = ?
GROUP BY zone, division
-- Older requests
SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END) AS older_requests,
UNION ALL
-- Status-based counts
SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed,
SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel,
SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel,
SELECT
zone AS zone,
'TOTAL' AS division,
COUNT(*) AS total_request,
-- Pending = older_requests - (completed + cancels)
(
SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END)
- SUM(CASE WHEN ur.status IN (2,4,5) THEN 1 ELSE 0 END)
SUM(
CASE
WHEN cdate >= DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
AND cdate < DATE_ADD(
DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY),
INTERVAL 7 DAY
)
THEN 1 ELSE 0
END
) AS this_week_requests,
SUM(
CASE
WHEN cdate < DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
THEN 1 ELSE 0
END
) AS older_requests,
SUM(
CASE WHEN status = 2 THEN 1 ELSE 0 END
) AS completed,
SUM(
CASE WHEN status = 4 THEN 1 ELSE 0 END
) AS user_cancel,
SUM(
CASE WHEN status = 5 THEN 1 ELSE 0 END
) AS officer_cancel,
SUM(
CASE WHEN status IN (1, 3) THEN 1 ELSE 0 END
) AS pending
FROM
user_request_table ur
CROSS JOIN date_limits d
WHERE
ur.is_active = 1
AND ur.is_delete = 0
AND ur.zone = ?
GROUP BY
ur.division WITH ROLLUP
FROM user_request_table
WHERE is_active = 1
AND is_delete = 0
AND zone = ?
ORDER BY
CASE WHEN ur.division IS NULL THEN 999 ELSE CAST(ur.division AS UNSIGNED) END;
CASE
WHEN division = 'TOTAL' THEN 99999
ELSE CAST(division AS UNSIGNED)
END;
""";
List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, zone);
List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, zone, zone);
Map<String, Object> response = new LinkedHashMap<>();
response.put("status", "Success");
@ -234,62 +264,13 @@ public class SofaBedCollectionService {
return Collections.singletonList(response);
}
// @Transactional(readOnly = true)
// public List<Map<String, Object>> getWardStatusDetails(
// String fromDate, String toDate,
// String ward, String status) {
// // ✅ Base URL for images
// String fileBaseUrl = "https://gccservices.in"; // or your configured value
// // ✅ SQL query with ward + status filters
// String sql =
// "SELECT " +
// " u.id, u.request_id, u.user_name, u.mobile, u.address, " +
// " u.latitude, u.longitude, u.zone, u.division, u.street_name, " +
// " u.quantity AS main_quantity, u.remarks, " +
// " CONCAT('" + fileBaseUrl + "/gccofficialapp/files', u.image_url) AS image_url, " +
// " DATE_FORMAT(u.cdate, '%d-%m-%Y') AS cdate, " +
// " sm.status_master AS status, " +
// " DATE_FORMAT(u.close_date, '%d-%m-%Y') AS close_date, " +
// " CONCAT('" + fileBaseUrl + "/gccofficialapp/files', u.officer_upload_url) AS officer_upload_url, " +
// " im.item_name, itm.quantity " +
// "FROM user_request_table u " +
// "LEFT JOIN items itm ON u.id = itm.req_table_id " +
// "LEFT JOIN item_master im ON itm.iteam_id = im.id AND im.is_active = 1 " +
// "LEFT JOIN status_master sm ON sm.id = u.status AND sm.is_active = 1 AND sm.is_delete = 0 " +
// "WHERE u.is_active = 1 AND u.is_delete = 0 " +
// " AND u.division = ? " +
// " AND u.status = ? " +
// "ORDER BY u.cdate DESC";
// // ✅ Execute query
// List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, ward, status);
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "Success");
// response.put("message", "Ward-status-wise - Report");
// response.put("data", reportList);
// return Collections.singletonList(response);
// //return groupRequestsWithItems(reportList);
// }
@Transactional(readOnly = true)
public List<Map<String, Object>> getWardStatusDetails(String ward, String status) {
// ✅ Base URL for images (you can move to application.properties later)
String fileBaseUrl = "https://gccservices.in";
// ✅ SQL query using only ward + status
String sql = """
// ✅ Base SQL (common part)
StringBuilder sql = new StringBuilder("""
SELECT
u.id,
u.request_id,
@ -303,6 +284,10 @@ public class SofaBedCollectionService {
u.street_name,
u.quantity AS main_quantity,
u.remarks,
CAST(u.is_app AS CHAR) AS is_app,
u.is_active,
u.is_delete,
u.street_id,
CONCAT(?, u.image_url) AS image_url,
DATE_FORMAT(u.cdate, '%d-%m-%Y') AS cdate,
sm.status_master AS status,
@ -319,18 +304,57 @@ public class SofaBedCollectionService {
u.is_active = 1
AND u.is_delete = 0
AND u.division = ?
AND u.status = ?
ORDER BY u.cdate DESC
""";
""");
// ✅ Dynamic WHERE condition based on status
switch (status) {
case "1":
// This week requests (Sunday–Saturday)
sql.append(
"""
AND u.cdate >= DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY)
AND u.cdate < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL (WEEKDAY(CURDATE()) + 1) DAY), INTERVAL 7 DAY)
""");
break;
case "2":
// Completed requests
sql.append(
" AND u.status = 2 ");
break;
case "4":
// User cancelled requests
sql.append(
" AND u.status = 4 ");
break;
case "5":
// Officer cancelled requests
sql.append(
" AND u.status = 5 ");
break;
case "99":
// Pending requests before this week
sql.append(" AND u.status IN (1, 3) ");
break;
default:
// Return empty result if status invalid
return List.of(Map.of(
"status", "Failed",
"message", "Invalid status type",
"data", List.of()));
}
sql.append(" ORDER BY u.cdate DESC ");
// ✅ Execute query
List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(
sql,
sql.toString(),
fileBaseUrl + "/gccofficialapp/files",
fileBaseUrl + "/gccofficialapp/files",
ward,
status
);
ward);
Map<Integer, Map<String, Object>> groupedMap = new LinkedHashMap<>();
@ -367,26 +391,23 @@ public class SofaBedCollectionService {
newEntry.put("is_active", row.get("is_active"));
newEntry.put("is_delete", row.get("is_delete"));
newEntry.put("street_id", row.get("street_id"));
newEntry.put("status", row.get("status")); // Now this is human-readable
newEntry.put("status", row.get("status"));
newEntry.put("is_app", row.get("is_app"));
newEntry.put("close_date", row.get("close_date"));
newEntry.put("officer_upload_url", row.get("officer_upload_url"));
List<Map<String, Object>> items = new ArrayList<>();
if (item != null) {
if (item != null)
items.add(item);
}
newEntry.put("items", items);
groupedMap.put(id, newEntry);
}
}
// ✅ Wrap response
Map<String, Object> response = new LinkedHashMap<>();
response.put("status", "Success");
response.put("message", "Ward-status-wise Report");
response.put("message", "Ward-wise Report for Status " + status);
response.put("data", groupedMap.values());
return Collections.singletonList(response);

301
src/main/resources/templates/modules/pet/petlicense.html

@ -0,0 +1,301 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Pet License Zonewise Report Summary</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- DataTables CSS -->
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet"/>
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet"/>
<style>
table.dataTable th, table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #000;
}
table.dataTable th{
background-color: #003366 !important;
color: white;
}
.dataTables_wrapper .dt-buttons {
margin-bottom: 10px;
}
.dataTables_filter {
margin-bottom: 25px; /* adjust as needed */
}
.page-header-title h4 {
margin: 20px 0;
text-align: center;
}
#zoneDetailsTable_wrapper .dataTables_scrollBody {
border: none !important;
}
#zoneDetailsTable td, #zoneDetailsTable th {
vertical-align: middle;
text-align: center;
white-space: nowrap;
}
</style>
</head>
<body>
<div class="page-header-title">
<h4>Pet License - MIS Report</h4>
</div>
<div id="opSummaryTable" style="display: block;" class="container">
<p style="font-weight: bold;">Microchip Details:</p>
<table class="table table-striped table-bordered display nowrap w-100">
<tr>
<th class="text-center">Total requirement:&nbsp;&nbsp;<span id="micro_total"></span></th>
<th class="text-center">Completed:&nbsp;&nbsp;<span id="micro_completed"></span></th>
<th class="text-center">Pending:&nbsp;&nbsp;<span id="micro_pending"></span></th>
</tr>
</table>
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center" rowspan="2">Zones</th>
<th class="text-center" colspan="3">License</th>
<th class="text-center" colspan="3">Vaccination</th>
</tr>
<tr>
<th class="text-center">License Total Request</th>
<th class="text-center">Completed</th>
<th class="text-center">Pending</th>
<th class="text-center">Vaccination Total Request</th>
<th class="text-center">Completed</th>
<th class="text-center">Pending</th>
</tr>
</thead>
<tbody>
</tbody>
<!-- <tfoot>
<tr>
<th class="text-center">TOTAL</th>
<th class="text-center"></th>
<th class="text-center"></th>
<th class="text-center"></th>
<th class="text-center"></th>
<th class="text-center"></th>
<th class="text-center"></th>
</tr>
</tfoot> -->
</table>
</div>
<div id="pageLoader" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
<div style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
<span class="sr-only"></span>
</div>
<!-- Add the 'Please wait' text below the spinner -->
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please wait...</p>
</div>
</div>
<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).ready(function () {
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/petlicense/getzonewisedata',
method: 'GET',
success: function(response) {
$('#pageLoader').hide();
console.log(response);
if (response.status === true) {
if (response.licensedata && response.vaccinationdata &&
response.licensedata.data &&
Array.isArray(response.licensedata.data.zoneWise)) {
const licenseData = response.licensedata?.data?.zoneWise || [];
const vaccData = response.vaccinationdata?.data?.zoneWise || [];
const microData = response.microchipdata.data;
$('#micro_total').text(microData.totalRequirement || 0);
$('#micro_completed').text(microData.completed || 0);
$('#micro_pending').text(microData.pending || 0);
const mergedData = licenseData.map(lic => {
const vacc = vaccData.find(v => v.zone === lic.zone) || {};
return {
license_zone: lic.zone || '-',
license_total: parseInt(lic.completed || 0) + parseInt(lic.pending || 0),
license_completed: lic.completed || '0',
license_pending: lic.pending || '0',
vacc_zone: vacc.zone || '-',
vacc_total: parseInt(vacc.completed || 0) + parseInt(vacc.pending || 0),
vacc_completed: vacc.completed || '0',
vacc_pending: vacc.pending || '0'
};
});
// 🧾 Compute total row
const totals = mergedData.reduce(
(acc, curr) => {
acc.license_total += parseInt(curr.license_total || 0);
acc.license_completed += parseInt(curr.license_completed || 0);
acc.license_pending += parseInt(curr.license_pending || 0);
acc.vacc_total += parseInt(curr.vacc_total || 0);
acc.vacc_completed += parseInt(curr.vacc_completed || 0);
acc.vacc_pending += parseInt(curr.vacc_pending || 0);
return acc;
},
{
license_total: 0,
license_completed: 0,
license_pending: 0,
vacc_total: 0,
vacc_completed: 0,
vacc_pending: 0
}
);
// 🟩 Add total row at end
mergedData.push({
license_zone: '<strong>TOTAL</strong>',
license_total: `<strong>${totals.license_total}</strong>`,
license_completed: `<strong>${totals.license_completed}</strong>`,
license_pending: `<strong>${totals.license_pending}</strong>`,
vacc_total: `<strong>${totals.vacc_total}</strong>`,
vacc_completed: `<strong>${totals.vacc_completed}</strong>`,
vacc_pending: `<strong>${totals.vacc_pending}</strong>`
});
let table = $('#ZoneOpDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: mergedData,
columns: [
{ data: 'license_zone',defaultContent: '-', className: 'text-center'},
{ data: 'license_total', defaultContent: '-', className: 'text-center' },
{ data: 'license_completed', defaultContent: '-', className: 'text-center' },
{ data: 'license_pending', defaultContent: '-', className: 'text-center' },
{ data: 'vacc_total', defaultContent: '-', className: 'text-center' },
{ data: 'vacc_completed',defaultContent: '-', className: 'text-center' },
{ data: 'vacc_pending',defaultContent: '-', className: 'text-center' }
],
dom: 'Bfrtip',
buttons: [
{
extend: 'excelHtml5',
title: 'Pet_license_Report',
messageTop: 'License and Vaccination Report',
text: '<i class="fa fa-file-excel"></i> Export to Excel',
className: 'btn btn-success btn-sm',
exportOptions: { columns: ':visible' }
},
{
extend: 'pdfHtml5',
title: 'Pet_license_Report',
messageTop: 'License and Vaccination Report',
text: '<i class="fa fa-file-pdf"></i> Export to PDF',
className: 'btn btn-danger btn-sm',
orientation: 'portrait', // Optional: 'portrait' or 'landscape'
pageSize: 'A4', // Optional: 'A4', 'LETTER', etc.
exportOptions: { columns: ':visible' }
}
],
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: 'auto',
scrollX: true,
responsive: false,
searching: false,
ordering: false,
createdRow: function (row, data, dataIndex) {
if (data.license_zone === '<strong>TOTAL</strong>') {
$(row).addClass('font-weight-bold table-warning'); // highlight total row
}
}
});
}
}
else{
$('#pageLoader').hide();
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
// alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
});
</script>
</body>
</html>

133
src/main/resources/templates/modules/sofa_bed/zonewise1.html

@ -15,6 +15,7 @@
text-align: center;
vertical-align: middle;
border: 1px solid #000;
}
table.dataTable th{
@ -61,15 +62,17 @@
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">Zone</th>
<th class="text-center">Total Request</th>
<th class="text-center">This week Requests</th>
<th class="text-center">Older Requests</th>
<th class="text-center">Completed</th>
<th class="text-center">User Cancelled </th>
<th class="text-center">Officer Cancelled</th>
<th class="text-center">Pending</th>
<th rowspan="2" class="text-center">Zone</th>
<th colspan="3" class="text-center">Request Received</th>
<th rowspan="2" class="text-center">Completed</th>
<th rowspan="2" class="text-center">User Cancelled </th>
<th rowspan="2" class="text-center">Officer Cancelled</th>
<th rowspan="2" class="text-center">Request to be Taken</th>
</tr>
<tr>
<th class="text-center">Total</th>
<th class="text-center">Till last week</th>
<th class="text-center">This week</th>
</tr>
</thead>
<tbody>
@ -91,14 +94,17 @@
<table id="WardDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">Ward </th>
<th class="text-center">Total Request</th>
<th class="text-center">This Week Request</th>
<th class="text-center">Older Requests</th>
<th class="text-center">Completed</th>
<th class="text-center">User Cancelled </th>
<th class="text-center">Officer Cancelled</th>
<th class="text-center">Pending</th>
<th rowspan="2" class="text-center">Ward</th>
<th colspan="3" class="text-center">Request Received</th>
<th rowspan="2" class="text-center">Completed</th>
<th rowspan="2" class="text-center">User Cancelled </th>
<th rowspan="2" class="text-center">Officer Cancelled</th>
<th rowspan="2" class="text-center">Request to be Taken</th>
</tr>
<tr>
<th class="text-center">Total</th>
<th class="text-center">Till last week</th>
<th class="text-center">This week</th>
</tr>
</thead>
<tbody>
@ -130,15 +136,16 @@
<!-- Image Modal -->
<div class="modal fade" id="imageModal" tabindex="-1" role="dialog" aria-hidden="true">
<!-- <div class="modal fade" id="imageModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-body text-center p-0">
<img id="modalImage" src="" class="img-fluid" alt="Preview" style="max-height: 80vh;"/>
</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;">
@ -170,11 +177,13 @@
<script>
/*
$(document).on('click', '.preview-img', function() {
const src = $(this).attr('src');
$('#modalImage').attr('src', src);
$('#imageModal').modal('show');
});
}); */
$(document).ready(function () {
@ -213,8 +222,9 @@ $(document).ready(function () {
}
},
{ data: 'total_request', defaultContent: '-', className: 'text-center' },
{ data: 'this_week_requests', defaultContent: '-', className: 'text-center' },
{ data: 'older_requests', defaultContent: '-', className: 'text-center' },
{ data: 'this_week_requests', defaultContent: '-', className: 'text-center' },
{ data: 'completed', defaultContent: '-', className: 'text-center' },
{ data: 'user_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'officer_cancel', defaultContent: '-', className: 'text-center' },
@ -352,8 +362,9 @@ function openZoneModal(zoneCode) {
columns: [
{ data: 'division', defaultContent: '-', className: 'text-center' },
{ data: 'total_request', defaultContent: '-', className: 'text-center' },
{ data: 'this_week_requests', defaultContent: '-', className: 'text-center' },
{ data: 'older_requests', defaultContent: '-', className: 'text-center' },
{ data: 'this_week_requests', defaultContent: '-', className: 'text-center' },
{ data: 'completed', defaultContent: '-', className: 'text-center' },
{ data: 'user_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'officer_cancel', defaultContent: '-', className: 'text-center' },
@ -372,16 +383,17 @@ function openZoneModal(zoneCode) {
createdRow: function (row, data, dataIndex) {
if (dataIndex === res.data.length - 1) return;
const clickableCols = ['this_week_requests', 'completed', 'user_cancel', 'officer_cancel'];
const clickableCols = ['this_week_requests', 'completed', 'user_cancel', 'officer_cancel','pending'];
clickableCols.forEach((col) => {
const value = parseInt(data[col]);
if (!isNaN(value) && value > 0) {
const colIndex = {
this_week_requests: 2,
this_week_requests: 3,
completed: 4,
user_cancel: 5,
officer_cancel: 6
officer_cancel: 6,
pending:7
}[col];
$('td:eq(' + colIndex + ')', row).css({
@ -460,10 +472,11 @@ function openZoneModal(zoneCode) {
// Define column-to-status mapping (based on your requirement)
const columnMap = {
2: 1, // open
3: 1, // open
4: 2, // completed
5: 4, // user_cancel
6: 5 // officer_cancel
6: 5, // officer_cancel
7:99 // pending
};
// Get column name using column index
@ -535,6 +548,11 @@ function openWardDetails(division, status){
// Create a container div for each record
let streetDiv = $('<div class="mb-4 p-3 border rounded shadow-sm bg-light"></div>');
let sourceText = '-';
if (item.is_app === "1") sourceText = 'Namma Chennai App';
else if (item.is_app === "2") sourceText = 'Whatsapp registration';
else if (item.is_app === "3") sourceText = '1913';
// Info section (2 columns layout)
let infoHtml = `
<div class="container-fluid">
@ -552,6 +570,10 @@ function openWardDetails(division, status){
<div class="col-md-8"><strong>Address:</strong> ${item.address || '-'}</div>
<div class="col-md-4"><strong>Created Date:</strong> ${item.cdate || '-'}</div>
</div>
<div class="row mb-2">
<div class="col-md-4"><strong>Source:</strong> ${sourceText}</div>
</div>
</div>
`;
streetDiv.append(infoHtml);
@ -575,9 +597,47 @@ function openWardDetails(division, status){
`;
streetDiv.append(itemsHtml);
let imagesHtml;
if(item.status === "completed"){
imagesHtml = `
<hr>
<div class="d-flex mt-2">
<div class="me-2 text-center" style="flex:1;">
<p><strong>User Uploaded Image</strong></p>
${
item.image_url
? (() => {
let beforePath = item.image_url.split(",")[0].trim();
return `<img src="${beforePath}"
alt="User's Uploaded Image"
style="width: 250px; height: 200px; object-fit: contain;"
/>`;
})()
: `<p>No image</p>`
}
</div>
<div class="text-center" style="flex:1;">
<p><strong>Officer Uploaded Image</strong></p>
${
item.officer_upload_url
? (() => {
let afterPath = item.officer_upload_url.split(",")[0].trim();
return `<img src="${afterPath}"
alt="Officer's Uploaded Image"
// Image section
let imagesHtml = `
style="width: 250px; height: 200px; object-fit: contain;"
/>`;
})()
: `<p>No image</p>`
}
</div>
</div>
`;
}
else{
imagesHtml = `
<hr>
<div class="mt-2" style="text-align:center;">
<p><strong>Image:</strong></p>
@ -590,18 +650,20 @@ function openWardDetails(division, status){
return `
<img src="${trimmed}"
alt="Image"
class="img-thumbnail me-2 mb-2 preview-img"
style="width: 250px; height: 200px; object-fit: contain; cursor: pointer;"
data-bs-toggle="modal"
data-bs-target="#imageModal"
style="width: 250px; height: 200px; object-fit: contain;"
/>
`;
}).join("");
})()
: `<p class="text-muted">No images available.</p>`
: `<p class="text-muted">No image.</p>`
}
</div>
`;
}
streetDiv.append(imagesHtml);
modalBody.append(streetDiv);
@ -681,6 +743,9 @@ function openWardDetails(division, status){
}
</script>
</body>
Loading…
Cancel
Save