Browse Source

Changes in 1913 socialmedia closing complaint API

master
Hariprasath S 2 months ago
parent
commit
19482571b1
  1. 32
      .classpath
  2. 23
      .project
  3. 4
      .settings/org.eclipse.core.resources.prefs
  4. 9
      .settings/org.eclipse.jdt.core.prefs
  5. 4
      .settings/org.eclipse.m2e.core.prefs
  6. BIN
      gccoffice_uploads/socialmedia_1913_regcompfiles/2026/08/resolved_img_06082026175501_Screenshot(11).png
  7. 5
      src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/SocialMediaApiController.java
  8. 317
      src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/SocialMediaService.java
  9. 4
      src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java
  10. 26
      src/main/java/in/gov/chennaicorporation/gccoffice/vendor/controller/ApiController.java
  11. 70
      src/main/java/in/gov/chennaicorporation/gccoffice/vendor/controller/CreateEventAPIController.java
  12. 29
      src/main/java/in/gov/chennaicorporation/gccoffice/vendor/controller/MainController.java
  13. 214
      src/main/java/in/gov/chennaicorporation/gccoffice/vendor/service/StreetVendorService.java
  14. 198
      src/main/java/in/gov/chennaicorporation/gccoffice/vendor/service/createventService.java
  15. 1
      src/main/resources/application-local.properties
  16. 67
      src/main/resources/templates/modules/callcenterqaqc/socialmediaregcompclosing.html
  17. 68
      src/main/resources/templates/modules/vendors/EventList.html
  18. 69
      src/main/resources/templates/modules/vendors/RequestList.html
  19. 891
      src/main/resources/templates/modules/vendors/approvedcertificates.html
  20. 716
      src/main/resources/templates/modules/vendors/certificate.html
  21. 658
      src/main/resources/templates/modules/vendors/streetVendorRequestForm.html
  22. 225
      src/main/resources/templates/modules/vendors/streetVendorRequestList.html
  23. 591
      src/main/resources/templates/modules/vendors/zonerequests.html

32
.classpath

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

23
.project

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>gccoffice</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

4
.settings/org.eclipse.core.resources.prefs

@ -0,0 +1,4 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding/<project>=UTF-8

9
.settings/org.eclipse.jdt.core.prefs

@ -0,0 +1,9 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
org.eclipse.jdt.core.compiler.compliance=17
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=17

4
.settings/org.eclipse.m2e.core.prefs

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

BIN
gccoffice_uploads/socialmedia_1913_regcompfiles/2026/08/resolved_img_06082026175501_Screenshot(11).png

After

Width: 1920  |  Height: 1080  |  Size: 285 KiB

5
src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/SocialMediaApiController.java

