diff --git a/pom.xml b/pom.xml index 13df3f5..e83f538 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.admin admin-api - 3.4.0 + 3.6.1 war Admin-API Admin Page @@ -54,6 +54,10 @@ org.springframework.boot spring-boot-devtools + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + org.springframework.boot spring-boot-starter @@ -73,6 +77,11 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.apache.commons + commons-compress + 1.21 + org.springframework.boot spring-boot-starter-web @@ -181,12 +190,7 @@ org.apache.poi poi-ooxml 5.2.3 - - - org.apache.commons - commons-compress - - + @@ -275,7 +279,7 @@ - ${artifactId}-${version} + ${project.artifactId}-${project.version} org.owasp diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java new file mode 100644 index 0000000..4832b53 --- /dev/null +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -0,0 +1,112 @@ +package com.iemr.admin.controller.bulkRegistration; + +import com.iemr.admin.repo.employeemaster.EmployeeMasterRepoo; +import com.iemr.admin.service.bulkRegistration.BulkRegistrationService; +import com.iemr.admin.service.bulkRegistration.BulkRegistrationServiceImpl; +import com.iemr.admin.service.bulkRegistration.EmployeeXmlService; +import com.iemr.admin.service.locationmaster.LocationMasterServiceInter; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +@RestController +public class BulkRegistrationController { + @Autowired + private EmployeeXmlService employeeXmlService; + @Autowired + BulkRegistrationServiceImpl bulkRegistrationServiceimpl; + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + + @Autowired + BulkRegistrationService bulkRegistrationService; + + @Autowired + private EmployeeMasterRepoo employeeMasterRepoo; + private Map errorResponse = new HashMap<>(); + @Autowired + private LocationMasterServiceInter locationMasterServiceInter; + private Map response = new HashMap<>(); + + @PostMapping(value = "/bulkRegistration", headers = "Authorization") + public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization, @RequestParam String userName, + HttpServletRequest request, @RequestParam Integer serviceProviderID + ) { + String jwtToken = null; + + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if ("jwt".equalsIgnoreCase(cookie.getName())) { // Cookie name == jwt + jwtToken = cookie.getValue(); + break; + } + } + } + + logger.info("JWT Token From Cookie: " + jwtToken); + logger.info("M_user Request: " + m_user); + + String authHeader = request.getHeader("Authorization"); + logger.info("Authorization Token: " + authHeader); + + logger.info("M_user Request: " + m_user); + bulkRegistrationServiceimpl.bulkRegistrationErrors.clear(); + logger.info("Bulk registration request received. Request payload is omitted from logs."); + try { + bulkRegistrationService.registerBulkUser(m_user, authorization,userName,serviceProviderID); + response.put("status", "Success"); + response.put("statusCode", 200); + response.put("totalUser", bulkRegistrationServiceimpl.totalEmployeeListSize); + response.put("registeredUser", bulkRegistrationServiceimpl.m_bulkUser.size()); + response.put("error", bulkRegistrationServiceimpl.errorLogs.toString()); + + bulkRegistrationServiceimpl.m_bulkUser.clear(); + bulkRegistrationServiceimpl.m_UserDemographics.clear(); + bulkRegistrationServiceimpl.errorLogs.clear(); + bulkRegistrationServiceimpl.totalEmployeeListSize=0; + + } catch (Exception e) { + response.put("message", e.getMessage()); + response.put("statusCode", 500); + + } + return ResponseEntity.ok(response); + + } + + @GetMapping(value = "/download-error-sheet", headers = "Authorization") + public ResponseEntity downloadErrorSheet() { + try { + byte[] fileContent = bulkRegistrationServiceimpl.insertErrorLog(); + + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=error_log.xlsx"); + + if(!bulkRegistrationServiceimpl.bulkRegistrationErrors.isEmpty()){ + bulkRegistrationServiceimpl.bulkRegistrationErrors.clear(); + } + return ResponseEntity.ok() + .headers(headers) + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(fileContent); + + } catch (Exception e) { + return ResponseEntity.status(500).body(null); + } + } + + +} diff --git a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java index b02e2c9..227baf2 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java @@ -30,9 +30,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.PropertySource; import org.springframework.http.MediaType; - import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -40,6 +38,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.iemr.admin.data.employeemaster.M_Community; import com.iemr.admin.data.employeemaster.M_Designation; import com.iemr.admin.data.employeemaster.M_Gender; @@ -1051,7 +1050,7 @@ public String getEmployeeByDesignation(@RequestBody String getDesignation) { ArrayList employeeBydesiganation = employeeMasterInter.getEmployeeByDesiganationID( employeeMaster.getDesignationID(), employeeMaster1.getServiceProviderID()); - + response.setResponse(employeeBydesiganation.toString()); } catch (Exception e) { diff --git a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java index bd4a62d..deb1bba 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -21,28 +21,34 @@ */ package com.iemr.admin.controller.employeemaster; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.PropertySource; +import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; +import org.springframework.http.InvalidMediaTypeException; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; - +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import com.google.gson.JsonObject; import com.iemr.admin.data.employeemaster.EmployeeSignature; import com.iemr.admin.service.employeemaster.EmployeeSignatureServiceImpl; -import com.iemr.admin.utils.mapper.InputMapper; import com.iemr.admin.utils.response.OutputResponse; import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletRequest; @PropertySource("classpath:application.properties") @@ -54,12 +60,10 @@ public class EmployeeSignatureController { @Autowired EmployeeSignatureServiceImpl employeeSignatureServiceImpl; - private InputMapper inputMapper = new InputMapper(); - private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); @Operation(summary = "Upload") - @RequestMapping(value = "/upload", headers = "Authorization", method = { RequestMethod.POST }, produces = { + @PostMapping(value = "/upload", headers = "Authorization", produces = { "application/json" }) public String uploadFile(@RequestBody EmployeeSignature emp) { OutputResponse response = new OutputResponse(); @@ -83,22 +87,27 @@ public String uploadFile(@RequestBody EmployeeSignature emp) { } @Operation(summary = "User id") - @RequestMapping(value = "/{userID}", headers = "Authorization", method = { RequestMethod.GET }) + @GetMapping(value = "/{userID}", headers = "Authorization") public ResponseEntity fetchFile(@PathVariable("userID") Long userID) throws Exception { - OutputResponse response = new OutputResponse(); logger.debug("File download for userID" + userID); try { EmployeeSignature userSignID = employeeSignatureServiceImpl.fetchSignature(userID); HttpHeaders responseHeaders = new HttpHeaders(); - responseHeaders.set(HttpHeaders.CONTENT_DISPOSITION, - "inline; filename=\"" + userSignID.getFileName() + "\""); - responseHeaders.set("filename", userSignID.getFileName()); - - return ResponseEntity.ok().contentType(MediaType.parseMediaType(userSignID.getFileType())) - .headers(responseHeaders).body(userSignID.getSignature()); - + ContentDisposition cd = ContentDisposition.attachment() + .filename(userSignID.getFileName(), StandardCharsets.UTF_8).build(); + responseHeaders.setContentDisposition(cd); + + MediaType mediaType; + try { + mediaType = MediaType.parseMediaType(userSignID.getFileType()); + } catch (InvalidMediaTypeException | NullPointerException e) { + mediaType = MediaType.APPLICATION_OCTET_STREAM; + } + byte[] fileBytes = userSignID.getSignature(); // MUST be byte[] + return ResponseEntity.ok().headers(responseHeaders).contentType(mediaType).contentLength(fileBytes.length) + .body(fileBytes); } catch (Exception e) { logger.error("Unexpected error:", e); logger.error("File download for userID failed with exception " + e.getMessage(), e); @@ -117,7 +126,15 @@ public String existFile(@PathVariable("userID") Long userID) throws Exception { try { Boolean userSignID = employeeSignatureServiceImpl.existSignature(userID); - response.setResponse(userSignID.toString()); + Boolean signatureActive = employeeSignatureServiceImpl.isSignatureActive(userID); + + // Create JSON response with both fields + JsonObject responseData = new JsonObject(); + responseData.addProperty("response", userSignID.toString()); + responseData.addProperty("signStatus", signatureActive.toString()); + + // Set the response (existing setResponse method will handle it) + response.setResponse(responseData.toString()); } catch (Exception e) { logger.error("Unexpected error:", e); @@ -128,4 +145,19 @@ public String existFile(@PathVariable("userID") Long userID) throws Exception { logger.debug("response" + response); return response.toString(); } + + @Operation(summary = "Active or DeActive user Signature") + @PostMapping(value = "/activateOrdeActivateSignature", headers = "Authorization", produces = { "application/json" }) + public String ActivateUser(@RequestBody String activateUser, HttpServletRequest request) { + OutputResponse response = new OutputResponse(); + try { + EmployeeSignature empSignature = employeeSignatureServiceImpl.updateUserSignatureStatus(activateUser); + boolean active = empSignature.getDeleted() == null ? false : !empSignature.getDeleted(); + response.setResponse("{\"userID\":" + empSignature.getUserID() + ",\"active\":" + active + "}"); + } catch (Exception e) { + logger.error("Active or Deactivate User Signature failed with exception " + e.getMessage(), e); + response.setError(e); + } + return response.toString(); + } } diff --git a/src/main/java/com/iemr/admin/data/bulkuser/BulkRegistrationError.java b/src/main/java/com/iemr/admin/data/bulkuser/BulkRegistrationError.java new file mode 100644 index 0000000..cf3a14c --- /dev/null +++ b/src/main/java/com/iemr/admin/data/bulkuser/BulkRegistrationError.java @@ -0,0 +1,12 @@ +package com.iemr.admin.data.bulkuser; + +import lombok.Data; + +import java.util.List; + +@Data +public class BulkRegistrationError { + String userName; + Integer rowNumber; + List error; +} diff --git a/src/main/java/com/iemr/admin/data/bulkuser/Employee.java b/src/main/java/com/iemr/admin/data/bulkuser/Employee.java new file mode 100644 index 0000000..984060d --- /dev/null +++ b/src/main/java/com/iemr/admin/data/bulkuser/Employee.java @@ -0,0 +1,102 @@ +package com.iemr.admin.data.bulkuser; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import lombok.Data; + +@Data +@JacksonXmlRootElement(localName = "Employee") +public class Employee { + + @JacksonXmlProperty(localName = "Title") + private String title=""; + + @JacksonXmlProperty(localName = "FirstName") + private String firstName=""; + + @JacksonXmlProperty(localName = "MiddleName") + private String middleName=""; + + @JacksonXmlProperty(localName = "LastName") + private String lastName=""; + + @JacksonXmlProperty(localName = "Gender") + private String gender=""; + + @JacksonXmlProperty(localName = "ContactNo") + private String contactNo=""; + + @JacksonXmlProperty(localName = "Designation") + private String designation=""; + + @JacksonXmlProperty(localName = "EmergencyContactNo") + private String emergencyContactNo=""; + + @JacksonXmlProperty(localName = "DateOfBirth") + private String dob=""; + + @JacksonXmlProperty(localName = "Age") + private int age=0; + + @JacksonXmlProperty(localName = "Email") + private String email=""; + + @JacksonXmlProperty(localName = "MaritalStatus") + private String maritalStatus=""; + + @JacksonXmlProperty(localName = "AadhaarNo") + private String aadhaarNo=""; + + @JacksonXmlProperty(localName = "PAN") + private String pan=""; + + @JacksonXmlProperty(localName = "Qualification") + private String qualification=""; + + @JacksonXmlProperty(localName = "FatherName") + private String fatherName=""; + + @JacksonXmlProperty(localName = "MotherName") + private String motherName=""; + + @JacksonXmlProperty(localName = "Community") + private String community=""; + + @JacksonXmlProperty(localName = "Religion") + private String religion=""; + + @JacksonXmlProperty(localName = "CurrentAddressLine1") + private String addressLine1=""; + + @JacksonXmlProperty(localName = "CurrentState") + private String state=""; + + @JacksonXmlProperty(localName = "CurrentDistrict") + private String district=""; + + @JacksonXmlProperty(localName = "CurrentPincode") + private String pincode=""; + + @JacksonXmlProperty(localName = "PermanentAddressLine1") + private String permanentAddressLine1=""; + + @JacksonXmlProperty(localName = "PermanentState") + private String permanentState=""; + + @JacksonXmlProperty(localName = "PermanentDistrict") + private String permanentDistrict=""; + + @JacksonXmlProperty(localName = "PermanentPincode") + private String permanentPincode=""; + + @JacksonXmlProperty(localName = "DateOfJoining") + private String dateOfJoining=""; + + @JacksonXmlProperty(localName = "UserName") + private String UserName=""; + + @JacksonXmlProperty(localName = "Password") + private String Password=""; + + +} diff --git a/src/main/java/com/iemr/admin/data/bulkuser/EmployeeList.java b/src/main/java/com/iemr/admin/data/bulkuser/EmployeeList.java new file mode 100644 index 0000000..7d656d2 --- /dev/null +++ b/src/main/java/com/iemr/admin/data/bulkuser/EmployeeList.java @@ -0,0 +1,17 @@ +package com.iemr.admin.data.bulkuser; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import lombok.Data; + +import java.util.List; + +@Data +@JacksonXmlRootElement(localName = "Employees") +public class EmployeeList { + + @JsonProperty("Employee") + @JacksonXmlElementWrapper(useWrapping = false) // To avoid extra nested array in XML + private List employees; +} diff --git a/src/main/java/com/iemr/admin/data/employeemaster/M_Religion.java b/src/main/java/com/iemr/admin/data/employeemaster/M_Religion.java index 2e733ac..dd2bfd9 100644 --- a/src/main/java/com/iemr/admin/data/employeemaster/M_Religion.java +++ b/src/main/java/com/iemr/admin/data/employeemaster/M_Religion.java @@ -36,8 +36,7 @@ @Entity @Table(name = "m_Religion") -public class M_Religion -{ +public class M_Religion { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/iemr/admin/data/employeemaster/M_User1.java b/src/main/java/com/iemr/admin/data/employeemaster/M_User1.java index 5c265f8..1c319a8 100644 --- a/src/main/java/com/iemr/admin/data/employeemaster/M_User1.java +++ b/src/main/java/com/iemr/admin/data/employeemaster/M_User1.java @@ -202,10 +202,32 @@ public class M_User1{ @Expose private M_Maritalstatus m_Maritalstatus; + @Expose + @Transient + private String signatureStatus; + /*@OneToOne(mappedBy="m_user") private M_UserLangMapping m_UserLangMapping1;*/ - // new field for rate-limit, failed authentication + public String getSignatureStatus() { + return signatureStatus; + } + + public void setSignatureStatus(String signatureStatus) { + this.signatureStatus = signatureStatus; + } + + + + + + + + + + + + // new field for rate-limit, failed authentication @Expose @Column(name = "failed_attempt", insertable = false) private Integer failedAttempt; diff --git a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepoo.java b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepoo.java index 9865245..3c90c81 100644 --- a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepoo.java +++ b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepoo.java @@ -40,9 +40,16 @@ public interface EmployeeMasterRepoo extends CrudRepository @Query("SELECT u FROM M_User1 u WHERE u.userID=:userID AND deleted=false") M_User1 editEmployee(@Param("userID") Integer userID); + @Query("SELECT u FROM M_User1 u WHERE u.aadhaarNo=:aadhaar AND deleted=false ") + M_User1 findEmployeeAadhaarNo(@Param("aadhaar") String userName); + @Query("SELECT u FROM M_User1 u WHERE u.userName=:userName AND deleted=false ") M_User1 findEmployeeByName(@Param("userName") String userName); + + @Query("SELECT u FROM M_User1 u WHERE u.contactNo=:contactNo AND deleted=false ") + M_User1 findEmployeeByContact(@Param("contactNo") String userName); + @Query("SELECT u FROM M_User1 u WHERE u.userName=:userName OR u.aadhaarNo=:aadhaarNo OR u.pAN=:getpAN OR u.employeeID=:employeeID OR u.healthProfessionalID=:healthProfessionalID AND deleted=false ") M_User1 checkingEmpDetails(@Param("userName") String userName, @Param("aadhaarNo") String aadhaarNo, @Param("getpAN") String getpAN,@Param("employeeID") String employeeID, @Param("healthProfessionalID") String healthProfessionalID); diff --git a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeSignatureRepo.java b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeSignatureRepo.java index 06a89f1..6463ff5 100644 --- a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeSignatureRepo.java +++ b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeSignatureRepo.java @@ -39,6 +39,6 @@ public interface EmployeeSignatureRepo extends CrudRepository{ @Query("SELECT u FROM V_Showuser u WHERE u.serviceProviderID= :serviceProviderID ORDER By u.userName") ArrayList EmployeeDetails4(@Param("serviceProviderID") Integer serviceProviderID); + @Query("SELECT u FROM V_Showuser u WHERE u.userName = :userName ORDER BY u.userName") + V_Showuser findByUserName(@Param("userName") String userName); + } diff --git a/src/main/java/com/iemr/admin/repository/user/UserLoginRepo.java b/src/main/java/com/iemr/admin/repository/user/UserLoginRepo.java index 0605ec3..27b37f9 100644 --- a/src/main/java/com/iemr/admin/repository/user/UserLoginRepo.java +++ b/src/main/java/com/iemr/admin/repository/user/UserLoginRepo.java @@ -1,5 +1,6 @@ package com.iemr.admin.repository.user; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; @@ -8,9 +9,8 @@ import com.iemr.admin.data.user.M_User; @Repository -public interface UserLoginRepo extends CrudRepository { +public interface UserLoginRepo extends JpaRepository { - @Query(" SELECT u FROM M_User u WHERE u.userID = :userID AND u.Deleted = false ") - public M_User getUserByUserID(@Param("userID") Long userID); + public M_User findByUserID(Integer userID); } diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java new file mode 100644 index 0000000..19ce84c --- /dev/null +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java @@ -0,0 +1,5 @@ +package com.iemr.admin.service.bulkRegistration; + +public interface BulkRegistrationService { + void registerBulkUser(String user,String authorization,String userName,Integer serviceProviderID); +} diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java new file mode 100644 index 0000000..0f2debf --- /dev/null +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -0,0 +1,795 @@ +package com.iemr.admin.service.bulkRegistration; + +import com.iemr.admin.data.bulkuser.BulkRegistrationError; +import com.iemr.admin.data.bulkuser.Employee; +import com.iemr.admin.data.bulkuser.EmployeeList; +import com.iemr.admin.data.employeemaster.*; +import com.iemr.admin.data.locationmaster.M_District; +import com.iemr.admin.data.rolemaster.StateMasterForRole; +import com.iemr.admin.repo.employeemaster.V_ShowuserRepo; +import com.iemr.admin.service.employeemaster.EmployeeMasterInter; +import com.iemr.admin.service.locationmaster.LocationMasterServiceInter; +import com.iemr.admin.service.rolemaster.Role_MasterInter; +import com.iemr.admin.utils.JwtUtil; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import java.io.*; +import java.math.BigInteger; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.spec.InvalidKeySpecException; +import java.sql.Date; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Service +public class BulkRegistrationServiceImpl implements BulkRegistrationService { + private static final String PAN_REGEX = "^[A-Z]{8}[0-9]{3}$"; + private static final String EMAIL_REGEX = "^[\\w-.]+@[\\w-]+\\.[a-zA-Z]{2,}$"; + public Integer totalEmployeeListSize = 0; + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + @Autowired + JwtUtil jwtUtil; + public static final String FILE_PATH = "error_log.xlsx"; // Excel file path + public List bulkRegistrationErrors = new ArrayList<>(); + + + @Autowired + private EmployeeMasterInter employeeMasterInter; + @Autowired + private Role_MasterInter roleMasterInter; + + @Autowired + private V_ShowuserRepo showuserRepo; + @Autowired + private LocationMasterServiceInter locationMasterServiceInter; + + @Autowired + EmployeeXmlService employeeXmlService; + + public ArrayList errorLogs = new ArrayList<>(); + public ArrayList m_bulkUser = new ArrayList<>(); + public ArrayList m_UserDemographics = new ArrayList<>(); + + private List m_districts; + + @Override + public void registerBulkUser(String xml, String authorization,String userName,Integer serviceProviderID) { + try { + xml = escapeXmlSpecialChars(xml); + + EmployeeList employeeList = employeeXmlService.parseXml(xml); + if (!employeeList.getEmployees().isEmpty()) { + logger.info("employee_list" + employeeList.getEmployees().toString()); + totalEmployeeListSize = employeeList.getEmployees().size(); + for (int i = 0; i < employeeList.getEmployees().size(); i++) { + saveUserUser(employeeList.getEmployees().get(i), i, authorization,userName,serviceProviderID); + + + } + } else { + errorLogs.add("Data is invalid or empty"); + + } + + + } catch (Exception e) { + logger.error("Exception:" + e.getMessage()); + errorLogs.add("Data is invalid or empty"); + + } + + + } + public static String escapeXmlSpecialChars(String xml) { + // Only escape & that are not already part of valid XML entities + return xml.replaceAll("&(?!amp;|lt;|gt;|apos;|quot;|#\\d+;)", "&"); + } + + + private void saveUserUser(Employee employee, Integer row, String authorization, String createdBy, Integer serviceProviderID) throws Exception { + List validationErrors = new ArrayList<>(); + BulkRegistrationError bulkRegistrationErrors_ = new BulkRegistrationError(); + M_User1 mUser = new M_User1(); + M_UserDemographics mUserDemographics = new M_UserDemographics(); + M_UserServiceRoleMapping2 m_userServiceRoleMapping = new M_UserServiceRoleMapping2(); + + logger.info("employee_list after for loop" + employee.toString()); + if (!employee.getUserName().isEmpty()) { + String checkUserIsExist = employeeMasterInter.FindEmployeeName(employee.getUserName()); + String checkContactIsExist = employeeMasterInter.FindEmployeeContact(employee.getContactNo()); + logger.info("checkAAdharIsExist" + checkUserIsExist); + if (checkUserIsExist.equalsIgnoreCase("usernotexist")) { + if (checkContactIsExist.equalsIgnoreCase("contactnotexist")) { + if (employee.getTitle() == null || employee.getTitle().isEmpty()) { + validationErrors.add("Title is missing."); + } + if (!employee.getTitle().isEmpty()) { + if (getTitleId(employee.getTitle()) == 0) { + validationErrors.add("Title is invalid."); + + } + + } + + if (employee.getFirstName() == null || employee.getFirstName().isEmpty()) { + validationErrors.add("First Name is missing."); + } + if(!employee.getFirstName().isEmpty()){ + if(employee.getFirstName().length()>50){ + validationErrors.add("First name is invalid."); + + } + if(isNumeric(employee.getFirstName())){ + validationErrors.add("First name is invalid."); + + } + } + + if(!employee.getMiddleName().isEmpty()){ + if(employee.getMiddleName().length()>50){ + validationErrors.add("Middle name is invalid."); + + } + if(isNumeric(employee.getMiddleName())){ + validationErrors.add("Middle name is invalid."); + + } + } + if (employee.getLastName() == null || employee.getLastName().isEmpty()) { + validationErrors.add("Last Name is missing."); + } + if(!employee.getLastName().isEmpty()){ + if(employee.getLastName().length()>50){ + validationErrors.add("Last name is invalid."); + + } + if(isNumeric(employee.getLastName())){ + validationErrors.add("Last name is invalid."); + + } + } + if (employee.getGender().isEmpty()) { + validationErrors.add("Gender is missing"); + + } + if (employee.getContactNo().isEmpty()) { + validationErrors.add("Contact number missing"); + + } + if (!employee.getContactNo().isEmpty()) { + if (!isValidPhoneNumber(String.valueOf(employee.getContactNo()))) { + validationErrors.add("Contact Number is invalid"); + } + } + + if (employee.getDesignation().isEmpty()) { + validationErrors.add("Designation is missing"); + + } + if (employee.getEmergencyContactNo().isEmpty()) { + validationErrors.add("Emergency contact number is missing"); + + } + if (!employee.getEmergencyContactNo().isEmpty()) { + if (!isValidPhoneNumber(String.valueOf(employee.getEmergencyContactNo()))) { + validationErrors.add("Emergency Contact Number is invalid."); + } + } + + if (employee.getDob().isEmpty()) { + validationErrors.add("Date of Birth is missing."); + + } + if(!employee.getDob().isEmpty()){ + if(!isValidDate(convertStringIntoDate(employee.getDob()).toString())){ + validationErrors.add("Date of Birth is invalid."); + + } + } + + if(employee.getEmail().isEmpty()){ + validationErrors.add("Email is missing."); + + } + if(!employee.getEmail().isEmpty()){ + if (!employee.getEmail().matches(EMAIL_REGEX)) { + validationErrors.add("Invalid Email format."); + } + } + + if (employee.getPassword().isEmpty()) { + validationErrors.add("Please Enter valid password."); + + } + + if (!employee.getAadhaarNo().isEmpty()) { + if (!employeeMasterInter.FindEmployeeAadhaar(employee.getAadhaarNo()).equalsIgnoreCase("aadhaarnotexist")) { + validationErrors.add("Duplicate aadhaar number found"); + + } + if(isValidAadhar(employee.getAadhaarNo())){ + validationErrors.add("Aadhaar number is invalid"); + + } + } + + + if (employee.getQualification().isEmpty()) { + validationErrors.add("Qualification is missing"); + + } + + if (employee.getState().isEmpty()) { + validationErrors.add("Current State is missing."); + } + if (!employee.getState().isEmpty()) { + if (getStateId(employee.getState()) == 0) { + validationErrors.add("Current State is invalid."); + + } + } + if (employee.getDistrict().isEmpty()) { + validationErrors.add("Current District is missing."); + } + if (!employee.getDistrict().isEmpty()) { + if (getDistrictId(employee.getDistrict()) == 0) { + validationErrors.add("Current District is invalid."); + + } + } + + if (employee.getPermanentState().isEmpty()) { + validationErrors.add("Permanent State is missing."); + } + if (!employee.getPermanentState().isEmpty()) { + if (getStateId(employee.getPermanentState()) == 0) { + validationErrors.add("Permanent State is invalid."); + + } + } + if (employee.getPermanentDistrict().isEmpty()) { + validationErrors.add("Permanent District is missing."); + } + + if (!employee.getPermanentDistrict().isEmpty()) { + if (getDistrictId(employee.getPermanentDistrict()) == 0) { + validationErrors.add("Permanent District is invalid."); + + } + } + + if(employee.getDateOfJoining().isEmpty()){ + validationErrors.add("Date of Joining is missing."); + + } + if(!employee.getDateOfJoining().isEmpty()){ + if(!isValidDate(convertStringIntoDate(employee.getDateOfJoining()).toString())){ + validationErrors.add("Date of Joining is invalid."); + + } + } + + + + if (!validationErrors.isEmpty()) { + errorLogs.add("Row " + (row + 1) + ": " + String.join(", ", validationErrors)); + bulkRegistrationErrors_.setRowNumber((row + 1)); + bulkRegistrationErrors_.setUserName(employee.getUserName()); + bulkRegistrationErrors_.setError(validationErrors); + bulkRegistrationErrors.add(bulkRegistrationErrors_); + + + + } + + + // showLogger(employee); + + if (!employee.getTitle().isEmpty() && !employee.getFirstName().isEmpty() && !employee.getLastName().isEmpty() && !employee.getContactNo().isEmpty() && !employee.getEmergencyContactNo().isEmpty() && !employee.getDob().isEmpty() && !employee.getUserName().isEmpty() && !employee.getPassword().isEmpty() && !employee.getState().isEmpty() && !employee.getDistrict().isEmpty() && !employee.getPermanentState().isEmpty() && !employee.getPermanentDistrict().isEmpty() && !employee.getGender().isEmpty() && !employee.getQualification().isEmpty() && isValidDate(convertStringIntoDate(employee.getDob()).toString()) && isValidDate(convertStringIntoDate(employee.getDateOfJoining()).toString())) { + try { + + mUser.setTitleID(getTitleId(employee.getTitle())); + mUser.setFirstName(employee.getFirstName()); + mUser.setLastName(employee.getLastName()); + mUser.setUserName(employee.getContactNo()); + mUser.setdOB(convertStringIntoDate(employee.getDob())); + mUser.setEmployeeID(employee.getUserName()); + mUser.setEmergencyContactNo(String.valueOf(employee.getEmergencyContactNo())); + mUser.setContactNo(String.valueOf(employee.getContactNo())); + if (!employee.getMiddleName().isEmpty()) { + mUser.setMiddleName(employee.getMiddleName()); + + } + if (!employee.getDesignation().isEmpty()) { + mUser.setDesignationID(getDesignationId(employee.getDesignation())); + + } + if (!employee.getDesignation().isEmpty()) { + mUser.setDesignationName(employee.getDesignation()); + + } + if (!isValidAadhar(employee.getAadhaarNo()) && employeeMasterInter.FindEmployeeAadhaar(employee.getAadhaarNo()).equalsIgnoreCase("aadhaarnotexist")) { + mUser.setAadhaarNo(String.valueOf(employee.getAadhaarNo())); + + } + + if (!employee.getPan().isEmpty()) { + mUser.setpAN(employee.getPan()); + + } + mUser.setMaritalStatusID(1); + mUser.setEmailID(employee.getEmail()); + mUser.setGenderID(Short.parseShort(String.valueOf(getGenderId(employee.getGender())))); + if (!employee.getQualification().isEmpty()) { + mUser.setQualificationID(getQualificationId(employee.getQualification())); + + } + mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); + mUser.setCreatedBy(createdBy); + mUser.setModifiedBy(createdBy); + mUser.setStatusID(2); + mUser.setDeleted(false); + mUser.setEmployeeID(employee.getUserName()); + mUser.setServiceProviderID(serviceProviderID); + mUser.setPassword(generateStrongPassword(employee.getPassword())); + logger.info("Register_user:" + mUser); + M_User1 bulkUserID = employeeMasterInter.saveBulkUserEmployee(mUser); + logger.info("BulkUser:" + bulkUserID); +// m_userServiceRoleMapping.setUserID(bulkUserID.getUserID()); +// m_userServiceRoleMapping.setServiceProviderID(bulkUserID.getServiceProviderID()); +// m_userServiceRoleMapping.setCreatedBy(createdBy); +// m_userServiceRoleMapping.setRoleID(122); + mUserDemographics.setUserID(bulkUserID.getUserID()); + mUserDemographics.setCountryID(91); + if (!employee.getCommunity().isEmpty()) { + mUserDemographics.setCommunityID(getCommunityId(employee.getCommunity())); + + } + if (!employee.getReligion().isEmpty()) { + mUserDemographics.setReligionID(getReligionStringId(employee.getReligion())); + + } + mUserDemographics.setCreatedBy(createdBy); + // Permanent Address + if (!employee.getPermanentAddressLine1().isEmpty()) { + mUserDemographics.setPermAddressLine1(employee.getPermanentAddressLine1()); + + } + if (!employee.getPermanentState().isEmpty()) { + mUserDemographics.setPermStateID(getStateId(employee.getPermanentState())); + + } + if (!employee.getPermanentDistrict().isEmpty()) { + mUserDemographics.setPermDistrictID(getDistrictId(employee.getPermanentDistrict())); + + } + mUserDemographics.setIsPermanent(false); + if (!employee.getPermanentPincode().isEmpty()) { + mUserDemographics.setPermPinCode(Integer.valueOf(employee.getPermanentPincode())); + + } + if (!employee.getMotherName().isEmpty()) { + mUserDemographics.setMothersName(employee.getMotherName()); + + } + if (!employee.getFatherName().isEmpty()) { + mUserDemographics.setFathersName(employee.getFatherName()); + + } + // correspondence address + if (!employee.getAddressLine1().isEmpty()) { + mUserDemographics.setAddressLine1(employee.getAddressLine1()); + + } + if (!employee.getState().isEmpty()) { + mUserDemographics.setStateID(getStateId(employee.getState())); + + } + mUserDemographics.setIsPresent(false); + if (!employee.getDistrict().isEmpty()) { + mUserDemographics.setDistrictID(getDistrictId(employee.getDistrict())); + + } + if (!employee.getPincode().isEmpty()) { + mUserDemographics.setPinCode(employee.getPincode().toString()); + + } + employeeMasterInter.saveDemography(mUserDemographics); + m_bulkUser.add(mUser); + m_UserDemographics.add(mUserDemographics); +// employeeMasterInter.saveRoleMappingeditedData(m_userServiceRoleMapping, authorization); + + } catch (Exception e) { + errorLogs.add("Row :" + (row + 1) + e.getMessage()); + bulkRegistrationErrors_.setRowNumber((row + 1)); + bulkRegistrationErrors_.setUserName(employee.getUserName()); + bulkRegistrationErrors_.setError(validationErrors); + bulkRegistrationErrors.add(bulkRegistrationErrors_); + + + } + } + + } else { + validationErrors.add("Contact No Already exist"); + if (!validationErrors.isEmpty()) { + + errorLogs.add("Row " + (row + 1) + ": " + String.join(", ", validationErrors)); + bulkRegistrationErrors_.setRowNumber((row + 1)); + bulkRegistrationErrors_.setUserName(employee.getUserName()); + bulkRegistrationErrors_.setError(validationErrors); + bulkRegistrationErrors.add(bulkRegistrationErrors_); + + + } + } + + } else { + validationErrors.add("User Already exist"); + if (!validationErrors.isEmpty()) { + + errorLogs.add("Row " + (row + 1) + ": " + String.join(", ", validationErrors)); + bulkRegistrationErrors_.setRowNumber((row + 1)); + bulkRegistrationErrors_.setUserName(employee.getUserName()); + bulkRegistrationErrors_.setError(validationErrors); + bulkRegistrationErrors.add(bulkRegistrationErrors_); + + + } + + } + } else { + validationErrors.add("Please Enter UserName"); + if (!validationErrors.isEmpty()) { + errorLogs.add("Row " + (row + 1) + ": " + String.join(", ", validationErrors)); + bulkRegistrationErrors_.setRowNumber((row + 1)); + bulkRegistrationErrors_.setUserName(employee.getUserName()); + bulkRegistrationErrors_.setError(validationErrors); + bulkRegistrationErrors.add(bulkRegistrationErrors_); + + + } + } + + + } + /** + * Validate employee details. + */ + + + private boolean isValidDate(String dateStr) { + try { + String[] parts = dateStr.split("-"); + int year = Integer.parseInt(parts[0]); + + if (year > 2025) { + return false; // Year should not be greater than 2025 + } + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate.parse(dateStr, formatter); // Validates if the full date is correct + + return true; // Valid date within range + } catch (Exception e) { + return false; // Invalid date format or parsing error + } + } + + private int calculateAge(String dob) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate birthDate = LocalDate.parse(dob, formatter); + + // Get current date + LocalDate currentDate = LocalDate.now(); + + // Calculate age + return Period.between(birthDate, currentDate).getYears(); + } + + private void showLogger(Employee employee) { + logger.info("Title: " + employee.getTitle()); + logger.info("Title Id: " + getTitleId(employee.getTitle())); + logger.info("First Name: " + employee.getFirstName()); + logger.info("Last Name: " + employee.getLastName()); + logger.info("Email: " + employee.getEmail()); + logger.info("Contact No: " + employee.getContactNo()); + logger.info("Emergency Contact No: " + employee.getEmergencyContactNo()); + logger.info("Age: " + employee.getAge()); + logger.info("DOB: " + employee.getDob()); + logger.info("State: " + employee.getState()); + logger.info("State ID: " + getStateId(employee.getState())); + logger.info("District: " + employee.getDistrict()); + logger.info("District ID: " + getDistrictId(employee.getDistrict())); + logger.info("Designation: " + employee.getDesignation()); + logger.info("Designation Id: " + getDesignationId(employee.getDesignation())); + logger.info("Qualification: " + employee.getQualification()); + logger.info("Father Name: " + employee.getFatherName()); + logger.info("Mother Name: " + employee.getMotherName()); + logger.info("Address Line 1: " + employee.getAddressLine1()); + logger.info("Permanent Address: " + employee.getPermanentAddressLine1()); + logger.info("Aadhaar No: " + employee.getAadhaarNo()); + logger.info("PAN: " + employee.getPan()); + logger.info("Gender: " + employee.getGender()); + logger.info("Date of Joining: " + employee.getDateOfJoining()); + logger.info("Religion: " + employee.getReligion()); + logger.info("Community: " + employee.getCommunity()); + logger.info("Pincode: " + employee.getPincode()); + logger.info("Dob_formated: " + convertStringIntoDate(employee.getDob())); + logger.info("doj_formated: " + convertStringIntoDate(employee.getDateOfJoining())); + + } + + + private int getGenderId(String genderString) { + int genderId = employeeMasterInter.getAllGender() + .stream() + .filter(gender -> gender.getGenderName().equalsIgnoreCase(genderString)) + .map(M_Gender::getGenderID) + .findFirst() + .orElse(0); + + if (genderId == 0) { + System.out.println("Gender name not found: " + genderString); + } else { + System.out.println("Gender ID: " + genderId); + } + + return genderId; + } + + public static boolean isNumeric(String str) { + try { + Integer.parseInt(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + + private int getTitleId(String titleString) { + int titleId = 0; + + if (!titleString.isEmpty()) { + if (titleString.equalsIgnoreCase("Major") || titleString.equalsIgnoreCase("Madame")) { + titleId = employeeMasterInter.getAllTitle() + .stream() + .filter(title -> title.getTitleName().equalsIgnoreCase(titleString)) + .map(M_Title::getTitleID) + .findFirst() + .orElse(0); + } else { + titleId = employeeMasterInter.getAllTitle() + .stream() + .filter(title -> title.getTitleName().equalsIgnoreCase(titleString + ".")) + .map(M_Title::getTitleID) + .findFirst() + .orElse(0); + } + } + + + return titleId; + } + + + public int getDesignationId(String designationString) { + + return 20; + } + + + public int getCommunityId(String communityString) { + int communityId = employeeMasterInter.getAllCommunity() + .stream() + .filter(community -> community.getCommunityType().equalsIgnoreCase(communityString)) + .map(M_Community::getCommunityID) + .findFirst() + .orElse(0); + + + return communityId; + } + + public int getQualificationId(String qualificationString) { + int qualificationId = employeeMasterInter.getQualification() + .stream() + .filter(q -> q.getName().equalsIgnoreCase(qualificationString)) + .map(M_Userqualification::getQualificationID) + .findFirst() + .orElse(0); + + + return qualificationId; + } + + //Religion + public int getReligionStringId(String religionString) { + if (religionString.equalsIgnoreCase("Not given")) { + return 0; + } else { + return employeeMasterInter.getAllReligion() + .stream() + .filter(religion -> religion.getReligionType().equalsIgnoreCase(religionString)) + .map(M_Religion::getReligionID) + .findFirst() + .orElse(0); + } + } + + + public int getDistrictId(String districtName) { + if (!districtName.isEmpty()) { + return m_districts.stream() + .filter(m_district -> m_district.getDistrictName().equalsIgnoreCase(districtName)) + .map(M_District::getDistrictID) + .findFirst() + .orElse(0); + } else { + return 0; + } + + + } + + + public ArrayList getAllState() { + return roleMasterInter.getAllState(); + } + + + public int getStateId(String stateName) { + int stateId = roleMasterInter.getAllState() + .stream() + .filter(state -> state.getStateName().equalsIgnoreCase(stateName)) + .map(StateMasterForRole::getStateID) + .findFirst() + .orElse(0); + + if (stateId == 0) { + logger.info("State name not found: " + stateName); + } else { + System.out.println("State ID: " + stateId); + m_districts = locationMasterServiceInter.getAllDistrictByStateId(stateId); + } + + return stateId; + } + + private boolean isValidPAN(String pan) { + // Check if the PAN matches the regex + return Pattern.matches(PAN_REGEX, pan); + } + + private boolean isValidPhoneNumber(String phoneNumber) { + // Correct regex: Phone number must start with 6, 7, 8, or 9 and be exactly 10 digits + System.out.println("Phone Number" + phoneNumber); + String regex = "^[6789]\\d{9}$"; + + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(phoneNumber); + + return matcher.matches(); + } + + private Map getHeaderMap(Row headerRow) { + Map headerMap = new HashMap<>(); + for (Cell cell : headerRow) { + headerMap.put(cell.getStringCellValue().trim(), cell.getColumnIndex()); + } + return headerMap; + } + + + public static Date convertStringIntoDate(String date) { + + final long MILLISECONDS_PER_DAY = 86400000L; + final long EPOCH_OFFSET = 2209161600000L; + + // Calculate milliseconds since epoch + long javaMillis = (long) (Double.parseDouble(date) * MILLISECONDS_PER_DAY - EPOCH_OFFSET); + + return new Date(javaMillis); + + + } + + + public String generateStrongPassword(String password) throws NoSuchAlgorithmException, InvalidKeySpecException { + int iterations = 1001; + char[] chars = password.toCharArray(); + byte[] salt = getSalt(); + + PBEKeySpec spec = new PBEKeySpec(chars, salt, iterations, 512); + SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); + byte[] hash = skf.generateSecret(spec).getEncoded(); + return iterations + ":" + toHex(salt) + ":" + toHex(hash); + } + + private byte[] getSalt() throws NoSuchAlgorithmException { + SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); + byte[] salt = new byte[16]; + sr.nextBytes(salt); + return salt; + } + + private String toHex(byte[] array) throws NoSuchAlgorithmException { + BigInteger bi = new BigInteger(1, array); + String hex = bi.toString(16); + int paddingLength = array.length * 2 - hex.length(); + if (paddingLength > 0) { + return String.format(new StringBuilder().append("%0").append(paddingLength).append("d").toString(), + new Object[]{Integer.valueOf(0)}) + hex; + } + return hex; + } + + public static boolean isValidAadhar(String aadharNumber) { + if (!Pattern.matches("\\d{12}", aadharNumber)) { + return true; // Must be a 12-digit number + } + return false; + + } + + + public byte[] insertErrorLog() { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("Error Log"); + + try { + // **Create Header Row (Only Once)** + Row headerRow = sheet.createRow(0); + headerRow.createCell(0).setCellValue("UserName"); + headerRow.createCell(1).setCellValue("Remark"); + + // **Start inserting data from row 1** + int rowIndex = 1; // Start from row 1 (row 0 is header) + int rowIndex2 = 1; // Start from row 1 (row 0 is header) + logger.info("Error Size" + bulkRegistrationErrors.size()); + for (BulkRegistrationError bulkRegistrationError : bulkRegistrationErrors) { + Row row = sheet.createRow(rowIndex++); + + row.createCell(0).setCellValue(bulkRegistrationError.getUserName()); + row.createCell(1).setCellValue(bulkRegistrationError.getError().toString()); + + + } + + + // **Auto-Size Columns for Better Readability** + sheet.autoSizeColumn(0); + sheet.autoSizeColumn(1); + + // **Write to ByteArrayOutputStream** + workbook.write(baos); + workbook.close(); + + System.out.println("Error log generated successfully!"); + + } catch (IOException e) { + logger.error("IOException" + e.getMessage()); + e.printStackTrace(); + } + + return baos.toByteArray(); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/EmployeeXmlService.java b/src/main/java/com/iemr/admin/service/bulkRegistration/EmployeeXmlService.java new file mode 100644 index 0000000..7c10bb8 --- /dev/null +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/EmployeeXmlService.java @@ -0,0 +1,21 @@ +package com.iemr.admin.service.bulkRegistration; + + +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import com.iemr.admin.data.bulkuser.EmployeeList; +import org.springframework.stereotype.Service; + +@Service +public class EmployeeXmlService { + + private final XmlMapper xmlMapper = new XmlMapper(); + + // Convert XML to EmployeeList (Java Object) + public EmployeeList parseXml(String xmlData) throws Exception { + System.out.println("user_xml_date"+xmlData.toString()); + + return xmlMapper.readValue(xmlData, EmployeeList.class); + } + + +} diff --git a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java index 1d22c5d..ff284cb 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java @@ -113,6 +113,9 @@ ArrayList getEmployeeDetails11(Intege ArrayList getlocationByMapid2(int tempProSerStatMapID, Integer districtID); String FindEmployeeName(String userName); + String FindEmployeeContact(String contactNo); + String FindEmployeeAadhaar(String aadhaarNo); + public M_User1 FindEmployeeName1(String userName); @@ -188,4 +191,5 @@ Boolean checkingEmpDetails(String userName, String aadhaarNo, String getpAN, Str M_UserServiceRoleMapping2 deleteuserrolemapTM(M_UserServiceRoleMapping2 pre) throws Exception; + M_User1 saveBulkUserEmployee(M_User1 mUser); } diff --git a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java index 19032d6..62593f1 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java @@ -59,6 +59,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonParser; import com.iemr.admin.data.blocking.M_Providerservicemapping_Blocking; +import com.iemr.admin.data.employeemaster.EmployeeSignature; import com.iemr.admin.data.employeemaster.M_Community; import com.iemr.admin.data.employeemaster.M_Gender; import com.iemr.admin.data.employeemaster.M_ProviderServiceMap1; @@ -80,6 +81,7 @@ import com.iemr.admin.repo.blocking.MProviderservicemappingBlockingRepo; import com.iemr.admin.repo.employeemaster.EmployeeMasterRepo; import com.iemr.admin.repo.employeemaster.EmployeeMasterRepoo; +import com.iemr.admin.repo.employeemaster.EmployeeSignatureRepo; import com.iemr.admin.repo.employeemaster.M_CommunityRepo; import com.iemr.admin.repo.employeemaster.M_GenderRepo; import com.iemr.admin.repo.employeemaster.M_ProviderServiceMap1Repo; @@ -104,7 +106,6 @@ import com.iemr.admin.utils.mapper.InputMapper; import com.iemr.admin.utils.response.OutputResponse; -import jakarta.servlet.http.HttpServletRequest; @Service public class EmployeeMasterServiceImpl implements EmployeeMasterInter { @@ -190,6 +191,9 @@ public void setConfigProperties(ConfigProperties configProperties) { @Autowired M_ServiceMasterRepo serviceMasterRepo; + + @Autowired + private EmployeeSignatureRepo employeeSignatureRepo; /* * @Override public ArrayList getAllRole() { //ArrayList resSet * = new ArrayList(); //resSet = @@ -652,6 +656,25 @@ public String FindEmployeeName(String userName) { } + @Override + public String FindEmployeeContact(String contactNo) { + M_User1 user = employeeMasterRepoo.findEmployeeByContact(contactNo); + if (user == null) { + return "contactnotexist"; + } else { + return "contactexist"; + } } + + @Override + public String FindEmployeeAadhaar(String aadhaarNo) { + M_User1 user = employeeMasterRepoo.findEmployeeAadhaarNo(aadhaarNo); + if (user == null) { + return "aadhaarnotexist"; + } else { + return "aadhaarexist"; + } + } + @Override public M_User1 FindEmployeeName1(String userName) { @@ -1070,6 +1093,19 @@ public ArrayList getEmployeeDetails4(Integer serviceProviderID) { public ArrayList getEmployeeByDesiganationID(Integer designationID, Integer serviceProviderID) { ArrayList getEmpByDesiganation = employeeMasterRepoo.getempByDesiganation(designationID, serviceProviderID); + for (M_User1 user : getEmpByDesiganation) { + Integer userID = user.getUserID(); + EmployeeSignature signature = employeeSignatureRepo.findOneByUserID(Long.valueOf(userID)); + if (null != signature) { + if (signature.getDeleted()) { + user.setSignatureStatus("InActive"); + } else { + user.setSignatureStatus("Active"); + } + } else { + user.setSignatureStatus(null); + } + } return getEmpByDesiganation; } @@ -1191,4 +1227,14 @@ public M_UserServiceRoleMapping2 deleteuserrolemapTM(M_UserServiceRoleMapping2 u return dataout; } + @Override + public M_User1 saveBulkUserEmployee(M_User1 mUser) { + logger.info("EmployeeMasterServiceImpl.saveEmployee - start"); + M_User1 data = employeeMasterRepo11.save(mUser); +// logger.info("Encrypt password returned " + encryptUserPassword.encryptUserCredentials(data).toString()); + Integer data1 = data.getUserID(); + logger.info("EmployeeMasterServiceImpl.saveEmployee - finish"); + return data; + } + } diff --git a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureService.java b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureService.java index 09ddd34..3006438 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureService.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureService.java @@ -29,4 +29,6 @@ public interface EmployeeSignatureService { Long uploadSignature(EmployeeSignature empSign); + EmployeeSignature updateUserSignatureStatus(String activateUser); + } diff --git a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java index 2505576..fd4a047 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java @@ -21,6 +21,7 @@ */ package com.iemr.admin.service.employeemaster; +import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -64,7 +65,24 @@ public EmployeeSignature fetchSignature(Long userSignID) { public Boolean existSignature(Long userID) { // TODO Auto-generated method stub - return employeeSignatureRepo.countByUserIDAndSignatureNotNull(userID)>0; + return employeeSignatureRepo.countByUserIDAndSignatureNotNull(userID) > 0; } + public Boolean isSignatureActive(Long userID) { + return employeeSignatureRepo.countByUserIDAndSignatureNotNullAndDeletedFalse(userID) > 0; + } + + @Override + public EmployeeSignature updateUserSignatureStatus(String activateUser) { + JSONObject obj = new JSONObject(activateUser); + Long userID = obj.getLong("userID"); + // String role = obj.getString("role"); + boolean active = obj.getBoolean("active"); + EmployeeSignature signature = employeeSignatureRepo.findOneByUserID(userID); + if (signature == null) { + throw new IllegalArgumentException("No signature found for userID: " + userID); + } + signature.setDeleted(!active); + return employeeSignatureRepo.save(signature); + } } diff --git a/src/main/java/com/iemr/admin/service/rolemaster/Role_MasterInter.java b/src/main/java/com/iemr/admin/service/rolemaster/Role_MasterInter.java index 6cc99a4..9c432d9 100644 --- a/src/main/java/com/iemr/admin/service/rolemaster/Role_MasterInter.java +++ b/src/main/java/com/iemr/admin/service/rolemaster/Role_MasterInter.java @@ -24,12 +24,7 @@ import java.util.ArrayList; import java.util.List; -import com.iemr.admin.data.rolemaster.RoleMaster; -import com.iemr.admin.data.rolemaster.M_Role104; -import com.iemr.admin.data.rolemaster.M_Screen; -import com.iemr.admin.data.rolemaster.M_UserservicerolemappingForRoleProviderAdmin; -import com.iemr.admin.data.rolemaster.RoleScreenMapping; -import com.iemr.admin.data.rolemaster.StateServiceMapping; +import com.iemr.admin.data.rolemaster.*; public interface Role_MasterInter { @@ -56,7 +51,7 @@ public interface Role_MasterInter { List mapScreen(RoleScreenMapping mRoles2); String settingScreenId(Integer sRSMappingID, Integer screenID); - + public ArrayList getProStateServRoles1(int pssmID); List mapfeature(List mRoles3); @@ -64,7 +59,7 @@ public interface Role_MasterInter { ArrayList getServiceByServiceProviderIds(Integer userID); ArrayList getStateByServiceProviderIdAndServiceLines(Integer userID, - Integer serviceID,Boolean isNational); + Integer serviceID,Boolean isNational); ArrayList getAllByMapId(Integer serviceProviderID, Integer serviceID); @@ -76,8 +71,10 @@ ArrayList getStateByServiceProvide RoleMaster configWrapUpTime(RoleMaster role) throws Exception; + ArrayList getAllState(); + + - } diff --git a/src/main/java/com/iemr/admin/service/rolemaster/Role_Master_ServiceImpl.java b/src/main/java/com/iemr/admin/service/rolemaster/Role_Master_ServiceImpl.java index 1471395..683487d 100644 --- a/src/main/java/com/iemr/admin/service/rolemaster/Role_Master_ServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/rolemaster/Role_Master_ServiceImpl.java @@ -46,8 +46,8 @@ import jakarta.persistence.EntityManager; @Service -public class Role_Master_ServiceImpl implements Role_MasterInter -{ +public class Role_Master_ServiceImpl implements Role_MasterInter { + @Autowired private StateMasterRepo stateMasterRepo; @@ -62,7 +62,7 @@ public class Role_Master_ServiceImpl implements Role_MasterInter @Autowired private RoleScreenMappingRepo roleScreenMappingRepo; - + @Autowired private M_ScreenRepo m_ScreenRepo; @@ -279,7 +279,7 @@ public ArrayList getServiceByServi @Override public ArrayList - getStateByServiceProviderIdAndServiceLines(Integer userID, Integer serviceID, Boolean isNational) + getStateByServiceProviderIdAndServiceLines(Integer userID, Integer serviceID, Boolean isNational) { if (isNational == false) { @@ -364,7 +364,7 @@ public ArrayList getProStateServRolesActive(Integer providerServiceM public RoleMaster configWrapUpTime(RoleMaster role) throws Exception { // TODO Auto-generated method stub RoleMaster buff=mRoleRepo.findByRoleID(role.getRoleID()); - + if(buff==null) { throw new Exception("Invalid Role"); } @@ -374,8 +374,14 @@ public RoleMaster configWrapUpTime(RoleMaster role) throws Exception { buff.setIsWrapUpTime(role.getIsWrapUpTime()); buff.setWrapUpTime(role.getWrapUpTime()); buff.setModifiedBy(role.getModifiedBy()); - + return mRoleRepo.save(buff); } + @Override + public ArrayList getAllState() { + return stateMasterRepo.getAllState(); + } + + } diff --git a/src/main/java/com/iemr/admin/utils/JwtAuthenticationUtil.java b/src/main/java/com/iemr/admin/utils/JwtAuthenticationUtil.java index 77c7891..e6c02bb 100644 --- a/src/main/java/com/iemr/admin/utils/JwtAuthenticationUtil.java +++ b/src/main/java/com/iemr/admin/utils/JwtAuthenticationUtil.java @@ -109,7 +109,7 @@ private M_User fetchUserFromDB(String userId) { String redisKey = "user_" + userId; // Redis key format // Fetch user from DB - M_User user = userLoginRepo.getUserByUserID(Long.parseLong(userId)); + M_User user = userLoginRepo.findByUserID(Integer.parseInt(userId)); if (user != null) { M_User userHash = new M_User(); diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 64c89a9..f61881a 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -84,6 +84,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo return; } + try { String jwtFromCookie = getJwtTokenFromCookies(request); String jwtFromHeader = request.getHeader(Constants.JWT_TOKEN); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e65d5b3..f86b6b6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -74,3 +74,21 @@ swymed-edituser-url=swymed-base-url/SwymedWebApi/api/Contact calibrationPageSize=5 biological-screening-device-url=http://localhost:8096/ezdx-hub-connect-srv + +callcentre-server-ip=10.208.122.99 + +videoConsultation-apikey= +videoConsultation-base-url=https://psmri.swymed.com:9274 + +### Redis IP +spring.redis.host=localhost + +common-url=http://localhost:8083/ + +springdoc.api-docs.enabled=true +springdoc.swagger-ui.enabled=true + +logging.path=logs/ +logging.file.name=logs/admin-api.log + +cors.allowed-origins=http://localhost:*