Browse Source

Officer Portal Updated code

main
kanimozhi 8 months ago
parent
commit
ab93f2a9c1
  1. 67
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcAgentsService.java
  2. 9
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/AppConfig.java
  3. 52
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java
  4. 215
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/controller/FlagPoleApiController.java
  5. 133
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/service/FlagpoleSMSService.java
  6. 1195
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/service/RdoService.java
  7. 45
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/service/WhatsappServiceFlagPole.java
  8. 41
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/util/MessageUtility.java
  9. 4
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/greencommittee/service/PendinglistService.java
  10. 3
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/nulm/controller/NulmAPIController.java
  11. 9
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/nulm/service/NulmService.java
  12. 4
      gcc_officer_portal/src/main/resources/application.properties
  13. 4
      gcc_officer_portal/src/main/resources/templates/modules/callcenterqaqc/socialmediacomplaints.html
  14. 29
      gcc_officer_portal/src/main/resources/templates/modules/flagpole/approvedandrejectedlist.html
  15. 315
      gcc_officer_portal/src/main/resources/templates/modules/flagpole/requestlist.html
  16. 1
      gcc_officer_portal/src/main/resources/templates/modules/m_petition/complaint_list.html
  17. 1
      gcc_officer_portal/src/main/resources/templates/modules/m_petition/petition_list.html
  18. 3
      gcc_officer_portal/src/main/resources/templates/modules/nulm/salary-approve.html

67
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcAgentsService.java