@ -433,6 +433,11 @@ public class SocialMediaApiController {
return socialservice.getFilteredRegComps(); return socialservice.getFilteredRegComps();
} }
@GetMapping("/getcompstatus")
public Map<String, Object> getcompstatus(String complaintNumber) {
return socialservice.getcompstatus(complaintNumber);
}
@PostMapping("/approveComplaint") @PostMapping("/approveComplaint")
@ResponseBody @ResponseBody
public Map<String, Object> approveComplaint( public Map<String, Object> approveComplaint(

317
src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/SocialMediaService.java

@ -6,6 +6,8 @@ import java.util.Base64;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -373,16 +375,19 @@ public class SocialMediaService {
// Get the bytes of the file // Get the bytes of the file
byte[] bytes = file.getBytes(); byte[] bytes = file.getBytes();
String originalFileName = file.getOriginalFilename();
String extension = originalFileName.substring(originalFileName.lastIndexOf('.') + 1).toLowerCase();
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50%quality
if ("jpg".equals(extension) || "jpeg".equals(extension)) {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
byte[] compressedBytes = compressImage(image, 0.5f); // Compress with 50% quality
// Write the bytes to the file
Files.write(path, bytes);
// Write the bytes to the file
Files.write(path, compressedBytes);
// Write the compressed bytes to the file
Files.write(path, compressedBytes);
} else {
// Write the original bytes to the file
Files.write(path, bytes);
}
//System.out.println(filePath); //System.out.println(filePath);
return filepath_txt; return filepath_txt;
@ -428,52 +433,60 @@ public class SocialMediaService {
if (responseEntity.getStatusCode().is2xxSuccessful()) { if (responseEntity.getStatusCode().is2xxSuccessful()) {
String responseBody = responseEntity.getBody(); String responseBody = responseEntity.getBody();
//System.out.println("Response Body: " + responseBody);
//System.out.println("RAW Response Body: " + responseBody);
// Fix malformed fields
responseBody = fixMalformedField(responseBody, "complaintdetails", "OfficialMobile");
responseBody = fixMalformedField(responseBody, "mediaLink", "COMP_MODE");
//
// System.out.println("Altered Response Body: " + responseBody);
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody); JsonNode rootNode = mapper.readTree(responseBody);
JsonNode complaintDetails = rootNode.path(0).path("ComplaintListHistory").path(0); JsonNode complaintDetails = rootNode.path(0).path("ComplaintListHistory").path(0);
String registerDate=complaintDetails.path("complaintopendate").asText("N/A");
//System.out.println("registerdate====="+registerDate);
String formattedDate = "N/A"; // Default value if parsing fails
if (!registerDate.equals("N/A") && !registerDate.isEmpty()) {
try {
// Parse the input date string
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
Date date = inputFormat.parse(registerDate);
// Format the date to dd-MM-yyyy
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy");
formattedDate = outputFormat.format(date);
} catch (Exception e) {
e.printStackTrace(); // Log exception for debugging
}
}
// String registerDate=complaintDetails.path("complaintopendate").asText("N/A");
// //System.out.println("registerdate====="+registerDate);
//
// String formattedDate = "N/A"; // Default value if parsing fails
//
// if (!registerDate.equals("N/A") && !registerDate.isEmpty()) {
// try {
// // Parse the input date string
// SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
// Date date = inputFormat.parse(registerDate);
//
// // Format the date to dd-MM-yyyy
// SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy");
// formattedDate = outputFormat.format(date);
// } catch (Exception e) {
// e.printStackTrace(); // Log exception for debugging
// }
// }
if (!complaintDetails.isMissingNode()) { if (!complaintDetails.isMissingNode()) {
// Existing fields // Existing fields
resultMap.put("complaintid", complaintDetails.path("complaintid").asText("N/A"));
resultMap.put("complaintdate", formattedDate);
resultMap.put("complainantName", complaintDetails.path("CustomerName").asText("N/A"));
resultMap.put("mobileNumber", complaintDetails.path("CustomerMobile").asText("N/A"));
resultMap.put("complaintType", complaintDetails.path("complainttype").asText("N/A"));
resultMap.put("description", complaintDetails.path("complaintdetails").asText("N/A"));
// resultMap.put("complaintid", complaintDetails.path("complaintid").asText("N/A"));
// resultMap.put("complaintdate", formattedDate);
// resultMap.put("complainantName", complaintDetails.path("CustomerName").asText("N/A"));
// resultMap.put("mobileNumber", complaintDetails.path("CustomerMobile").asText("N/A"));
// resultMap.put("complaintType", complaintDetails.path("complainttype").asText("N/A"));
//resultMap.put("description", complaintDetails.path("complaintdetails").asText("N/A"));
resultMap.put("currentStatus", complaintDetails.path("complaintcurrentstatus").asText("N/A")); resultMap.put("currentStatus", complaintDetails.path("complaintcurrentstatus").asText("N/A"));
resultMap.put("Street", complaintDetails.path("Street").asText("N/A"));
resultMap.put("Area", complaintDetails.path("Area").asText("N/A"));
resultMap.put("Landmark", complaintDetails.path("Landmark").asText("N/A"));
resultMap.put("Location", complaintDetails.path("Location").asText("N/A"));
resultMap.put("Zone", complaintDetails.path("Zone").asText("N/A"));
resultMap.put("Division", complaintDetails.path("Division").asText("N/A"));
resultMap.put("OfficialMobile", complaintDetails.path("OfficialMobile").asText("N/A"));
resultMap.put("gender", complaintDetails.path("GENDER").asText("N/A"));
resultMap.put("deptname",complaintDetails.path("DEPT_NAME").asText("N/A"));
resultMap.put("compmode", complaintDetails.path("COMP_MODE").asText("N/A"));
resultMap.put("Officialname", complaintDetails.path("Officialname").asText("N/A"));
// resultMap.put("Street", complaintDetails.path("Street").asText("N/A"));
// resultMap.put("Area", complaintDetails.path("Area").asText("N/A"));
// resultMap.put("Landmark", complaintDetails.path("Landmark").asText("N/A"));
// resultMap.put("Location", complaintDetails.path("Location").asText("N/A"));
// resultMap.put("Zone", complaintDetails.path("Zone").asText("N/A"));
// resultMap.put("Division", complaintDetails.path("Division").asText("N/A"));
// resultMap.put("OfficialMobile", complaintDetails.path("OfficialMobile").asText("N/A"));
// resultMap.put("gender", complaintDetails.path("GENDER").asText("N/A"));
// resultMap.put("deptname",complaintDetails.path("DEPT_NAME").asText("N/A"));
// resultMap.put("compmode", complaintDetails.path("COMP_MODE").asText("N/A"));
// resultMap.put("Officialname", complaintDetails.path("Officialname").asText("N/A"));
} }
@ -487,6 +500,29 @@ public class SocialMediaService {
return resultMap; return resultMap;
} }
private String fixMalformedField(String json, String fieldName, String nextFieldName) {
Pattern pattern = Pattern.compile(
"\"" + Pattern.quote(fieldName) + "\":\"\"(.*?)\"\",\"" + Pattern.quote(nextFieldName) + "\"",
Pattern.DOTALL);
Matcher matcher = pattern.matcher(json);
if (matcher.find()) {
String value = matcher.group(1);
// Escape any quotes inside the value
value = value.replace("\"", "\\\"");
json = matcher.replaceFirst(
"\"" + fieldName + "\":\"" +
Matcher.quoteReplacement(value) +
"\",\"" + nextFieldName + "\"");
}
return json;
}
public Map<String, Object> getFilteredRegComps() { public Map<String, Object> getFilteredRegComps() {
@ -495,7 +531,7 @@ public class SocialMediaService {
try { try {
String sql = String sql =
"SELECT src.complaint_number, src.created_date,CONCAT('" + fileBaseUrl + "/gcc/files',src.resolved_img) AS img_full_path,al.agent_name as agent_name,src.remarks as remarks" +
"SELECT src.complaint_number as complaintnumber, date_format(src.created_date,'%d-%m-%Y %H:%i') as submitted_date,CONCAT('" + fileBaseUrl + "/gcc/files',src.resolved_img) AS img_full_path,al.agent_name as agent_name,src.remarks as remarks" +
" FROM socialmedia_reg_completed src " " FROM socialmedia_reg_completed src "
+ " LEFT JOIN agents_list al ON al.agent_id=src.cby " + + " LEFT JOIN agents_list al ON al.agent_id=src.cby " +
"WHERE src.is_processed = 0 " + "WHERE src.is_processed = 0 " +
@ -504,70 +540,70 @@ public class SocialMediaService {
List<Map<String, Object>> dbList = jdbcTemplate.queryForList(sql); List<Map<String, Object>> dbList = jdbcTemplate.queryForList(sql);
List<Map<String, Object>> finalList = new ArrayList<>();
for (Map<String, Object> row : dbList) {
String complaintNumber =
String.valueOf(row.get("complaint_number"));
Map<String, Object> complaintDetails =
getDetailsByComplaintNumber(complaintNumber);
String currentStatus =
String.valueOf(
complaintDetails.getOrDefault(
"currentStatus",
""
)
);
//System.out.println("currentStatus==="+currentStatus);
if ("REGISTERED".equalsIgnoreCase(currentStatus)
|| "FORWARDED".equalsIgnoreCase(currentStatus)) {
Map<String, Object> resultRow = new HashMap<>();
resultRow.put("complaintnumber", complaintNumber);
//resultRow.put("submitted_date", row.get("created_date"));
Timestamp ts = (Timestamp) row.get("created_date");
SimpleDateFormat sdf =
new SimpleDateFormat("dd/MM/yyyy HH:mm");
resultRow.put("submitted_date", sdf.format(ts));
String img = (String) row.get("img_full_path");
resultRow.put("img_full_path", img);
String agent_name = (String) row.get("agent_name");
resultRow.put("agent_name", agent_name);
String remarks = (String) row.get("remarks");
resultRow.put("remarks", remarks);
finalList.add(resultRow);
} else {
String updateSql =
"UPDATE socialmedia_reg_completed " +
"SET updated_by = ?, " +
"updated_date = NOW(), " +
"isactive = 0, " +
"isdelete = 1 " +
"WHERE complaint_number = ?";
jdbcTemplate.update(
updateSql,
0,
complaintNumber
);
}
}
if (finalList.isEmpty()) {
// List<Map<String, Object>> finalList = new ArrayList<>();
//
// for (Map<String, Object> row : dbList) {
//
// String complaintNumber =
// String.valueOf(row.get("complaint_number"));
//
// Map<String, Object> complaintDetails =
// getDetailsByComplaintNumber(complaintNumber);
//
// String currentStatus =
// String.valueOf(
// complaintDetails.getOrDefault(
// "currentStatus",
// ""
// )
// );
//
// //System.out.println("currentStatus==="+currentStatus);
//
// if ("REGISTERED".equalsIgnoreCase(currentStatus)
// || "FORWARDED".equalsIgnoreCase(currentStatus)) {
//
// Map<String, Object> resultRow = new HashMap<>();
//
// resultRow.put("complaintnumber", complaintNumber);
// //resultRow.put("submitted_date", row.get("created_date"));
// Timestamp ts = (Timestamp) row.get("created_date");
//
// SimpleDateFormat sdf =
// new SimpleDateFormat("dd/MM/yyyy HH:mm");
//
// resultRow.put("submitted_date", sdf.format(ts));
//
// String img = (String) row.get("img_full_path");
// resultRow.put("img_full_path", img);
//
// String agent_name = (String) row.get("agent_name");
// resultRow.put("agent_name", agent_name);
//
// String remarks = (String) row.get("remarks");
// resultRow.put("remarks", remarks);
//
// finalList.add(resultRow);
//
// } else {
//
// String updateSql =
// "UPDATE socialmedia_reg_completed " +
// "SET updated_by = ?, " +
// "updated_date = NOW(), " +
// "isactive = 0, " +
// "isdelete = 1 " +
// "WHERE complaint_number = ?";
//
// jdbcTemplate.update(
// updateSql,
// 0,
// complaintNumber
// );
// }
// }
if (dbList.isEmpty()) {
response.put("status", "nodata"); response.put("status", "nodata");
response.put("message", "No registered complaints found."); response.put("message", "No registered complaints found.");
@ -575,7 +611,7 @@ public class SocialMediaService {
} else { } else {
response.put("status", "success"); response.put("status", "success");
response.put("details", finalList);
response.put("details", dbList);
} }
} catch (Exception e) { } catch (Exception e) {
@ -592,9 +628,9 @@ public class SocialMediaService {
public Map<String, Object> approveComplaint(String complaintId, String remarks, String imgFullPath, String userid) { public Map<String, Object> approveComplaint(String complaintId, String remarks, String imgFullPath, String userid) {
Map<String, Object> response = new HashMap<>(); Map<String, Object> response = new HashMap<>();
try { try {
Integer updated_by = Integer.parseInt(userid); Integer updated_by = Integer.parseInt(userid);
String erp_name=get1913AdminErpusernamebyId(userid); String erp_name=get1913AdminErpusernamebyId(userid);
@ -819,4 +855,59 @@ public class SocialMediaService {
return response; return response;
} }
public Map<String, Object> getcompstatus(String complaintNumber) {
Map<String, Object> response = new HashMap<>();
try {
Map<String, Object> complaintDetails =
getDetailsByComplaintNumber(complaintNumber);
String currentStatus =
String.valueOf(
complaintDetails.getOrDefault(
"currentStatus",
""
)
);
//System.out.println("currentStatus==="+currentStatus);
if ("REGISTERED".equalsIgnoreCase(currentStatus)
|| "FORWARDED".equalsIgnoreCase(currentStatus)) {
response.put("status", "success");
response.put("message", "Status Not Changed");
} else {
String updateSql =
"UPDATE socialmedia_reg_completed " +
"SET updated_by = ?, " +
"updated_date = NOW(), " +
"isactive = 0, " +
"isdelete = 1 " +
"WHERE complaint_number = ? AND isactive = 1 AND isdelete = 0";
jdbcTemplate.update(
updateSql,
0,
complaintNumber
);
response.put("status", "changed");
response.put("message", complaintNumber+" Complaint Already Moved to "+currentStatus);
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
} }

4
src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java

@ -24,8 +24,8 @@ import java.util.Properties;
@EnableTransactionManagement @EnableTransactionManagement
public class DataSourceConfig { public class DataSourceConfig {
// private static String host = "localhost:3306";
// private static String dbpassword = "root";
// private static String host = "localhost:3306";
// private static String dbpassword = "root";
// private static String dbpassword = "gccroot"; // private static String dbpassword = "gccroot";

26
src/main/java/in/gov/chennaicorporation/gccoffice/vendor/controller/ApiController.java

@ -269,7 +269,11 @@ public class ApiController {
@RequestParam (required = false)String tamil_landmark, @RequestParam (required = false)String tamil_landmark,
@RequestParam (required = false)String tamil_gender, @RequestParam (required = false)String tamil_gender,
@RequestParam (required = false)String tamil_present_district, @RequestParam (required = false)String tamil_present_district,
@RequestParam String userId) {
@RequestParam String userId,
@RequestParam Integer religion,
@RequestParam(required = false) Integer diff_type,
@RequestParam(required = false) String other_disability,
@RequestParam(required = false) String familyDetails) {
//String presentAddress = door_no + ", " + streetname + ", " + areaname; //String presentAddress = door_no + ", " + streetname + ", " + areaname;
@ -331,7 +335,8 @@ public class ApiController {
streetVendorPhotoPath, name, f_h_name, mobile_number,dob, streetVendorPhotoPath, name, f_h_name, mobile_number,dob,
gender, social_category, diff_abled, education_status, marital_status, gender, social_category, diff_abled, education_status, marital_status,
no_of_fam_mem, are_any_fam_mem_invol_str,presentAddress, present_district, present_pincode, no_of_fam_mem, are_any_fam_mem_invol_str,presentAddress, present_district, present_pincode,
rationCardPath,aadharFrontPhotoPath, aadharBackPhotoPath,aadharNo,userId,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamilvending_category);
rationCardPath,aadharFrontPhotoPath, aadharBackPhotoPath,aadharNo,userId,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamilvending_category,
religion,diff_type,other_disability,familyDetails);
if (saveStatus == null || saveStatus.equals("error")) { if (saveStatus == null || saveStatus.equals("error")) {
return ResponseEntity.ok(Map.of( return ResponseEntity.ok(Map.of(
@ -458,7 +463,11 @@ public class ApiController {
@RequestParam (required = false)String tamil_gender, @RequestParam (required = false)String tamil_gender,
@RequestParam (required = false)String tamil_present_district, @RequestParam (required = false)String tamil_present_district,
@RequestParam String userId, @RequestParam String userId,
@RequestParam String vendor_req_id){
@RequestParam String vendor_req_id,
@RequestParam Integer religion,
@RequestParam(required = false) Integer diff_type,
@RequestParam(required = false) String other_disability,
@RequestParam(required = false) String familyDetails){
String data = streetVendorService.logEntry(userId, vendor_req_id); String data = streetVendorService.logEntry(userId, vendor_req_id);
@ -511,7 +520,8 @@ public class ApiController {
streetVendorPhotoPath, name, f_h_name, mobile_number,dob, streetVendorPhotoPath, name, f_h_name, mobile_number,dob,
gender, social_category, diff_abled, education_status, marital_status, gender, social_category, diff_abled, education_status, marital_status,
no_of_fam_mem, are_any_fam_mem_invol_str,presentAddress, present_district, present_pincode, no_of_fam_mem, are_any_fam_mem_invol_str,presentAddress, present_district, present_pincode,
rationCardPath,aadharFrontPhotoPath, aadharBackPhotoPath,aadharNo,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamilvending_category,userId,vendor_req_id);
rationCardPath,aadharFrontPhotoPath, aadharBackPhotoPath,aadharNo,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamilvending_category,userId,vendor_req_id,
religion,diff_type,other_disability,familyDetails);
if(sts.equals("Error")) { if(sts.equals("Error")) {
return ResponseEntity.ok(Map.of( return ResponseEntity.ok(Map.of(
@ -617,7 +627,13 @@ public class ApiController {
return streetVendorService.ViewWardDropdown(zone); return streetVendorService.ViewWardDropdown(zone);
} }
@GetMapping("/getrelationship")
public List<Map<String, Object>> getrelationship() {
return streetVendorService.fetchrelationship();
}
} }

70
src/main/java/in/gov/chennaicorporation/gccoffice/vendor/controller/CreateEventAPIController.java

@ -208,5 +208,75 @@ public class CreateEventAPIController {
return createventservices.finalvendorDetailsById(requestId); return createventservices.finalvendorDetailsById(requestId);
} }
@GetMapping("/getvendorforcertificate")
public List<Map<String, Object>> getvendorforcertificate(
@RequestParam(required = false) String meeting,
@RequestParam(required = false) String status,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String ward,
@RequestParam String userId) {
return createventservices.getvendorforcertificate(zone,ward,meeting,status,userId);
}
@GetMapping("/getstreetsbyward")
public List<Map<String, Object>> getstreetsbyward(String ward){
return createventservices.getstreetsbyward(ward);
}
@PostMapping("/giveCertificate")
public ResponseEntity<Map<String, Object>> giveCertificate(
@RequestParam Integer vdid,
@RequestParam String zone,
@RequestParam String ward,
@RequestParam String street_id,
@RequestParam String street_name,
@RequestParam String cby) {
Map<String, Object> response = new HashMap<>();
try {
boolean status = createventservices.giveCertificate(
vdid,
zone,
ward,
street_id,
street_name,
cby);
if (status) {
response.put("status", "success");
response.put("message", "Certificate generated successfully.");
} else {
response.put("status", "error");
response.put("message", "Unable to generate certificate.");
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", "Something went wrong.");
}
return ResponseEntity.ok(response);
}
@GetMapping("/getapprovedcertificates")
public List<Map<String, Object>> getapprovedcertificates(String zone,String ward,String street_id){
return createventservices.getapprovedcertificates(zone,ward,street_id);
}
} }

29
src/main/java/in/gov/chennaicorporation/gccoffice/vendor/controller/MainController.java

@ -107,6 +107,11 @@ public class MainController {
//System.out.println("educationList===="+educationList); //System.out.println("educationList===="+educationList);
model.addAttribute("educationList", educationList); model.addAttribute("educationList", educationList);
List<Map<String, Object>> religionList=streetVendorService.fetchReligion();
model.addAttribute("religionList", religionList);
List<Map<String, Object>> DiffAbledList=streetVendorService.fetchdifferently_abled();
model.addAttribute("DiffAbledList", DiffAbledList);
List<Map<String, Object>>vendingCategories=streetVendorService.fetchvendingCategory(); List<Map<String, Object>>vendingCategories=streetVendorService.fetchvendingCategory();
@ -184,6 +189,12 @@ public class MainController {
List<Map<String, Object>>educationList=streetVendorService.fetchEducationStatus(); List<Map<String, Object>>educationList=streetVendorService.fetchEducationStatus();
model.addAttribute("educationList", educationList); model.addAttribute("educationList", educationList);
List<Map<String, Object>> religionList=streetVendorService.fetchReligion();
model.addAttribute("religionList", religionList);
List<Map<String, Object>> DiffAbledList=streetVendorService.fetchdifferently_abled();
model.addAttribute("DiffAbledList", DiffAbledList);
List<Map<String, Object>>vendingCategories=streetVendorService.fetchvendingCategory(); List<Map<String, Object>>vendingCategories=streetVendorService.fetchvendingCategory();
model.addAttribute("vendingCategories", vendingCategories); model.addAttribute("vendingCategories", vendingCategories);
@ -212,5 +223,23 @@ public class MainController {
return "modules/vendors/certificate"; return "modules/vendors/certificate";
} }
@GetMapping("/approvedcertificate")
public String viewapprovedcertificate(Model model)
{
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("LoginUserId",LoginUserId);
String zone=streetVendorService.getloginUserZone(userId);
model.addAttribute("zone",zone);
//System.out.println("zone="+zone);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/vendors/approvedcertificates";
}
} }

214
src/main/java/in/gov/chennaicorporation/gccoffice/vendor/service/StreetVendorService.java

@ -9,6 +9,8 @@ import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
@ -31,6 +33,7 @@ import org.springframework.core.env.Environment;
import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder; import org.springframework.jdbc.support.KeyHolder;
@ -38,6 +41,9 @@ import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@Service @Service
@ -103,6 +109,34 @@ public class StreetVendorService {
return jdbcTemplate.queryForList(query); return jdbcTemplate.queryForList(query);
} }
public List<Map<String, Object>> fetchReligion() {
String query = "SELECT id,religion " +
"FROM religion_master " +
"WHERE is_active=1 AND is_delete=0 ";
return jdbcTemplate.queryForList(query);
}
public List<Map<String, Object>> fetchdifferently_abled() {
String query = "SELECT id,name " +
"FROM differently_abled_master " +
"WHERE is_active=1 AND is_delete=0 ";
return jdbcTemplate.queryForList(query);
}
public List<Map<String, Object>> fetchrelationship() {
String query = "SELECT id,name " +
"FROM relationship_master " +
"WHERE is_active=1 AND is_delete=0 ";
return jdbcTemplate.queryForList(query);
}
public List<Map<String, Object>> fetchvendingCategory() { public List<Map<String, Object>> fetchvendingCategory() {
String query = "SELECT id,vending_category_name " + String query = "SELECT id,vending_category_name " +
"FROM vending_category_master " + "FROM vending_category_master " +
@ -218,7 +252,8 @@ public class StreetVendorService {
Integer education_status, Integer marital_status, Integer no_of_fam_mem, Boolean are_any_fam_mem_invol_str, Integer education_status, Integer marital_status, Integer no_of_fam_mem, Boolean are_any_fam_mem_invol_str,
String presentAddress, String present_district, Integer present_pincode, String rationCardPath, String presentAddress, String present_district, Integer present_pincode, String rationCardPath,
String aadharFrontPhotoPath, String aadharBackPhotoPath,String aadharNo,String userId,String tamil_name,String tamil_f_h_name,String tamil_landmark, String aadharFrontPhotoPath, String aadharBackPhotoPath,String aadharNo,String userId,String tamil_name,String tamil_f_h_name,String tamil_landmark,
String tamil_gender,String tamil_present_district,@RequestParam Integer tamilvending_category) {
String tamil_gender,String tamil_present_district,@RequestParam Integer tamilvending_category,
Integer religion,Integer diff_type,String other_disability,String familyDetails) {
int isWeb=1; int isWeb=1;
String latitudeVal = (latitude != null && !latitude.trim().isEmpty()) ? latitude : null; String latitudeVal = (latitude != null && !latitude.trim().isEmpty()) ? latitude : null;
@ -227,7 +262,7 @@ public class StreetVendorService {
String wardVal = (ward != null && !ward.trim().isEmpty()) ? ward : null; String wardVal = (ward != null && !ward.trim().isEmpty()) ? ward : null;
String dobVal = (dob != null && !dob.trim().isEmpty()) ? dob : null; String dobVal = (dob != null && !dob.trim().isEmpty()) ? dob : null;
String vendingAddressVal = (landmark != null && !landmark.trim().isEmpty()) ? landmark : null; String vendingAddressVal = (landmark != null && !landmark.trim().isEmpty()) ? landmark : null;
String other_diff=(other_disability != null && !other_disability.trim().isEmpty()) ? other_disability : null;
String sql = "INSERT INTO vendor_details (" String sql = "INSERT INTO vendor_details ("
@ -235,8 +270,9 @@ public class StreetVendorService {
+ "bank_acc_status, bank_passbook, street_vendor_photo, name, f_h_name, mob_no, " + "bank_acc_status, bank_passbook, street_vendor_photo, name, f_h_name, mob_no, "
+ "dob,gender,social_category, diff_abled, education_status, marital_status,no_of_fam_mem, " + "dob,gender,social_category, diff_abled, education_status, marital_status,no_of_fam_mem, "
+ "are_any_fam_mem_invol_str_ven,present_address, present_district, present_pincode, ration_card_photo, aadhar_front_photo, " + "are_any_fam_mem_invol_str_ven,present_address, present_district, present_pincode, ration_card_photo, aadhar_front_photo, "
+ "aadhar_back_photo,aadhar_no,is_web,cby,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamil_vending_category "
+ ") VALUES (?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?,?,?,?,?,?,?,?)";
+ "aadhar_back_photo,aadhar_no,is_web,cby,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamil_vending_category, "
+ "diff_type,other_disability,religion "
+ ") VALUES (?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder(); KeyHolder keyHolder = new GeneratedKeyHolder();
@ -298,6 +334,10 @@ public class StreetVendorService {
ps.setString(38, tamil_present_district); ps.setString(38, tamil_present_district);
if (tamilvending_category != null) ps.setInt(39, tamilvending_category); if (tamilvending_category != null) ps.setInt(39, tamilvending_category);
else ps.setNull(39, java.sql.Types.INTEGER); else ps.setNull(39, java.sql.Types.INTEGER);
if (diff_type != null) ps.setInt(40, diff_type);
else ps.setNull(40, java.sql.Types.INTEGER);
ps.setString(41, other_diff);
ps.setInt(42,religion);
return ps; return ps;
}, keyHolder); }, keyHolder);
//return keyHolder.getKey().intValue(); //return keyHolder.getKey().intValue();
@ -308,6 +348,55 @@ public class StreetVendorService {
String updateSql = " UPDATE vendor_details SET vendor_req_id = ? WHERE id = ? "; String updateSql = " UPDATE vendor_details SET vendor_req_id = ? WHERE id = ? ";
jdbcTemplate.update(updateSql,refId, generatedId); jdbcTemplate.update(updateSql,refId, generatedId);
if (familyDetails != null && !familyDetails.trim().isEmpty()) {
ObjectMapper mapper = new ObjectMapper();
List<Map<String, Object>> members =
mapper.readValue(familyDetails,
new TypeReference<List<Map<String, Object>>>() {});
String familySql =
"INSERT INTO familymembers_details " +
"(vendor_req_id,name,age,relation,cby) " +
"VALUES (?,?,?,?,?)";
jdbcTemplate.batchUpdate(familySql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Map<String, Object> member = members.get(i);
ps.setString(1, refId);
ps.setString(2,
member.get("name") == null ? null :
member.get("name").toString());
if (member.get("age") != null)
ps.setInt(3,
Integer.parseInt(member.get("age").toString()));
else
ps.setNull(3, Types.INTEGER);
if (member.get("relationship") != null)
ps.setInt(4,
Integer.parseInt(member.get("relationship").toString()));
else
ps.setNull(4, Types.INTEGER);
ps.setString(5, userId);
}
@Override
public int getBatchSize() {
return members.size();
}
});
}
return refId; return refId;
} }
//return "error"; //return "error";
@ -442,15 +531,37 @@ public class StreetVendorService {
"CONCAT('" + fileBaseUrl + "/gccofficialapp/files', vd.ration_card_photo) AS view_ration_card_photo, " + "CONCAT('" + fileBaseUrl + "/gccofficialapp/files', vd.ration_card_photo) AS view_ration_card_photo, " +
"CONCAT('" + fileBaseUrl + "/gccofficialapp/files', vd.street_vendor_photo) AS view_street_vendor_photo, " + "CONCAT('" + fileBaseUrl + "/gccofficialapp/files', vd.street_vendor_photo) AS view_street_vendor_photo, " +
"CONCAT('" + fileBaseUrl + "/gccofficialapp/files', vd.aadhar_front_photo) AS view_aadhar_front_photo, " + "CONCAT('" + fileBaseUrl + "/gccofficialapp/files', vd.aadhar_front_photo) AS view_aadhar_front_photo, " +
"CONCAT('" + fileBaseUrl + "/gccofficialapp/files', vd.aadhar_back_photo) AS view_aadhar_back_photo "
"CONCAT('" + fileBaseUrl + "/gccofficialapp/files', vd.aadhar_back_photo) AS view_aadhar_back_photo, "+
" rm.religion as religion_name,dam.name as diff_name "
+ "FROM vendor_details vd " + "FROM vendor_details vd "
+ "LEFT JOIN social_category_master scm on vd.social_category = scm.id " + "LEFT JOIN social_category_master scm on vd.social_category = scm.id "
+ "LEFT JOIN vending_category_master vcm ON vd.vending_category=vcm.id " + "LEFT JOIN vending_category_master vcm ON vd.vending_category=vcm.id "
+ "LEFT JOIN education_master em on vd.education_status = em.id " + "LEFT JOIN education_master em on vd.education_status = em.id "
+ "LEFT JOIN marital_status_master mm on vd.marital_status = mm.id " + "LEFT JOIN marital_status_master mm on vd.marital_status = mm.id "
+ "LEFT JOIN religion_master rm on rm.id=vd.religion "
+ "LEFT JOIN differently_abled_master dam on dam.id=vd.diff_type "
+ "WHERE vd.vendor_req_id = ?"; + "WHERE vd.vendor_req_id = ?";
return jdbcTemplate.queryForList(sql,requestId);
List<Map<String, Object>> vendorList = jdbcTemplate.queryForList(sql, requestId);
if (!vendorList.isEmpty()) {
String familySql =
"SELECT fm.id, fm.name, fm.age, fm.relation, " +
"rm.name AS relation_name " +
"FROM familymembers_details fm " +
"LEFT JOIN relationship_master rm ON rm.id = fm.relation " +
"WHERE fm.vendor_req_id = ? " +
"AND fm.isactive = 1 " +
"AND fm.isdelete = 0";
List<Map<String, Object>> familyMembers =
jdbcTemplate.queryForList(familySql, requestId);
vendorList.get(0).put("familymembers_details", familyMembers);
}
return vendorList;
} }
@ -461,7 +572,8 @@ public class StreetVendorService {
Integer social_category, Boolean diff_abled, Integer education_status, Integer marital_status, Integer social_category, Boolean diff_abled, Integer education_status, Integer marital_status,
Integer no_of_fam_mem, Boolean are_any_fam_mem_invol_str, String presentAddress, String present_district, Integer no_of_fam_mem, Boolean are_any_fam_mem_invol_str, String presentAddress, String present_district,
Integer present_pincode, String rationCardPath, String aadharFrontPhotoPath, String aadharBackPhotoPath, Integer present_pincode, String rationCardPath, String aadharFrontPhotoPath, String aadharBackPhotoPath,
String aadharNo,String tamil_name,String tamil_f_h_name, String tamil_landmark,String tamil_gender,String tamil_present_district,Integer tamilvending_category, String userId, String vendor_req_id) {
String aadharNo,String tamil_name,String tamil_f_h_name, String tamil_landmark,String tamil_gender,String tamil_present_district,Integer tamilvending_category, String userId, String vendor_req_id,
Integer religion,Integer diff_type,String other_disability,String familyDetails) {
String latitudeVal = (latitude != null && !latitude.trim().isEmpty()) ? latitude : null; String latitudeVal = (latitude != null && !latitude.trim().isEmpty()) ? latitude : null;
@ -470,27 +582,67 @@ public class StreetVendorService {
String wardVal = (ward != null && !ward.trim().isEmpty()) ? ward : null; String wardVal = (ward != null && !ward.trim().isEmpty()) ? ward : null;
String dobVal = (dob != null && !dob.trim().isEmpty()) ? dob : null; String dobVal = (dob != null && !dob.trim().isEmpty()) ? dob : null;
String vendingAddressVal = (landmark != null && !landmark.trim().isEmpty()) ? landmark : null; String vendingAddressVal = (landmark != null && !landmark.trim().isEmpty()) ? landmark : null;
String otherDiff = (other_disability != null && !other_disability.trim().isEmpty()) ? other_disability : null;
String sql="UPDATE vendor_details SET " String sql="UPDATE vendor_details SET "
+ "latitude =?,longitude=?,zone=?, ward=?, vending_address=?,vending_district=?, vending_pincode=?, vending_category=?, vending_space=?, pm_svanidhi_loan=?, " + "latitude =?,longitude=?,zone=?, ward=?, vending_address=?,vending_district=?, vending_pincode=?, vending_category=?, vending_space=?, pm_svanidhi_loan=?, "
+ "bank_acc_status=?, bank_passbook=?, street_vendor_photo=?, name=?, f_h_name=?, mob_no=?, " + "bank_acc_status=?, bank_passbook=?, street_vendor_photo=?, name=?, f_h_name=?, mob_no=?, "
+ "dob=?,gender=?,social_category=?, diff_abled=?, education_status=?, marital_status=?,no_of_fam_mem=?, " + "dob=?,gender=?,social_category=?, diff_abled=?, education_status=?, marital_status=?,no_of_fam_mem=?, "
+ "are_any_fam_mem_invol_str_ven=?,present_address=?, present_district=?, present_pincode=?, ration_card_photo=?, aadhar_front_photo=?, " + "are_any_fam_mem_invol_str_ven=?,present_address=?, present_district=?, present_pincode=?, ration_card_photo=?, aadhar_front_photo=?, "
+ "aadhar_back_photo=?,aadhar_no=?,updated_date=NOW(),tamil_name=?,tamil_f_h_name=?,tamil_landmark=?,tamil_gender=?,tamil_present_district=?,tamil_vending_category=?,edit_by=? "
+ "aadhar_back_photo=?,aadhar_no=?,updated_date=NOW(),tamil_name=?,tamil_f_h_name=?,tamil_landmark=?,tamil_gender=?,tamil_present_district=?,tamil_vending_category=?,edit_by=?, "
+ "religion=?,diff_type=?,other_disability=? "
+ " WHERE vendor_req_id = ? AND editable=1"; + " WHERE vendor_req_id = ? AND editable=1";
//AND is_web=1
try { try {
int rows=jdbcTemplate.update(sql, latitudeVal, longitudeVal, zoneVal, wardVal, vendingAddressVal, vending_district, int rows=jdbcTemplate.update(sql, latitudeVal, longitudeVal, zoneVal, wardVal, vendingAddressVal, vending_district,
vending_pincode, vending_category, vending_space, pm_svanidhi_loan, bank_acc_status, bankPassbookPath, vending_pincode, vending_category, vending_space, pm_svanidhi_loan, bank_acc_status, bankPassbookPath,
streetVendorPhotoPath, name, f_h_name, mobile_number, dobVal, gender, social_category, diff_abled, streetVendorPhotoPath, name, f_h_name, mobile_number, dobVal, gender, social_category, diff_abled,
education_status, marital_status, no_of_fam_mem, are_any_fam_mem_invol_str, presentAddress, education_status, marital_status, no_of_fam_mem, are_any_fam_mem_invol_str, presentAddress,
present_district, present_pincode, rationCardPath, aadharFrontPhotoPath, aadharBackPhotoPath, aadharNo, present_district, present_pincode, rationCardPath, aadharFrontPhotoPath, aadharBackPhotoPath, aadharNo,
tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamilvending_category,userId,
tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamilvending_category,userId,religion,diff_type,otherDiff,
vendor_req_id); vendor_req_id);
if (rows==1) {
return "Success";
if (rows == 1) {
// Step 1 - Deactivate old family members
String deactivateSql =
"UPDATE familymembers_details " +
"SET isactive = 0, isdelete = 1 " +
"WHERE vendor_req_id = ? " +
"AND isactive = 1 " +
"AND isdelete = 0";
jdbcTemplate.update(deactivateSql, vendor_req_id);
// Step 2 - Insert latest family members
if (familyDetails != null && !familyDetails.trim().isEmpty()) {
ObjectMapper mapper = new ObjectMapper();
List<Map<String, Object>> members =
mapper.readValue(familyDetails,
new TypeReference<List<Map<String, Object>>>() {});
String insertSql =
"INSERT INTO familymembers_details " +
"(vendor_req_id, name, age, relation, cby) " +
"VALUES (?, ?, ?, ?, ?)";
for (Map<String, Object> member : members) {
jdbcTemplate.update(
insertSql,
vendor_req_id,
member.get("name"),
member.get("age"),
member.get("relationship"),
userId
);
}
}
return "Success";
} }
else { else {
return "Error"; return "Error";
@ -504,8 +656,8 @@ public class StreetVendorService {
public String logEntry(String userId, String vendor_req_id) { public String logEntry(String userId, String vendor_req_id) {
String sql="INSERT INTO vendor_details_web_log (name,f_h_name,gender,dob,social_category,diff_abled,mob_no,aadhar_no,present_address,present_district,present_pincode,vending_address,vending_district,vending_pincode,vending_category,vending_space,bank_acc_status,bank_passbook,ration_card_photo,street_vendor_photo,aadhar_front_photo,aadhar_back_photo,zone,ward,pm_svanidhi_loan,vendor_req_id,education_status,marital_status,no_of_fam_mem,are_any_fam_mem_invol_str_ven,latitude,longitude,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamil_vending_category,cby) "
+ " SELECT name,f_h_name,gender,dob,social_category,diff_abled,mob_no,aadhar_no,present_address,present_district,present_pincode,vending_address,vending_district,vending_pincode,vending_category,vending_space,bank_acc_status,bank_passbook,ration_card_photo,street_vendor_photo,aadhar_front_photo,aadhar_back_photo,zone,ward,pm_svanidhi_loan,vendor_req_id,education_status,marital_status,no_of_fam_mem,are_any_fam_mem_invol_str_ven,latitude,longitude,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamil_vending_category,? FROM vendor_details WHERE vendor_req_id=?";
String sql="INSERT INTO vendor_details_web_log (name,f_h_name,gender,dob,social_category,diff_abled,mob_no,aadhar_no,present_address,present_district,present_pincode,vending_address,vending_district,vending_pincode,vending_category,vending_space,bank_acc_status,bank_passbook,ration_card_photo,street_vendor_photo,aadhar_front_photo,aadhar_back_photo,zone,ward,pm_svanidhi_loan,vendor_req_id,education_status,marital_status,no_of_fam_mem,are_any_fam_mem_invol_str_ven,latitude,longitude,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamil_vending_category,diff_type,other_disability,religion,cby) "
+ " SELECT name,f_h_name,gender,dob,social_category,diff_abled,mob_no,aadhar_no,present_address,present_district,present_pincode,vending_address,vending_district,vending_pincode,vending_category,vending_space,bank_acc_status,bank_passbook,ration_card_photo,street_vendor_photo,aadhar_front_photo,aadhar_back_photo,zone,ward,pm_svanidhi_loan,vendor_req_id,education_status,marital_status,no_of_fam_mem,are_any_fam_mem_invol_str_ven,latitude,longitude,tamil_name,tamil_f_h_name,tamil_landmark,tamil_gender,tamil_present_district,tamil_vending_category,diff_type,other_disability,religion,? FROM vendor_details WHERE vendor_req_id=?";
try { try {
jdbcTemplate.update(sql, userId,vendor_req_id); jdbcTemplate.update(sql, userId,vendor_req_id);
@ -574,8 +726,10 @@ public class StreetVendorService {
public List<Map<String, Object>> vendorDetailsById(String requestId) { public List<Map<String, Object>> vendorDetailsById(String requestId) {
String sql = "SELECT vd.id,vd.vendor_req_id, vd.name, vd.mob_no, vd.dob, vd.gender, vd.diff_abled, vd.f_h_name, scm.category_name, " +
String sql = "SELECT vd.id,vd.vendor_req_id, vd.name, vd.mob_no, date_format(vd.dob,'%d-%m-%Y') as dob_format, vd.gender, vd.diff_abled, vd.f_h_name, scm.category_name, " +
" rm.religion as religion_name,dam.name as diff_name,vd.other_disability,vd.no_of_fam_mem, " +
"CONCAT_WS(', ', vd.present_address, vd.present_district, vd.present_pincode) AS residental_address, " + "CONCAT_WS(', ', vd.present_address, vd.present_district, vd.present_pincode) AS residental_address, " +
"vd.tamil_name,vd.tamil_f_h_name,vd.tamil_landmark,vd.tamil_gender,vd.tamil_present_district,tvcm.tamil_vending_category_name as tamil_vending_category_name,vd.aadhar_no as aadhar_no, "+
"CONCAT_WS(', ', vd.vending_address, vd.vending_district, vd.vending_pincode) AS business_address, vd.bank_acc_status, " + "CONCAT_WS(', ', vd.vending_address, vd.vending_district, vd.vending_pincode) AS business_address, vd.bank_acc_status, " +
"ifnull(CONCAT('" + fileBaseUrl + "/gccofficialapp/files',vd.bank_passbook),'') as bank_passbook, " + "ifnull(CONCAT('" + fileBaseUrl + "/gccofficialapp/files',vd.bank_passbook),'') as bank_passbook, " +
"ifnull(CONCAT('" + fileBaseUrl + "/gccofficialapp/files',vd.ration_card_photo),'') as ration_card_photo, " + "ifnull(CONCAT('" + fileBaseUrl + "/gccofficialapp/files',vd.ration_card_photo),'') as ration_card_photo, " +
@ -596,14 +750,40 @@ public class StreetVendorService {
"LEFT JOIN education_master em on em.id= vd.education_status " + "LEFT JOIN education_master em on em.id= vd.education_status " +
"LEFT JOIN marital_status_master msm on msm.id= vd.marital_status " + "LEFT JOIN marital_status_master msm on msm.id= vd.marital_status " +
"LEFT JOIN social_category_master scm on vd.social_category = scm.id " + "LEFT JOIN social_category_master scm on vd.social_category = scm.id " +
"LEFT JOIN vending_category_master vcm ON vd.vending_category=vcm.id " +
"LEFT JOIN vending_category_master vcm ON vd.vending_category=vcm.id " +
"LEFT JOIN tamil_vending_category_master tvcm ON vd.tamil_vending_category=tvcm.id " +
"LEFT JOIN vending_time_master vtm on va1.vendor_timing_id = vtm.id " + "LEFT JOIN vending_time_master vtm on va1.vendor_timing_id = vtm.id " +
"LEFT JOIN transaction_mode_master tmm on va1.transaction_mode_id = tmm.id " + "LEFT JOIN transaction_mode_master tmm on va1.transaction_mode_id = tmm.id " +
"LEFT JOIN vending_type_master vtym ON va1.vendor_type = vtym.typeid " + "LEFT JOIN vending_type_master vtym ON va1.vendor_type = vtym.typeid " +
"LEFT JOIN vending_sub_type_master vstym ON va1.vendor_sub_type = vstym.subtypeid " + "LEFT JOIN vending_sub_type_master vstym ON va1.vendor_sub_type = vstym.subtypeid " +
"LEFT JOIN religion_master rm on rm.id=vd.religion " +
"LEFT JOIN differently_abled_master dam on dam.id=vd.diff_type " +
"WHERE vd.id = ? "; "WHERE vd.id = ? ";
return jdbcTemplate.queryForList(sql, requestId);
List<Map<String, Object>> vendorList = jdbcTemplate.queryForList(sql, requestId);
if (!vendorList.isEmpty()) {
String vendorReqId = (String) vendorList.get(0).get("vendor_req_id");
String familySql =
"SELECT fm.id, fm.name, fm.age, fm.relation, " +
"rm.name AS relation_name " +
"FROM familymembers_details fm " +
"LEFT JOIN relationship_master rm ON rm.id = fm.relation " +
"WHERE fm.vendor_req_id = ? " +
"AND fm.isactive = 1 " +
"AND fm.isdelete = 0";
List<Map<String, Object>> familyMembers =
jdbcTemplate.queryForList(familySql, vendorReqId);
vendorList.get(0).put("familymembers_details", familyMembers);
}
return vendorList;
} }

198
src/main/java/in/gov/chennaicorporation/gccoffice/vendor/service/createventService.java

@ -30,11 +30,18 @@ import org.springframework.transaction.annotation.Transactional;
public class createventService { public class createventService {
private JdbcTemplate jdbcTemplate; private JdbcTemplate jdbcTemplate;
private JdbcTemplate strjdbcTemplate;
@Autowired @Autowired
public void setDataSource(@Qualifier("mysqlVendingCommitteDataSource") DataSource dataSource) { public void setDataSource(@Qualifier("mysqlVendingCommitteDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource); this.jdbcTemplate = new JdbcTemplate(dataSource);
} }
@Autowired
public void setDataSource2(@Qualifier("mysqlGccStreetVendorDataSource") DataSource dataSource) {
this.strjdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired @Autowired
public StreetVendorService streetVendorService; public StreetVendorService streetVendorService;
@ -181,10 +188,16 @@ public class createventService {
* ============================================================ * ============================================================
*/ */
if ("Approved".equalsIgnoreCase(status)) { if ("Approved".equalsIgnoreCase(status)) {
Integer expiryYears = jdbcTemplate.queryForObject(
"SELECT idcard_expire_year FROM info_details WHERE isactive = 1 AND isdelete=0 LIMIT 1",
Integer.class
);
String currentYear = java.time.Year.now().toString(); String currentYear = java.time.Year.now().toString();
String uid_no = zone + "_" + ward + "_" + currentYear + "_" + generatedId; String uid_no = zone + "_" + ward + "_" + currentYear + "_" + generatedId;
jdbcTemplate.update("UPDATE vendor_request_list SET uid_no=? WHERE id=?", uid_no, generatedId);
jdbcTemplate.update("UPDATE vendor_request_list SET uid_no=?, expire_date = DATE_ADD(CURDATE(), INTERVAL ? YEAR) WHERE id=?", uid_no,expiryYears, generatedId);
} }
/* /*
@ -206,12 +219,10 @@ public class createventService {
* Send WhatsApp notification * Send WhatsApp notification
* ============================================================ * ============================================================
*/ */
String result = sendWhatsappMsg(mob_no, status, vendor_req_number);
sendWhatsappMsg(mob_no, status, vendor_req_number);
response.put("status", "success"); response.put("status", "success");
response.put("message", result.equals("200")
? "Details submitted successfully!"
: "Details submitted, but WhatsApp msg failed.");
response.put("message","Details submitted successfully!");
return ResponseEntity.ok(response); return ResponseEntity.ok(response);
@ -612,6 +623,19 @@ public class createventService {
return Collections.emptyList(); return Collections.emptyList();
} }
} }
public List<Map<String, Object>> getCertificateDetails(String vendorReqId) {
String sql =
"SELECT id, zone, ward, street_id, street_name, " +
"status, cby, DATE_FORMAT(cdate,'%d-%m-%Y %h:%i %p') AS cdate " +
"FROM vending_certificate " +
"WHERE vdid = ? " +
"AND isactive = 1 " +
"AND isdelete = 0";
return jdbcTemplate.queryForList(sql, vendorReqId);
}
public List<Map<String, Object>> finalvendorDetailsById(String requestId) { public List<Map<String, Object>> finalvendorDetailsById(String requestId) {
@ -623,6 +647,13 @@ public class createventService {
} }
Map<String, Object> base = org_list.get(0); Map<String, Object> base = org_list.get(0);
// Add certificate details
List<Map<String, Object>> certificateDetails =
getCertificateDetails(requestId);
base.put("certificate_details", certificateDetails);
// Get full request history (multiple rows) // Get full request history (multiple rows)
List<Map<String, Object>> historyList = getvendingfinaldata(requestId); List<Map<String, Object>> historyList = getvendingfinaldata(requestId);
@ -644,25 +675,26 @@ public class createventService {
String sql = "SELECT all_logs.vdid, " + String sql = "SELECT all_logs.vdid, " +
" all_logs.vc_status, " + " all_logs.vc_status, " +
" all_logs.vc_remarks, " + " all_logs.vc_remarks, " +
" all_logs.uid_no, " +
" CONCAT_WS('- ', ce.event_name, DATE_FORMAT(ce.event_date, '%d-%m-%Y')) AS event_name, " + " CONCAT_WS('- ', ce.event_name, DATE_FORMAT(ce.event_date, '%d-%m-%Y')) AS event_name, " +
" DATE_FORMAT(all_logs.cdate, '%d-%m-%Y %l:%i %p') AS vc_Inspection_date " + " DATE_FORMAT(all_logs.cdate, '%d-%m-%Y %l:%i %p') AS vc_Inspection_date " +
"FROM (" + "FROM (" +
" SELECT vrl.vdid, vrl.status AS vc_status, vrl.remarks AS vc_remarks, " +
" SELECT vrl.vdid, vrl.status AS vc_status, vrl.remarks AS vc_remarks,vrl.uid_no as uid_no, " +
" vrl.event_req_id, vrl.cdate " + " vrl.event_req_id, vrl.cdate " +
" FROM vendor_request_list vrl " + " FROM vendor_request_list vrl " +
" WHERE vrl.vdid = ? AND vrl.isactive = 1 " + " WHERE vrl.vdid = ? AND vrl.isactive = 1 " +
" UNION ALL " + " UNION ALL " +
" SELECT vpl.vdid, vpl.status AS vc_status, vpl.remarks AS vc_remarks, " +
" SELECT vpl.vdid, vpl.status AS vc_status, vpl.remarks AS vc_remarks,NULL, " +
" vpl.event_req_id, vpl.cdate " + " vpl.event_req_id, vpl.cdate " +
" FROM vendor_postponed_list vpl " + " FROM vendor_postponed_list vpl " +
" WHERE vpl.vdid = ? AND vpl.isactive = 1 " + " WHERE vpl.vdid = ? AND vpl.isactive = 1 " +
" UNION ALL " + " UNION ALL " +
" SELECT phl.vdid, phl.status AS vc_status, phl.remarks AS vc_remarks, " +
" SELECT phl.vdid, phl.status AS vc_status, phl.remarks AS vc_remarks,NULL, " +
" phl.event_req_id, phl.cdate " + " phl.event_req_id, phl.cdate " +
" FROM postponed_history_log phl " + " FROM postponed_history_log phl " +
" WHERE phl.vdid = ? " + " WHERE phl.vdid = ? " +
@ -726,4 +758,154 @@ public class createventService {
return result; return result;
} }
public List<Map<String, Object>> getvendorforcertificate(String zone, String ward, String meeting, String status, String userId) {
StringBuilder sql = new StringBuilder(
" SELECT vd.id,vd.name,vd.vendor_req_id,vd.zone,vd.ward,vd.mob_no,vrl.status,vrl.uid_no "
+ "FROM gcc_street_vendor.vendor_details vd "
+ "JOIN vendingcommitte.vendor_request_list vrl ON vrl.vdid=vd.id "
+ "WHERE vrl.status='Approved' AND vrl.isactive=1 AND vrl.isdelete=0 AND vd.isactive=1 "
+ "AND NOT EXISTS ( "
+ "SELECT 1 "
+ "FROM vending_certificate vc "
+ "WHERE vc.vdid = vrl.vdid "
+ "AND vc.isactive = 1 "
+ "AND vc.isdelete = 0 "
+ ") "
);
List<Object> params = new ArrayList<>();
// Add zone if not empty
if (zone != null && !zone.trim().isEmpty()) {
sql.append(" AND vd.zone = ?");
params.add(zone);
}
// Add ward if not empty
if (ward != null && !ward.trim().isEmpty()) {
sql.append(" AND vd.ward = ?");
params.add(ward);
}
if (meeting != null && !meeting.trim().isEmpty()) {
sql.append(" AND vrl.event_req_id = ?");
params.add(Integer.parseInt(meeting));
}
sql.append(" AND vrl.cby = ?");
params.add(Integer.parseInt(userId));
try {
return jdbcTemplate.queryForList(sql.toString(), params.toArray());
} catch (Exception e) {
e.printStackTrace();
return Collections.emptyList();
}
}
public List<Map<String, Object>> getstreetsbyward(String ward) {
String sql="SELECT zone,ward,area,location,streetid,street FROM erp_street_master WHERE ward=? AND is_active=1 AND is_delete=0";
try {
return jdbcTemplate.queryForList(sql, ward);
} catch (Exception e) {
e.printStackTrace();
return Collections.emptyList();
}
}
public boolean giveCertificate(Integer vdid,
String zone,
String ward,
String street_id,
String street_name,
String cby) {
Integer expiryYears = jdbcTemplate.queryForObject(
"SELECT certificate_expire_year FROM info_details WHERE isactive = 1 AND isdelete=0 LIMIT 1",
Integer.class
);
String sql =
"INSERT INTO vending_certificate " +
"(vdid, zone, ward, street_id, street_name, status, cby, expire_date) " +
"VALUES (?, ?, ?, ?, ?, 'Approved', ?, DATE_ADD(CURDATE(), INTERVAL ? YEAR))";
try {
int rows = jdbcTemplate.update(
sql,
vdid,
zone,
ward,
street_id,
street_name,
cby,
expiryYears
);
return rows > 0;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public List<Map<String, Object>> getapprovedcertificates(String zone, String ward, String street_id) {
StringBuilder sql = new StringBuilder(
"SELECT " +
"vd.id, " +
"vd.name, " +
"vd.vendor_req_id, " +
"vc.zone, " +
"vc.ward, " +
"vd.mob_no, " +
"vc.status as certificate_status, " +
"vc.street_id, " +
"vc.street_name " +
"FROM gcc_street_vendor.vendor_details vd " +
"JOIN vendingcommitte.vending_certificate vc ON vc.vdid = vd.id " +
"WHERE vc.status = 'Approved' " +
"AND vc.isactive = 1 " +
"AND vc.isdelete = 0 " +
"AND vd.isactive = 1 "
);
List<Object> params = new ArrayList<>();
if (zone != null && !zone.trim().isEmpty()) {
sql.append(" AND vc.zone = ?");
params.add(zone);
}
if (ward != null && !ward.trim().isEmpty()) {
sql.append(" AND vc.ward = ?");
params.add(ward);
}
if (street_id != null && !street_id.trim().isEmpty()) {
sql.append(" AND vc.street_id = ?");
params.add(street_id);
}
sql.append(" ORDER BY vc.zone, vc.ward, vc.street_name, vd.name");
try {
return jdbcTemplate.queryForList(sql.toString(), params.toArray());
} catch (Exception e) {
e.printStackTrace();
return Collections.emptyList();
}
}
} }

1
src/main/resources/application-local.properties

@ -1,3 +1,4 @@
assets.base-url=/assets/ assets.base-url=/assets/
fileBaseUrl=http://localhost:8064 fileBaseUrl=http://localhost:8064

67
src/main/resources/templates/modules/callcenterqaqc/socialmediaregcompclosing.html

@ -397,12 +397,73 @@
}); });
$(document).on('click', '.btn-info', function () { $(document).on('click', '.btn-info', function () {
const complaintNumber = $(this).data('complaint-number');
const complaintNumber = $(this).data('complaint-number');
const remarks = $(this).data('remarks'); const remarks = $(this).data('remarks');
const imgFullPath = $(this).data('img'); const imgFullPath = $(this).data('img');
viewDetails(complaintNumber, remarks, imgFullPath);
});
$('#pageLoader').show();
$.ajax({
url: '/gcc/api/callcenterqaqc/socialmedia/getcompstatus',
type: 'GET',
data: {
complaintNumber: complaintNumber
},
success: function (response) {
$('#pageLoader').hide();
if (response.status === "success") {
// Status not changed, continue
viewDetails(complaintNumber, remarks, imgFullPath);
} else if (response.status === "changed") {
Swal.fire({
allowOutsideClick: false,
allowEscapeKey: false,
allowEnterKey: false,
icon: 'warning',
title: 'Notice',
text: response.message,
confirmButtonText: 'OK'
}).then((result) => {
if (result.isConfirmed) {
location.reload();
}
});
} else if (response.status === "error") {
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message
});
} else {
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Unexpected response from server.'
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Failed to communicate with the server.'
});
console.error(error);
}
});
});
function viewDetails(complaintNumber, remarks, imgFullPath) { function viewDetails(complaintNumber, remarks, imgFullPath) {
document.getElementById('modalBody').innerHTML = '<p style="text-align:center;">Please wait, loading data...</p>'; document.getElementById('modalBody').innerHTML = '<p style="text-align:center;">Please wait, loading data...</p>';

68
src/main/resources/templates/modules/vendors/EventList.html

@ -124,7 +124,7 @@
</div> </div>
<div class="col-md-2 mb-1"> <div class="col-md-2 mb-1">
<label for="statusdropdown" style="font-size: medium;">Status:</label>
<label for="statusdropdown" style="font-size: medium;">ID Status:</label>
<select id="statusdropdown" class="form-control"> <select id="statusdropdown" class="form-control">
<option value="">Select Status</option> <option value="">Select Status</option>
<option value="Approved">Approved</option> <option value="Approved">Approved</option>
@ -573,6 +573,36 @@
const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-'; const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-';
const familyMembers = details.familymembers_details || [];
let familyHtml = "-";
if (familyMembers.length > 0) {
familyHtml = `
<table class="table table-bordered table-sm mb-0">
<thead class="table-light">
<tr>
<th>S.No</th>
<th>Name</th>
<th>Age</th>
<th>Relationship</th>
</tr>
</thead>
<tbody>
${familyMembers.map((member, index) => `
<tr>
<td>${index + 1}</td>
<td>${member.name || '-'}</td>
<td>${member.age || '-'}</td>
<td>${member.relation_name || '-'}</td>
</tr>
`).join('')}
</tbody>
</table>
`;
}
let historyHtml = ""; let historyHtml = "";
historyList.forEach(h => { historyList.forEach(h => {
@ -609,7 +639,7 @@
<div class="col-md-3">${details.category_name || '-'}</div> <div class="col-md-3">${details.category_name || '-'}</div>
<div class="col-md-3"><strong>DOB:</strong></div> <div class="col-md-3"><strong>DOB:</strong></div>
<div class="col-md-3">${details.dob || '-'}</div>
<div class="col-md-3">${formatDateForDisplay(details.dob_format)}</div>
<div class="col-md-3"><strong>Address:</strong></div> <div class="col-md-3"><strong>Address:</strong></div>
<div class="col-md-3">${details.residental_address || '-'}</div> <div class="col-md-3">${details.residental_address || '-'}</div>
@ -621,6 +651,15 @@
<div class="col-md-3"><strong>Differently Abled:</strong></div> <div class="col-md-3"><strong>Differently Abled:</strong></div>
<div class="col-md-3">${diffAbledDisplay || '-'}</div> <div class="col-md-3">${diffAbledDisplay || '-'}</div>
<div class="col-md-3"><strong>Type of Disability:</strong></div>
<div class="col-md-3">${details.diff_name || '-'}</div>
<div class="col-md-3"><strong>Specify the Disability:</strong></div>
<div class="col-md-3">${details.other_disability || '-'}</div>
<div class="col-md-3"><strong>Religion:</strong></div>
<div class="col-md-3">${details.religion_name || '-'}</div>
<div class="col-md-3"><strong>Aadhaar front Image:</strong></div> <div class="col-md-3"><strong>Aadhaar front Image:</strong></div>
<div class="col-md-3">${aadharFrontBtn}</div> <div class="col-md-3">${aadharFrontBtn}</div>
@ -630,6 +669,15 @@
<div class="col-md-3"><strong>Aadhaar back Image:</strong></div> <div class="col-md-3"><strong>Aadhaar back Image:</strong></div>
<div class="col-md-3">${aadharBackBtn}</div> <div class="col-md-3">${aadharBackBtn}</div>
<div class="col-md-12 mt-3">
<strong>Family Members:</strong>
</div>
<div class="col-md-12 mt-3">
${familyHtml}
</div>
</div> </div>
</div> </div>
@ -796,7 +844,23 @@
}); });
} }
function formatDateForDisplay(dateStr) {
if (!dateStr) return "-";
// Already dd-MM-yyyy
if (/^\d{2}-\d{2}-\d{4}$/.test(dateStr)) {
return dateStr;
}
// yyyy-MM-dd -> dd-MM-yyyy
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
const [year, month, day] = dateStr.split("-");
return `${day}-${month}-${year}`;
}
return dateStr;
}
</script> </script>

69
src/main/resources/templates/modules/vendors/RequestList.html

@ -762,6 +762,37 @@
const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-'; const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-';
const familyMembers = details.familymembers_details || [];
let familyHtml = "-";
if (familyMembers.length > 0) {
familyHtml = `
<table class="table table-bordered table-sm mb-0">
<thead class="table-light">
<tr>
<th>S.No</th>
<th>Name</th>
<th>Age</th>
<th>Relationship</th>
</tr>
</thead>
<tbody>
${familyMembers.map((member, index) => `
<tr>
<td>${index + 1}</td>
<td>${member.name || '-'}</td>
<td>${member.age || '-'}</td>
<td>${member.relation_name || '-'}</td>
</tr>
`).join('')}
</tbody>
</table>
`;
}
let postponedHTML = ""; let postponedHTML = "";
@ -821,7 +852,7 @@
<div class="col-md-3">${details.category_name || '-'}</div> <div class="col-md-3">${details.category_name || '-'}</div>
<div class="col-md-3"><strong>DOB:</strong></div> <div class="col-md-3"><strong>DOB:</strong></div>
<div class="col-md-3">${details.dob || '-'}</div>
<div class="col-md-3">${formatDateForDisplay(details.dob_format)}</div>
<div class="col-md-3"><strong>Address:</strong></div> <div class="col-md-3"><strong>Address:</strong></div>
<div class="col-md-3">${details.residental_address || '-'}</div> <div class="col-md-3">${details.residental_address || '-'}</div>
@ -833,6 +864,15 @@
<div class="col-md-3"><strong>Differently Abled:</strong></div> <div class="col-md-3"><strong>Differently Abled:</strong></div>
<div class="col-md-3">${diffAbledDisplay || '-'}</div> <div class="col-md-3">${diffAbledDisplay || '-'}</div>
<div class="col-md-3"><strong>Type of Disability:</strong></div>
<div class="col-md-3">${details.diff_name || '-'}</div>
<div class="col-md-3"><strong>Specify the Disability:</strong></div>
<div class="col-md-3">${details.other_disability || '-'}</div>
<div class="col-md-3"><strong>Religion:</strong></div>
<div class="col-md-3">${details.religion_name || '-'}</div>
<div class="col-md-3"><strong>Aadhaar front Image:</strong></div> <div class="col-md-3"><strong>Aadhaar front Image:</strong></div>
<div class="col-md-3">${aadharFrontBtn}</div> <div class="col-md-3">${aadharFrontBtn}</div>
@ -842,6 +882,15 @@
<div class="col-md-3"><strong>Aadhaar back Image:</strong></div> <div class="col-md-3"><strong>Aadhaar back Image:</strong></div>
<div class="col-md-3">${aadharBackBtn}</div> <div class="col-md-3">${aadharBackBtn}</div>
<div class="col-md-12 mt-3">
<strong>Family Members:</strong>
</div>
<div class="col-md-12 mt-3">
${familyHtml}
</div>
</div> </div>
</div> </div>
@ -1137,6 +1186,24 @@
} }
}); });
} }
function formatDateForDisplay(dateStr) {
if (!dateStr) return "-";
// Already dd-MM-yyyy
if (/^\d{2}-\d{2}-\d{4}$/.test(dateStr)) {
return dateStr;
}
// yyyy-MM-dd -> dd-MM-yyyy
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
const [year, month, day] = dateStr.split("-");
return `${day}-${month}-${year}`;
}
return dateStr;
}
</script> </script>
</body> </body>

891
src/main/resources/templates/modules/vendors/approvedcertificates.html

@ -0,0 +1,891 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/modules/base/head :: head}"></head>
<style>
.custom-width1 {
width: 30%; /* Adjust the width as needed */
}
.custom-width2 {
width: 15%; /* Adjust the width as needed */
}
#viewModal .modal-body {
max-height: 70vh;
/* Limit the height to 70% of the viewport */
overflow-y: auto;
/* Enable vertical scrolling */
}
.custom-doc-btn {
height: 20px;
width: 80px;
font-size: 9px;
font-weight: bold;
text-align: center;
padding: 0px;
border: 1px solid grey;
}
.col-md-3 {
padding-bottom: 10px;
}
.comment {
margin-bottom: 20px;
}
.comment p {
margin: 0;
}
hr {
border: 1px solid #ccc;
}
.comment {
padding: 10px 0;
}
.comment .text-muted {
font-size: 0.9em;
color: #6c757d;
}
.comment hr {
border-top: 1px solid #ccc;
}
</style>
<body>
<div class="wrapper">
<!-- header top menu Start -->
<header th:replace="~{fragments/modules/base/header :: header}"></header>
<div class="page-wrap">
<div th:replace="~{fragments/modules/base/menu :: menu}"></div>
<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="fa fa-list-alt bg-blue"></i>
<div class="d-inline">
<h5>Approved Certificate</h5>
<span>Vending certificate approved list</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">Vending Committe</li>
<li class="breadcrumb-item active" aria-current="page">Certificate Approved</li>
</ol>
</nav>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-12">
<div class="card">
<div class="card-header">
<span style="font-size: medium;font-weight: bold;"> Filters</span>
<span th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span><span
th:text="${zone}" id="userzone" style="display: none;"></span>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-4 mb-3">
<label for="zonedropdown" class="form-label"> Select
Zone
</label> <select id="zonedropdown" class="form-control">
<option value="">Select Zone</option>
<!-- Zones will be loaded dynamically -->
</select>
</div>
<div class="col-md-4 mb-3">
<label for="warddropdown" class="form-label"> Select
Ward
</label> <select id="warddropdown" class="form-control">
<option value="">Select Ward</option>
<!-- Wards will be loaded based on selected zone -->
</select>
</div>
<div class="col-md-4 mb-3">
<label for="streetdropdown" class="form-label">
Street Name
</label>
<select id="streetdropdown" class="form-control">
<option value="">Select Street</option>
</select>
</div>
<div class="col-md-12 mb-2 d-flex justify-content-center">
<button type="submit" id="searchBtn"
class="btn btn-primary mx-2">Search</button>
<button class="btn btn-danger mx-2" id="resetBtn" name="reset" type="button">Reset</button>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="card">
<div class="card-header">
<span style="font-size: medium;font-weight: bold;">Certificate Approved List</span>
</div>
<div class="card-body">
<div class="table-responsive" >
<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 no-sort">S.No</th>
<th class="text-center no-sort">Zone</th>
<th class="text-center no-sort">Ward</th>
<th class="text-center no-sort">Vendor Name</th>
<th class="text-center no-sort">Mobile Number</th>
<th class="text-center custom-width1 no-sort">Street</th>
<th class="text-center no-sort">View</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="viewModal" tabindex="-1" aria-labelledby="viewModalLabel" aria-hidden="true"
data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-lg">
<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" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="modalBodyContent">
<!-- Dynamic content loads here -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Image Modal -->
<div class="modal fade" id="docModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-lg">
<div class="modal-content border-0">
<div class="modal-body p-0 text-center" style="background-color: #f8f9fa;">
<div id="docContainer" style="max-height: 90vh; overflow: auto;"></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>
<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 userzone = document.getElementById('userzone').textContent;
function openDocModal(fileUrl) {
const container = document.getElementById('docContainer');
const ext = fileUrl.split('.').pop().toLowerCase();
if (ext === 'pdf') {
container.innerHTML = `<iframe src="${fileUrl}" style="width:100%; height:90vh;" frameborder="0"></iframe>`;
} else {
container.innerHTML = `<img src="${fileUrl}" class="img-fluid" style="max-height:90vh; max-width:100%;" onerror="this.src='/default.jpg'">`;
}
$('#docModal').modal('show');
}
$(document).ready(function () {
var table = $('#RequestListDatatable').DataTable({
dom: 'Bftip',
columnDefs: [
{ targets: 'no-sort', orderable: false }
],
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '50vh',
buttons: [
{
extend: 'pageLength',
className: 'btn btn-warning'
},
{
title: 'Data export',
extend: 'copyHtml5',
text: 'Copy',
className: 'btn btn-secondary',
id: 'copyBtn'
},
{
extend: 'excelHtml5',
text: 'Excel',
className: 'btn btn-secondary',
id: 'excelBtn'
},
{
extend: 'csvHtml5',
text: 'CSV',
className: 'btn btn-secondary',
id: 'csvBtn'
},
{
extend: 'pdfHtml5',
text: 'PDF',
className: 'btn btn-secondary',
id: 'pdfBtn'
}
],
fixedHeader: false,
autoWidth: true,
responsive: true,
searching: false,
select: false,
processing: false
});
let zoneString = userzone; // e.g. "01,02,03,04,05"
if (zoneString) {
let zoneArray = zoneString.split(","); // ["01","02","03","04","05"]
zoneArray.forEach(z => {
$("#zonedropdown").append(
`<option value="${z}">${z}</option>`
);
});
}
$('#zonedropdown').on('change', function () {
$('#streetdropdown').empty()
.append('<option value="">Select Street</option>');
let selectedZone = $(this).val();
// Reset ward dropdown
$('#warddropdown').html(`<option value="">Select Ward</option>`);
if (selectedZone) {
fetchWardDropdown(selectedZone);
}
});
loadCertificateList();
});
function fetchWardDropdown(zone) {
$.ajax({
url: "/gcc/api/streetvendor/getwardbyzone",
type: "GET",
data: { zone: zone },
success: function (data) {
if (!data || data.length === 0) {
$('#warddropdown').html(`<option value="">No wards found</option>`);
return;
}
// Clear before loading
$('#warddropdown').html(`<option value="">Select Ward</option>`);
// Append wards
data.forEach(w => {
// backend returns ward_name
$('#warddropdown').append(
`<option value="${w.ward_name}">${w.ward_name}</option>`
);
});
},
error: function (xhr) {
console.error("Error fetching wards:", xhr.responseText);
$('#warddropdown').html(`<option value="">Error loading wards</option>`);
}
});
}
$('#warddropdown').change(function () {
let ward = $(this).val();
$('#streetdropdown').empty()
.append('<option value="">Select Street</option>');
if (ward) {
$.ajax({
url: '/gcc/api/vending/getstreetsbyward',
type: 'GET',
data: {
ward: ward
},
beforeSend: function () {
$("#pageLoader").show();
},
success: function (data) {
//console.log("API Response:", data);
// Clear existing options
$("#streetdropdown").empty();
// Default option
$("#streetdropdown").append(
'<option value="">Select Street</option>'
);
data.forEach(function(street) {
$("#streetdropdown").append(
`<option value="${street.streetid}">
${street.street}, ${street.location}, ${street.area}
</option>`
);
});
// Destroy if already initialized
if ($("#streetdropdown").hasClass("select2-hidden-accessible")) {
$("#streetdropdown").select2("destroy");
}
// Initialize Select2
$("#streetdropdown").select2({
width: "100%",
placeholder: "Search Street",
allowClear: true,
});
},
error: function (xhr, status, error) {
console.log("Error:", error);
console.log(xhr.responseText);
},
complete: function () {
$("#pageLoader").hide();
}
});
}
});
$("#searchBtn").click(function () {
loadCertificateList();
});
$('#resetBtn').on('click', function () {
location.reload();
return;
});
function loadCertificateList() {
let cby = document.getElementById('userIdSpan').textContent;
let zone = $("#zonedropdown").val();
let ward = $("#warddropdown").val();
let street_id = $("#streetdropdown").val();
$("#pageLoader").show();
$.ajax({
url: "/gcc/api/vending/getapprovedcertificates",
type: "GET",
data: {
zone: zone,
ward: ward,
street_id: street_id
},
success: function (data) {
$('#pageLoader').hide();
let tableContainer = $('#RequestListDatatable');
// Destroy any existing DataTable instance
if ($.fn.DataTable.isDataTable(tableContainer)) {
tableContainer.DataTable().destroy();
}
// Initialize DataTable
tableContainer.DataTable({
destroy: true,
searching: true,
autoWidth: false,
paging: true,
info: true,
data: data,
columns: [
{
data: null,
render: (data, type, row, meta) => meta.row + 1,
className: 'text-center'
},
{ data: 'zone', defaultContent: '-', className: 'text-center' },
{ data: 'ward', defaultContent: '-', className: 'text-center' },
{ data: 'name', defaultContent: '-', className: 'text-center' },
{ data: 'mob_no', defaultContent: '-', className: 'text-center' },
{ data: 'street_name', defaultContent: '-', className: 'text-center' },
{
data: 'id',
render: function (data, type, row) {
return `<button class="btn btn-primary btn-sm btn-view" data-id="${data}">View</button>`;
},
className: 'text-center'
}
],
dom: 'Bfrtip',
buttons: [
{ extend: 'pageLength', className: 'btn btn-warning' },
{ extend: 'copyHtml5', text: 'Copy', className: 'btn btn-secondary' },
{ extend: 'excelHtml5', text: 'Excel', className: 'btn btn-secondary' },
{ extend: 'csvHtml5', text: 'CSV', className: 'btn btn-secondary' },
{ extend: 'pdfHtml5', text: 'PDF', className: 'btn btn-secondary' }
],
columnDefs: [{ targets: 'no-sort', orderable: false }],
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '80vh',
scrollX: true,
responsive: false
});
// Bind view buttons
tableContainer.off('click', '.btn-view');
tableContainer.on('click', '.btn-view', function () {
let id = $(this).data('id');
$.ajax({
url: `/gcc/api/vending/finalvendorDetailsById?requestId=${id}`,
method: 'GET',
success: function (detailData) {
if (!detailData || detailData.length === 0) {
$('#modalBodyContent').html("<p>No data found for this request.</p>");
$('#viewModal').modal('show');
return;
}
const details = detailData[0];
const historyList = detailData.map(h => ({
date: h.vc_Inspection_date || "N/A",
status: h.vc_status || "N/A",
remarks: h.vc_remarks || "",
event: h.event_name || "-"
}));
const diffAbledDisplay = details.diff_abled ? (details.diff_abled ? 'Yes' : 'No') : '-';
const pmLoanDisplay = details.pm_svanidhi_loan ? (details.pm_svanidhi_loan ? 'Yes' : 'No') : '-';
const bankAccDisplay = details.bank_acc_status ? (details.bank_acc_status === '1' ? 'Yes' : 'No') : '-';
const idCardDisplay = details.vendor_id_card ? (details.vendor_id_card === '1' ? 'Yes' : 'No') : '-';
const bankPassbookDisplay = details.bank_acc_status === '1' && details.bank_passbook
? `<img src="${details.bank_passbook}" alt="Bank Passbook" class="img-fluid" style="max-width: 150px;" onerror="this.src='/default.jpg'">`
: '-';
const aadharFrontBtn = details.aadhar_front_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.aadhar_front_photo}')">View</button>` : '-';
const rationCardBtn = details.ration_card_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.ration_card_photo}')">View</button>` : '-';
const aadharBackBtn = details.aadhar_back_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.aadhar_back_photo}')">View</button>` : '-';
const bankPassbookBtn = details.bank_acc_status === '1' && details.bank_passbook
? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.bank_passbook}')">View</button>`
: '-';
const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-';
const familyMembers = details.familymembers_details || [];
let familyHtml = "-";
if (familyMembers.length > 0) {
familyHtml = `
<table class="table table-bordered table-sm mb-0">
<thead class="table-light">
<tr>
<th>S.No</th>
<th>Name</th>
<th>Age</th>
<th>Relationship</th>
</tr>
</thead>
<tbody>
${familyMembers.map((member, index) => `
<tr>
<td>${index + 1}</td>
<td>${member.name || '-'}</td>
<td>${member.age || '-'}</td>
<td>${member.relation_name || '-'}</td>
</tr>
`).join('')}
</tbody>
</table>
`;
}
let historyHtml = "";
historyList.forEach(h => {
historyHtml += `
<div class="comment mb-4">
<div class="row">
<div class="col-4 text-center">
<p class="text-muted"><strong>${h.date}</strong></p>
</div>
<div class="col-8">
<p><strong>Vending Committee ${h.status} (${h.event})</strong></p>
<p><strong>Remarks: </strong>${h.remarks}</p>
</div>
</div>
</div>`;
});
const certificateDetails = details.certificate_details || [];
let certificateCard = "";
if (certificateDetails.length > 0) {
const cert = certificateDetails[0]; // Active certificate
certificateCard = `
<div class="card mb-3">
<div class="card-header bg-secondary text-white">
Certificate Details
</div>
<div class="card-body row">
<div class="col-md-3"><strong>Alloted Zone:</strong></div>
<div class="col-md-3">${cert.zone || '-'}</div>
<div class="col-md-3"><strong>Alloted Ward:</strong></div>
<div class="col-md-3">${cert.ward || '-'}</div>
<div class="col-md-3"><strong>Alloted Street Name:</strong></div>
<div class="col-md-3">${cert.street_name || '-'}</div>
<div class="col-md-3"><strong>Status:</strong></div>
<div class="col-md-3">
<span class="badge badge-success">
${cert.status || '-'}
</span>
</div>
<div class="col-md-3"><strong>Generated Date:</strong></div>
<div class="col-md-3">${cert.cdate || '-'}</div>
</div>
</div>
`;
}
const content = `
<div class="container-fluid">
<!-- Personal Details -->
<div class="card mb-3">
<div class="card-header bg-primary text-white">Personal Details</div>
<div class="card-body row">
<div class="col-md-3"><strong>Name:</strong></div>
<div class="col-md-3">${details.name || '-'}</div>
<div class="col-md-3"><strong>Father/Husband Name:</strong></div>
<div class="col-md-3">${details.f_h_name || '-'}</div>
<div class="col-md-3"><strong>Mobile:</strong></div>
<div class="col-md-3">${details.mob_no || '-'}</div>
<div class="col-md-3"><strong>Community Category:</strong></div>
<div class="col-md-3">${details.category_name || '-'}</div>
<div class="col-md-3"><strong>DOB:</strong></div>
<div class="col-md-3">${formatDateForDisplay(details.dob_format)}</div>
<div class="col-md-3"><strong>Address:</strong></div>
<div class="col-md-3">${details.residental_address || '-'}</div>
<div class="col-md-3"><strong>Gender:</strong></div>
<div class="col-md-3">${details.gender || '-'}</div>
<div class="col-md-3"><strong>Differently Abled:</strong></div>
<div class="col-md-3">${diffAbledDisplay || '-'}</div>
<div class="col-md-3"><strong>Type of Disability:</strong></div>
<div class="col-md-3">${details.diff_name || '-'}</div>
<div class="col-md-3"><strong>Specify the Disability:</strong></div>
<div class="col-md-3">${details.other_disability || '-'}</div>
<div class="col-md-3"><strong>Religion:</strong></div>
<div class="col-md-3">${details.religion_name || '-'}</div>
<div class="col-md-3"><strong>Aadhaar front Image:</strong></div>
<div class="col-md-3">${aadharFrontBtn}</div>
<div class="col-md-3"><strong>Ration card Image:</strong></div>
<div class="col-md-3">${rationCardBtn}</div>
<div class="col-md-3"><strong>Aadhaar back Image:</strong></div>
<div class="col-md-3">${aadharBackBtn}</div>
<div class="col-md-12 mt-3">
<strong>Family Members:</strong>
</div>
<div class="col-md-12 mt-3">
${familyHtml}
</div>
</div>
</div>
<!-- Business Details -->
<div class="card mb-3">
<div class="card-header bg-success text-white">Business Details</div>
<div class="card-body row">
<div class="col-md-3"><strong>Type of Business:</strong></div>
<div class="col-md-3">${details.vending_category_name || '-'}</div>
<div class="col-md-3"><strong>Zone:</strong></div>
<div class="col-md-3">${details.zone || '-'}</div>
<div class="col-md-3"><strong>Business Space (sq.ft):</strong></div>
<div class="col-md-3">${details.vending_space || '-'}</div>
<div class="col-md-3"><strong>Ward:</strong></div>
<div class="col-md-3">${details.ward || '-'}</div>
<div class="col-md-3"><strong>Address:</strong></div>
<div class="col-md-3">${details.business_address || '-'}</div>
<div class="col-md-3"><strong>PM SVANidhi Loan Availed:</strong></div>
<div class="col-md-3">${pmLoanDisplay || '-'}</div>
<div class="col-md-3"><strong>Do you Have Bank Account?:</strong></div>
<div class="col-md-3">${bankAccDisplay || '-'}</div>
<div class="col-md-3"><strong>Bank Passbook Image:</strong></div>
<div class="col-md-3">${bankPassbookBtn}</div>
</div>
</div>
<!-- Inspection Details -->
<div class="card mb-3">
<div class="card-header bg-warning text-white">Inspection Details</div>
<div class="card-body row">
<div class="col-md-3"><strong>Vendor Type:</strong></div>
<div class="col-md-3">${details.vendor_type || '-'}</div>
<div class="col-md-3"><strong>Vendor ID Card:</strong></div>
<div class="col-md-3">${idCardDisplay}</div>
<div class="col-md-3"><strong>Vending Nature:</strong></div>
<div class="col-md-3">${details.vending_nature || '-'}</div>
<div class="col-md-3"><strong>Vending Time:</strong></div>
<div class="col-md-3">${details.vending_time || '-'}</div>
<div class="col-md-3"><strong>Transaction Mode:</strong></div>
<div class="col-md-3">${details.transaction_mode || '-'}</div>
<div class="col-md-3"><strong>Swanidi Loan Amount:</strong></div>
<div class="col-md-3">${details.swanidi_loan_amount || '-'}</div>
<div class="col-md-3"><strong>Vendor Space Image:</strong></div>
<div class="col-md-3">${spacePhotoBtn || '-'}</div>
</div>
</div>
<!-- Request History -->
<div class="card mb-3">
<div class="card-header bg-info text-white">Request History</div>
<div class="card-body">
<div class="comment mb-4">
<div class="row">
<div class="col-4 text-center">
<p class="text-muted"><strong>${details.LI_Cdate || 'N/A'}</strong></p>
</div>
<div class="col-8">
<p><strong>LI Officer ${details.LI_Status || 'N/A'}</strong></p>
<p><strong>Remarks: </strong>${details.LI_Remarks || ''}</p>
</div>
</div>
</div>
<div class="comment mb-4">
<div class="row">
<div class="col-4 text-center">
<p class="text-muted"><strong>${details.ARO_Inspection_date || 'N/A'}</strong></p>
</div>
<div class="col-8">
<p><strong>ARO Officer ${details.ARO_status || 'N/A'}</strong></p>
<p><strong>Remarks: </strong>${details.ARO_remarks || ''}</p>
</div>
</div>
</div>
<div class="comment mb-4">
<div class="row">
<div class="col-4 text-center">
<p class="text-muted"><strong>${details.EE_Inspection_date || 'N/A'}</strong></p>
</div>
<div class="col-8">
<p><strong>EE Officer ${details.EE_status || 'N/A'}</strong></p>
<p><strong>Remarks: </strong>${details.EE_remarks || ''}</p>
</div>
</div>
</div>
${historyHtml}
</div>
</div>
${certificateCard}
</div>
`;
$('#modalBodyContent').html(content);
$('#viewModalLabel').text(`Vendor Details - ${id}`);
$('#viewModal').modal('show');
},
error: function (xhr) {
console.error("Error fetching detail:", xhr.responseText);
alert("Failed to fetch vendor details.");
}
});
});
},
error: function () {
$('#pageLoader').hide();
Swal.fire(
'Error',
'Failed to load Road War details',
'error'
);
}
});
}
function formatDateForDisplay(dateStr) {
if (!dateStr) return "-";
// Already dd-MM-yyyy
if (/^\d{2}-\d{2}-\d{4}$/.test(dateStr)) {
return dateStr;
}
// yyyy-MM-dd -> dd-MM-yyyy
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
const [year, month, day] = dateStr.split("-");
return `${day}-${month}-${year}`;
}
return dateStr;
}
</script>
</body>
</html>

716
src/main/resources/templates/modules/vendors/certificate.html

@ -59,6 +59,70 @@
.comment hr { .comment hr {
border-top: 1px solid #ccc; border-top: 1px solid #ccc;
} }
.certificate{
background:#fff;
border:2px solid #000;
padding:25px;
font-family:'Times New Roman', serif;
}
.certificate table{
margin-top:15px;
}
.certificate table th{
width:35%;
background:#f4f4f4;
font-weight:bold;
vertical-align:middle;
}
.certificate table td{
vertical-align:middle;
}
.certificate h4{
margin-bottom:5px;
color: green;
}
.certificate h5{
margin-bottom:5px;
color: blue;
}
.certificate .sub-content{
font-size: medium;
}
.green-row td{
border:2px solid green !important;
}
.certificate table{
width:100%;
table-layout:fixed;
border-collapse:collapse;
}
.certificate table td,
.certificate table th{
word-wrap:break-word;
vertical-align:middle;
}
#certificateStreet + .select2-container{
width:100% !important;
}
.select2-selection{
overflow:hidden;
}
.select2-selection__rendered{
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
</style> </style>
<body> <body>
@ -82,7 +146,7 @@
<i class="fa fa-list-alt bg-blue"></i> <i class="fa fa-list-alt bg-blue"></i>
<div class="d-inline"> <div class="d-inline">
<h5>Vending Certificate</h5> <h5>Vending Certificate</h5>
<span>Vending Committe</span>
<span>Vending Committee</span>
</div> </div>
</div> </div>
</div> </div>
@ -170,7 +234,9 @@
<th class="text-center">Public Name</th> <th class="text-center">Public Name</th>
<th class="text-center">Mobile</th> <th class="text-center">Mobile</th>
<th class="text-center">ID Status</th> <th class="text-center">ID Status</th>
<th class="text-center">UID Number</th>
<th class="text-center no-sort" width="%2">View Details</th> <th class="text-center no-sort" width="%2">View Details</th>
<th class="text-center no-sort" width="%2">Certificate</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -222,6 +288,28 @@
</div> </div>
<div class="modal fade" id="certificateModal" tabindex="-1" aria-labelledby="certificateModalLabel" aria-hidden="true"
data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="labelcertificateModal">Certificate Details</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="cmodalContent">
<!-- Dynamic content loads here -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-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 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 style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;"> <div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
@ -341,7 +429,9 @@
fetchWardDropdown(selectedZone); fetchWardDropdown(selectedZone);
} }
}); });
fetchVendingCommitteeList("", "Approved", "", "", userId)
fetchVendingCommitteeList("", "", "", userId);
}); });
@ -385,29 +475,20 @@
const meeting = $('#meetingdropdown').val(); const meeting = $('#meetingdropdown').val();
const status = "Approved";
const zone = $('#zonedropdown').val(); const zone = $('#zonedropdown').val();
const ward = $('#warddropdown').val(); const ward = $('#warddropdown').val();
console.log("Selected Meeting Value:", meeting);
console.log("Selected Status Value:", status);
console.log("Selected zone Value:", zone);
console.log("Selected ward Value:", ward);
// 👉 Now call your API or next function using these two
fetchVendingCommitteeList(meeting, status, zone, ward, userId);
// call your API
fetchVendingCommitteeList(meeting, zone, ward, userId);
}); });
function fetchVendingCommitteeList(event_req_id, status, zone, ward) {
function fetchVendingCommitteeList(event_req_id, zone, ward,userId) {
$('#pageLoader').show(); $('#pageLoader').show();
$.ajax({ $.ajax({
url: '/gcc/api/vending/getreports',
data: { meeting: event_req_id, status: status, zone: zone, ward: ward, userId: userId },
url: '/gcc/api/vending/getvendorforcertificate',
data: { meeting: event_req_id, zone: zone, ward: ward, userId: userId },
method: 'GET', method: 'GET',
contentType: 'application/json', contentType: 'application/json',
success: function (data) { success: function (data) {
@ -463,12 +544,20 @@
} }
} }
}, },
{ data: 'uid_no', defaultContent: '-', className: 'text-center' },
{ {
data: 'id', data: 'id',
render: function (data, type, row) { render: function (data, type, row) {
return `<button class="btn btn-primary btn-sm btn-view" data-id="${data}">View</button>`; return `<button class="btn btn-primary btn-sm btn-view" data-id="${data}">View</button>`;
}, },
className: 'text-center' className: 'text-center'
},
{
data: 'id',
render: function (data, type, row) {
return `<button class="btn btn-warning btn-sm btn-cer_view" data-id="${data}">Update</button>`;
},
className: 'text-center'
} }
], ],
@ -533,6 +622,36 @@
const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-'; const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-';
const familyMembers = details.familymembers_details || [];
let familyHtml = "-";
if (familyMembers.length > 0) {
familyHtml = `
<table class="table table-bordered table-sm mb-0">
<thead class="table-light">
<tr>
<th>S.No</th>
<th>Name</th>
<th>Age</th>
<th>Relationship</th>
</tr>
</thead>
<tbody>
${familyMembers.map((member, index) => `
<tr>
<td>${index + 1}</td>
<td>${member.name || '-'}</td>
<td>${member.age || '-'}</td>
<td>${member.relation_name || '-'}</td>
</tr>
`).join('')}
</tbody>
</table>
`;
}
let historyHtml = ""; let historyHtml = "";
historyList.forEach(h => { historyList.forEach(h => {
@ -568,8 +687,9 @@
<div class="col-md-3"><strong>Community Category:</strong></div> <div class="col-md-3"><strong>Community Category:</strong></div>
<div class="col-md-3">${details.category_name || '-'}</div> <div class="col-md-3">${details.category_name || '-'}</div>
<div class="col-md-3"><strong>DOB:</strong></div> <div class="col-md-3"><strong>DOB:</strong></div>
<div class="col-md-3">${details.dob || '-'}</div>
<div class="col-md-3">${formatDateForDisplay(details.dob_format)}</div>
<div class="col-md-3"><strong>Address:</strong></div> <div class="col-md-3"><strong>Address:</strong></div>
<div class="col-md-3">${details.residental_address || '-'}</div> <div class="col-md-3">${details.residental_address || '-'}</div>
@ -581,6 +701,15 @@
<div class="col-md-3"><strong>Differently Abled:</strong></div> <div class="col-md-3"><strong>Differently Abled:</strong></div>
<div class="col-md-3">${diffAbledDisplay || '-'}</div> <div class="col-md-3">${diffAbledDisplay || '-'}</div>
<div class="col-md-3"><strong>Type of Disability:</strong></div>
<div class="col-md-3">${details.diff_name || '-'}</div>
<div class="col-md-3"><strong>Specify the Disability:</strong></div>
<div class="col-md-3">${details.other_disability || '-'}</div>
<div class="col-md-3"><strong>Religion:</strong></div>
<div class="col-md-3">${details.religion_name || '-'}</div>
<div class="col-md-3"><strong>Aadhaar front Image:</strong></div> <div class="col-md-3"><strong>Aadhaar front Image:</strong></div>
<div class="col-md-3">${aadharFrontBtn}</div> <div class="col-md-3">${aadharFrontBtn}</div>
@ -590,6 +719,15 @@
<div class="col-md-3"><strong>Aadhaar back Image:</strong></div> <div class="col-md-3"><strong>Aadhaar back Image:</strong></div>
<div class="col-md-3">${aadharBackBtn}</div> <div class="col-md-3">${aadharBackBtn}</div>
<div class="col-md-12 mt-3">
<strong>Family Members:</strong>
</div>
<div class="col-md-12 mt-3">
${familyHtml}
</div>
</div> </div>
</div> </div>
@ -716,7 +854,529 @@
} }
}); });
}); });
tableContainer.off('click', '.btn-cer_view');
tableContainer.on('click', '.btn-cer_view', function () {
let id = $(this).data('id');
console.log("id===",id);
$.ajax({
url: `/gcc/api/vending/finalvendorDetailsById?requestId=${id}`,
method: 'GET',
success: function (detailData) {
if (!detailData || detailData.length === 0) {
$('#cmodalContent').html("<p>No data found for this request.</p>");
$('#certificateModal').modal('show');
return;
}
const details = detailData[0];
const familyMembersHtml =
details.familymembers_details && details.familymembers_details.length > 0
? `
<table class="table table-bordered table-sm mb-0">
<thead>
<tr>
<th>வ.எண்</th>
<th>பெயர்</th>
<th>வயது</th>
<th>உறவுமுறை</th>
</tr>
</thead>
<tbody>
${details.familymembers_details.map((member, index) => `
<tr>
<td>${index + 1}</td>
<td>${member.name || '-'}</td>
<td>${member.age || '-'}</td>
<td>${member.relation_name || '-'}</td>
</tr>
`).join('')}
</tbody>
</table>
`
: `<span>-</span>`;
const content = `
<div class="certificate">
<!-- Header -->
<div class="text-center mb-3">
<img src="https://gccservices.in/gcc/assets/images/logo.png" alt="GCC Logo" style="height:80px;">
<h4 class="mt-2 font-weight-bold">
பெருநகர சென்னை மாநகராட்சி
</h4>
<h5>விற்பனை சான்றிதழ்</h5>
<p>
தெருவோர வியாபாரிகளின் (வாழ்வாதாரம் பாதுகாப்பு மற்றும் தெருவோர விற்பனையை ஒழுங்குபடுத்துதல்) சட்டம், 2014
</p>
</div>
<div class="row mb-3">
<div class="col-9">
<br>
<strong class="sub-content">பெருநகர சென்னை மாநகராட்சியால் வழங்கப்பட்ட தெருவோர வியாபாரிகளுக்கான அடையாள அட்டை எண் : ${details.uid_no}</strong>
</div>
<div class="col-3 text-right">
<img src="${details.street_vendor_photo}"
alt="vendor_img"
style="width:120px;height:140px;border:1px solid #000;">
</div>
</div>
<table class="table table-bordered certificate-table">
<colgroup>
<col style="width:9%">
<col style="width:51%">
<col style="width:40%">
</colgroup>
<tbody>
<tr>
<td width="9%">வ.எண்</td>
<td colspan="2">விவரங்கள்</td>
</tr>
<tr>
<td>1</td>
<td>தெருவோர வியாபாரியின் பெயர்</td>
<td>${details.tamil_name || '-'}/${details.name || '-'}</td>
</tr>
<tr>
<td>2</td>
<td>தந்தை / கணவன் பெயர்</td>
<td>${details.tamil_f_h_name || '-'}/${details.f_h_name || '-'}</td>
</tr>
<tr>
<td>3</td>
<td>பிறந்த தேதி / வயது</td>
<td>${details.dob_format || '-'}</td>
</tr>
<tr>
<td>4</td>
<td>பாலினம்:ஆண் / பெண் / திருநங்கை</td>
<td>${details.tamil_gender|| '-'}/${details.gender|| '-'}</td>
</tr>
<tr>
<td>5</td>
<td>தெரு வியாபாரியின் வீட்டு முகவரி</td>
<td>${details.residental_address || '-'}</td>
</tr>
<tr>
<td>6</td>
<td>பிரிவு: பொது / தாழ்த்தப்பட்ட / பழங்குடியினர் / இதர பிற்படுத்தப்பட்டவகுப்பினர்</td>
<td>${details.category_name || '-'}</td>
</tr>
<tr>
<td>7</td>
<td>மதம்</td>
<td>${details.religion_name || '-'}</td>
</tr>
<tr>
<td>8</td>
<td>மாற்றுத்திறனாளி: ஆம் / இல்லை</td>
<td>
${
details.diff_abled === true
? `ஆம்${details.diff_name ? ` - ${details.diff_name}` : ''}${
details.other_disability && details.other_disability.trim() !== ''
? ` - ${details.other_disability}`
: ''
}`
: details.diff_abled === false
? 'இல்லை'
: ''
}
</td>
</tr>
<tr>
<td>9</td>
<td>வியாபாரத்தின் தன்மை (தள்ளு வண்டி / நிலையானது / மோட்டார் வாகனம் </td>
<td>${details.vendor_type || '-'}/${details.vendor_sub_type || '-'}</td>
</tr>
<tr>
<td>10</td>
<td>வியாபாரத்தின் பெயர்</td>
<td>${details.tamil_vending_category_name || '-'}/${details.vending_category_name || '-'}</td>
</tr>
<tr>
<td>11</td>
<td>வியாபாரம் செய்ய ஒதுக்கப்பட்ட பரப்பளவு (சதுர அடியில்)</td>
<td>${details.vending_space || '-'} sq ft</td>
</tr>
<tr class="green-row">
<td>12</td>
<td>அறிவிக்கப்பட்ட விற்பனை மண்டலம்</td>
<td>
<div class="d-flex">
<select id="certificateZone" class="form-control form-control-sm mr-2 w-100" style="width:120px;">
</select>
<select id="certificateWard" class="form-control form-control-sm w-100" style="width:120px;">
</select>
</div>
</td>
</tr>
<tr class="green-row">
<td >13</td>
<td>வியாபாரம் நடைபெறும் இடம் with landmark</td>
<td>
<select id="certificateStreet" class="form-control form-control-sm">
</select>
</td>
</tr>
<tr>
<td>14</td>
<td>வியாபாரம் மேற்கொள்ளும் நாட்கள் மற்றும் நேரம்</td>
<td>${details.vending_nature || '-'} - ${details.vending_time || '-'}</td>
</tr>
<tr>
<td>15</td>
<td colspan="2">குடும்ப உறுப்பினர்களின் விவரம்(${details.no_of_fam_mem})${familyMembersHtml}</td>
</tr>
<tr>
<td>16</td>
<td>ஆதார் எண்</td>
<td>${details.aadhar_no || '-'}</td>
</tr>
<tr>
<td>17</td>
<td>மொபைல்/தொலைபேசி எண்</td>
<td>${details.mob_no || '-'}</td>
</tr>
</tbody>
</table>
</div>
<div class="text-center mt-3 mb-3">
<button class="btn btn-primary" id="certificate_btn">Give Certificate</button>
<div>
`;
$('#cmodalContent').html(content);
$('#labelcertificateModal').text(`Certificate Details - ${id}`);
$("#certificateZone").html($("#zonedropdown").html());
// Don't select anything
$("#certificateZone").val("");
$("#certificateWard").html('<option value="">Select Ward</option>');
$("#certificateStreet").html('<option value="">Select Street</option>');
$("#certificateZone").off("change").on("change", function () {
let zone = $(this).val();
$("#certificateWard").html('<option value="">Select Ward</option>');
$("#certificateStreet").html('<option value="">Select Street</option>');
if (!zone)
return;
$.ajax({
url: "/gcc/api/streetvendor/getwardbyzone",
type: "GET",
data: {
zone: zone
},
success: function(data) {
data.forEach(function(w) {
$("#certificateWard").append(
`<option value="${w.ward_name}">
${w.ward_name}
</option>`
);
});
}
});
});
$("#certificateWard").off("change").on("change", function () {
$('#pageLoader').show();
let ward = $(this).val();
$("#certificateStreet").html('<option value="">Select Street</option>');
if (!ward)
return;
$.ajax({
url: "/gcc/api/vending/getstreetsbyward",
type: "GET",
data: {
ward: ward
},
success: function(data) {
$('#pageLoader').hide();
// Clear existing options
$("#certificateStreet").empty();
// Default option
$("#certificateStreet").append(
'<option value="">Select Street</option>'
);
data.forEach(function(street) {
$("#certificateStreet").append(
`<option value="${street.streetid}">
${street.street}, ${street.location}, ${street.area}
</option>`
);
});
// Destroy if already initialized
if ($("#certificateStreet").hasClass("select2-hidden-accessible")) {
$("#certificateStreet").select2("destroy");
}
// Initialize Select2
$("#certificateStreet").select2({
width: "100%",
placeholder: "Search Street",
allowClear: true,
dropdownParent: $("#certificateModal") // important for modal
});
}
});
});
$(document).off("click", "#certificate_btn").on("click", "#certificate_btn", function () {
$('#certificate_btn').prop('disabled', true);
console.log("Clicked");
// Fields that must always have a value
const mandatoryFields = {
name: "Person Name",
tamil_name:"Person Name in Tamil",
f_h_name: "Father/Husband Name",
tamil_f_h_name:"Father/Husband Name in Tamil",
dob_format: "Date of Birth",
gender: "Gender",
tamil_gender:"Gender in Tamil",
residental_address: "Residential Address",
category_name: "Community Category",
religion_name: "Religion",
diff_abled:"Disability",
vendor_type: "Vendor Type",
vendor_sub_type: "Vendor Sub Type",
vending_category_name: "Business Name",
tamil_vending_category_name: "Tamil Business Name",
vending_space: "Business Space sq.ft",
vending_nature: "Business Nature",
vending_time: "Business Time",
aadhar_no: "Aadhaar Number",
mob_no: "Mobile Number",
no_of_fam_mem: "No. of Family Members"
};
// Check mandatory fields
for (const key in mandatoryFields) {
if (
details[key] === null ||
details[key] === undefined ||
String(details[key]).trim() === ""
) {
$('#certificate_btn').prop('disabled', false);
Swal.fire({
icon: "warning",
title: "Incomplete Details",
text: `${mandatoryFields[key]} is missing.`
});
return;
}
}
// Differently Abled validation
if (details.diff_abled === true) {
if (!details.diff_name || details.diff_name.trim() === "") {
$('#certificate_btn').prop('disabled', false);
Swal.fire("Incomplete Details",
"Disability Type is missing.",
"warning");
return;
}
if (
(details.diff_name.toLowerCase() === "others" || details.diff_name.includes("மற்றவை")) &&
(!details.other_disability ||
details.other_disability.trim() === "")
) {
$('#certificate_btn').prop('disabled', false);
Swal.fire("Incomplete Details",
"Specify Disability is missing.",
"warning");
return;
}
}
// Family members validation
if (Number(details.no_of_fam_mem) > 0) {
if (
!details.familymembers_details ||
details.familymembers_details.length !== Number(details.no_of_fam_mem)
) {
$('#certificate_btn').prop('disabled', false);
Swal.fire(
"Incomplete Details",
"Family member details are incomplete.",
"warning"
);
return;
}
}
// Certificate selections
const zone = $("#certificateZone").val();
const ward = $("#certificateWard").val();
const streetid = $("#certificateStreet").val();
if (!zone || !ward || !streetid) {
$('#certificate_btn').prop('disabled', false);
Swal.fire(
"Selection Required",
"Please select Zone, Ward and Street.",
"warning"
);
return;
}
const photo = details.street_vendor_photo;
if (!photo || photo.trim() === "") {
$('#certificate_btn').prop('disabled', false);
Swal.fire(
"Incomplete Details",
"Street Vendor Photo is missing.",
"warning"
);
return;
}
try {
new URL(photo);
} catch (e) {
$('#certificate_btn').prop('disabled', false);
Swal.fire(
"Incomplete Details",
"Street Vendor Photo URL is invalid.",
"warning"
);
return;
}
const street_id = $("#certificateStreet").val();
const street_name = $("#certificateStreet option:selected").text().trim();
// Everything OK
$.ajax({
url: "/gcc/api/vending/giveCertificate",
type: "POST",
data: {
vdid: id,
cby: userId,
zone: zone,
ward: ward,
street_id: street_id,
street_name: street_name
},
success: function (response) {
$('#certificate_btn').prop('disabled', false);
if (response.status === "success") {
Swal.fire({
icon: "success",
title: "Success",
text: response.message
}).then(() => {
$("#certificateModal").modal("hide");
location.reload();
});
} else {
Swal.fire({
icon: "error",
title: "Error",
text: response.message
});
}
},
error: function() {
$('#certificate_btn').prop('disabled', false);
Swal.fire({
icon: "error",
title: "Error",
text: "Something went wrong. Please try again."
});
}
});
});
$('#certificateModal').modal('show');
},
error: function (xhr) {
console.error("Error fetching for certificate detail:", xhr.responseText);
alert("Failed to fetch detail for certificate of vending.");
}
});
});
}, },
error: function (xhr, status, error) { error: function (xhr, status, error) {
@ -726,6 +1386,10 @@
} }
}); });
} }
// Call this function on page load // Call this function on page load
function fetchEventDropdown(userId) { function fetchEventDropdown(userId) {
@ -756,7 +1420,23 @@
}); });
} }
function formatDateForDisplay(dateStr) {
if (!dateStr) return "-";
// Already dd-MM-yyyy
if (/^\d{2}-\d{2}-\d{4}$/.test(dateStr)) {
return dateStr;
}
// yyyy-MM-dd -> dd-MM-yyyy
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
const [year, month, day] = dateStr.split("-");
return `${day}-${month}-${year}`;
}
return dateStr;
}
</script> </script>