@ -239,29 +239,50 @@ public class QaqcAgentsService {
public List<Map<String, Object>> getAgentPerformanceData(int agentId, String startDate, String endDate) {
String sql = "SELECT \n"
+ " COALESCE(total_data_count, 0) AS total_data_count,\n" // Ensure total_data_count is 0 if null
+ " COALESCE(completed_count, 0) AS completed_count,\n" // Ensure completed_count is 0 if null
+ " COALESCE((total_data_count - completed_count), 0) AS pending_count,\n" // Ensure pending_count is 0
+ " CASE \n"
+ " WHEN COALESCE(total_data_count, 0) > 0 THEN ROUND((COALESCE(completed_count, 0) / total_data_count) * 100, 1)\n"
+ " ELSE 0\n"
+ " END AS completed_percentage\n"
+ "FROM \n"
+ " (\n"
+ " SELECT \n"
+ " (SELECT COALESCE(SUM(aa.data_count), 0) \n"
+ " FROM agent_assigned aa \n"
+ " WHERE aa.agent_id = ? AND DATE(aa.created_date) BETWEEN ? AND ?) AS total_data_count,\n"
+ " \n"
+ " (SELECT COALESCE(COUNT(*), 0) \n"
+ " FROM qaqc_call_logs cl \n"
+ " WHERE cl.agent_id = ?\n"
+ " AND DATE(cl.created_date) BETWEEN ? AND ? \n"
+ " AND cl.call_status IS NOT NULL) AS completed_count\n"
+ " ) AS combined";
return jdbcTemplate.queryForList(sql, agentId, startDate, endDate, agentId, startDate, endDate);
// String sql = "SELECT \n"
// + " COALESCE(total_data_count, 0) AS total_data_count,\n" // Ensure total_data_count is 0 if null
// + " COALESCE(completed_count, 0) AS completed_count,\n" // Ensure completed_count is 0 if null
// + " COALESCE((total_data_count - completed_count), 0) AS pending_count,\n" // Ensure pending_count is 0
// + " CASE \n"
// + " WHEN COALESCE(total_data_count, 0) > 0 THEN ROUND((COALESCE(completed_count, 0) / total_data_count) * 100, 1)\n"
// + " ELSE 0\n"
// + " END AS completed_percentage\n"
// + "FROM \n"
// + " (\n"
// + " SELECT \n"
// + " (SELECT COALESCE(SUM(aa.data_count), 0) \n"
// + " FROM agent_assigned aa \n"
// + " WHERE aa.agent_id = ? AND DATE(aa.created_date) BETWEEN ? AND ?) AS total_data_count,\n"
// + " \n"
// + " (SELECT COALESCE(COUNT(*), 0) \n"
// + " FROM qaqc_call_logs cl \n"
// + " WHERE cl.agent_id = ?\n"
// + " AND DATE(cl.created_date) BETWEEN ? AND ? \n"
// + " AND cl.call_status IS NOT NULL) AS completed_count\n"
// + " ) AS combined";
// return jdbcTemplate.queryForList(sql, agentId, startDate, endDate, agentId, startDate, endDate);
String sql="SELECT "
+ " total_data_count,"
+ " completed_count,"
+ " (total_data_count - completed_count) AS pending_count,"
+ " CASE "
+ " WHEN total_data_count > 0 "
+ " THEN ROUND((completed_count / total_data_count) * 100, 1)"
+ " ELSE 0"
+ " END AS completed_percentage"
+ " FROM ("
+ " SELECT "
+ " COUNT(*) AS total_data_count,"
+ " COUNT(call_status) AS completed_count"
+ " FROM qaqc_upload_data_history"
+ " WHERE created_date >= ? "
+ " AND created_date < DATE_ADD( ? , INTERVAL 1 DAY)"
+ " AND agent_id = ? "
+ ") t";
return jdbcTemplate.queryForList(sql, startDate, endDate, agentId);
}

9
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/AppConfig.java

@ -25,6 +25,15 @@ public class AppConfig {
public String gccappsMysqlPassword = "";
public String domesticurl="https://gccservices.in/gccofficialapp/api/domesticwaste";
public String otpUrl = "https://tmegov.onex-aura.com/api/sms?";
public String getOtpUrl() {
return otpUrl;
}
public void setOtpUrl(String otpUrl) {
this.otpUrl = otpUrl;
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();

52
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java

@ -24,22 +24,21 @@ import java.util.Properties;
@EnableTransactionManagement
public class DataSourceConfig {
//private static String host = "localhost:3306";
//private static String dbpassword = "";
private static String host = "localhost:3306";
private static String dbpassword = "root";
// private static String dbpassword = "gccroot";
// AWS
private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306";
private static String dbpassword = "gcc-facial-password";
// private static String host =
// "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306";
// private static String dbpassword = "gcc-facial-password";
////////////////////////////// (For GCC APP) ////////////////////////
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "appEntityManagerFactory",
transactionManagerRef = "appTransactionManager",
basePackages = {"in.gov.chennaicorporation.gccoffice.repository"})
@EnableJpaRepositories(entityManagerFactoryRef = "appEntityManagerFactory", transactionManagerRef = "appTransactionManager", basePackages = {
"in.gov.chennaicorporation.gccoffice.repository" })
public static class MysqlAppDataSourceConfig {
@Primary
@ -52,11 +51,13 @@ public class DataSourceConfig {
dataSource.setPassword(dbpassword);
return dataSource;
}
/*
@Bean(name = "mysqlAppJdbcTemplate")
public JdbcTemplate mysqlAppJdbcTemplate(@Qualifier("mysqlAppDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
* @Bean(name = "mysqlAppJdbcTemplate")
* public JdbcTemplate mysqlAppJdbcTemplate(@Qualifier("mysqlAppDataSource")
* DataSource dataSource) {
* return new JdbcTemplate(dataSource);
* }
*/
@Primary
@Bean(name = "appEntityManagerFactory")
@ -75,18 +76,18 @@ public class DataSourceConfig {
@Primary
@Bean(name = "appTransactionManager")
public PlatformTransactionManager transactionManager(@Qualifier("appEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
public PlatformTransactionManager transactionManager(
@Qualifier("appEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
//////////////////////////////(For Tax Collection 1913) ////////////////////////
////////////////////////////// (For Tax Collection 1913)
////////////////////////////// ////////////////////////
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "taxEntityManagerFactory",
transactionManagerRef = "taxTransactionManager",
basePackages = {"in.gov.chennaicorporation.gccoffice.taxcollection.repository"})
@EnableJpaRepositories(entityManagerFactoryRef = "taxEntityManagerFactory", transactionManagerRef = "taxTransactionManager", basePackages = {
"in.gov.chennaicorporation.gccoffice.taxcollection.repository" })
public static class MysqlTaxCollectionDataSourceConfig {
@Bean(name = "mysqlTaxCollectionDataSource")
@ -114,13 +115,12 @@ public class DataSourceConfig {
}
@Bean(name = "taxTransactionManager")
public PlatformTransactionManager taxTransactionManager(@Qualifier("taxEntityManagerFactory") EntityManagerFactory taxEntityManagerFactory) {
public PlatformTransactionManager taxTransactionManager(
@Qualifier("taxEntityManagerFactory") EntityManagerFactory taxEntityManagerFactory) {
return new JpaTransactionManager(taxEntityManagerFactory);
}
}
////////////////////////////// (For Mayor Petition) ////////////////////////
@Bean(name = "mysqlMayorPetitionDataSource")
public DataSource mysqlMayorPetitionDataSource() {
@ -132,7 +132,8 @@ public class DataSourceConfig {
return dataSource;
}
//////////////////////////////(For Commissioner Petition) ////////////////////////
////////////////////////////// (For Commissioner Petition)
////////////////////////////// ////////////////////////
@Bean(name = "mysqlCommissionerPetitionDataSource")
public DataSource mysqlCommissionerPetitionDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
@ -154,7 +155,8 @@ public class DataSourceConfig {
return dataSource;
}
//////////////////////////////(For Councillor Petition) ////////////////////////
////////////////////////////// (For Councillor Petition)
////////////////////////////// ////////////////////////
@Bean(name = "mysqlCouncillorPetitionDataSource")
public DataSource mysqlCouncillorPetitionDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
@ -198,7 +200,8 @@ public class DataSourceConfig {
return dataSource;
}
//////////////////////////////(For Zero Hours Petition) ////////////////////////
////////////////////////////// (For Zero Hours Petition)
////////////////////////////// ////////////////////////
@Bean(name = "mysqlZeroHoursDataSource")
public DataSource mysqlZeroHoursDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
@ -351,6 +354,7 @@ public class DataSourceConfig {
dataSource.setPassword(dbpassword);
return dataSource;
}
////////////////////////////// (For vending committe) ////////////////////////
@Bean(name = "mysqlVendingCommitteDataSource")
public DataSource mysqlVendingCommitteDataSource() {

215
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/controller/FlagPoleApiController.java

@ -1,12 +1,8 @@
package in.gov.chennaicorporation.gccoffice.flagpole.controller;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.annotation.Generated;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@ -17,8 +13,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.cdwaste.service.OfficerService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.flagpole.service.FlagpoleSMSService;
import in.gov.chennaicorporation.gccoffice.flagpole.service.RdoService;
@RestController
@ -28,6 +24,9 @@ public class FlagPoleApiController {
@Autowired
private RdoService rdoService;
@Autowired
private FlagpoleSMSService flagpoleSMSService;
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@ -37,7 +36,7 @@ public class FlagPoleApiController {
this.appConfig = appConfig;
}
// old
// new
// @GetMapping("/getAllDetails")
// public ResponseEntity<?> getAllRequestDetails(
// @RequestParam String userLogin,
@ -49,6 +48,19 @@ public class FlagPoleApiController {
// rdoService.getAllRequestDetailsByUserLogin(
// userLogin, startDate, endDate);
// // 🔥 Attach HISTORY per refid
// for (Map<String, Object> record : result) {
// String refid = (String) record.get("refid");
// // List<Map<String, Object>> history =
// // rdoService.getRequestHistoryByRefId(refid);
// List<Map<String, Object>> history =
// rdoService.getOfficerFeedbackHistoryByRefId(refid,
// userLogin);
// record.put("history", history);
// }
// return ResponseEntity.ok(
// Map.of(
// "status", "success",
@ -58,33 +70,79 @@ public class FlagPoleApiController {
// } catch (Exception e) {
// e.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(
// .body(Map.of(
// "status", "error",
// "message", "Failed to fetch data",
// "error", e.getMessage()));
// }
// }
// @GetMapping("/getAllDetails")
// public ResponseEntity<?> getAllRequestDetails(
// @RequestParam String gccUserId,
// @RequestParam(required = false) String startDate,
// @RequestParam(required = false) String endDate) {
// try {
// // 🔥 Resolve username ONCE (backend trust)
// String username = rdoService.getUsernameByUserId(gccUserId);
// if (username == null) {
// throw new RuntimeException("Invalid gccUserId : " + gccUserId);
// }
// List<Map<String, Object>> result =
// rdoService.getAllRequestDetailsByUserLogin(
// gccUserId, startDate, endDate);
// // 🔥 Attach HISTORY per refid (dept-wise)
// for (Map<String, Object> record : result) {
// String refid = (String) record.get("refid");
// List<Map<String, Object>> history =
// rdoService.getOfficerFeedbackHistoryByRefId(
// refid, username);
// record.put("history", history);
// }
// return ResponseEntity.ok(
// Map.of(
// "status", "success",
// "count", result.size(),
// "data", result));
// } catch (Exception e) {
// e.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(Map.of(
// "status", "error",
// "message", "Failed to fetch data",
// "error", e.getMessage()));
// }
// }
// new
@GetMapping("/getAllDetails")
public ResponseEntity<?> getAllRequestDetails(
@RequestParam String userLogin,
@RequestParam String gccUserId,
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
try {
List<Map<String, Object>> result = rdoService.getAllRequestDetailsByUserLogin(
userLogin, startDate, endDate);
// 🔥 Attach HISTORY per refid
/* 🔥 Normalize input (username OR id → gccuserid) */
gccUserId = rdoService.resolveGccUserId(gccUserId);
List<Map<String, Object>> result = rdoService.getAllRequestDetailsByUserLogin(gccUserId,
startDate, endDate);
/* 🔥 Attach HISTORY per refid */
for (Map<String, Object> record : result) {
String refid = (String) record.get("refid");
// List<Map<String, Object>> history =
// rdoService.getRequestHistoryByRefId(refid);
List<Map<String, Object>> history = rdoService.getOfficerFeedbackHistoryByRefId(refid,
userLogin);
gccUserId);
record.put("history", history);
}
@ -105,19 +163,41 @@ public class FlagPoleApiController {
}
}
// old
// @PostMapping("/rdo/updateDecision")
// public ResponseEntity<?> updateRdoDecision(
// @RequestParam String refid,
// @RequestParam String status,
// @RequestParam String remarks,
// @RequestParam String approvedBy // 🔥 FROM JS
// ) {
// @RequestParam String approvedBy) {
// int count = rdoService.updateRdoDecision(refid, status, remarks, approvedBy);
// if (count > 0) {
// return ResponseEntity.ok(Map.of(
// "status", "SUCCESS",
// "message", "Decision updated successfully"));
// } else {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "FAILED",
// "message", "Unable to update decision"));
// }
// }
// @PostMapping("/rdo/updateDecision")
// public ResponseEntity<?> updateRdoDecision(
// @RequestParam String refid,
// @RequestParam String status,
// @RequestParam String remarks,
// @RequestParam String gccUserId) {
// try {
// /* 🔥 Normalize username OR id → gccuserid */
// gccUserId = rdoService.resolveGccUserId(gccUserId);
// int count = rdoService.updateRdoDecision(
// refid,
// status,
// remarks,
// approvedBy);
// refid, status, remarks, gccUserId);
// if (count > 0) {
// return ResponseEntity.ok(Map.of(
@ -128,16 +208,35 @@ public class FlagPoleApiController {
// "status", "FAILED",
// "message", "Unable to update decision"));
// }
// } catch (Exception e) {
// e.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(Map.of(
// "status", "ERROR",
// "message", e.getMessage()));
// }
// }
@PostMapping("/rdo/updateDecision")
public ResponseEntity<?> updateRdoDecision(
@PostMapping("/officer/updateDecision")
public ResponseEntity<?> updateOfficerDecision(
@RequestParam String refid,
@RequestParam String status,
@RequestParam String remarks,
@RequestParam String approvedBy) {
@RequestParam String gccUserId,
@RequestParam String username) {
try {
/* 🔥 Normalize username OR id → gccuserid */
gccUserId = rdoService.resolveGccUserId(gccUserId);
int count = rdoService.updateRdoDecision(refid, status, remarks, approvedBy);
int count = rdoService.updateOfficerDecision(
refid,
status,
remarks,
gccUserId,
username);
if (count > 0) {
return ResponseEntity.ok(Map.of(
@ -148,6 +247,14 @@ public class FlagPoleApiController {
"status", "FAILED",
"message", "Unable to update decision"));
}
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of(
"status", "ERROR",
"message", e.getMessage()));
}
}
// old
@ -219,22 +326,65 @@ public class FlagPoleApiController {
// }
// }
// @GetMapping("/getApprovedAndRejectedDetails")
// public ResponseEntity<?> getApprovedRequestDetails(
// @RequestParam String userLogin,
// @RequestParam(required = false) String startDate,
// @RequestParam(required = false) String endDate) {
// try {
// List<Map<String, Object>> result =
// rdoService.getRdoApprovedRequestDetailsByUserLogin(
// userLogin, startDate, endDate, null);
// for (Map<String, Object> record : result) {
// String refid = (String) record.get("refid");
// // 🔥 NEW: officer feedback history
// List<Map<String, Object>> history =
// rdoService.getOfficerFeedbackHistoryByRefId(refid,
// userLogin);
// record.put("history", history);
// }
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "count", result.size(),
// "data", result));
// } catch (Exception e) {
// e.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(Map.of(
// "status", "error",
// "message", "Failed to fetch data",
// "error", e.getMessage()));
// }
// }
@GetMapping("/getApprovedAndRejectedDetails")
public ResponseEntity<?> getApprovedRequestDetails(
@RequestParam String userLogin,
@RequestParam String gccUserId,
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
try {
/* 🔥 Normalize username OR id → gccuserid */
gccUserId = rdoService.resolveGccUserId(gccUserId);
/* 🔥 Fetch approved & rejected records */
List<Map<String, Object>> result = rdoService.getRdoApprovedRequestDetailsByUserLogin(
userLogin, startDate, endDate, null);
gccUserId, startDate, endDate, null);
/* 🔥 Attach officer feedback history per refid */
for (Map<String, Object> record : result) {
String refid = (String) record.get("refid");
// 🔥 NEW: officer feedback history
List<Map<String, Object>> history = rdoService.getOfficerFeedbackHistoryByRefId(refid,
userLogin);
gccUserId);
record.put("history", history);
}
@ -249,9 +399,14 @@ public class FlagPoleApiController {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of(
"status", "error",
"message", "Failed to fetch data",
"message", "Failed to fetch approved/rejected data",
"error", e.getMessage()));
}
}
@GetMapping("/sendRejectMessage")
public void sendRejectMessage(@RequestParam String mobileNo, @RequestParam String refid) {
flagpoleSMSService.userrequestRejectedsms(mobileNo, refid);
}
}

133
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/service/FlagpoleSMSService.java

@ -0,0 +1,133 @@
package in.gov.chennaicorporation.gccoffice.flagpole.service;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.flagpole.util.MessageUtility;
@Service
public class FlagpoleSMSService {
@Autowired
private AppConfig appConfig;
@Autowired
private MessageUtility messageUtility;
private final String key = "pfTEYN6H";
public String sendBookingSuccesssms(String mobileNo, String requestId) {
String message = "Your Flag Pole permission request has been submitted successfully. "
+ "Request ID: " + requestId
+ ". You will be notified once the status is updated. By GCC";
// Encode message and fix colon issue (gateway not decoding %3A)
String encodedMsg = URLEncoder.encode(message, StandardCharsets.UTF_8)
.replace("%3A", ":");
String urlString = appConfig.getOtpUrl()
+ "from=GCCCRP"
+ "&key=" + key
+ "&sender=GCCCRP"
+ "&to=" + mobileNo
+ "&body=" + encodedMsg
+ "&entityid=1401572690000011081"
+ "&templateid=1407176959297472163";
System.out.println("SMS URL:- " + urlString);
String response = messageUtility.sendSMS(urlString);
System.out.println("SMS RESPONSE:- " + response);
return response;
}
public String userrequestApprovedsms(String mobileNo, String requestId) {
String message = "Your Flag Pole permission request has been approved. "
+ "Request ID: " + requestId
+ ". Please proceed as per the permitted guidelines. By GCC";
// Encode message and fix colon issue (gateway not decoding %3A)
String encodedMsg = URLEncoder.encode(message, StandardCharsets.UTF_8)
.replace("%3A", ":");
String urlString = appConfig.getOtpUrl()
+ "from=GCCCRP"
+ "&key=" + key
+ "&sender=GCCCRP"
+ "&to=" + mobileNo
+ "&body=" + encodedMsg
+ "&entityid=1401572690000011081"
+ "&templateid=1407176959304753543";
System.out.println("SMS URL:- " + urlString);
String response = messageUtility.sendSMS(urlString);
System.out.println("SMS RESPONSE:- " + response);
return response;
}
// public String userrequestRejectedsms(String mobileNo, String requestId) {
// String message = "Your Flag Pole permission request has been rejected. "
// + "Request ID: " + requestId + ". "
// + "Review the details in the portal
// https://gccservices.in/flagpolesregistration/status\n"
// + "By GCC";
// // ONLY encode. Do NOT replace %3A
// String encodedMsg = URLEncoder.encode(message, StandardCharsets.UTF_8);
// String urlString = appConfig.getOtpUrl()
// + "from=GCCCRP"
// + "&key=" + key
// + "&sender=GCCCRP"
// + "&to=" + mobileNo
// + "&body=" + encodedMsg
// + "&entityid=1401572690000011081"
// + "&templateid=1407176959315374790";
// System.out.println("SMS URL:- " + urlString);
// String response = messageUtility.sendSMS(urlString);
// System.out.println("SMS RESPONSE:- " + response);
// return response;
// }
public String userrequestRejectedsms(String mobileNo, String requestId) {
System.out.println("Rejected Mob Num SMSSSSSSS = " + mobileNo);
String url = "https://gccservices.in/flagpolesregistration/status";
String message = "Your Flag Pole permission request has been rejected. Request ID: " + requestId
+ ". Review the details in the portal " + url + "\r\nBy GCC";
String encodedMsg = URLEncoder.encode(message, StandardCharsets.UTF_8);
System.out.println("encodedMsg:- " + encodedMsg);
String urlString = appConfig.getOtpUrl()
+ "from=GCCCRP"
+ "&key=" + key
// + "&sender=GCCCRP"
+ "&to=" + mobileNo
+ "&body=" + encodedMsg
+ "&entityid=1401572690000011081"
+ "&templateid=1407176959315374790";
System.out.println("SMS URL:- " + urlString);
String response = messageUtility.sendSMS(urlString);
System.out.println("SMS RESPONSE:- " + response);
return response;
}
}

1195
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/service/RdoService.java
File diff suppressed because it is too large
View File

45
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/service/WhatsappServiceFlagPole.java

@ -1,28 +1,31 @@
package in.gov.chennaicorporation.gccoffice.flagpole.service;
// package in.gov.chennaicorporation.gccoffice.flagpole.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.stereotype.Service;
@Service
public class WhatsappServiceFlagPole {
// @Service
// public class WhatsappServiceFlagPole {
@Autowired
private SmsServiceFlagPole smsService;
// @Autowired
// private SMSService smsService;
// c & d waste template after user register
public void sendOfficerApprovedWhatsappMessage(String refId, String mobileNumber) {
try {
// // c & d waste template after user register
// public void sendOfficerApprovedWhatsappMessage(String refId, String
// mobileNumber) {
// try {
String apiUrl = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="
+ mobileNumber
+ "&v=1.1&format=json&msg_type=IMAGE&method=SENDMEDIAMESSAGE&caption=Welcome+to+Greater+Chennai+Corporation%2C+%0A%0AYour+Registered+ID+is+%2A${registerId}%2A+.%0AYour+C%26D+waste+registration+has+been+approved+successfully.+%0A%0AFor+downloading+your+ID+card%2C+kindly+click+on+the+button+below+%F0%9F%91%87&media_url=https%3A%2F%2Fres.cloudinary.com%2Fdpub5muar%2Fimage%2Fupload%2Fv1729597847%2Fq2ihjs99puhhwkjzajyo.png&isTemplate=true&buttonUrlParam=userdetail%3Fregister_id%3D"
+ refId;
// String apiUrl =
// "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="
// + mobileNumber
// +
// "&v=1.1&format=json&msg_type=IMAGE&method=SENDMEDIAMESSAGE&caption=Welcome+to+Greater+Chennai+Corporation%2C+%0A%0AYour+Registered+ID+is+%2A${registerId}%2A+.%0AYour+C%26D+waste+registration+has+been+approved+successfully.+%0A%0AFor+downloading+your+ID+card%2C+kindly+click+on+the+button+below+%F0%9F%91%87&media_url=https%3A%2F%2Fres.cloudinary.com%2Fdpub5muar%2Fimage%2Fupload%2Fv1729597847%2Fq2ihjs99puhhwkjzajyo.png&isTemplate=true&buttonUrlParam=userdetail%3Fregister_id%3D"
// + refId;
System.out.println("WhatsApp API URL: " + apiUrl); // Optional debug
smsService.sendMsg(apiUrl);
// System.out.println("WhatsApp API URL: " + apiUrl); // Optional debug
// smsService.sendMsg(apiUrl);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// }

41
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/flagpole/util/MessageUtility.java

@ -0,0 +1,41 @@
package in.gov.chennaicorporation.gccoffice.flagpole.util;
import java.net.HttpURLConnection;
import java.net.URL;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class MessageUtility {
public String sendMsg(String msgUrl) {
System.out.println("Whatsapp URL :-" + msgUrl);
String response = "";
try {
HttpURLConnection connection = null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response = responseCode + "";
System.out.println("Response Code: " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public String sendSMS(String SMS_Url) {
// System.out.println("SMS URL:- " + SMS_Url);
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(SMS_Url, String.class);
return response;
}
}

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

@ -19,6 +19,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class PendinglistService {
@ -405,6 +406,7 @@ public class PendinglistService {
}
}
@Transactional
public Map<String, Object> saveReInspection(String refId, int action, int meetingId,
String remarks, int userId) {
@ -433,6 +435,8 @@ public class PendinglistService {
// 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);
response.put("status", "success");
response.put("message", "Committee decision saved!");
response.put("reinspection_id", generatedId);

3
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/nulm/controller/NulmAPIController.java

@ -488,10 +488,11 @@ public class NulmAPIController {
public ResponseEntity<List<Map<String, Object>>> getAttendanceWithInitiatedSalaryByGroupId(
@RequestParam(value = "inchargeId", required = false) Integer inchargeId,
@RequestParam(value = "month", required = false) String month,
@RequestParam(value = "year", required = false) String year,
@RequestParam(value = "incharge_name", required = false) String inchargeName,
@RequestParam (value = "enrollmentIds", required = false) List<Integer> enrollmentIds) {
List<Map<String, Object>> staffList = nulmService.getAttendanceWithInitiatedSalary(inchargeId, month, inchargeName, enrollmentIds);
List<Map<String, Object>> staffList = nulmService.getAttendanceWithInitiatedSalary(inchargeId, month, year, inchargeName, enrollmentIds);
return ResponseEntity.ok(staffList);
}
/*

9
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/nulm/service/NulmService.java

@ -1176,7 +1176,7 @@ public class NulmService {
*/
public List<Map<String, Object>> getAttendanceWithInitiatedSalary(
int inchargeId, String month, String inchargeName, List<Integer> enrollmentIds) {
int inchargeId, String month, String year, String inchargeName, List<Integer> enrollmentIds) {
String sql = "SELECT " +
"e.group_id, " +
@ -1207,6 +1207,10 @@ public class NulmService {
if (month != null && !month.isEmpty()) {
sql += "AND MONTHNAME(COALESCE(a.indatetime, a.leavedatetime, a.oddatetime)) = ? ";
}
if (year != null && !year.isEmpty()) {
sql += "AND YEAR(COALESCE(a.indatetime, a.leavedatetime, a.oddatetime)) = ? ";
}
// Assuming enrollmentIds is a List<String> or List<Integer>
StringBuilder placeholders = new StringBuilder();
@ -1240,6 +1244,9 @@ public class NulmService {
if (month != null && !month.isEmpty()) {
params.add(month);
}
if (year != null && !year.isEmpty()) {
params.add(year);
}
params.addAll(enrollmentIds);

4
gcc_officer_portal/src/main/resources/application.properties

@ -1,5 +1,5 @@
#spring.profiles.active=local
spring.profiles.active=production
spring.profiles.active=local
# spring.profiles.active=production
#For Server production
#assets.base-url=/gcc/assets/
#For local test

4
gcc_officer_portal/src/main/resources/templates/modules/callcenterqaqc/socialmediacomplaints.html

@ -615,7 +615,7 @@
<select class="form-control" id="action">
<option value="">Select</option>
<option value="COMPLETED">COMPLETED</option>
<option value="REOPENED">REOPEN</option>
<option value="REOPEN">REOPEN</option>
</select>
</td>`
: '-';
@ -1037,7 +1037,7 @@
return; // Stop execution if no action is selected
}
if (actionValue === "REOPENED" && remarksValue.trim() === "") {
if (actionValue === "REOPEN" && remarksValue.trim() === "") {
Swal.fire({
icon: 'warning',
title: 'Remarks Required',

29
gcc_officer_portal/src/main/resources/templates/modules/flagpole/approvedandrejectedlist.html

@ -141,7 +141,7 @@
<h3 class="mb-0">Temporary Flag Poles - Approved & Rejected List : <span
th:text="${officer_name}"></span></h3>
<input type="hidden" id="userName" th:value="${officer_name}">
<input type="hidden" id="loginuserid" th:value="${LoginUserId}">
</div>
@ -314,11 +314,14 @@
function loadTable() {
let officer_name = $("#userName").val();
//let officer_name = $("#userName").val();
let gccUserId = $("#loginuserid").val();
let startDate = $("#startDate").val();
let endDate = $("#endDate").val();
let status = $("#statusFilter").val();
console.log("gccuserid", gccUserId);
if ($.fn.DataTable.isDataTable('#QaqcDatatable')) {
$('#QaqcDatatable').DataTable().clear().destroy();
}
@ -333,7 +336,8 @@
url: "/gcc/api/flagpoleregistration/getApprovedAndRejectedDetails",
type: "GET",
data: {
userLogin: officer_name,
//userLogin: officer_name,
gccUserId: gccUserId,
startDate: startDate,
endDate: endDate,
status: status
@ -347,9 +351,10 @@
data.forEach(r => {
let status = r.history && r.history.length > 0
? r.history[0].status
? r.history[r.history.length - 1].status
: null;
if (!status) pending++;
else if (status === 'APPROVED') approved++;
else if (status === 'REJECTED') rejected++;
@ -423,9 +428,10 @@
render: row => {
let status = row.history && row.history.length > 0
? row.history[0].status
? row.history[row.history.length - 1].status
: null;
if (!status)
return `<span class="badge bg-warning text-dark">Pending</span>`;
if (status === 'APPROVED')
@ -563,7 +569,7 @@
record.history.forEach((h, index) => {
historyHtml += `
<div class="row mb-2 border-bottom pb-2">
<div class="col-md-4">
<div class="col-md-3">
<div class="label-text">Action Date</div>
<div class="value-text">${h.action_date}</div>
</div>
@ -574,22 +580,15 @@
</div>
<div class="col-md-2">
<div class="col-md-3">
<div class="label-text">Status</div>
<div class="value-text">${h.status}</div>
</div>
<div class="col-md-2">
<div class="label-text">RDO Status</div>
<div class="value-text">
${record.rdo_status || "-"}
</div>
</div>
${h.remarks ? `
<div class="col-md-2 mt-1">
<div class="col-md-3">
<div class="label-text">Remarks</div>
<div class="value-text">${h.remarks}</div>
</div>` : ""}

315
gcc_officer_portal/src/main/resources/templates/modules/flagpole/requestlist.html

@ -139,6 +139,7 @@
<h3 class="mb-0">Temporary Flag Poles - Request List : <span
th:text="${officer_name}"></span></h3>
<input type="hidden" id="userName" th:value="${officer_name}">
<input type="hidden" id="loginuserid" th:value="${LoginUserId}">
</div>
<div class="row mt-3 ml-2">
@ -277,6 +278,20 @@
<div class="modal fade" id="imagePreviewModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Document Preview</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body text-center">
<img id="previewImage" class="img-fluid">
</div>
</div>
</div>
</div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
@ -297,12 +312,132 @@
});
});
$(document).on("click", ".zoom-img", function () {
const src = $(this).data("src");
$("#previewImage").attr("src", src);
$("#imagePreviewModal").modal("show");
});
// function loadTable() {
// let officer_name = $("#userName").val();
// let startDate = $("#startDate").val();
// let endDate = $("#endDate").val();
// if ($.fn.DataTable.isDataTable('#QaqcDatatable')) {
// $('#QaqcDatatable').DataTable().clear().destroy();
// }
// table = $('#QaqcDatatable').DataTable({
// processing: true,
// responsive: true,
// scrollY: '50vh',
// dom: 'Bfrtip', // 🔥 ENABLE BUTTONS
// ajax: {
// url: "/gcc/api/flagpoleregistration/getAllDetails",
// type: "GET",
// data: {
// userLogin: officer_name,
// startDate: startDate,
// endDate: endDate
// },
// dataSrc: function (json) {
// const data = json.data || [];
// // 🔹 Dashboard counts
// let pending = 0, approved = 0, rejected = 0;
// data.forEach(r => {
// if (!r.rdo_status) pending++;
// else if (r.rdo_status === 'APPROVED') approved++;
// else if (r.rdo_status === 'REJECTED') rejected++;
// });
// $("#totalrequest").text(data.length);
// $("#pendingdecision").text(pending);
// $("#approved").text(approved);
// $("#rejected").text(rejected);
// return data; // ✅ already unique per refid
// }
// },
// columns: [
// {
// data: null,
// className: "text-center",
// render: (d, t, r, m) => m.row + 1
// },
// {
// data: "applicant_name",
// className: "text-center"
// },
// {
// data: "refid",
// className: "text-center"
// },
// {
// data: null,
// className: "text-center",
// render: row => {
// if (!row.streets || row.streets.length === 0) return "-";
// return `${row.streets[0].zone} / ${row.streets[0].ward}`;
// }
// },
// {
// data: "event_name",
// className: "text-center"
// },
// {
// data: "event_date",
// className: "text-center",
// render: d => new Date(d).toLocaleDateString("en-GB")
// },
// {
// data: "total_cost",
// className: "text-center",
// render: d => d.toLocaleString("en-GB")
// },
// {
// data: "rdo_status",
// className: "text-center",
// render: d => {
// if (!d)
// return `<span class="badge bg-warning text-dark">Pending</span>`;
// if (d === 'APPROVED')
// return `<span class="badge bg-success">Approved</span>`;
// return `<span class="badge bg-danger">Rejected</span>`;
// }
// },
// {
// data: null,
// className: "text-center",
// render: row =>
// `<button class="btn btn-primary btn-sm viewBtn"
// data-refid="${row.refid}">
// View
// </button>`
// }
// ]
// });
// }
function loadTable() {
let officer_name = $("#userName").val();
let gccUserId = $("#loginuserid").val();
let startDate = $("#startDate").val();
let endDate = $("#endDate").val();
console.log("gccuserid:" + gccUserId);
if ($.fn.DataTable.isDataTable('#QaqcDatatable')) {
$('#QaqcDatatable').DataTable().clear().destroy();
}
@ -311,13 +446,13 @@
processing: true,
responsive: true,
scrollY: '50vh',
dom: 'Bfrtip', // 🔥 ENABLE BUTTONS
dom: 'Bfrtip',
ajax: {
url: "/gcc/api/flagpoleregistration/getAllDetails",
type: "GET",
data: {
userLogin: officer_name,
gccUserId: gccUserId,
startDate: startDate,
endDate: endDate
},
@ -325,50 +460,47 @@
const data = json.data || [];
// 🔹 Dashboard counts
let pending = 0, approved = 0, rejected = 0;
// data.forEach(r => {
// if (!r.rdo_status) pending++;
// else if (r.rdo_status === 'APPROVED') approved++;
// else if (r.rdo_status === 'REJECTED') rejected++;
// });
data.forEach(r => {
if (!r.rdo_status) pending++;
else if (r.rdo_status === 'APPROVED') approved++;
else if (r.rdo_status === 'REJECTED') rejected++;
const status = r.final_status;
if (!status) pending++;
else if (status === 'APPROVED') approved++;
else if (status === 'REJECTED') rejected++;
});
$("#totalrequest").text(data.length);
$("#pendingdecision").text(pending);
$("#approved").text(approved);
$("#rejected").text(rejected);
return data; // ✅ already unique per refid
return data;
}
},
columns: [
{ data: null, render: (d, t, r, m) => m.row + 1, className: "text-center" },
{ data: "applicant_name", className: "text-center" },
{ data: "refid", className: "text-center" },
{
data: null,
className: "text-center",
render: (d, t, r, m) => m.row + 1
},
{
data: "applicant_name",
className: "text-center"
},
{
data: "refid",
className: "text-center"
},
{
data: null,
className: "text-center",
render: row => {
if (!row.streets || row.streets.length === 0) return "-";
return `${row.streets[0].zone} / ${row.streets[0].ward}`;
}
},
{
data: "event_name",
className: "text-center"
render: r =>
r.streets?.length
? `${r.streets[0].zone} / ${r.streets[0].ward}`
: "-"
},
{ data: "event_name", className: "text-center" },
{
data: "event_date",
className: "text-center",
@ -379,23 +511,38 @@
className: "text-center",
render: d => d.toLocaleString("en-GB")
},
// {
// data: "rdo_status",
// className: "text-center",
// render: d =>
// !d
// ? `<span class="badge bg-warning text-dark">Pending</span>`
// : d === 'APPROVED'
// ? `<span class="badge bg-success">Approved</span>`
// : `<span class="badge bg-danger">Rejected</span>`
// },
{
data: "rdo_status",
data: null,
className: "text-center",
render: d => {
if (!d)
render: r => {
const status = r.final_status;
if (!status)
return `<span class="badge bg-warning text-dark">Pending</span>`;
if (d === 'APPROVED')
else if (status === 'APPROVED')
return `<span class="badge bg-success">Approved</span>`;
else
return `<span class="badge bg-danger">Rejected</span>`;
}
},
{
data: null,
className: "text-center",
render: row =>
render: r =>
`<button class="btn btn-primary btn-sm viewBtn"
data-refid="${row.refid}">
data-refid="${r.refid}">
View
</button>`
}
@ -404,6 +551,7 @@
}
// 🔹 View button action
// Destroy previous instance if exists
@ -429,6 +577,9 @@
});
function populateModal(record) {
// HEADER
@ -499,7 +650,7 @@
record.history.forEach((h, index) => {
historyHtml += `
<div class="row mb-2 border-bottom pb-2">
<div class="col-md-4">
<div class="col-md-3">
<div class="label-text">Action Date</div>
<div class="value-text">${h.action_date}</div>
</div>
@ -511,22 +662,14 @@
<div class="col-md-2">
<div class="col-md-3">
<div class="label-text">Status</div>
<div class="value-text">${h.status}</div>
</div>
<div class="col-md-2">
<div class="label-text">RDO Status</div>
<div class="value-text">
${record.rdo_status || "-"}
</div>
</div>
${h.remarks ? `
<div class="col-md-12 mt-1">
<div class="col-md-3">
<div class="label-text">Remarks</div>
<div class="value-text">${h.remarks}</div>
</div>` : ""}
@ -540,7 +683,7 @@
let decisionHtml = "";
// 🔹 Show decision buttons ONLY if pending
if (!record.rdo_status) {
if (!record.final_status) {
decisionHtml = `
<div class="rdo-box">
<div class="section-title">Department Decision</div>
@ -550,10 +693,10 @@
<div class="d-flex justify-content-between">
<button class="btn btn-success btn-big"
onclick="submitRdoDecision('APPROVED')">Approve</button>
onclick="submitOfficerDecision('APPROVED')">Approve</button>
<button class="btn btn-danger btn-big"
onclick="submitRdoDecision('REJECTED')">Reject</button>
onclick="submitOfficerDecision('REJECTED')">Reject</button>
</div>
</div>`;
}
@ -633,11 +776,76 @@
function submitRdoDecision(status) {
// function submitRdoDecision(status) {
// let remarks = ($("#rdoRemarks").val() || "").trim();
// let refid = $("#detailsModal").data("refid");
// let gccUserId = $("#loginuserid").val(); // 🔥 ONLY THIS
// //let approvedBy = $("#userName").val(); // 🔥 FROM HIDDEN INPUT
// if (!remarks) {
// Swal.fire({
// icon: 'warning',
// title: 'Remarks Required',
// text: 'Please enter remarks before submitting'
// });
// return;
// }
// Swal.fire({
// title: `Are you sure?`,
// text: `You want to ${status.toLowerCase()} this request`,
// icon: status === 'APPROVED' ? 'success' : 'error',
// showCancelButton: true,
// confirmButtonColor: status === 'APPROVED' ? '#28a745' : '#dc3545',
// cancelButtonColor: '#6c757d',
// confirmButtonText: `Yes, ${status}`
// }).then((result) => {
// if (!result.isConfirmed) return;
// $.ajax({
// url: "/gcc/api/flagpoleregistration/rdo/updateDecision",
// type: "POST",
// data: {
// refid: refid,
// status: status,
// remarks: remarks,
// gccUserId: gccUserId
// //approvedBy: approvedBy // 🔥 PASS TO BACKEND
// },
// success: function (res) {
// Swal.fire({
// icon: 'success',
// title: status === 'APPROVED' ? 'Approved!' : 'Rejected!',
// text: res.message || `Request has been ${status.toLowerCase()}`,
// timer: 2000,
// showConfirmButton: false
// });
// $("#detailsModal").modal("hide");
// $("#QaqcDatatable").DataTable().ajax.reload(null, false);
// },
// error: function () {
// Swal.fire({
// icon: 'error',
// title: 'Error',
// text: 'Failed to update decision'
// });
// }
// });
// });
// }
function submitOfficerDecision(status) {
let remarks = ($("#rdoRemarks").val() || "").trim();
let refid = $("#detailsModal").data("refid");
let approvedBy = $("#userName").val(); // 🔥 FROM HIDDEN INPUT
let gccUserId = $("#loginuserid").val(); // login user id
let username = $("#userName").val(); // display username
if (!remarks) {
Swal.fire({
@ -661,13 +869,14 @@
if (!result.isConfirmed) return;
$.ajax({
url: "/gcc/api/flagpoleregistration/rdo/updateDecision",
url: "/gcc/api/flagpoleregistration/officer/updateDecision",
type: "POST",
data: {
refid: refid,
status: status,
remarks: remarks,
approvedBy: approvedBy // 🔥 PASS TO BACKEND
gccUserId: gccUserId,
username: username // ✅ NEW
},
success: function (res) {

1
gcc_officer_portal/src/main/resources/templates/modules/m_petition/complaint_list.html

@ -74,6 +74,7 @@
<label for="searchyear">Select Year</label>
<select class="form-control" name="searchyear" id="searchyear" required="">
<option value="" selected="" disabled="">Select Year</option>
<option value="2026">2026</option>
<option value="2025">2025</option>
<option value="2024">2024</option>
<option value="2023">2023</option>

1
gcc_officer_portal/src/main/resources/templates/modules/m_petition/petition_list.html

@ -74,6 +74,7 @@
<label for="searchyear">Select Year</label>
<select class="form-control" name="searchyear" id="searchyear" required="">
<option value="" selected="" disabled="">Select Year</option>
<option value="2026">2026</option>
<option value="2025">2025</option>
<option value="2024">2024</option>
<option value="2023">2023</option>

3
gcc_officer_portal/src/main/resources/templates/modules/nulm/salary-approve.html

@ -101,6 +101,7 @@
<a href="#" class="total-staff-count"
th:data-incharge-id="${salaryInitiatedCounts.incharge_id}"
th:data-month="${salaryInitiatedCounts.month}"
th:data-year="${salaryInitiatedCounts.year}"
th:data-incharge-name="${salaryInitiatedCounts.incharge_name}"
th:data-zone="${salaryInitiatedCounts.zone}"
th:data-enrollment-ids="${salaryInitiatedCounts.enrollment_ids}"
@ -282,6 +283,7 @@
// var inchargeName = $(this).data('incharge-name');
var inchargeId = $(this).data('incharge-id')
var month = $(this).data('month')
var year = $(this).data('year')
var inchargeName = $(this).data('incharge-name')
var zone = $(this).data('zone');
var enrollmentIds = $(this).data('enrollment-ids');
@ -295,6 +297,7 @@
//inchargeName: inchargeName,
inchargeId: inchargeId,
month: month,
year: year,
inchargeName: inchargeName,
enrollmentIds: enrollmentIds.join(',')
},

Loading…
Cancel
Save