658
src/main/resources/templates/modules/vendors/streetVendorRequestForm.html

@ -360,36 +360,36 @@
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Landmark (maximum 255 characters)</label>
<label class="form-label">Landmark (maximum 255 characters)<span class="text-danger">*</span></label>
<textarea class="form-control" id="landmark" name="landmark" <textarea class="form-control" id="landmark" name="landmark"
maxlength="255"></textarea>
maxlength="255" required="required"></textarea>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">விற்பனை பகுதி</label>
<label class="form-label">விற்பனை பகுதி<span class="text-danger">*</span></label>
<textarea class="form-control" id="landmark_tamil" name="landmark_tamil" <textarea class="form-control" id="landmark_tamil" name="landmark_tamil"
placeholder="தமிழில் பதிவு செய்யவும்"></textarea>
placeholder="தமிழில் பதிவு செய்யவும்" required="required"></textarea>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">District</label>
<label class="form-label">District<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="vendor_district" <input type="text" class="form-control" id="vendor_district"
name="vendor_district" name="vendor_district"
oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')">
oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" required="required">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label"> மாவட்டம்</label>
<label class="form-label"> மாவட்டம்<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="vendor_district_tamil" <input type="text" class="form-control" id="vendor_district_tamil"
name="vendor_district_tamil" placeholder="தமிழில் பதிவு செய்யவும்">
name="vendor_district_tamil" placeholder="தமிழில் பதிவு செய்யவும்" required="required">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Pincode</label>
<label class="form-label">Pincode<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="vendor_pincode" <input type="text" class="form-control" id="vendor_pincode"
name="vendor_pincode" oninput="validatePincode(this)">
name="vendor_pincode" oninput="validatePincode(this)" required="required">
</div> </div>
</div> </div>
@ -397,8 +397,7 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label for="businesstype" class="form-label">Type of Business <span
class="text-danger">*</span>
<label for="businesstype" class="form-label">Type of Business <span class="text-danger">*</span>
</label> </label>
<select id="businesstype" name="businesstype" class="form-control" required> <select id="businesstype" name="businesstype" class="form-control" required>
<option value="">-- Select Business Type --</option> <option value="">-- Select Business Type --</option>
@ -429,9 +428,9 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Business Space (Sq ft)| வியாபார இடம் </label>
<label class="form-label">Business Space (Sq ft)| வியாபார இடம்<span class="text-danger">*</span> </label>
<input type="text" class="form-control" id="business_space" <input type="text" class="form-control" id="business_space"
name="business_space">
name="business_space" required="required">
</div> </div>
</div> </div>
@ -452,7 +451,7 @@
<div class="col-md-6" id="bank_passbook_container" style="display:none;"> <div class="col-md-6" id="bank_passbook_container" style="display:none;">
<label for="bank_passbook" class="form-label">Upload Bank Passbook <label for="bank_passbook" class="form-label">Upload Bank Passbook
(jpg/jpeg/pdf)
(jpg/jpeg/pdf)<span class="text-danger">*</span>
</label> </label>
<input type="file" class="form-control" id="bank_passbook" name="bank_passbook" <input type="file" class="form-control" id="bank_passbook" name="bank_passbook"
accept=".jpg,.jpeg,.pdf,application/pdf"> accept=".jpg,.jpeg,.pdf,application/pdf">
@ -467,9 +466,9 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Profile Image (jpg/jpeg/pdf)</label>
<label class="form-label">Profile Image (jpg/jpeg/pdf)<span class="text-danger">*</span></label>
<input type="file" class="form-control" id="profileimage" <input type="file" class="form-control" id="profileimage"
accept=".jpg,.jpeg,.pdf,application/pdf" name="profileimage">
accept=".jpg,.jpeg,.pdf,application/pdf" name="profileimage" required="required">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
@ -486,28 +485,28 @@
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Father's / Husband's Name </label>
<label class="form-label">Father's / Husband's Name<span class="text-danger">*</span> </label>
<input type="text" class="form-control" id="father_name" name="father_name" <input type="text" class="form-control" id="father_name" name="father_name"
oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')">
oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" required="required">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label"> தந்தை/கணவர் பெயர் </label>
<label class="form-label"> தந்தை/கணவர் பெயர்<span class="text-danger">*</span> </label>
<input type="text" class="form-control" id="father_name_tamil" <input type="text" class="form-control" id="father_name_tamil"
name="father_name_tamil" placeholder="தமிழில் பதிவு செய்யவும்">
name="father_name_tamil" placeholder="தமிழில் பதிவு செய்யவும்" required="required">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Gender | பாலினம் </label><br>
<label class="form-label">Gender<span class="text-danger">*</span> </label><br>
<input type="radio" name="gender" value="Male"> Male <input type="radio" name="gender" value="Male"> Male
<input type="radio" name="gender" value="Female" class="ms-3"> Female <input type="radio" name="gender" value="Female" class="ms-3"> Female
<input type="radio" name="gender" value="Transgender" class="ms-3">Transgender <input type="radio" name="gender" value="Transgender" class="ms-3">Transgender
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label"> பாலினம் </label><br>
<label class="form-label"> பாலினம் <span class="text-danger">*</span></label><br>
<input type="radio" name="gender_tamil" value="ஆண்"> ஆண் <input type="radio" name="gender_tamil" value="ஆண்"> ஆண்
<input type="radio" name="gender_tamil" value="பெண்" class="ms-3"> பெண் <input type="radio" name="gender_tamil" value="பெண்" class="ms-3"> பெண்
<input type="radio" name="gender_tamil" value="பிற்பாலினர்" <input type="radio" name="gender_tamil" value="பிற்பாலினர்"
@ -527,12 +526,12 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Date of Birth | பிறந்த தேதி </label>
<input type="date" id="dob" class="form-control" name="dob">
<label class="form-label">Date of Birth | பிறந்த தேதி<span class="text-danger">*</span> </label>
<input type="date" id="dob" class="form-control" name="dob" required="required">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Community Category | சமூக வகை </label>
<select class="form-control" id="community" name="community">
<label class="form-label">Community Category | சமூக வகை <span class="text-danger">*</span></label>
<select class="form-control" id="community" name="community" required>
<option value="">-- Select Community --</option> <option value="">-- Select Community --</option>
<th:block th:each="com : ${communities}"> <th:block th:each="com : ${communities}">
<option th:value="${com.id}" th:text="${com.category_name}"></option> <option th:value="${com.id}" th:text="${com.category_name}"></option>
@ -543,12 +542,33 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Differently Abled | இயலாமை உள்ளவரா? </label><br>
<label class="form-label">Differently Abled | இயலாமை உள்ளவரா?<span class="required">*</span> </label><br>
<input type="radio" name="differently_abled" value="Yes"> Yes <input type="radio" name="differently_abled" value="Yes"> Yes
<input type="radio" name="differently_abled" value="No" class="ms-3"> No <input type="radio" name="differently_abled" value="No" class="ms-3"> No
</div> </div>
<div class="col-md-6" id="diffSection" style="display: none;">
<label class="form-label">Type of Disability | இயலாமையின் வகை <span class="required">*</span> </label>
<select class="form-control" id="diff_type" name="diff_type">
<option value="">-- Select Disability --</option>
<th:block th:each="diff : ${DiffAbledList}">
<option th:value="${diff.id}" th:text="${diff.name}"></option>
</th:block>
</select>
<div id="otherDisabilityDiv" class="mt-2" style="display:none;">
<label class="form-label">
Specify Disability | இயலாமையை குறிப்பிடவும்
<span class="required">*</span>
</label>
<input type="text"
class="form-control"
id="other_disability"
name="other_disability"
placeholder="Enter Disability">
</div>
</div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Street Vendor’s educational status | தெருவணிகரின் <label class="form-label">Street Vendor’s educational status | தெருவணிகரின்
@ -575,13 +595,29 @@
</th:block> </th:block>
</select> </select>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label for="religion" class="form-label"> Religion | மதம்<span class="text-danger">*</span></label>
<select class="form-control" id="religion" name="religion" required="required">
<option value="">-- Select Religion --</option>
<th:block th:each="religion : ${religionList}">
<option th:value="${religion.id}" th:text="${religion.religion}">
</option>
</th:block>
</select>
</div>
<div class="col-md-6 mt-3">
<label for="familymembers" class="form-label">Number of Family Members | குடும்ப <label for="familymembers" class="form-label">Number of Family Members | குடும்ப
உறுப்பினர்கள் எண்ணிக்கை </label>
உறுப்பினர்கள் எண்ணிக்கை<span class="text-danger">*</span></label>
<input type="number" class="form-control" name="familymembers" <input type="number" class="form-control" name="familymembers"
id="familymembers">
id="familymembers" max="15" required="required">
</div> </div>
</div> </div>
<div id="familyMemberContainer"></div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Are any of your family member involved in street vending | <label class="form-label">Are any of your family member involved in street vending |
@ -600,34 +636,34 @@
<input type="text" class="form-control" name="doorno" id="doorno"> <input type="text" class="form-control" name="doorno" id="doorno">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Street Name | தெரு பெயர் </label>
<input type="text" class="form-control" name="streetname" id="streetname">
<label class="form-label">Street Name | தெரு பெயர் <span class="text-danger">*</span></label>
<input type="text" class="form-control" name="streetname" id="streetname" required>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Area Name | பகுதி பெயர் </label>
<input type="text" class="form-control" name="areaname" id="areaname">
<label class="form-label">Area Name | பகுதி பெயர்<span class="text-danger">*</span> </label>
<input type="text" class="form-control" name="areaname" id="areaname" required>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">District | மாவட்டம் </label>
<label class="form-label">District | மாவட்டம் <span class="text-danger">*</span></label>
<input type="text" class="form-control" name="district" id="district" <input type="text" class="form-control" name="district" id="district"
oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')">
oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" required>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Pincode | அஞ்சல் குறியீடு </label>
<label class="form-label">Pincode | அஞ்சல் குறியீடு<span class="text-danger">*</span> </label>
<input type="text" class="form-control" name="pincode" id="pincode" <input type="text" class="form-control" name="pincode" id="pincode"
oninput="validatePincode(this)">
oninput="validatePincode(this)" required>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Aadhaar Number | ஆதார் எண் </label>
<label class="form-label">Aadhaar Number | ஆதார் எண்<span class="text-danger">*</span> </label>
<input type="text" class="form-control" id="aadhar_number" name="aadhar_number" <input type="text" class="form-control" id="aadhar_number" name="aadhar_number"
maxlength="12" oninput="validateAadhar(this)">
maxlength="12" oninput="validateAadhar(this)" required>
</div> </div>
</div> </div>
@ -748,6 +784,8 @@
<script src="https://www.gstatic.com/inputtools/js/ln/13/en.js"></script> <script src="https://www.gstatic.com/inputtools/js/ln/13/en.js"></script>
<script> <script>
var relationshipOptions = "";
function allowTamilAndSymbols(id) { function allowTamilAndSymbols(id) {
const el = document.getElementById(id); const el = document.getElementById(id);
@ -863,83 +901,7 @@
fetchStreets(lat, lng); fetchStreets(lat, lng);
}); });
// ✅ Move fetchStreets here inside myMap, and use local streetsList
/* function fetchStreets(lat, lng) {
const encodedGeometry = encodeURIComponent(JSON.stringify({ y: lat, x: lng }));
const streetURL = `https://gisgcc.chennaicorporation.gov.in/server/rest/services/GCCDepts/EDPMobile2025/FeatureServer/0/query?` +
`where=&objectIds=&time=&geometry=${encodedGeometry}` +
`&geometryType=esriGeometryPoint&inSR=4326&defaultSR=4326&spatialRel=esriSpatialRelIntersects&distance=25` +
`&units=esriSRUnit_Meter&relationParam=&outFields=region%2Cnew_zone%2C+new_ward%2Croad_id%2C+road_name%2Cgis_id%2Ctype` +
`&returnGeometry=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&gdbVersion=&historicMoment=` +
`&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=` +
`&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&multipatchOption=xyFootprint&resultOffset=` +
`&resultRecordCount=&returnTrueCurves=false&returnExceededLimitFeatures=false&quantizationParameters=&returnCentroid=false` +
`&timeReferenceUnknownClient=false&maxRecordCountFactor=&sqlFormat=none&resultType=&featureEncoding=esriDefault` +
`&datumTransformation=&f=geojson`;
const streetSelect = document.getElementById("streetName");
streetSelect.innerHTML = "";
const defaultOption = document.createElement("option");
defaultOption.value = "";
defaultOption.text = "-- Select Street --";
streetSelect.appendChild(defaultOption);
document.getElementById("streetId").value = "";
document.getElementById("landmark").value = "";
// Timeout mechanism: 1 seconds
const timeout = new Promise((_, reject) =>
setTimeout(() => reject(new Error("Request timed out")), 1000)
);
// Actual fetch
const fetchRequest = fetch(streetURL).then(res => res.json());
Promise.race([fetchRequest, timeout])
.then(data => {
const features = data.features;
if (!features || features.length === 0) {
Swal.fire({
icon: 'warning',
title: 'No Street Found',
text: 'Please select the nearby street.',
});
return;
}
streetsList = features.map(f => f.properties); //Save for use in dropdown
streetsList.forEach((props, index) => {
const option = document.createElement("option");
option.value = index;
option.text = props.road_name;
streetSelect.appendChild(option);
});
})
.catch(err => {
console.error("Error fetching street:", err);
Swal.fire("Failed to load street data", '', 'error');
});
} */
/* document.getElementById("streetName").addEventListener("change", function () {
const selectedIndex = this.value;
if (selectedIndex !== "") {
const selectedStreet = streetsList[selectedIndex];
document.getElementById("streetId").value = selectedStreet.road_id;
document.getElementById("landmark").value = selectedStreet.type;
// document.getElementById("zone").value = selectedStreet.new_zone;
// document.getElementById("ward").value = selectedStreet.new_ward;
console.log("Selected street:", selectedStreet);
} else {
document.getElementById("streetId").value = "";
document.getElementById("landmark").value = "";
// document.getElementById("zone").value = "";
// document.getElementById("ward").value = "";
}
}); */
function fetchStreets(lat, lng) { function fetchStreets(lat, lng) {
@ -989,156 +951,115 @@
}); });
} }
} }
/* function fetchSuggestions(query) {
// ArcGIS API URL to fetch suggestions based on the input query
const arcgisSuggestionUrl = `https://gisgcc.chennaicorporation.gov.in/server/rest/services/Hosted/Road_API/FeatureServer/0/query?where=UPPER(road_name)%20LIKE%20'%25${query.toUpperCase()}%25'&outFields=road_name,zone,ward,road_id&returnGeometry=true&f=geojson`;
fetch(arcgisSuggestionUrl)
.then(response => response.json())
.then(data => {
var suggestions = document.getElementById('suggestions');
suggestions.innerHTML = '';
if (data.features && data.features.length > 0) {
suggestions.style.display = 'block';
var ul = document.createElement('ul');
data.features.forEach(function (result) {
var lat = result.geometry.coordinates[1];
var lng = result.geometry.coordinates[0];
var roadName = result.properties.road_name || 'Unknown Road';
var zone = result.properties.zone || 'Unknown Zone';
var ward = result.properties.ward || 'Unknown Ward';
var roadId = result.properties.road_id || 'Unknown Road ID'
// Creating the suggestion item with road name, zone, and ward
var li = document.createElement('li');
li.textContent = `${roadName} - Zone: ${zone}, Ward: ${ward}`;
li.dataset.latlng = JSON.stringify([lat, lng]);
li.dataset.roadName = roadName;
li.dataset.roadId = roadId;
li.dataset.zone = zone;
li.dataset.ward = ward;
ul.appendChild(li);
});
suggestions.appendChild(ul);
} else {
suggestions.style.display = 'none';
}
})
.catch(error => console.error('Error fetching suggestions:', error));
} */
/* function fetchLocationInfoByMap(lat, lng, marker) {
const arcgisUrl = `https://gisgcc.chennaicorporation.gov.in/server/rest/services/Hosted/Road_API/FeatureServer/0/query?where=&objectIds=&time=&geometry=%7B%22y%22%3A${lat}%2C%22x%22%3A${lng}%7D&geometryType=esriGeometryEnvelope&inSR=4326&defaultSR=4326&spatialRel=esriSpatialRelIntersects&distance=25&units=esriSRUnit_Meter&relationParam=&outFields=zone%2Cward%2Croad_id%2Croad_name&returnGeometry=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&gdbVersion=&historicMoment=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&multipatchOption=xyFootprint&resultOffset=&resultRecordCount=&returnTrueCurves=false&returnCentroid=false&timeReferenceUnknownClient=false&maxRecordCountFactor=&sqlFormat=none&resultType=&datumTransformation=&lodType=geohash&lod=&lodSR=&f=geojson`;
fetch(arcgisUrl)
.then(response => response.json())
.then(data => {
console.log(data);
let info;
if (data.features && data.features.length > 0) {
const properties = data.features[0].properties;
const roadName = properties.road_name || 'N/A';
const zone = properties.zone || 'N/A';
const ward = properties.ward || 'N/A';
const roadId = properties.road_id || 'N/A';
info = `Road Name: ${roadName}<br>Zone: ${zone}<br>Ward: ${ward}<br>Latitude: ${lat}<br>Longitude: ${lng}`;
document.getElementById("street").value = roadName;
document.getElementById("latitude_field").value = lat;
document.getElementById("longitude_field").value = lng;
//document.getElementById("street_id").value = roadId;
document.getElementById("streetId").value = roadId;
document.getElementById("landmark").value = roadName;
marker.bindTooltip(info, {permanent: false, direction: 'top'}).openTooltip();
} else {
document.getElementById("street").value = "No road data found for this location";
document.getElementById("latitude_field").value = "No latitude data found for this location";
document.getElementById("longitude_field").value = "No latitude data found for this location";
//document.getElementById("street_id").value = "No street id data found for this location";
document.getElementById("streetId").value = "No street id data found for this location";
document.getElementById("landmark").value = "No landmark data found for this location";
info = `No road data found for this location`
marker.bindTooltip(info, {permanent: false, direction: 'top'}).openTooltip();
}
})
.catch(error => {
console.error('Error fetching road data:', error);
marker.bindTooltip(`Error fetching road data.<br>Latitude: ${lat}<br>Longitude: ${lng}`, {permanent: false, direction: 'top'}).openTooltip();
});
} */
/* function fetchLocationInfoBySuggestions(lat, lng, marker) {
const arcgisUrl = `https://gisgcc.chennaicorporation.gov.in/server/rest/services/Hosted/Road_API/FeatureServer/0/query?where=&objectIds=&time=&geometry=%7B%22y%22%3A${lat}%2C%22x%22%3A${lng}%7D&geometryType=esriGeometryEnvelope&inSR=4326&defaultSR=4326&spatialRel=esriSpatialRelIntersects&distance=25&units=esriSRUnit_Meter&relationParam=&outFields=zone%2Cward%2Croad_id%2Croad_name&returnGeometry=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&gdbVersion=&historicMoment=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&multipatchOption=xyFootprint&resultOffset=&resultRecordCount=&returnTrueCurves=false&returnCentroid=false&timeReferenceUnknownClient=false&maxRecordCountFactor=&sqlFormat=none&resultType=&datumTransformation=&lodType=geohash&lod=&lodSR=&f=geojson`;
fetch(arcgisUrl)
.then(response => response.json())
.then(data => {
console.log(data);
let info;
if (data.features && data.features.length > 0) {
const properties = data.features[0].properties;
const roadName = properties.road_name || 'N/A';
const zone = properties.zone || 'N/A';
const ward = properties.ward || 'N/A';
const roadId = properties.road_id || 'N/A';
info = `Road Name: ${roadName}<br>Zone: ${zone}<br>Ward: ${ward}<br>Latitude: ${lat}<br>Longitude: ${lng}`;
document.getElementById("street").value = roadName;
document.getElementById("latitude_field").value = lat;
document.getElementById("longitude_field").value = lng;
//document.getElementById("street_id").value = roadId;
document.getElementById("streetId").value = roadId;
document.getElementById("landmark").value = roadName;
marker.bindTooltip(info, {permanent: false, direction: 'top'}).openTooltip();
} else {
document.getElementById("street").value = suggestedRoadName;
document.getElementById("latitude_field").value = lat;
document.getElementById("longitude_field").value = lng;
//document.getElementById("street_id").value = suggestedRoadId;
document.getElementById("streetId").value = suggestedRoadId;
document.getElementById("landmark").value = suggestedRoadName;
info = `Road Name: ${suggestedRoadName}<br>Zone: ${suggestedZone}<br>Ward: ${suggestedWard}<br>Latitude: ${lat}<br>Longitude: ${lng}`
marker.bindTooltip(info, {permanent: false, direction: 'top'}).openTooltip();
}
})
.catch(error => {
console.error('Error fetching road data:', error);
marker.bindTooltip(`Error fetching road data.<br>Latitude: ${lat}<br>Longitude: ${lng}`, {permanent: false, direction: 'top'}).openTooltip();
});
} */
// Load Relationship Dropdown
function loadRelationshipDropdown(selectElement) {
$.ajax({
url: "/gcc/api/streetvendor/getrelationship",
type: "GET",
success: function(response) {
$(selectElement).empty();
$(selectElement).append('<option value="">-- Select Relationship --</option>');
$.each(response, function(index, item) {
$(selectElement).append(
'<option value="' + item.id + '">' + item.name + '</option>'
);
});
$(document).ready(function () {
}
});
/* $('#zone').on('change', function () {
var zoneId = $(this).val();
$('#ward').html('<option value="">-- Loading Wards --</option>');
if (zoneId) {
$.ajax({
url: '/gcc/api/streetvendor/wards-by-zone',
type: 'GET',
data: { zoneId: zoneId },
success: function (data) {
$('#ward').empty().append('<option value="">-- Select Ward --</option>');
$.each(data, function (i, ward) {
$('#ward').append(`<option value="${ward.id}">${ward.ward_name}</option>`);
});
},
error: function () {
$('#ward').html('<option value="">-- Error Loading Wards --</option>');
}
});
} else {
$('#ward').html('<option value="">-- Select Ward --</option>');
}
}); */
}
$("#familymembers").on("input", function () {
var count = parseInt($(this).val()) || 0;
if (count > 15) {
count = 15;
$(this).val(15);
Swal.fire("Warning", "Maximum 15 family members allowed.", "info");
}
$("#familyMemberContainer").empty();
for (var i = 1; i <= count; i++) {
var row = `
<div class="row familyRow mb-3">
<div class="col-md-4">
<label>Person Name ${i}<span class="text-danger">*</span></label>
<input type="text"
class="form-control family_name"
placeholder="Enter Name">
</div>
<div class="col-md-3">
<label>Age<span class="text-danger">*</span></label>
<input type="number"
class="form-control family_age"
placeholder="Enter Age">
</div>
<div class="col-md-5">
<label>Relationship<span class="text-danger">*</span></label>
<select class="form-control relationship">
${relationshipOptions}
</select>
</div>
</div>
`;
$("#familyMemberContainer").append(row);
}
});
$(document).on("input", ".family_name", function () {
this.value = this.value.replace(/[^A-Za-z. ]/g, '');
});
$(document).on("input", ".family_age", function () {
this.value = this.value.replace(/\D/g, '').slice(0, 3);
});
$(document).on("input", "#familymembers", function () {
this.value = this.value.replace(/\D/g, '').slice(0, 2);
});
$(document).ready(function () {
$.ajax({
url: "/gcc/api/streetvendor/getrelationship",
type: "GET",
success: function (response) {
relationshipOptions = '<option value="">-- Select Relationship --</option>';
$.each(response, function (i, item) {
relationshipOptions +=
'<option value="' + item.id + '">' +
item.name +
'</option>';
});
},
error: function () {
alert("Failed to load relationships.");
}
});
$('#business_space').on('input', function () { $('#business_space').on('input', function () {
// Remove anything that is not a digit // Remove anything that is not a digit
this.value = this.value.replace(/\D/g, ''); this.value = this.value.replace(/\D/g, '');
@ -1158,6 +1079,29 @@
$("#bank_passbook").val(""); $("#bank_passbook").val("");
} }
}); });
$("#diff_type").change(function () {
var selectedText = $("#diff_type option:selected").text().trim();
if (selectedText.toLowerCase() === "others" || selectedText.includes("மற்றவை")) {
$("#otherDisabilityDiv").show();
} else {
$("#otherDisabilityDiv").hide();
$("#other_disability").val("");
}
});
$("input[name='differently_abled']").change(function () {
if ($(this).val() === "Yes") {
$("#diffSection").show();
} else {
$("#diffSection").hide();
$("#diff_type").val("");
$("#otherDisabilityDiv").hide();
$("#other_disability").val("");
}
});
// Form submit // Form submit
$('#vendorForm').submit(function (e) { $('#vendorForm').submit(function (e) {
@ -1186,6 +1130,20 @@
$('#submitBtn').prop('disabled', false).text('Submit'); $('#submitBtn').prop('disabled', false).text('Submit');
return; return;
} }
const gen=$('input[name="gender"]:checked').val();
if(!gen){
Swal.fire("Missing Gender", "Please Select Gender", "info");
$('#submitBtn').prop('disabled', false).text('Submit');
return;
}
const tamgen=$('input[name="gender_tamil"]:checked').val();
if(!tamgen){
Swal.fire("Missing Gender", "Please Select Gender in Tamil", "info");
$('#submitBtn').prop('disabled', false).text('Submit');
return;
}
$('#pageLoader').show(); $('#pageLoader').show();
@ -1253,9 +1211,7 @@
let bankVal = $("input[name='bank_account']:checked").val(); let bankVal = $("input[name='bank_account']:checked").val();
setIfPresent(formData, "bank_acc_status", bankVal === undefined ? "" : bankVal === "Yes"); setIfPresent(formData, "bank_acc_status", bankVal === undefined ? "" : bankVal === "Yes");
// diff_abled
let diffVal = $("input[name='differently_abled']:checked").val();
setIfPresent(formData, "diff_abled", diffVal === undefined ? "" : diffVal === "Yes");
// are_any_fam_mem_invol_str // are_any_fam_mem_invol_str
let famVal = $("input[name='fam_vendor']:checked").val(); let famVal = $("input[name='fam_vendor']:checked").val();
@ -1267,6 +1223,7 @@
//setIfPresent(formData, "bank_acc_status", isBankYes === undefined ? "" : isBankYes === "Yes"); //setIfPresent(formData, "bank_acc_status", isBankYes === undefined ? "" : isBankYes === "Yes");
const bankPassbook = $('#bank_passbook')[0]?.files[0]; const bankPassbook = $('#bank_passbook')[0]?.files[0];
if (isBankYes && !bankPassbook) { if (isBankYes && !bankPassbook) {
$('#pageLoader').hide();
Swal.fire('Missing Bank Passbook', 'Bank passbook is required because Bank Account Status is Yes.', 'warning'); Swal.fire('Missing Bank Passbook', 'Bank passbook is required because Bank Account Status is Yes.', 'warning');
$('#submitBtn').prop('disabled', false).text('Submit'); $('#submitBtn').prop('disabled', false).text('Submit');
return; return;
@ -1275,7 +1232,165 @@
if (isBankYes) { if (isBankYes) {
setFileIfPresent(formData, "bank_passbook", $('#bank_passbook')[0]); setFileIfPresent(formData, "bank_passbook", $('#bank_passbook')[0]);
} }
const religion =$("#religion").val();
if(!religion){
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Warning", "Please select Religion.", "warning");
return false;
}
setIfPresent(formData, "religion", religion);
// diff_abled
let diffVal = $("input[name='differently_abled']:checked").val();
setIfPresent(formData, "diff_abled", diffVal === undefined ? "" : diffVal === "Yes");
// Differently Abled Validation
var differentlyAbled = $("input[name='differently_abled']:checked").val();
if (!differentlyAbled) {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Warning", "Please select Differently Abled (Yes/No).", "warning");
return false;
}
if (differentlyAbled === "Yes") {
if ($("#diff_type").val() == "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Warning", "Please select the Type of Disability.", "warning");
return false;
}
var selectedText = $("#diff_type option:selected").text().trim().toLowerCase();
if (selectedText.toLowerCase() === "others" || selectedText.includes("மற்றவை")) {
if ($("#other_disability").val().trim() == "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Warning", "Please specify the disability.", "warning");
return false;
}
}
}
const diff_type =$("#diff_type").val();
const other_disability =$("#other_disability").val().trim();
setIfPresent(formData, "diff_type", diff_type);
setIfPresent(formData, "other_disability", other_disability);
var familyCount = parseInt($("#familymembers").val()) || 0;
var familyDetails = [];
if (familyCount > 0) {
var isValid = true;
$("#familyMemberContainer .familyRow").each(function (index) {
var name = $(this).find(".family_name").val().trim();
var age = $(this).find(".family_age").val().trim();
var relationship = $(this).find(".relationship").val();
if (name === "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Warning",
"Please enter Person Name for Family Member " + (index + 1),
"warning");
isValid = false;
return false;
}
if (age === "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Warning",
"Please enter Age for Family Member " + (index + 1),
"warning");
isValid = false;
return false;
}
if (relationship === "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Warning",
"Please select Relationship for Family Member " + (index + 1),
"warning");
isValid = false;
return false;
}
// Push only after successful validation
familyDetails.push({
name: name,
age: age,
relationship: relationship
});
});
if (!isValid) {
return false;
}
}
console.log(familyDetails);
setIfPresent(formData, "familyDetails", JSON.stringify(familyDetails));
var familyCount = parseInt($("#familymembers").val()) || 0;
var rowCount = $("#familyMemberContainer .familyRow").length;
// If family members is 0, there should be no rows
if (familyCount === 0) {
if (rowCount !== 0) {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire(
"Warning",
"Family member details should be empty when Number of Family Members is 0.",
"warning"
);
return false;
}
} else {
// Count should match
if (familyCount !== rowCount) {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire(
"Warning",
"Number of Family Members (" + familyCount +
") does not match the entered Family Member Details (" + rowCount + ").",
"warning"
);
return false;
}
}
//if (isBankYes) setFileIfPresent(formData, "bank_passbook", $('#bank_passbook')[0]); //if (isBankYes) setFileIfPresent(formData, "bank_passbook", $('#bank_passbook')[0]);
// Lat/Lng // Lat/Lng
@ -1352,11 +1467,23 @@
); );
if (dobValue > age14Date) { if (dobValue > age14Date) {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Invalid Age", "Applicant must be at least 14 years old.", "error"); Swal.fire("Invalid Age", "Applicant must be at least 14 years old.", "error");
return; return;
} }
setIfPresent(formData, "dob", $('#dob').val());
const dob = $('#dob').val();
if (dob) {
const [year, month, day] = dob.split("-");
const formattedDob = `${day}-${month}-${year}`;
setIfPresent(formData, "dob", formattedDob);
}
let genderVal = $("input[name='gender']:checked").val(); let genderVal = $("input[name='gender']:checked").val();
@ -1408,8 +1535,9 @@
icon: 'success', icon: 'success',
title: 'Details are Saved Successfully', title: 'Details are Saved Successfully',
html: 'Reference ID: <b>' + response.vendor_req_id + '</b>' html: 'Reference ID: <b>' + response.vendor_req_id + '</b>'
}).then(() => {
location.reload();
}); });
$('#vendorForm')[0].reset();
} else { } else {
$('#pageLoader').hide(); $('#pageLoader').hide();
Swal.fire({ Swal.fire({

225
src/main/resources/templates/modules/vendors/streetVendorRequestList.html

@ -518,11 +518,32 @@ input.form-control {
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Differently Abled | இயலாமை உள்ளவரா? </label><br>
<label class="form-label">Differently Abled | இயலாமை உள்ளவரா? <span class="required">*</span></label><br>
<input type="radio" name="differently_abled" value="Yes" > Yes <input type="radio" name="differently_abled" value="Yes" > Yes
<input type="radio" name="differently_abled" value="No" class="ms-3"> No <input type="radio" name="differently_abled" value="No" class="ms-3"> No
</div> </div>
<div class="col-md-6" id="diffSection" style="display: none;">
<label class="form-label">Type of Disability | இயலாமையின் வகை <span class="required">*</span> </label>
<select class="form-control" id="diff_type" name="diff_type">
<option value="">-- Select Disability --</option>
<th:block th:each="diff : ${DiffAbledList}">
<option th:value="${diff.id}" th:text="${diff.name}"></option>
</th:block>
</select>
<div id="otherDisabilityDiv" class="mt-2" style="display:none;">
<label class="form-label">
Specify Disability | இயலாமையை குறிப்பிடவும்
<span class="required">*</span>
</label>
<input type="text"
class="form-control"
id="other_disability"
name="other_disability"
placeholder="Enter Disability">
</div>
</div>
<div class="col-md-6"> <div class="col-md-6">
@ -547,11 +568,26 @@ input.form-control {
</th:block> </th:block>
</select> </select>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label for="religion" class="form-label"> Religion | மதம்<span class="text-danger">*</span></label>
<select class="form-control" id="religion" name="religion" required="required">
<option value="">-- Select Religion --</option>
<th:block th:each="religion : ${religionList}">
<option th:value="${religion.id}" th:text="${religion.religion}">
</option>
</th:block>
</select>
</div>
<div class="col-md-6 mt-3">
<label for="familymembers" class="form-label">Number of Family Members | குடும்ப உறுப்பினர்கள் எண்ணிக்கை </label> <label for="familymembers" class="form-label">Number of Family Members | குடும்ப உறுப்பினர்கள் எண்ணிக்கை </label>
<input type="number" class="form-control" name="familymembers" id="familymembers"> <input type="number" class="form-control" name="familymembers" id="familymembers">
</div> </div>
</div> </div>
<div id="familyMemberContainer"></div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Are any of your family member involved in street vending | உங்கள் குடும்ப உறுப்பினர் வியாபாரத்தில் உள்ளவரா? </label><br> <label class="form-label">Are any of your family member involved in street vending | உங்கள் குடும்ப உறுப்பினர் வியாபாரத்தில் உள்ளவரா? </label><br>
@ -676,6 +712,8 @@ input.form-control {
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script> <script>
var relationshipOptions = "";
function allowTamilAndSymbols(id) { function allowTamilAndSymbols(id) {
const el = document.getElementById(id); const el = document.getElementById(id);
@ -835,9 +873,119 @@ allowTamilAndSymbols("father_name_tamil");
$('#docModal').modal('show'); $('#docModal').modal('show');
} }
// Load Relationship Dropdown
function loadRelationshipDropdown(selectElement) {
$.ajax({
url: "/gcc/api/streetvendor/getrelationship",
type: "GET",
success: function(response) {
$(selectElement).empty();
$(selectElement).append('<option value="">-- Select Relationship --</option>');
$.each(response, function(index, item) {
$(selectElement).append(
'<option value="' + item.id + '">' + item.name + '</option>'
);
});
}
});
}
$("#familymembers").on("input", function(){
var count=parseInt($(this).val())||0;
if(count>15){
count=15;
$(this).val(15);
Swal.fire("Warning",
"Maximum 15 family members allowed.",
"info");
}
generateFamilyRows(count);
});
$(document).on("input", ".family_name", function () {
this.value = this.value.replace(/[^A-Za-z. ]/g, '');
});
$(document).on("input", ".family_age", function () {
this.value = this.value.replace(/\D/g, '').slice(0, 3);
});
$(document).on("input", "#familymembers", function () {
this.value = this.value.replace(/\D/g, '').slice(0, 2);
});
function generateFamilyRows(count){
$("#familyMemberContainer").empty();
for(let i=1;i<=count;i++){
$("#familyMemberContainer").append(`
<div class="row familyRow mb-3">
<div class="col-md-4">
<label>Person Name ${i}</label>
<input type="text"
class="form-control family_name">
</div>
<div class="col-md-3">
<label>Age</label>
<input type="number"
class="form-control family_age">
</div>
<div class="col-md-5">
<label>Relationship</label>
<select class="form-control relationship">
${relationshipOptions}
</select>
</div>
</div>
`);
}
}
$(document).ready(function() { $(document).ready(function() {
$.ajax({
url: "/gcc/api/streetvendor/getrelationship",
type: "GET",
success: function (response) {
relationshipOptions = '<option value="">-- Select Relationship --</option>';
$.each(response, function (i, item) {
relationshipOptions +=
'<option value="' + item.id + '">' +
item.name +
'</option>';
});
},
error: function () {
alert("Failed to load relationships.");
}
});
var table = $('#RequestListDatatable').DataTable({ var table = $('#RequestListDatatable').DataTable({
dom: 'Bftip', dom: 'Bftip',
columnDefs: [ columnDefs: [
@ -912,6 +1060,28 @@ allowTamilAndSymbols("father_name_tamil");
this.value = this.value.slice(0, 2); this.value = this.value.slice(0, 2);
} }
}); });
$("#diff_type").change(function () {
var selectedText = $("#diff_type option:selected").text().trim();
if (selectedText.toLowerCase() === "others" || selectedText.includes("மற்றவை")) {
$("#otherDisabilityDiv").show();
} else {
$("#otherDisabilityDiv").hide();
$("#other_disability").val("");
}
});
$("input[name='differently_abled']").change(function () {
if ($(this).val() === "Yes") {
$("#diffSection").show();
} else {
$("#diffSection").hide();
$("#diff_type").val("");
$("#otherDisabilityDiv").hide();
$("#other_disability").val("");
}
});
}); });
@ -1108,6 +1278,12 @@ allowTamilAndSymbols("father_name_tamil");
<div class="col-md-3"><strong>Differently Abled:</strong></div> <div class="col-md-3"><strong>Differently Abled:</strong></div>
<div class="col-md-3">${diffAbledDisplay || '-'}</div> <div class="col-md-3">${diffAbledDisplay || '-'}</div>
<div class="col-md-3"><strong>Type of Disability:</strong></div>
<div class="col-md-3">${details.diff_name || '-'}${details.other_disability || ''}</div>
<div class="col-md-3"><strong>Religion:</strong></div>
<div class="col-md-3">${details.religion_name || '-'}</div>
<div class="col-md-3"><strong>Vendor Image:</strong></div> <div class="col-md-3"><strong>Vendor Image:</strong></div>
<div class="col-md-3">${vendorPhotoBtn || '-'}</div> <div class="col-md-3">${vendorPhotoBtn || '-'}</div>
@ -1253,14 +1429,51 @@ allowTamilAndSymbols("father_name_tamil");
$("#dob").val(data.dob); $("#dob").val(data.dob);
$("#community").val(data.social_category); $("#community").val(data.social_category);
if (data.diff_abled == null) { if (data.diff_abled == null) {
$("input[name='differently_abled']").prop("checked", false); // clear both
} else {
$("input[name='differently_abled'][value='" + (data.diff_abled ? "Yes" : "No") + "']")
.prop("checked", true);
}
$("input[name='differently_abled']").prop("checked", false);
$("#diffSection").hide();
$("#otherDisabilityDiv").hide();
} else {
$("input[name='differently_abled'][value='" +
(data.diff_abled ? "Yes" : "No") + "']")
.prop("checked", true)
.trigger("change"); // IMPORTANT
}
$("#diff_type")
.val(data.diff_type)
.trigger("change");
$("#other_disability").val(data.other_disability);
$("#religion").val(data.religion);
if(data.familymembers_details){
data.familymembers_details.forEach(function(member,index){
let row=$("#familyMemberContainer .familyRow").eq(index);
row.find(".family_name")
.val(member.name);
row.find(".family_age")
.val(member.age);
row.find(".relationship")
.val(member.relation);
});
}
$("#education").val(data.education_status); $("#education").val(data.education_status);
$("#maritalStatus").val(data.marital_status); $("#maritalStatus").val(data.marital_status);
$("#familymembers").val(data.no_of_fam_mem); $("#familymembers").val(data.no_of_fam_mem);
generateFamilyRows(data.no_of_fam_mem);
if (data.are_any_fam_mem_invol_str_ven == null) { if (data.are_any_fam_mem_invol_str_ven == null) {
$("input[name='fam_vendor']").prop("checked", false); // clear both $("input[name='fam_vendor']").prop("checked", false); // clear both

591
src/main/resources/templates/modules/vendors/zonerequests.html

@ -351,29 +351,29 @@ input.form-control {
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Landmark (maximum 255 characters)</label>
<textarea class="form-control" id="landmark" name="landmark" maxlength="255"></textarea>
<label class="form-label">Landmark (maximum 255 characters)<span class="text-danger">*</span></label>
<textarea class="form-control" id="landmark" name="landmark" maxlength="255" required="required"></textarea>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">விற்பனை பகுதி</label>
<textarea class="form-control" id="landmark_tamil" name="landmark_tamil" placeholder="தமிழில் பதிவு செய்யவும்"></textarea>
<label class="form-label">விற்பனை பகுதி<span class="text-danger">*</span></label>
<textarea class="form-control" id="landmark_tamil" name="landmark_tamil" placeholder="தமிழில் பதிவு செய்யவும்" required="required"></textarea>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">District | மாவட்டம்</label>
<input type="text" class="form-control" id="vendor_district" name="vendor_district" oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" >
<label class="form-label">District | மாவட்டம்<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="vendor_district" name="vendor_district" oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" required="required">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label"> மாவட்டம்</label>
<input type="text" class="form-control" id="vendor_district_tamil" name="vendor_district_tamil" placeholder="தமிழில் பதிவு செய்யவும்">
<label class="form-label"> மாவட்டம்<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="vendor_district_tamil" name="vendor_district_tamil" placeholder="தமிழில் பதிவு செய்யவும்" required="required">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Pincode | அஞ்சல் குறியீடு</label>
<input type="text" class="form-control" id="vendor_pincode" name="vendor_pincode" oninput="validatePincode(this)" >
<label class="form-label">Pincode | அஞ்சல் குறியீடு<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="vendor_pincode" name="vendor_pincode" oninput="validatePincode(this)" required="required">
</div> </div>
</div> </div>
@ -407,8 +407,8 @@ input.form-control {
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Business Space (Sq ft)| வியாபார இடம் </label>
<input type="text" class="form-control" id="business_space" name="business_space">
<label class="form-label">Business Space (Sq ft)| வியாபார இடம்<span class="text-danger">*</span> </label>
<input type="text" class="form-control" id="business_space" name="business_space" required="required">
</div> </div>
</div> </div>
@ -426,7 +426,7 @@ input.form-control {
<div class="col-md-6" id="bank_passbook_container" style="display:none;"> <div class="col-md-6" id="bank_passbook_container" style="display:none;">
<label for="bank_passbook" class="form-label">Upload Bank Passbook (jpg/jpeg/pdf)
<label for="bank_passbook" class="form-label">Upload Bank Passbook (jpg/jpeg/pdf)<span class="text-danger">*</span>
</label> </label>
<input type="file" class="form-control" id="bank_passbook" name="bank_passbook" accept=".jpg,.jpeg,.pdf,application/pdf" > <input type="file" class="form-control" id="bank_passbook" name="bank_passbook" accept=".jpg,.jpeg,.pdf,application/pdf" >
<div id="bank_passbookpreview" class="mt-2" style="display: none;"></div> <div id="bank_passbookpreview" class="mt-2" style="display: none;"></div>
@ -443,7 +443,7 @@ input.form-control {
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Profile Image (jpg/jpeg/pdf)</label> <label class="form-label">Profile Image (jpg/jpeg/pdf)</label>
<input type="file" class="form-control" id="profileimage" <input type="file" class="form-control" id="profileimage"
accept=".jpg,.jpeg,.pdf,application/pdf" name="profileimage" >
accept=".jpg,.jpeg,.pdf,application/pdf" name="profileimage">
<div id="profilepreview" class="mt-2" style="display: none;"></div> <div id="profilepreview" class="mt-2" style="display: none;"></div>
</div> </div>
</div> </div>
@ -459,25 +459,25 @@ input.form-control {
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Father's / Husband's Name </label>
<input type="text" class="form-control" id="father_name" name="father_name" oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" >
<label class="form-label">Father's / Husband's Name <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="father_name" name="father_name" oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" required="required">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label"> தந்தை/கணவர் பெயர் </label>
<input type="text" class="form-control" id="father_name_tamil" name="father_name_tamil" placeholder="தமிழில் பதிவு செய்யவும்" >
<label class="form-label"> தந்தை/கணவர் பெயர் <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="father_name_tamil" name="father_name_tamil" placeholder="தமிழில் பதிவு செய்யவும்" required="required">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Gender | பாலினம் </label><br>
<label class="form-label">Gender <span class="text-danger">*</span></label><br>
<input type="radio" name="gender" value="Male" > Male <input type="radio" name="gender" value="Male" > Male
<input type="radio" name="gender" value="Female" class="ms-3"> Female <input type="radio" name="gender" value="Female" class="ms-3"> Female
<input type="radio" name="gender" value="Transgender" class="ms-3">Transgender <input type="radio" name="gender" value="Transgender" class="ms-3">Transgender
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label"> பாலினம் </label><br>
<label class="form-label"> பாலினம் <span class="text-danger">*</span></label><br>
<input type="radio" name="gender_tamil" value="ஆண்" > ஆண் <input type="radio" name="gender_tamil" value="ஆண்" > ஆண்
<input type="radio" name="gender_tamil" value="பெண்" class="ms-3"> பெண் <input type="radio" name="gender_tamil" value="பெண்" class="ms-3"> பெண்
<input type="radio" name="gender_tamil" value="பிற்பாலினர்" class="ms-3">பிற்பாலினர் <input type="radio" name="gender_tamil" value="பிற்பாலினர்" class="ms-3">பிற்பாலினர்
@ -495,12 +495,12 @@ input.form-control {
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Date of Birth | பிறந்த தேதி </label>
<input type="date" id="dob" class="form-control" name="dob" >
<label class="form-label">Date of Birth | பிறந்த தேதி <span class="text-danger">*</span></label>
<input type="date" id="dob" class="form-control" name="dob" required="required">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Community Category | சமூக வகை </label>
<select class="form-control" id="community" name="community" >
<label class="form-label">Community Category | சமூக வகை <span class="text-danger">*</span></label>
<select class="form-control" id="community" name="community" required="required">
<option value="">-- Select Community --</option> <option value="">-- Select Community --</option>
<th:block th:each="com : ${communities}"> <th:block th:each="com : ${communities}">
<option th:value="${com.id}" th:text="${com.category_name}"></option> <option th:value="${com.id}" th:text="${com.category_name}"></option>
@ -511,12 +511,32 @@ input.form-control {
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Differently Abled | இயலாமை உள்ளவரா? </label><br>
<label class="form-label">Differently Abled | இயலாமை உள்ளவரா? <span class="required">*</span></label><br>
<input type="radio" name="differently_abled" value="Yes" > Yes <input type="radio" name="differently_abled" value="Yes" > Yes
<input type="radio" name="differently_abled" value="No" class="ms-3"> No <input type="radio" name="differently_abled" value="No" class="ms-3"> No
</div> </div>
<div class="col-md-6" id="diffSection" style="display: none;">
<label class="form-label">Type of Disability | இயலாமையின் வகை <span class="required">*</span> </label>
<select class="form-control" id="diff_type" name="diff_type">
<option value="">-- Select Disability --</option>
<th:block th:each="diff : ${DiffAbledList}">
<option th:value="${diff.id}" th:text="${diff.name}"></option>
</th:block>
</select>
<div id="otherDisabilityDiv" class="mt-2" style="display:none;">
<label class="form-label">
Specify Disability | இயலாமையை குறிப்பிடவும்
<span class="required">*</span>
</label>
<input type="text"
class="form-control"
id="other_disability"
name="other_disability"
placeholder="Enter Disability">
</div>
</div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Street Vendor’s educational status | தெருவணிகரின் கல்வித்தகுதி </label> <label class="form-label">Street Vendor’s educational status | தெருவணிகரின் கல்வித்தகுதி </label>
@ -540,11 +560,25 @@ input.form-control {
</th:block> </th:block>
</select> </select>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label for="familymembers" class="form-label">Number of Family Members | குடும்ப உறுப்பினர்கள் எண்ணிக்கை </label>
<input type="number" class="form-control" name="familymembers" id="familymembers">
<label for="religion" class="form-label"> Religion | மதம்<span class="text-danger">*</span></label>
<select class="form-control" id="religion" name="religion" required="required">
<option value="">-- Select Religion --</option>
<th:block th:each="religion : ${religionList}">
<option th:value="${religion.id}" th:text="${religion.religion}">
</option>
</th:block>
</select>
</div>
<div class="col-md-6 mt-3">
<label for="familymembers" class="form-label">Number of Family Members | குடும்ப உறுப்பினர்கள் எண்ணிக்கை<span class="text-danger">*</span> </label>
<input type="number" class="form-control" name="familymembers" id="familymembers" max="15" required="required">
</div> </div>
</div> </div>
<div id="familyMemberContainer"></div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Are any of your family member involved in street vending | உங்கள் குடும்ப உறுப்பினர் வியாபாரத்தில் உள்ளவரா? </label><br> <label class="form-label">Are any of your family member involved in street vending | உங்கள் குடும்ப உறுப்பினர் வியாபாரத்தில் உள்ளவரா? </label><br>
@ -562,31 +596,31 @@ input.form-control {
<input type="text" class="form-control" name="doorno" id="doorno" > <input type="text" class="form-control" name="doorno" id="doorno" >
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Street Name | தெரு பெயர் </label>
<input type="text" class="form-control" name="streetname" id="streetname" >
<label class="form-label">Street Name | தெரு பெயர் <span class="text-danger">*</span> </label>
<input type="text" class="form-control" name="streetname" id="streetname" required="required">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Area Name | பகுதி பெயர் </label>
<input type="text" class="form-control" name="areaname" id="areaname" >
<label class="form-label">Area Name | பகுதி பெயர் <span class="text-danger">*</span></label>
<input type="text" class="form-control" name="areaname" id="areaname" required="required">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">District | மாவட்டம் </label>
<input type="text" class="form-control" name="district" id="district" oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" >
<label class="form-label">District | மாவட்டம் <span class="text-danger">*</span></label>
<input type="text" class="form-control" name="district" id="district" oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')" required="required">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Pincode | அஞ்சல் குறியீடு </label>
<input type="text" class="form-control" name="pincode" id="pincode" oninput="validatePincode(this)" >
<label class="form-label">Pincode | அஞ்சல் குறியீடு <span class="text-danger">*</span></label>
<input type="text" class="form-control" name="pincode" id="pincode" oninput="validatePincode(this)" required="required">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Aadhaar Number | ஆதார் எண் </label>
<input type="text" class="form-control" id="aadhar_number" name="aadhar_number" maxlength="12" oninput="validateAadhar(this)" >
<label class="form-label">Aadhaar Number | ஆதார் எண் <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="aadhar_number" name="aadhar_number" maxlength="12" oninput="validateAadhar(this)" required="required">
</div> </div>
</div> </div>
@ -668,6 +702,8 @@ input.form-control {
</script> </script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script> <script>
var relationshipOptions = "";
function allowTamilAndSymbols(id) { function allowTamilAndSymbols(id) {
const el = document.getElementById(id); const el = document.getElementById(id);
@ -826,8 +862,118 @@ allowTamilAndSymbols("father_name_tamil");
$('#docModal').modal('show'); $('#docModal').modal('show');
} }
// Load Relationship Dropdown
function loadRelationshipDropdown(selectElement) {
$.ajax({
url: "/gcc/api/streetvendor/getrelationship",
type: "GET",
success: function(response) {
$(selectElement).empty();
$(selectElement).append('<option value="">-- Select Relationship --</option>');
$.each(response, function(index, item) {
$(selectElement).append(
'<option value="' + item.id + '">' + item.name + '</option>'
);
});
}
});
}
$("#familymembers").on("input", function(){
var count=parseInt($(this).val())||0;
if(count>15){
count=15;
$(this).val(15);
Swal.fire("Warning",
"Maximum 15 family members allowed.",
"info");
}
generateFamilyRows(count);
});
$(document).on("input", ".family_name", function () {
this.value = this.value.replace(/[^A-Za-z. ]/g, '');
});
$(document).on("input", ".family_age", function () {
this.value = this.value.replace(/\D/g, '').slice(0, 3);
});
$(document).on("input", "#familymembers", function () {
this.value = this.value.replace(/\D/g, '').slice(0, 2);
});
function generateFamilyRows(count){
$("#familyMemberContainer").empty();
for(let i=1;i<=count;i++){
$("#familyMemberContainer").append(`
<div class="row familyRow mb-3">
<div class="col-md-4">
<label>Person Name ${i}<span class="text-danger">*</span></label>
<input type="text"
class="form-control family_name">
</div>
<div class="col-md-3">
<label>Age<span class="text-danger">*</span></label>
<input type="number"
class="form-control family_age">
</div>
<div class="col-md-5">
<label>Relationship<span class="text-danger">*</span></label>
<select class="form-control relationship">
${relationshipOptions}
</select>
</div>
</div>
`);
}
}
$(document).ready(function() { $(document).ready(function() {
$.ajax({
url: "/gcc/api/streetvendor/getrelationship",
type: "GET",
success: function (response) {
relationshipOptions = '<option value="">-- Select Relationship --</option>';
$.each(response, function (i, item) {
relationshipOptions +=
'<option value="' + item.id + '">' +
item.name +
'</option>';
});
},
error: function () {
alert("Failed to load relationships.");
}
});
var table = $('#RequestListDatatable').DataTable({ var table = $('#RequestListDatatable').DataTable({
dom: 'Bftip', dom: 'Bftip',
@ -903,6 +1049,28 @@ allowTamilAndSymbols("father_name_tamil");
this.value = this.value.slice(0, 2); this.value = this.value.slice(0, 2);
} }
}); });
$("#diff_type").change(function () {
var selectedText = $("#diff_type option:selected").text().trim();
if (selectedText.toLowerCase() === "others" || selectedText.includes("மற்றவை")) {
$("#otherDisabilityDiv").show();
} else {
$("#otherDisabilityDiv").hide();
$("#other_disability").val("");
}
});
$("input[name='differently_abled']").change(function () {
if ($(this).val() === "Yes") {
$("#diffSection").show();
} else {
$("#diffSection").hide();
$("#diff_type").val("");
$("#otherDisabilityDiv").hide();
$("#other_disability").val("");
}
});
}); });
@ -1043,6 +1211,7 @@ allowTamilAndSymbols("father_name_tamil");
} }
const details = detailData[0]; const details = detailData[0];
const diffAbledDisplay = details.diff_abled === true ? 'Yes' : (details.diff_abled === false ? 'No' : '-'); const diffAbledDisplay = details.diff_abled === true ? 'Yes' : (details.diff_abled === false ? 'No' : '-');
const pmLoanDisplay = details.pm_svanidhi_loan ? (details.pm_svanidhi_loan ? 'Yes' : 'No') : '-'; const pmLoanDisplay = details.pm_svanidhi_loan ? (details.pm_svanidhi_loan ? 'Yes' : 'No') : '-';
const bankAccDisplay = details.bank_acc_status ? (details.bank_acc_status === '1' ? 'Yes' : 'No') : '-'; const bankAccDisplay = details.bank_acc_status ? (details.bank_acc_status === '1' ? 'Yes' : 'No') : '-';
@ -1060,6 +1229,37 @@ allowTamilAndSymbols("father_name_tamil");
const vendorPhotoBtn= details.view_street_vendor_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.view_street_vendor_photo}')">View</button>` : '-'; const vendorPhotoBtn= details.view_street_vendor_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.view_street_vendor_photo}')">View</button>` : '-';
const familyMembers = details.familymembers_details || [];
let familyHtml = "-";
if (familyMembers.length > 0) {
familyHtml = `
<table class="table table-bordered table-sm mb-0">
<thead class="table-light">
<tr>
<th>S.No</th>
<th>Name</th>
<th>Age</th>
<th>Relationship</th>
</tr>
</thead>
<tbody>
${familyMembers.map((member, index) => `
<tr>
<td>${index + 1}</td>
<td>${member.name || '-'}</td>
<td>${member.age || '-'}</td>
<td>${member.relation_name || '-'}</td>
</tr>
`).join('')}
</tbody>
</table>
`;
}
const content = ` const content = `
<div class="container-fluid"> <div class="container-fluid">
<!-- Personal Details --> <!-- Personal Details -->
@ -1078,7 +1278,7 @@ allowTamilAndSymbols("father_name_tamil");
<div class="col-md-3">${details.category_name || '-'}</div> <div class="col-md-3">${details.category_name || '-'}</div>
<div class="col-md-3"><strong>DOB:</strong></div> <div class="col-md-3"><strong>DOB:</strong></div>
<div class="col-md-3">${details.dob || '-'}</div>
<div class="col-md-3">${formatDateForDisplay(details.dob)}</div>
<div class="col-md-3"><strong>Address:</strong></div> <div class="col-md-3"><strong>Address:</strong></div>
<div class="col-md-3">${details.residental_address || '-'}</div> <div class="col-md-3">${details.residental_address || '-'}</div>
@ -1092,6 +1292,15 @@ allowTamilAndSymbols("father_name_tamil");
<div class="col-md-3"><strong>Differently Abled:</strong></div> <div class="col-md-3"><strong>Differently Abled:</strong></div>
<div class="col-md-3">${diffAbledDisplay || '-'}</div> <div class="col-md-3">${diffAbledDisplay || '-'}</div>
<div class="col-md-3"><strong>Type of Disability:</strong></div>
<div class="col-md-3">${details.diff_name || '-'}</div>
<div class="col-md-3"><strong>Specify the Disability:</strong></div>
<div class="col-md-3">${details.other_disability || '-'}</div>
<div class="col-md-3"><strong>Religion:</strong></div>
<div class="col-md-3">${details.religion_name || '-'}</div>
<div class="col-md-3"><strong>Vendor Image:</strong></div> <div class="col-md-3"><strong>Vendor Image:</strong></div>
<div class="col-md-3">${vendorPhotoBtn || '-'}</div> <div class="col-md-3">${vendorPhotoBtn || '-'}</div>
@ -1103,6 +1312,15 @@ allowTamilAndSymbols("father_name_tamil");
<div class="col-md-3"><strong>Aadhaar back Image:</strong></div> <div class="col-md-3"><strong>Aadhaar back Image:</strong></div>
<div class="col-md-3">${aadharBackBtn}</div> <div class="col-md-3">${aadharBackBtn}</div>
<div class="col-md-12 mt-3">
<strong>Family Members:</strong>
</div>
<div class="col-md-12 mt-3">
${familyHtml}
</div>
</div> </div>
</div> </div>
@ -1234,17 +1452,53 @@ allowTamilAndSymbols("father_name_tamil");
$("input[name='gender_tamil'][value='" + data.tamil_gender + "']").prop("checked", true); $("input[name='gender_tamil'][value='" + data.tamil_gender + "']").prop("checked", true);
} }
$("#dob").val(data.dob);
$("#dob").val(formatDateForInput(data.dob));
$("#community").val(data.social_category); $("#community").val(data.social_category);
if (data.diff_abled == null) { if (data.diff_abled == null) {
$("input[name='differently_abled']").prop("checked", false); // clear both
} else {
$("input[name='differently_abled'][value='" + (data.diff_abled ? "Yes" : "No") + "']")
.prop("checked", true);
}
$("input[name='differently_abled']").prop("checked", false);
$("#diffSection").hide();
$("#otherDisabilityDiv").hide();
} else {
$("input[name='differently_abled'][value='" +
(data.diff_abled ? "Yes" : "No") + "']")
.prop("checked", true)
.trigger("change"); // IMPORTANT
}
$("#diff_type").val(data.diff_type).trigger("change");
$("#other_disability").val(data.other_disability);
$("#religion").val(data.religion);
$("#education").val(data.education_status); $("#education").val(data.education_status);
$("#maritalStatus").val(data.marital_status); $("#maritalStatus").val(data.marital_status);
$("#familymembers").val(data.no_of_fam_mem); $("#familymembers").val(data.no_of_fam_mem);
generateFamilyRows(data.no_of_fam_mem);
if(data.familymembers_details){
data.familymembers_details.forEach(function(member,index){
let row=$("#familyMemberContainer .familyRow").eq(index);
row.find(".family_name")
.val(member.name);
row.find(".family_age")
.val(member.age);
row.find(".relationship")
.val(member.relation);
});
}
if (data.are_any_fam_mem_invol_str_ven == null) { if (data.are_any_fam_mem_invol_str_ven == null) {
$("input[name='fam_vendor']").prop("checked", false); // clear both $("input[name='fam_vendor']").prop("checked", false); // clear both
@ -1408,6 +1662,163 @@ allowTamilAndSymbols("father_name_tamil");
let diffVal = $("input[name='differently_abled']:checked").val(); let diffVal = $("input[name='differently_abled']:checked").val();
setIfPresent(formData, "diff_abled", diffVal === undefined ? "" : diffVal === "Yes"); setIfPresent(formData, "diff_abled", diffVal === undefined ? "" : diffVal === "Yes");
// Differently Abled Validation
var differentlyAbled = $("input[name='differently_abled']:checked").val();
if (!differentlyAbled) {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Submit');
Swal.fire("Warning", "Please select Differently Abled (Yes/No).", "Update");
return false;
}
if (differentlyAbled === "Yes") {
if ($("#diff_type").val() == "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire("Warning", "Please select the Type of Disability.", "warning");
return false;
}
var selectedText = $("#diff_type option:selected").text().trim().toLowerCase();
if (selectedText.toLowerCase() === "others" || selectedText.includes("மற்றவை")) {
if ($("#other_disability").val().trim() == "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire("Warning", "Please specify the disability.", "warning");
return false;
}
}
}
const gen=$('input[name="gender"]:checked').val();
if(!gen){
$('#pageLoader').hide();
Swal.fire("Missing Gender", "Please Select Gender", "warning");
$('#submitBtn').prop('disabled', false).text('Update');
return;
}
const tamgen=$('input[name="gender_tamil"]:checked').val();
if(!tamgen){
$('#pageLoader').hide();
Swal.fire("Missing Gender", "Please Select Gender in Tamil", "warning");
$('#submitBtn').prop('disabled', false).text('Update');
return;
}
const diff_type =$("#diff_type").val();
const other_disability =$("#other_disability").val().trim();
setIfPresent(formData, "diff_type", diff_type);
setIfPresent(formData, "other_disability", other_disability);
var familyCount = parseInt($("#familymembers").val()) || 0;
var familyDetails = [];
if (familyCount > 0) {
var isValid = true;
$("#familyMemberContainer .familyRow").each(function (index) {
var name = $(this).find(".family_name").val().trim();
var age = $(this).find(".family_age").val().trim();
var relationship = $(this).find(".relationship").val();
if (name === "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire("Warning",
"Please enter Person Name for Family Member " + (index + 1),
"warning");
isValid = false;
return false;
}
if (age === "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire("Warning",
"Please enter Age for Family Member " + (index + 1),
"warning");
isValid = false;
return false;
}
if (relationship === "") {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire("Warning",
"Please select Relationship for Family Member " + (index + 1),
"warning");
isValid = false;
return false;
}
// Push only after successful validation
familyDetails.push({
name: name,
age: age,
relationship: relationship
});
});
if (!isValid) {
return false;
}
}
console.log(familyDetails);
setIfPresent(formData, "familyDetails", JSON.stringify(familyDetails));
var familyCount = parseInt($("#familymembers").val()) || 0;
var rowCount = $("#familyMemberContainer .familyRow").length;
// If family members is 0, there should be no rows
if (familyCount === 0) {
if (rowCount !== 0) {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire(
"Warning",
"Family member details should be empty when Number of Family Members is 0.",
"warning"
);
return false;
}
} else {
// Count should match
if (familyCount !== rowCount) {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire(
"Warning",
"Number of Family Members (" + familyCount +
") does not match the entered Family Member Details (" + rowCount + ").",
"warning"
);
return false;
}
}
// are_any_fam_mem_invol_str // are_any_fam_mem_invol_str
let famVal = $("input[name='fam_vendor']:checked").val(); let famVal = $("input[name='fam_vendor']:checked").val();
setIfPresent(formData, "are_any_fam_mem_invol_str", famVal === undefined ? "" : famVal === "Yes"); setIfPresent(formData, "are_any_fam_mem_invol_str", famVal === undefined ? "" : famVal === "Yes");
@ -1447,6 +1858,21 @@ allowTamilAndSymbols("father_name_tamil");
const zone = $('#zone').val().trim(); const zone = $('#zone').val().trim();
const ward = $('#ward').val().trim(); const ward = $('#ward').val().trim();
const czone = $('#zone').val().trim();
if (czone==="") {
$('#pageLoader').hide();
Swal.fire("Missing Zone", "Please Click on Map", "warning");
$('#submitBtn').prop('disabled', false).text('Update');
return;
}
const cward = $('#ward').val().trim();
if (cward==="") {
$('#pageLoader').hide();
Swal.fire("Missing Ward", "Please Click on Map", "warning");
$('#submitBtn').prop('disabled', false).text('Update');
return;
}
setIfPresent(formData, "zone", zone); setIfPresent(formData, "zone", zone);
setIfPresent(formData, "ward", ward); setIfPresent(formData, "ward", ward);
@ -1488,6 +1914,15 @@ allowTamilAndSymbols("father_name_tamil");
$('#submitBtn').prop('disabled', false).text('Update'); $('#submitBtn').prop('disabled', false).text('Update');
return; return;
} }
const religion =$("#religion").val();
if(!religion){
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire("Warning", "Please select Religion.", "warning");
return false;
}
setIfPresent(formData, "religion", religion);
setIfPresent(formData, "mobile_number", mobileNumber); setIfPresent(formData, "mobile_number", mobileNumber);
@ -1501,7 +1936,29 @@ allowTamilAndSymbols("father_name_tamil");
setIfPresent(formData, "name", $('#name').val()); setIfPresent(formData, "name", $('#name').val());
setIfPresent(formData, "f_h_name", $('#father_name').val()); setIfPresent(formData, "f_h_name", $('#father_name').val());
setIfPresent(formData, "dob", $('#dob').val());
const dobValue = new Date($('#dob').val());
const today = new Date();
const age14Date = new Date(
today.getFullYear() - 14,
today.getMonth(),
today.getDate()
);
if (dobValue > age14Date) {
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire("Invalid Age", "Applicant must be at least 14 years old.", "error");
return;
}
const dob = $('#dob').val();
if (dob) {
const [year, month, day] = dob.split("-");
const formattedDob = `${day}-${month}-${year}`;
setIfPresent(formData, "dob", formattedDob);
}
let genderVal = $("input[name='gender']:checked").val(); let genderVal = $("input[name='gender']:checked").val();
@ -1522,6 +1979,14 @@ allowTamilAndSymbols("father_name_tamil");
let vendor_req_id= document.getElementById('vendor_req_id').textContent; let vendor_req_id= document.getElementById('vendor_req_id').textContent;
setIfPresent(formData, "vendor_req_id", vendor_req_id); setIfPresent(formData, "vendor_req_id", vendor_req_id);
const cprofileimage = $('#profileimage')[0]?.files[0];
if(profile_Preview.html().trim() === '' && !cprofileimage){
$('#pageLoader').hide();
$('#submitBtn').prop('disabled', false).text('Update');
Swal.fire("Missing", "Profile image is mandatory.", "warning");
return;
}
setFileIfPresent(formData, "street_vendor_photo", $('#profileimage')[0]); setFileIfPresent(formData, "street_vendor_photo", $('#profileimage')[0]);
setFileIfPresent(formData, "ration_card_photo", $('#ration_card_photo')[0]); setFileIfPresent(formData, "ration_card_photo", $('#ration_card_photo')[0]);
setFileIfPresent(formData, "aadhar_front_photo", $('#aadharfrontimage')[0]); setFileIfPresent(formData, "aadhar_front_photo", $('#aadharfrontimage')[0]);
@ -1601,6 +2066,40 @@ allowTamilAndSymbols("father_name_tamil");
}); });
function formatDateForInput(dateStr) {
if (!dateStr) return "";
// Already yyyy-MM-dd
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
return dateStr;
}
// dd-MM-yyyy -> yyyy-MM-dd
if (/^\d{2}-\d{2}-\d{4}$/.test(dateStr)) {
const [day, month, year] = dateStr.split("-");
return `${year}-${month}-${day}`;
}
return "";
}
function formatDateForDisplay(dateStr) {
if (!dateStr) return "-";
// Already dd-MM-yyyy
if (/^\d{2}-\d{2}-\d{4}$/.test(dateStr)) {
return dateStr;
}
// yyyy-MM-dd -> dd-MM-yyyy
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
const [year, month, day] = dateStr.split("-");
return `${day}-${month}-${year}`;
}
return dateStr;
}
</script> </script>
</body> </body>
</html> </html>
Loading…
Cancel
Save