From 3c2135eb2d7cb447211a77a762df983e42b9b843 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 4 Mar 2025 10:37:17 +0530 Subject: [PATCH 01/61] Bulk registration --- pom.xml | 4 + .../BulkRegistrationController.java | 84 +++ .../iemr/admin/data/bulkuser/Employee.java | 94 ++++ .../admin/data/bulkuser/EmployeeList.java | 17 + .../BulkRegistrationService.java | 5 + .../BulkRegistrationServiceImpl.java | 482 ++++++++++++++++++ .../bulkRegistration/EmployeeXmlService.java | 21 + .../employeemaster/EmployeeMasterInter.java | 1 + .../EmployeeMasterServiceImpl.java | 10 + .../service/rolemaster/Role_MasterInter.java | 15 +- .../rolemaster/Role_Master_ServiceImpl.java | 18 +- 11 files changed, 736 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java create mode 100644 src/main/java/com/iemr/admin/data/bulkuser/Employee.java create mode 100644 src/main/java/com/iemr/admin/data/bulkuser/EmployeeList.java create mode 100644 src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java create mode 100644 src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java create mode 100644 src/main/java/com/iemr/admin/service/bulkRegistration/EmployeeXmlService.java diff --git a/pom.xml b/pom.xml index 080d7a2..13d9b28 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,10 @@ org.springframework.boot spring-boot-devtools + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + org.springframework.boot spring-boot-starter 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..9275237 --- /dev/null +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -0,0 +1,84 @@ +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 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.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<>(); + + + @CrossOrigin() + @RequestMapping(value = "/bulkRegistration",method = RequestMethod.POST,headers = "Authorization") + public ResponseEntity> registerBulkUser(@RequestBody String m_user) throws Exception { + logger.info("M_user Request"+m_user.toString()); + try { + bulkRegistrationService.registerBulkUser(m_user); + 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.validationErrors.clear(); + + } catch (Exception e) { + response.put("status","Fail"); + response.put("statusCode",500); + throw new RuntimeException(e); + } + return ResponseEntity.ok(response); + + } + @CrossOrigin() + @Operation(description = "Download formatted Excel sheet") + @RequestMapping(value = {"/downloadExcelSheet"},method = {RequestMethod.GET},consumes = {"application/octet-stream"}) + public ResponseEntity exportIntoExcelFile(){ + + // Load the Excel file from resources + ClassPathResource excelFile = new ClassPathResource("xlsxfile/bulkuser_excel_sheet.xlsx"); + + // Return the Excel file as a response with proper headers + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + excelFile.getFilename() + "\"") + .body(excelFile); + } + + + +} 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..74a1483 --- /dev/null +++ b/src/main/java/com/iemr/admin/data/bulkuser/Employee.java @@ -0,0 +1,94 @@ +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 = "DOB") + private String dob; + + @JacksonXmlProperty(localName = "Age") + private int age; + + @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 = "AddressLine1") + private String addressLine1; + + @JacksonXmlProperty(localName = "State") + private String state; + + @JacksonXmlProperty(localName = "District") + private String district; + + @JacksonXmlProperty(localName = "Pincode") + 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; +} 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/service/bulkRegistration/BulkRegistrationService.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java new file mode 100644 index 0000000..55f42b7 --- /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); +} 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..b961385 --- /dev/null +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -0,0 +1,482 @@ +package com.iemr.admin.service.bulkRegistration; + +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.service.employeemaster.EmployeeMasterInter; +import com.iemr.admin.service.locationmaster.LocationMasterServiceInter; +import com.iemr.admin.service.rolemaster.Role_MasterInter; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Row; +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.ByteArrayOutputStream; +import java.math.BigInteger; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.spec.InvalidKeySpecException; +import java.sql.Date; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +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 + private EmployeeMasterInter employeeMasterInter; + @Autowired + private Role_MasterInter roleMasterInter; + @Autowired + private LocationMasterServiceInter locationMasterServiceInter; + + ByteArrayOutputStream out; + @Autowired + EmployeeXmlService employeeXmlService; + public List validationErrors = new ArrayList<>(); + + public List errorLogs = new ArrayList<>(); + public ArrayList m_bulkUser = new ArrayList<>(); + // public ArrayList m_bulkUser1 = new ArrayList<>(); + public ArrayList m_UserDemographics = new ArrayList<>(); + + private List m_districts; + + public List getValidationError() { + return validationErrors; + + } + + + + + @Override + public void registerBulkUser(String xml) { + try { + EmployeeList employeeList = employeeXmlService.parseXml(xml); + 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); + + } + + + } catch (Exception e) { + System.out.println(e.getMessage()); + } + + + } + + + private void saveUserUser(Employee employee, Integer row) throws Exception { + logger.info("employee_list after for loop" + employee.toString()); + + + + if (employee.getTitle() == null || employee.getTitle().isEmpty() || getTitleId(employee.getTitle()) == 0) { + validationErrors.add("Title is missing or invalid."); + } + if (employee.getFirstName() == null || employee.getFirstName().isEmpty()) { + validationErrors.add("First Name is missing."); + } + if (employee.getLastName() == null || employee.getLastName().isEmpty()) { + validationErrors.add("Last Name is missing."); + } + if (employee.getEmail() == null || !employee.getEmail().matches(EMAIL_REGEX)) { + validationErrors.add("Invalid Email format."); + } + if (!isValidPhoneNumber(String.valueOf(employee.getContactNo()))) { + validationErrors.add("Contact Number must be exactly 10 digits."); + } + if (!isValidPhoneNumber(String.valueOf(employee.getEmergencyContactNo()))) { + validationErrors.add("Emergency Contact Number must be exactly 10 digits."); + } + if (!String.valueOf(employee.getAge()).matches("\\d{1,2}")) { + validationErrors.add("Age should be a 1 or 2-digit number."); + } + if (employee.getDob() == null || employee.getDob().toString().isEmpty()) { + validationErrors.add("Date of Birth is invalid."); + } + if (employee.getDateOfJoining() == null || employee.getDateOfJoining().toString().isEmpty()) { + validationErrors.add("Date of Joining is invalid."); + } + if (getStateId(employee.getState()) == 0) { + validationErrors.add("State is invalid."); + } + if (getDistrictId(employee.getDistrict()) == 0) { + validationErrors.add("District is invalid."); + } + + if (getStateId(employee.getPermanentState()) == 0) { + validationErrors.add("Permanent State is invalid."); + } + if (getDistrictId(employee.getPermanentDistrict()) == 0) { + validationErrors.add("Permanent District is invalid."); + } + if(employee.getPincode()==null|| employee.getPincode().isEmpty()){ + validationErrors.add("Pincode is invalid."); + + } + if(employee.getPermanentPincode()==null|| employee.getPermanentPincode().isEmpty()){ + validationErrors.add("Permanent Pincode is invalid."); + + } + if(isValidPAN(employee.getPan())){ + validationErrors.add("PAN is invalid."); + + } + + if (!validationErrors.isEmpty()) { + errorLogs.add("Row " + (row + 1) + ": " + String.join(", ", validationErrors)); + } + + + try { + 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()); + + + + M_User1 mUser = new M_User1(); + M_UserDemographics mUserDemographics = new M_UserDemographics(); + + mUser.setTitleID(getTitleId(employee.getTitle())); + mUser.setDesignationID(getDesignationId(employee.getDesignation())); + mUser.setDesignationName("ASHA"); + mUser.setFirstName(employee.getFirstName()); + mUser.setLastName(employee.getLastName()); + mUser.setUserName(employee.getContactNo()); + mUser.setdOB(convertStringIntoDate(employee.getDob())); + mUser.setEmployeeID(employee.getContactNo()); + mUser.setEmergencyContactNo(String.valueOf(employee.getEmergencyContactNo())); + mUser.setContactNo(String.valueOf(employee.getContactNo())); + mUser.setMiddleName(employee.getMiddleName()); + mUser.setAadhaarNo(String.valueOf(employee.getAadhaarNo())); + mUser.setpAN(employee.getPan()); +// mUser.setMaritalStatusID(getMaritalStatusID(employee.getMaritalStatus())); + mUser.setMaritalStatusID(1); + mUser.setEmailID(employee.getEmail()); + mUser.setGenderID(Short.parseShort(String.valueOf(getGenderId(employee.getGender())))); + mUser.setQualificationID(getQualificationId(employee.getQualification())); + mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); + mUser.setCreatedBy("PSMRIL2"); + mUser.setModifiedBy("PSMRIL2"); + mUser.setIsSupervisor(false); + mUser.setServiceProviderID(15); + mUser.setPassword(generateStrongPassword("Test@123")); + logger.info("M_user" + mUser); + M_User1 bulkUserID = employeeMasterInter.saveBulkUserEmployee(mUser); + System.out.println("bulk_userID" + bulkUserID.getUserID().toString()); + logger.info("M_user Id" + bulkUserID.getUserID()); + mUserDemographics.setUserID(bulkUserID.getUserID()); + mUserDemographics.setCountryID(91); + mUserDemographics.setCommunityID(getCommunityId(employee.getCommunity())); + mUserDemographics.setReligionID(getReligionStringId(employee.getReligion())); + mUserDemographics.setFathersName(employee.getFatherName()); + mUserDemographics.setCreatedBy("PSMRIL2"); + mUserDemographics.setAddressLine1(employee.getAddressLine1()); + mUserDemographics.setPermAddressLine1(employee.getPermanentAddressLine1()); + mUserDemographics.setPermStateID(getStateId(employee.getPermanentState())); + mUserDemographics.setPermDistrictID(getDistrictId(employee.getPermanentDistrict())); + mUserDemographics.setIsPermanent(false); + mUserDemographics.setPermPinCode(Integer.valueOf(employee.getPermanentPincode())); + mUserDemographics.setMothersName(employee.getMotherName()); + mUserDemographics.setAddressLine1(employee.getPermanentAddressLine1()); + mUserDemographics.setStateID(getStateId(employee.getState())); + mUserDemographics.setIsPresent(false); + mUserDemographics.setStateID(getStateId(employee.getState())); + mUserDemographics.setDistrictID(getDistrictId(employee.getDistrict())); + mUserDemographics.setPinCode(employee.getPincode().toString()); + employeeMasterInter.saveDemography(mUserDemographics); + m_bulkUser.add(mUser); + m_UserDemographics.add(mUserDemographics); + + } catch (Exception e) { + errorLogs.add("Row : " + (row+1) + e.getMessage()); + } + + + } + + + + + public 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 int getTitleId(String titleString) { + int 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.getUserQualificationDesc().equalsIgnoreCase(qualificationString)) + .map(M_Userqualification::getQualificationID) + .findFirst() + .orElse(0); + + + + return qualificationId; + } + + + //Religion + public int getReligionStringId(String religionString) { + return employeeMasterInter.getAllReligion() + .stream() + .filter(religion -> religion.getReligionType().equalsIgnoreCase(religionString)) + .map(M_Religion::getReligionID) + .findFirst() + .orElse(0); + } + + + public int getDistrictId(String districtName) { + return m_districts.stream() + .filter(m_district -> m_district.getDistrictName().equalsIgnoreCase(districtName)) + .map(M_District::getDistrictID) + .findFirst() + .orElse(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; + } + + private Integer getIntegerValue(Row row, Integer cellIndex) { + if (cellIndex == null) return null; + Cell cell = row.getCell(cellIndex); + return (cell != null && cell.getCellType() == CellType.NUMERIC) ? (int) cell.getNumericCellValue() : null; + } + + private Long getLongValue(Row row, Integer cellIndex) { + if (cellIndex == null) return null; + Cell cell = row.getCell(cellIndex); + return (cell != null && cell.getCellType() == CellType.NUMERIC) ? (long) cell.getNumericCellValue() : null; + } + + + private String getStringValue(Row row, Integer cellIndex) { + if (cellIndex == null || row.getCell(cellIndex) == null) return null; + Cell cell = row.getCell(cellIndex); + return (cell.getCellType() == CellType.STRING) ? cell.getStringCellValue().trim() : null; + } + + private void validateHeaders(Map headerMap, List requiredHeaders) { + for (String header : requiredHeaders) { + if (!headerMap.containsKey(header)) { + throw new RuntimeException("Missing required header: " + header); + } + } + } + + private Timestamp getTimestampValue(Row row, Integer cellIndex) { + if (cellIndex == null) return null; + Cell cell = row.getCell(cellIndex); + if (cell != null && cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) { + return new Timestamp(cell.getDateCellValue().getTime()); + } + return null; + } + + + public Date convertStringIntoDate(String dateString) throws ParseException { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime dateTime = LocalDateTime.parse(dateString+" "+"00:00:00", formatter); + + + // Convert String to Date + return Date.valueOf(String.valueOf(dateTime)); + + } + + + private Timestamp getTimestampValue(String dateString) { + if (dateString == null || dateString.trim().isEmpty()) { + } + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // + try { + return new Timestamp(dateFormat.parse(dateString).getTime()); + } catch (ParseException e) { + e.printStackTrace(); // + return null; + } + } + + + 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; + } + + +} \ 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 aae5837..d91d8c7 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java @@ -184,4 +184,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 41ee880..28d5072 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java @@ -1178,4 +1178,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/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(); + } + + } From 23cccacd1126a01a5a3c39ad33dcf405535524c7 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 11 Mar 2025 14:10:44 +0530 Subject: [PATCH 02/61] Bulk registration --- .../controller/bulkRegistration/BulkRegistrationController.java | 2 -- .../service/bulkRegistration/BulkRegistrationServiceImpl.java | 1 - 2 files changed, 3 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 9275237..dde1937 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -39,7 +39,6 @@ public class BulkRegistrationController { private Map response = new HashMap<>(); - @CrossOrigin() @RequestMapping(value = "/bulkRegistration",method = RequestMethod.POST,headers = "Authorization") public ResponseEntity> registerBulkUser(@RequestBody String m_user) throws Exception { logger.info("M_user Request"+m_user.toString()); @@ -64,7 +63,6 @@ public ResponseEntity> registerBulkUser(@RequestBody String return ResponseEntity.ok(response); } - @CrossOrigin() @Operation(description = "Download formatted Excel sheet") @RequestMapping(value = {"/downloadExcelSheet"},method = {RequestMethod.GET},consumes = {"application/octet-stream"}) public ResponseEntity exportIntoExcelFile(){ diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index b961385..b4b1cfc 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -443,7 +443,6 @@ private Timestamp getTimestampValue(String dateString) { try { return new Timestamp(dateFormat.parse(dateString).getTime()); } catch (ParseException e) { - e.printStackTrace(); // return null; } } From 83f693ebb9bfb5be3f58631548e34ee7f70922f5 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 13 Mar 2025 11:30:50 +0530 Subject: [PATCH 03/61] Bulk registration --- .../BulkRegistrationController.java | 6 +- .../BulkRegistrationService.java | 2 +- .../BulkRegistrationServiceImpl.java | 131 +++--------------- 3 files changed, 20 insertions(+), 119 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index dde1937..24b146a 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -40,10 +40,10 @@ public class BulkRegistrationController { @RequestMapping(value = "/bulkRegistration",method = RequestMethod.POST,headers = "Authorization") - public ResponseEntity> registerBulkUser(@RequestBody String m_user) throws Exception { - logger.info("M_user Request"+m_user.toString()); + public ResponseEntity> registerBulkUser(@RequestBody String m_user,@RequestHeader String authorization) throws Exception { + logger.info("Bulk registration request received. Request payload is omitted from logs."); try { - bulkRegistrationService.registerBulkUser(m_user); + bulkRegistrationService.registerBulkUser(m_user,authorization); response.put("status","Success"); response.put("statusCode",200); response.put("totalUser",bulkRegistrationServiceimpl.totalEmployeeListSize); diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java index 55f42b7..2e5d0dd 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java @@ -1,5 +1,5 @@ package com.iemr.admin.service.bulkRegistration; public interface BulkRegistrationService { - void registerBulkUser(String user); + void registerBulkUser(String user,String authorization); } diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index b4b1cfc..c7c7e99 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -8,9 +8,8 @@ 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.CellType; -import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,9 +24,7 @@ import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException; import java.sql.Date; -import java.sql.Timestamp; import java.text.ParseException; -import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -43,6 +40,8 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { 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; @Autowired private EmployeeMasterInter employeeMasterInter; @@ -58,7 +57,6 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { public List errorLogs = new ArrayList<>(); public ArrayList m_bulkUser = new ArrayList<>(); - // public ArrayList m_bulkUser1 = new ArrayList<>(); public ArrayList m_UserDemographics = new ArrayList<>(); private List m_districts; @@ -69,33 +67,29 @@ public List getValidationError() { } - - @Override - public void registerBulkUser(String xml) { + public void registerBulkUser(String xml, String authorization) { try { EmployeeList employeeList = employeeXmlService.parseXml(xml); 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); + saveUserUser(employeeList.getEmployees().get(i), i, authorization); } } catch (Exception e) { - System.out.println(e.getMessage()); + logger.error("Exception:" + e.getMessage()); } } - private void saveUserUser(Employee employee, Integer row) throws Exception { + private void saveUserUser(Employee employee, Integer row, String authorization) throws Exception { logger.info("employee_list after for loop" + employee.toString()); - - if (employee.getTitle() == null || employee.getTitle().isEmpty() || getTitleId(employee.getTitle()) == 0) { validationErrors.add("Title is missing or invalid."); } @@ -136,15 +130,15 @@ private void saveUserUser(Employee employee, Integer row) throws Exception { if (getDistrictId(employee.getPermanentDistrict()) == 0) { validationErrors.add("Permanent District is invalid."); } - if(employee.getPincode()==null|| employee.getPincode().isEmpty()){ + if (employee.getPincode() == null || employee.getPincode().isEmpty()) { validationErrors.add("Pincode is invalid."); } - if(employee.getPermanentPincode()==null|| employee.getPermanentPincode().isEmpty()){ + if (employee.getPermanentPincode() == null || employee.getPermanentPincode().isEmpty()) { validationErrors.add("Permanent Pincode is invalid."); } - if(isValidPAN(employee.getPan())){ + if (!isValidPAN(employee.getPan())) { validationErrors.add("PAN is invalid."); } @@ -155,35 +149,6 @@ private void saveUserUser(Employee employee, Integer row) throws Exception { try { - 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()); - - M_User1 mUser = new M_User1(); M_UserDemographics mUserDemographics = new M_UserDemographics(); @@ -201,27 +166,23 @@ private void saveUserUser(Employee employee, Integer row) throws Exception { mUser.setMiddleName(employee.getMiddleName()); mUser.setAadhaarNo(String.valueOf(employee.getAadhaarNo())); mUser.setpAN(employee.getPan()); -// mUser.setMaritalStatusID(getMaritalStatusID(employee.getMaritalStatus())); mUser.setMaritalStatusID(1); mUser.setEmailID(employee.getEmail()); mUser.setGenderID(Short.parseShort(String.valueOf(getGenderId(employee.getGender())))); mUser.setQualificationID(getQualificationId(employee.getQualification())); mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); - mUser.setCreatedBy("PSMRIL2"); - mUser.setModifiedBy("PSMRIL2"); + mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); + mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); mUser.setIsSupervisor(false); mUser.setServiceProviderID(15); mUser.setPassword(generateStrongPassword("Test@123")); - logger.info("M_user" + mUser); M_User1 bulkUserID = employeeMasterInter.saveBulkUserEmployee(mUser); - System.out.println("bulk_userID" + bulkUserID.getUserID().toString()); - logger.info("M_user Id" + bulkUserID.getUserID()); mUserDemographics.setUserID(bulkUserID.getUserID()); mUserDemographics.setCountryID(91); mUserDemographics.setCommunityID(getCommunityId(employee.getCommunity())); mUserDemographics.setReligionID(getReligionStringId(employee.getReligion())); mUserDemographics.setFathersName(employee.getFatherName()); - mUserDemographics.setCreatedBy("PSMRIL2"); + mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); mUserDemographics.setAddressLine1(employee.getAddressLine1()); mUserDemographics.setPermAddressLine1(employee.getPermanentAddressLine1()); mUserDemographics.setPermStateID(getStateId(employee.getPermanentState())); @@ -240,15 +201,13 @@ private void saveUserUser(Employee employee, Integer row) throws Exception { m_UserDemographics.add(mUserDemographics); } catch (Exception e) { - errorLogs.add("Row : " + (row+1) + e.getMessage()); + errorLogs.add("Row : " + (row + 1) + e.getMessage()); } } - - public int getGenderId(String genderString) { int genderId = employeeMasterInter.getAllGender() .stream() @@ -267,8 +226,6 @@ public int getGenderId(String genderString) { } - - public int getTitleId(String titleString) { int titleId = employeeMasterInter.getAllTitle() .stream() @@ -282,7 +239,6 @@ public int getTitleId(String titleString) { } - public int getDesignationId(String designationString) { return 20; @@ -310,11 +266,9 @@ public int getQualificationId(String qualificationString) { .orElse(0); - return qualificationId; } - //Religion public int getReligionStringId(String religionString) { return employeeMasterInter.getAllReligion() @@ -359,10 +313,6 @@ public int getStateId(String stateName) { return stateId; } - - - - private boolean isValidPAN(String pan) { // Check if the PAN matches the regex return Pattern.matches(PAN_REGEX, pan); @@ -387,64 +337,15 @@ private Map getHeaderMap(Row headerRow) { return headerMap; } - private Integer getIntegerValue(Row row, Integer cellIndex) { - if (cellIndex == null) return null; - Cell cell = row.getCell(cellIndex); - return (cell != null && cell.getCellType() == CellType.NUMERIC) ? (int) cell.getNumericCellValue() : null; - } - - private Long getLongValue(Row row, Integer cellIndex) { - if (cellIndex == null) return null; - Cell cell = row.getCell(cellIndex); - return (cell != null && cell.getCellType() == CellType.NUMERIC) ? (long) cell.getNumericCellValue() : null; - } - - - private String getStringValue(Row row, Integer cellIndex) { - if (cellIndex == null || row.getCell(cellIndex) == null) return null; - Cell cell = row.getCell(cellIndex); - return (cell.getCellType() == CellType.STRING) ? cell.getStringCellValue().trim() : null; - } - - private void validateHeaders(Map headerMap, List requiredHeaders) { - for (String header : requiredHeaders) { - if (!headerMap.containsKey(header)) { - throw new RuntimeException("Missing required header: " + header); - } - } - } - - private Timestamp getTimestampValue(Row row, Integer cellIndex) { - if (cellIndex == null) return null; - Cell cell = row.getCell(cellIndex); - if (cell != null && cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) { - return new Timestamp(cell.getDateCellValue().getTime()); - } - return null; - } - public Date convertStringIntoDate(String dateString) throws ParseException { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - LocalDateTime dateTime = LocalDateTime.parse(dateString+" "+"00:00:00", formatter); + LocalDateTime dateTime = LocalDateTime.parse(dateString + " " + "00:00:00", formatter); // Convert String to Date - return Date.valueOf(String.valueOf(dateTime)); - - } - + return Date.valueOf(String.valueOf(dateTime)); - private Timestamp getTimestampValue(String dateString) { - if (dateString == null || dateString.trim().isEmpty()) { - } - - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // - try { - return new Timestamp(dateFormat.parse(dateString).getTime()); - } catch (ParseException e) { - return null; - } } From cdd7b2a1a0d0d7ca2c8977bc895abc9b46693639 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Mon, 31 Mar 2025 13:12:10 +0530 Subject: [PATCH 04/61] add userName and password in Bulk registration --- pom.xml | 13 +- .../BulkRegistrationController.java | 65 +- .../data/bulkuser/BulkRegistrationError.java | 12 + .../iemr/admin/data/bulkuser/Employee.java | 74 +- .../admin/data/employeemaster/M_Religion.java | 3 +- .../employeemaster/EmployeeMasterRepoo.java | 7 + .../BulkRegistrationServiceImpl.java | 707 ++++++++++++++---- .../employeemaster/EmployeeMasterInter.java | 3 + .../EmployeeMasterServiceImpl.java | 19 + .../utils/JwtUserIdValidationFilter.java | 187 ++--- 10 files changed, 787 insertions(+), 303 deletions(-) create mode 100644 src/main/java/com/iemr/admin/data/bulkuser/BulkRegistrationError.java diff --git a/pom.xml b/pom.xml index 13d9b28..5d04359 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ 1.2.0.Final 1.16.18 ${ENV_VAR} + target/classes/application.properties target/classes/admin_${environment}.properties @@ -77,6 +78,11 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.apache.commons + commons-compress + 1.21 + org.springframework.boot spring-boot-starter-web @@ -185,12 +191,7 @@ org.apache.poi poi-ooxml 5.2.3 - - - org.apache.commons - commons-compress - - + diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 24b146a..fafa4d2 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -6,6 +6,7 @@ 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.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -19,7 +20,6 @@ import java.util.Map; @RestController - public class BulkRegistrationController { @Autowired private EmployeeXmlService employeeXmlService; @@ -33,50 +33,59 @@ public class BulkRegistrationController { @Autowired private EmployeeMasterRepoo employeeMasterRepoo; - private Map errorResponse = new HashMap<>(); + private Map errorResponse = new HashMap<>(); @Autowired private LocationMasterServiceInter locationMasterServiceInter; - private Map response = new HashMap<>(); - + private Map response = new HashMap<>(); - @RequestMapping(value = "/bulkRegistration",method = RequestMethod.POST,headers = "Authorization") - public ResponseEntity> registerBulkUser(@RequestBody String m_user,@RequestHeader String authorization) throws Exception { - logger.info("Bulk registration request received. Request payload is omitted from logs."); + @CrossOrigin() + @PostMapping(value = "/bulkRegistration", headers = "Authorization") + public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization) { + bulkRegistrationServiceimpl.bulkRegistrationErrors.clear(); + logger.info("Bulk registration request received. Request payload is omitted from logs."); try { - bulkRegistrationService.registerBulkUser(m_user,authorization); - 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()); + bulkRegistrationService.registerBulkUser(m_user, authorization); + 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.validationErrors.clear(); + bulkRegistrationServiceimpl.totalEmployeeListSize=0; } catch (Exception e) { - response.put("status","Fail"); - response.put("statusCode",500); - throw new RuntimeException(e); + response.put("message", e.getMessage()); + response.put("statusCode", 500); + } return ResponseEntity.ok(response); } - @Operation(description = "Download formatted Excel sheet") - @RequestMapping(value = {"/downloadExcelSheet"},method = {RequestMethod.GET},consumes = {"application/octet-stream"}) - public ResponseEntity exportIntoExcelFile(){ - // Load the Excel file from resources - ClassPathResource excelFile = new ClassPathResource("xlsxfile/bulkuser_excel_sheet.xlsx"); + @CrossOrigin() + @GetMapping("/download-error-sheet") + public ResponseEntity downloadErrorSheet() { + try { + byte[] fileContent = bulkRegistrationServiceimpl.insertErrorLog(); + + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=error_log.xlsx"); - // Return the Excel file as a response with proper headers - return ResponseEntity.ok() - .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + excelFile.getFilename() + "\"") - .body(excelFile); - } + 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/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 index 74a1483..984060d 100644 --- a/src/main/java/com/iemr/admin/data/bulkuser/Employee.java +++ b/src/main/java/com/iemr/admin/data/bulkuser/Employee.java @@ -9,86 +9,94 @@ public class Employee { @JacksonXmlProperty(localName = "Title") - private String title; + private String title=""; @JacksonXmlProperty(localName = "FirstName") - private String firstName; + private String firstName=""; @JacksonXmlProperty(localName = "MiddleName") - private String middleName; + private String middleName=""; @JacksonXmlProperty(localName = "LastName") - private String lastName; + private String lastName=""; @JacksonXmlProperty(localName = "Gender") - private String gender; + private String gender=""; @JacksonXmlProperty(localName = "ContactNo") - private String contactNo; + private String contactNo=""; @JacksonXmlProperty(localName = "Designation") - private String designation; + private String designation=""; @JacksonXmlProperty(localName = "EmergencyContactNo") - private String emergencyContactNo; + private String emergencyContactNo=""; - @JacksonXmlProperty(localName = "DOB") - private String dob; + @JacksonXmlProperty(localName = "DateOfBirth") + private String dob=""; @JacksonXmlProperty(localName = "Age") - private int age; + private int age=0; @JacksonXmlProperty(localName = "Email") - private String email; + private String email=""; @JacksonXmlProperty(localName = "MaritalStatus") - private String maritalStatus; + private String maritalStatus=""; @JacksonXmlProperty(localName = "AadhaarNo") - private String aadhaarNo; + private String aadhaarNo=""; @JacksonXmlProperty(localName = "PAN") - private String pan; + private String pan=""; @JacksonXmlProperty(localName = "Qualification") - private String qualification; + private String qualification=""; @JacksonXmlProperty(localName = "FatherName") - private String fatherName; + private String fatherName=""; @JacksonXmlProperty(localName = "MotherName") - private String motherName; + private String motherName=""; @JacksonXmlProperty(localName = "Community") - private String community; + private String community=""; @JacksonXmlProperty(localName = "Religion") - private String religion; + private String religion=""; - @JacksonXmlProperty(localName = "AddressLine1") - private String addressLine1; + @JacksonXmlProperty(localName = "CurrentAddressLine1") + private String addressLine1=""; - @JacksonXmlProperty(localName = "State") - private String state; + @JacksonXmlProperty(localName = "CurrentState") + private String state=""; - @JacksonXmlProperty(localName = "District") - private String district; + @JacksonXmlProperty(localName = "CurrentDistrict") + private String district=""; - @JacksonXmlProperty(localName = "Pincode") - private String pincode; + @JacksonXmlProperty(localName = "CurrentPincode") + private String pincode=""; @JacksonXmlProperty(localName = "PermanentAddressLine1") - private String permanentAddressLine1; + private String permanentAddressLine1=""; @JacksonXmlProperty(localName = "PermanentState") - private String permanentState; + private String permanentState=""; @JacksonXmlProperty(localName = "PermanentDistrict") - private String permanentDistrict; + private String permanentDistrict=""; @JacksonXmlProperty(localName = "PermanentPincode") - private String permanentPincode; + private String permanentPincode=""; @JacksonXmlProperty(localName = "DateOfJoining") - private String 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/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/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/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index c7c7e99..56f9a26 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -1,36 +1,40 @@ 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.data.user.M_UserServiceRoleMapping; 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.http.ResponseEntity; import org.springframework.stereotype.Service; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; -import java.io.ByteArrayOutputStream; +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.text.ParseException; -import java.time.LocalDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.time.format.DateTimeParseException; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -42,6 +46,9 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { 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; @@ -50,31 +57,29 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { @Autowired private LocationMasterServiceInter locationMasterServiceInter; - ByteArrayOutputStream out; @Autowired EmployeeXmlService employeeXmlService; - public List validationErrors = new ArrayList<>(); - public List errorLogs = new ArrayList<>(); + public ArrayList errorLogs = new ArrayList<>(); public ArrayList m_bulkUser = new ArrayList<>(); public ArrayList m_UserDemographics = new ArrayList<>(); private List m_districts; - public List getValidationError() { - return validationErrors; - - } - - @Override public void registerBulkUser(String xml, String authorization) { try { EmployeeList employeeList = employeeXmlService.parseXml(xml); - 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); + 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); + + + } + } else { + errorLogs.add("Data is invalid or empty"); } @@ -88,127 +93,455 @@ public void registerBulkUser(String xml, String authorization) { private void saveUserUser(Employee employee, Integer row, String authorization) 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 (employee.getTitle() == null || employee.getTitle().isEmpty() || getTitleId(employee.getTitle()) == 0) { - validationErrors.add("Title is missing or invalid."); - } - if (employee.getFirstName() == null || employee.getFirstName().isEmpty()) { - validationErrors.add("First Name is missing."); - } - if (employee.getLastName() == null || employee.getLastName().isEmpty()) { - validationErrors.add("Last Name is missing."); - } - if (employee.getEmail() == null || !employee.getEmail().matches(EMAIL_REGEX)) { - validationErrors.add("Invalid Email format."); - } - if (!isValidPhoneNumber(String.valueOf(employee.getContactNo()))) { - validationErrors.add("Contact Number must be exactly 10 digits."); - } - if (!isValidPhoneNumber(String.valueOf(employee.getEmergencyContactNo()))) { - validationErrors.add("Emergency Contact Number must be exactly 10 digits."); - } - if (!String.valueOf(employee.getAge()).matches("\\d{1,2}")) { - validationErrors.add("Age should be a 1 or 2-digit number."); - } - if (employee.getDob() == null || employee.getDob().toString().isEmpty()) { - validationErrors.add("Date of Birth is invalid."); - } - if (employee.getDateOfJoining() == null || employee.getDateOfJoining().toString().isEmpty()) { - validationErrors.add("Date of Joining is invalid."); - } - if (getStateId(employee.getState()) == 0) { - validationErrors.add("State is invalid."); - } - if (getDistrictId(employee.getDistrict()) == 0) { - validationErrors.add("District is invalid."); - } + } + if(isValidAadhar(employee.getAadhaarNo())){ + validationErrors.add("Aadhaar number is invalid"); + + } + } - if (getStateId(employee.getPermanentState()) == 0) { - validationErrors.add("Permanent State is invalid."); - } - if (getDistrictId(employee.getPermanentDistrict()) == 0) { - validationErrors.add("Permanent District is invalid."); - } - if (employee.getPincode() == null || employee.getPincode().isEmpty()) { - validationErrors.add("Pincode is invalid."); - } - if (employee.getPermanentPincode() == null || employee.getPermanentPincode().isEmpty()) { - validationErrors.add("Permanent Pincode is invalid."); + if (employee.getQualification().isEmpty()) { + validationErrors.add("Qualification is missing"); - } - if (!isValidPAN(employee.getPan())) { - validationErrors.add("PAN is invalid."); + } + + 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.getUserName()); + mUser.setdOB(convertStringIntoDate(employee.getDob())); + mUser.setEmployeeID(employee.getContactNo()); + 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())))); + mUser.setQualificationID(4); + if (!employee.getQualification().isEmpty()) { + mUser.setQualificationID(getQualificationId(employee.getQualification())); + + } + mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); + //mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); + mUser.setCreatedBy("Psmril2"); + //mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); + mUser.setModifiedBy("Psmril2"); + mUser.setStatusID(1); + mUser.setIsSupervisor(false); + mUser.setServiceProviderID(15); + 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("Psmril2"); + m_userServiceRoleMapping.setRoleID(133); + m_userServiceRoleMapping.setProviderServiceMapID(1); + //m_userServiceRoleMapping.setWorkingLocationID(117); + m_userServiceRoleMapping.setIsSanjeevani(false); + m_userServiceRoleMapping.setBlockName("Biswanath"); + String[] villageName = {"Bagijuli"}; + m_userServiceRoleMapping.setVillageName(villageName); + String[] villageID = {"25460"}; + m_userServiceRoleMapping.setVillageID(villageID); + m_userServiceRoleMapping.setBlockID(920); + + 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.setReligionID(1); +// mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); + mUserDemographics.setCreatedBy("Psmril2"); + // 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_); - } - if (!validationErrors.isEmpty()) { - errorLogs.add("Row " + (row + 1) + ": " + String.join(", ", validationErrors)); + } } + } + /** + * Validate employee details. + */ + + + private boolean isValidDate(String dateStr) { try { + String[] parts = dateStr.split("-"); + int year = Integer.parseInt(parts[0]); - M_User1 mUser = new M_User1(); - M_UserDemographics mUserDemographics = new M_UserDemographics(); - - mUser.setTitleID(getTitleId(employee.getTitle())); - mUser.setDesignationID(getDesignationId(employee.getDesignation())); - mUser.setDesignationName("ASHA"); - mUser.setFirstName(employee.getFirstName()); - mUser.setLastName(employee.getLastName()); - mUser.setUserName(employee.getContactNo()); - mUser.setdOB(convertStringIntoDate(employee.getDob())); - mUser.setEmployeeID(employee.getContactNo()); - mUser.setEmergencyContactNo(String.valueOf(employee.getEmergencyContactNo())); - mUser.setContactNo(String.valueOf(employee.getContactNo())); - mUser.setMiddleName(employee.getMiddleName()); - mUser.setAadhaarNo(String.valueOf(employee.getAadhaarNo())); - mUser.setpAN(employee.getPan()); - mUser.setMaritalStatusID(1); - mUser.setEmailID(employee.getEmail()); - mUser.setGenderID(Short.parseShort(String.valueOf(getGenderId(employee.getGender())))); - mUser.setQualificationID(getQualificationId(employee.getQualification())); - mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); - mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); - mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); - mUser.setIsSupervisor(false); - mUser.setServiceProviderID(15); - mUser.setPassword(generateStrongPassword("Test@123")); - M_User1 bulkUserID = employeeMasterInter.saveBulkUserEmployee(mUser); - mUserDemographics.setUserID(bulkUserID.getUserID()); - mUserDemographics.setCountryID(91); - mUserDemographics.setCommunityID(getCommunityId(employee.getCommunity())); - mUserDemographics.setReligionID(getReligionStringId(employee.getReligion())); - mUserDemographics.setFathersName(employee.getFatherName()); - mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); - mUserDemographics.setAddressLine1(employee.getAddressLine1()); - mUserDemographics.setPermAddressLine1(employee.getPermanentAddressLine1()); - mUserDemographics.setPermStateID(getStateId(employee.getPermanentState())); - mUserDemographics.setPermDistrictID(getDistrictId(employee.getPermanentDistrict())); - mUserDemographics.setIsPermanent(false); - mUserDemographics.setPermPinCode(Integer.valueOf(employee.getPermanentPincode())); - mUserDemographics.setMothersName(employee.getMotherName()); - mUserDemographics.setAddressLine1(employee.getPermanentAddressLine1()); - mUserDemographics.setStateID(getStateId(employee.getState())); - mUserDemographics.setIsPresent(false); - mUserDemographics.setStateID(getStateId(employee.getState())); - mUserDemographics.setDistrictID(getDistrictId(employee.getDistrict())); - mUserDemographics.setPinCode(employee.getPincode().toString()); - employeeMasterInter.saveDemography(mUserDemographics); - m_bulkUser.add(mUser); - m_UserDemographics.add(mUserDemographics); + 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) { - errorLogs.add("Row : " + (row + 1) + e.getMessage()); + 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())); + + } - public int getGenderId(String genderString) { + + private int getGenderId(String genderString) { int genderId = employeeMasterInter.getAllGender() .stream() .filter(gender -> gender.getGenderName().equalsIgnoreCase(genderString)) @@ -225,14 +558,36 @@ public int getGenderId(String genderString) { return genderId; } + public static boolean isNumeric(String str) { + try { + Integer.parseInt(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + - public int getTitleId(String titleString) { - int titleId = employeeMasterInter.getAllTitle() - .stream() - .filter(title -> title.getTitleName().equalsIgnoreCase(titleString)) - .map(M_Title::getTitleID) - .findFirst() - .orElse(0); + 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; @@ -260,7 +615,7 @@ public int getCommunityId(String communityString) { public int getQualificationId(String qualificationString) { int qualificationId = employeeMasterInter.getQualification() .stream() - .filter(q -> q.getUserQualificationDesc().equalsIgnoreCase(qualificationString)) + .filter(q -> q.getName().equalsIgnoreCase(qualificationString)) .map(M_Userqualification::getQualificationID) .findFirst() .orElse(0); @@ -271,21 +626,30 @@ public int getQualificationId(String qualificationString) { //Religion public int getReligionStringId(String religionString) { - return employeeMasterInter.getAllReligion() - .stream() - .filter(religion -> religion.getReligionType().equalsIgnoreCase(religionString)) - .map(M_Religion::getReligionID) - .findFirst() - .orElse(0); + 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) { - return m_districts.stream() - .filter(m_district -> m_district.getDistrictName().equalsIgnoreCase(districtName)) - .map(M_District::getDistrictID) - .findFirst() - .orElse(0); + 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; + } + } @@ -338,13 +702,16 @@ private Map getHeaderMap(Row headerRow) { } - public Date convertStringIntoDate(String dateString) throws ParseException { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - LocalDateTime dateTime = LocalDateTime.parse(dateString + " " + "00:00:00", formatter); + 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); - // Convert String to Date - return Date.valueOf(String.valueOf(dateTime)); } @@ -378,5 +745,57 @@ private String toHex(byte[] array) throws NoSuchAlgorithmException { 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/employeemaster/EmployeeMasterInter.java b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java index d91d8c7..3378667 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java @@ -110,6 +110,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); 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 28d5072..a0f1762 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java @@ -638,6 +638,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) { diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 7fe71e4..b9cb53c 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -18,94 +18,101 @@ @Component public class JwtUserIdValidationFilter implements Filter { - private final JwtAuthenticationUtil jwtAuthenticationUtil; - private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); - - public JwtUserIdValidationFilter(JwtAuthenticationUtil jwtAuthenticationUtil) { - this.jwtAuthenticationUtil = jwtAuthenticationUtil; - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - HttpServletRequest request = (HttpServletRequest) servletRequest; - HttpServletResponse response = (HttpServletResponse) servletResponse; - - String path = request.getRequestURI(); - String contextPath = request.getContextPath(); - logger.info("JwtUserIdValidationFilter invoked for path: " + path); - - // Log cookies for debugging - Cookie[] cookies = request.getCookies(); - if (cookies != null) { - for (Cookie cookie : cookies) { - if ("userId".equals(cookie.getName())) { - logger.warn("userId found in cookies! Clearing it..."); - clearUserIdCookie(response); // Explicitly remove userId cookie - } - } - } else { - logger.info("No cookies found in the request"); - } - - // Log headers for debugging - String jwtTokenFromHeader = request.getHeader("Jwttoken"); - logger.info("JWT token from header: "); - - // Skip login and public endpoints - if (path.equals(contextPath + "/user/userAuthenticate") - || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") - || path.startsWith(contextPath + "/public")) { - logger.info("Skipping filter for path: " + path); - filterChain.doFilter(servletRequest, servletResponse); - return; - } - - try { - // Retrieve JWT token from cookies - String jwtTokenFromCookie = getJwtTokenFromCookies(request); - logger.info("JWT token from cookie: "); - - // Determine which token (cookie or header) to validate - String jwtToken = jwtTokenFromCookie != null ? jwtTokenFromCookie : jwtTokenFromHeader; - if (jwtToken == null) { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "JWT token not found in cookies or headers"); - return; - } - - // Validate JWT token and userId - boolean isValid = jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtToken); - - if (isValid) { - // If token is valid, allow the request to proceed - filterChain.doFilter(servletRequest, servletResponse); - } else { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid JWT token"); - } - } catch (Exception e) { - logger.error("Authorization error: ", e); - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization error: "); - } - } - - private String getJwtTokenFromCookies(HttpServletRequest request) { - Cookie[] cookies = request.getCookies(); - if (cookies != null) { - for (Cookie cookie : cookies) { - if (cookie.getName().equals("Jwttoken")) { - return cookie.getValue(); - } - } - } - return null; - } - - private void clearUserIdCookie(HttpServletResponse response) { - Cookie cookie = new Cookie("userId", null); - cookie.setPath("/"); - cookie.setHttpOnly(true); - cookie.setSecure(true); - cookie.setMaxAge(0); // Invalidate the cookie - response.addCookie(cookie); - } + private final JwtAuthenticationUtil jwtAuthenticationUtil; + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + public JwtUserIdValidationFilter(JwtAuthenticationUtil jwtAuthenticationUtil) { + this.jwtAuthenticationUtil = jwtAuthenticationUtil; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + + String path = request.getRequestURI(); + String contextPath = request.getContextPath(); + logger.info("JwtUserIdValidationFilter invoked for path: " + path); + + + // Log cookies for debugging + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if ("userId".equals(cookie.getName())) { + logger.warn("userId found in cookies! Clearing it..."); + clearUserIdCookie(response); // Explicitly remove userId cookie + } + } + } else { + logger.info("No cookies found in the request"); + } + + // Log headers for debugging + String jwtTokenFromHeader = request.getHeader("Jwttoken"); + logger.info("JWT token from header: "); + + // Skip login and public endpoints + if (path.equals(contextPath + "/user/userAuthenticate") + || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") + || path.startsWith(contextPath + "/public") || + path.startsWith(contextPath + "/swagger") || + path.startsWith(contextPath + "/bulkRegistration") || + path.startsWith(contextPath + "/download-error-sheet") || + path.startsWith(contextPath + "/v3/api-docs") || + path.startsWith(contextPath + "/swagger-ui") || + path.startsWith(contextPath + "/swagger-resources")) { + logger.info("Skipping filter for path: " + path); + filterChain.doFilter(servletRequest, servletResponse); + return; + } + + try { + // Retrieve JWT token from cookies + String jwtTokenFromCookie = getJwtTokenFromCookies(request); + logger.info("JWT token from cookie: "); + + // Determine which token (cookie or header) to validate + String jwtToken = jwtTokenFromCookie != null ? jwtTokenFromCookie : jwtTokenFromHeader; + if (jwtToken == null) { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "JWT token not found in cookies or headers"); + return; + } + + // Validate JWT token and userId + boolean isValid = jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtToken); + + if (isValid) { + // If token is valid, allow the request to proceed + filterChain.doFilter(servletRequest, servletResponse); + } else { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid JWT token"); + } + } catch (Exception e) { + logger.error("Authorization error: ", e); + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization error: "); + } + } + + private String getJwtTokenFromCookies(HttpServletRequest request) { + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals("Jwttoken")) { + return cookie.getValue(); + } + } + } + return null; + } + + private void clearUserIdCookie(HttpServletResponse response) { + Cookie cookie = new Cookie("userId", null); + cookie.setPath("/"); + cookie.setHttpOnly(true); + cookie.setSecure(true); + cookie.setMaxAge(0); // Invalidate the cookie + response.addCookie(cookie); + } } From 128c8f91fbbf124c503146dc674ad9efe6049f7b Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 19 Jun 2025 12:05:53 +0530 Subject: [PATCH 05/61] add userName and password in Bulk registration --- .../controller/bulkRegistration/BulkRegistrationController.java | 1 + .../service/bulkRegistration/BulkRegistrationServiceImpl.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index fafa4d2..2f46481 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -16,6 +16,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 56f9a26..007559d 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -86,6 +86,8 @@ public void registerBulkUser(String xml, String authorization) { } catch (Exception e) { logger.error("Exception:" + e.getMessage()); + errorLogs.add("Data is invalid or empty"); + } From 5cd719df6abd3411dd071306c62accc59fe377ab Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 19 Jun 2025 19:56:59 +0530 Subject: [PATCH 06/61] remove unwanted line --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5b69d7a..622c745 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,6 @@ 1.2.0.Final 1.16.18 ${ENV_VAR} - target/classes/application.properties target/classes/admin_${environment}.properties From 110fa5907b2b08fe96afeacef6901597746b1cda Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Sat, 21 Jun 2025 11:03:29 +0530 Subject: [PATCH 07/61] fix code --- .../service/bulkRegistration/BulkRegistrationServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 007559d..2a69870 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -351,7 +351,6 @@ private void saveUserUser(Employee employee, Integer row, String authorization) m_userServiceRoleMapping.setRoleID(133); m_userServiceRoleMapping.setProviderServiceMapID(1); //m_userServiceRoleMapping.setWorkingLocationID(117); - m_userServiceRoleMapping.setIsSanjeevani(false); m_userServiceRoleMapping.setBlockName("Biswanath"); String[] villageName = {"Bagijuli"}; m_userServiceRoleMapping.setVillageName(villageName); From b1a893f823fed71a18ce01d1346929e19850ac33 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 21 Aug 2025 20:36:03 +0530 Subject: [PATCH 08/61] fix code --- pom.xml | 6 +++--- .../bulkRegistration/BulkRegistrationServiceImpl.java | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 622c745..c74cc29 100644 --- a/pom.xml +++ b/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.iemr.admin - admin-api - 3.1.0 + adminapi + v3.1.0 war Admin-API Admin Page @@ -279,7 +279,7 @@ - ${artifactId}-${version} + adminapi-v3.0.0 org.owasp diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 2a69870..4d9e105 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -69,6 +69,8 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { @Override public void registerBulkUser(String xml, String authorization) { try { + xml = escapeXmlSpecialChars(xml); + EmployeeList employeeList = employeeXmlService.parseXml(xml); if (!employeeList.getEmployees().isEmpty()) { logger.info("employee_list" + employeeList.getEmployees().toString()); @@ -92,6 +94,10 @@ public void registerBulkUser(String xml, String authorization) { } + 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) throws Exception { From b67332f64cbe4aed62e29c370ed4d2b8dd60210c Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 21 Aug 2025 21:26:57 +0530 Subject: [PATCH 09/61] fix code --- src/main/resources/application.properties | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e65d5b3..007cdc5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -74,3 +74,33 @@ swymed-edituser-url=swymed-base-url/SwymedWebApi/api/Contact calibrationPageSize=5 biological-screening-device-url=http://localhost:8096/ezdx-hub-connect-srv + + +server.port=8082 +# local env +# DB Connections +spring.datasource.url=jdbc:mysql://devbox.bizbrolly.com:3306/db_iemr +spring.datasource.username=root +spring.datasource.password=BizDev@24BB +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +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 + +jwt.secret=my-32-character-ultra-secure-and-ultra-long-secret + +cors.allowed-origins=http://devbox.bizbrolly.com:*,http://localhost:* +cors.allowed-origin=http://devbox.bizbrolly.com:*,http://localhost:* From bdde896c7852853387f0b8bc5de4c2521d09e2f2 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 21 Aug 2025 21:33:20 +0530 Subject: [PATCH 10/61] fix code --- src/main/environment/admin_example.properties | 2 +- src/main/resources/application.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/environment/admin_example.properties b/src/main/environment/admin_example.properties index f510b42..d24ad85 100644 --- a/src/main/environment/admin_example.properties +++ b/src/main/environment/admin_example.properties @@ -25,4 +25,4 @@ logging.file.name=logs/admin-api.log jwt.secret=my-32-character-ultra-secure-and-ultra-long-secret -cors.allowed-origins=http://localhost:* +cors.allowed-origin=http://devbox.bizbrolly.com:*,http://localhost:* diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 007cdc5..dab7a6e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -103,4 +103,4 @@ logging.file.name=logs/admin-api.log jwt.secret=my-32-character-ultra-secure-and-ultra-long-secret cors.allowed-origins=http://devbox.bizbrolly.com:*,http://localhost:* -cors.allowed-origin=http://devbox.bizbrolly.com:*,http://localhost:* +cors.allowed-origin=http://devbox.bizbrolly.com:4901,http://localhost:* From 5315e05257632f394a86b0ee2a28d6c24e0bd03d Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 21 Aug 2025 21:38:12 +0530 Subject: [PATCH 11/61] fix code --- src/main/java/com/iemr/admin/config/CorsConfig.java | 2 +- .../bulkRegistration/BulkRegistrationController.java | 4 +--- src/main/java/com/iemr/admin/utils/FilterConfig.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/iemr/admin/config/CorsConfig.java b/src/main/java/com/iemr/admin/config/CorsConfig.java index f43d8ef..728ce29 100644 --- a/src/main/java/com/iemr/admin/config/CorsConfig.java +++ b/src/main/java/com/iemr/admin/config/CorsConfig.java @@ -9,7 +9,7 @@ @Configuration public class CorsConfig implements WebMvcConfigurer { - @Value("${cors.allowed-origins}") + @Value("${cors.allowed-origin}") private String allowedOrigins; @Override diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 2f46481..700a767 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -39,7 +39,6 @@ public class BulkRegistrationController { private LocationMasterServiceInter locationMasterServiceInter; private Map response = new HashMap<>(); - @CrossOrigin() @PostMapping(value = "/bulkRegistration", headers = "Authorization") public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization) { bulkRegistrationServiceimpl.bulkRegistrationErrors.clear(); @@ -66,8 +65,7 @@ public ResponseEntity> registerBulkUser(@RequestBody String } - @CrossOrigin() - @GetMapping("/download-error-sheet") + @GetMapping(value = "/download-error-sheet", headers = "Authorization") public ResponseEntity downloadErrorSheet() { try { byte[] fileContent = bulkRegistrationServiceimpl.insertErrorLog(); diff --git a/src/main/java/com/iemr/admin/utils/FilterConfig.java b/src/main/java/com/iemr/admin/utils/FilterConfig.java index 9c92095..b51f29d 100644 --- a/src/main/java/com/iemr/admin/utils/FilterConfig.java +++ b/src/main/java/com/iemr/admin/utils/FilterConfig.java @@ -9,7 +9,7 @@ @Configuration public class FilterConfig { - @Value("${cors.allowed-origins}") + @Value("${cors.allowed-origin}") private String allowedOrigins; @Bean From 486d412559c4daa4833ee7f61fa981ad1cd26db1 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 21 Aug 2025 21:43:05 +0530 Subject: [PATCH 12/61] fix code --- .../java/com/iemr/admin/utils/JwtUserIdValidationFilter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 64c89a9..a571609 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -76,6 +76,8 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo if (path.equals(contextPath + "/user/userAuthenticate") || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") || path.startsWith(contextPath + "/swagger-ui") + || path.startsWith(contextPath + "/bulkRegistration") + || path.startsWith(contextPath + "/download-error-sheet") || path.startsWith(contextPath + "/v3/api-docs") || path.startsWith(contextPath + "/user/refreshToken") || path.startsWith(contextPath + "/public")) { From 4e5dab6bcd83ec9e855179a2c1fa49d80c2d6804 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 21 Aug 2025 21:57:58 +0530 Subject: [PATCH 13/61] fix code --- .../BulkRegistrationServiceImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 4d9e105..6eb2388 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -340,10 +340,10 @@ private void saveUserUser(Employee employee, Integer row, String authorization) } mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); - //mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); - mUser.setCreatedBy("Psmril2"); - //mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); - mUser.setModifiedBy("Psmril2"); + mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); +// mUser.setCreatedBy("Psmril2"); + mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); +// mUser.setModifiedBy("Psmril2"); mUser.setStatusID(1); mUser.setIsSupervisor(false); mUser.setServiceProviderID(15); @@ -353,10 +353,10 @@ private void saveUserUser(Employee employee, Integer row, String authorization) logger.info("BulkUser:" + bulkUserID); m_userServiceRoleMapping.setUserID(bulkUserID.getUserID()); m_userServiceRoleMapping.setServiceProviderID(bulkUserID.getServiceProviderID()); - m_userServiceRoleMapping.setCreatedBy("Psmril2"); - m_userServiceRoleMapping.setRoleID(133); + m_userServiceRoleMapping.setCreatedBy(jwtUtil.extractUsername(authorization)); + m_userServiceRoleMapping.setRoleID(122); m_userServiceRoleMapping.setProviderServiceMapID(1); - //m_userServiceRoleMapping.setWorkingLocationID(117); +// m_userServiceRoleMapping.setWorkingLocationID(117); m_userServiceRoleMapping.setBlockName("Biswanath"); String[] villageName = {"Bagijuli"}; m_userServiceRoleMapping.setVillageName(villageName); From cd7f5678e2258f70707a47323d8600d29a065bb2 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 21 Aug 2025 22:05:29 +0530 Subject: [PATCH 14/61] fix code --- .../bulkRegistration/BulkRegistrationServiceImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 6eb2388..c7e0cb0 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -340,10 +340,10 @@ private void saveUserUser(Employee employee, Integer row, String authorization) } mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); - mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); -// mUser.setCreatedBy("Psmril2"); - mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); -// mUser.setModifiedBy("Psmril2"); + //mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); + mUser.setCreatedBy("Psmril2"); + //mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); + mUser.setModifiedBy("Psmril2"); mUser.setStatusID(1); mUser.setIsSupervisor(false); mUser.setServiceProviderID(15); @@ -353,7 +353,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization) logger.info("BulkUser:" + bulkUserID); m_userServiceRoleMapping.setUserID(bulkUserID.getUserID()); m_userServiceRoleMapping.setServiceProviderID(bulkUserID.getServiceProviderID()); - m_userServiceRoleMapping.setCreatedBy(jwtUtil.extractUsername(authorization)); + m_userServiceRoleMapping.setCreatedBy("Psmril2"); m_userServiceRoleMapping.setRoleID(122); m_userServiceRoleMapping.setProviderServiceMapID(1); // m_userServiceRoleMapping.setWorkingLocationID(117); From f06d0776813d97c84b5bb6c53cf5cb604066ba41 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 28 Aug 2025 10:47:10 +0530 Subject: [PATCH 15/61] fix code --- .../BulkRegistrationServiceImpl.java | 12 +++++------- .../iemr/admin/utils/JwtUserIdValidationFilter.java | 2 -- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index c7e0cb0..6630aef 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -340,10 +340,8 @@ private void saveUserUser(Employee employee, Integer row, String authorization) } mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); - //mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); - mUser.setCreatedBy("Psmril2"); - //mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); - mUser.setModifiedBy("Psmril2"); + mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); + mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); mUser.setStatusID(1); mUser.setIsSupervisor(false); mUser.setServiceProviderID(15); @@ -353,7 +351,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization) logger.info("BulkUser:" + bulkUserID); m_userServiceRoleMapping.setUserID(bulkUserID.getUserID()); m_userServiceRoleMapping.setServiceProviderID(bulkUserID.getServiceProviderID()); - m_userServiceRoleMapping.setCreatedBy("Psmril2"); + m_userServiceRoleMapping.setCreatedBy(jwtUtil.extractUsername(authorization)); m_userServiceRoleMapping.setRoleID(122); m_userServiceRoleMapping.setProviderServiceMapID(1); // m_userServiceRoleMapping.setWorkingLocationID(117); @@ -375,8 +373,8 @@ private void saveUserUser(Employee employee, Integer row, String authorization) } // mUserDemographics.setReligionID(1); -// mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); - mUserDemographics.setCreatedBy("Psmril2"); + mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); +// mUserDemographics.setCreatedBy("Psmril2"); // Permanent Address if (!employee.getPermanentAddressLine1().isEmpty()) { mUserDemographics.setPermAddressLine1(employee.getPermanentAddressLine1()); diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index a571609..64c89a9 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -76,8 +76,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo if (path.equals(contextPath + "/user/userAuthenticate") || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") || path.startsWith(contextPath + "/swagger-ui") - || path.startsWith(contextPath + "/bulkRegistration") - || path.startsWith(contextPath + "/download-error-sheet") || path.startsWith(contextPath + "/v3/api-docs") || path.startsWith(contextPath + "/user/refreshToken") || path.startsWith(contextPath + "/public")) { From 84b679af82098d8e87d9351da3b556e45713d844 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 28 Aug 2025 16:42:03 +0530 Subject: [PATCH 16/61] fix code --- src/main/environment/admin_example.properties | 2 +- src/main/java/com/iemr/admin/config/CorsConfig.java | 2 +- src/main/java/com/iemr/admin/utils/FilterConfig.java | 2 +- src/main/resources/application.properties | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/environment/admin_example.properties b/src/main/environment/admin_example.properties index d24ad85..f510b42 100644 --- a/src/main/environment/admin_example.properties +++ b/src/main/environment/admin_example.properties @@ -25,4 +25,4 @@ logging.file.name=logs/admin-api.log jwt.secret=my-32-character-ultra-secure-and-ultra-long-secret -cors.allowed-origin=http://devbox.bizbrolly.com:*,http://localhost:* +cors.allowed-origins=http://localhost:* diff --git a/src/main/java/com/iemr/admin/config/CorsConfig.java b/src/main/java/com/iemr/admin/config/CorsConfig.java index 728ce29..f43d8ef 100644 --- a/src/main/java/com/iemr/admin/config/CorsConfig.java +++ b/src/main/java/com/iemr/admin/config/CorsConfig.java @@ -9,7 +9,7 @@ @Configuration public class CorsConfig implements WebMvcConfigurer { - @Value("${cors.allowed-origin}") + @Value("${cors.allowed-origins}") private String allowedOrigins; @Override diff --git a/src/main/java/com/iemr/admin/utils/FilterConfig.java b/src/main/java/com/iemr/admin/utils/FilterConfig.java index b51f29d..9c92095 100644 --- a/src/main/java/com/iemr/admin/utils/FilterConfig.java +++ b/src/main/java/com/iemr/admin/utils/FilterConfig.java @@ -9,7 +9,7 @@ @Configuration public class FilterConfig { - @Value("${cors.allowed-origin}") + @Value("${cors.allowed-origins}") private String allowedOrigins; @Bean diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index dab7a6e..34fc0b5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -102,5 +102,4 @@ logging.file.name=logs/admin-api.log jwt.secret=my-32-character-ultra-secure-and-ultra-long-secret -cors.allowed-origins=http://devbox.bizbrolly.com:*,http://localhost:* -cors.allowed-origin=http://devbox.bizbrolly.com:4901,http://localhost:* +cors.allowed-origins=http://localhost:* From 7b123e922e5bab3ae48f4ce4bdcf2a9c9e382fa2 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 28 Aug 2025 16:44:24 +0530 Subject: [PATCH 17/61] fix code --- src/main/environment/admin_example.properties | 4 ++-- src/main/resources/application.properties | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/environment/admin_example.properties b/src/main/environment/admin_example.properties index f510b42..b86b64d 100644 --- a/src/main/environment/admin_example.properties +++ b/src/main/environment/admin_example.properties @@ -2,8 +2,8 @@ server.port=8082 # local env # DB Connections spring.datasource.url=jdbc:mysql://localhost:3306/db_iemr -spring.datasource.username=root -spring.datasource.password=1234 +spring.datasource.username= +spring.datasource.password= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver callcentre-server-ip=10.208.122.99 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 34fc0b5..5acdbbc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -79,9 +79,9 @@ biological-screening-device-url=http://localhost:8096/ezdx-hub-connect-srv server.port=8082 # local env # DB Connections -spring.datasource.url=jdbc:mysql://devbox.bizbrolly.com:3306/db_iemr -spring.datasource.username=root -spring.datasource.password=BizDev@24BB +spring.datasource.url=jdbc:mysql://localhost:3306/db_iemr +spring.datasource.username= +spring.datasource.password= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver callcentre-server-ip=10.208.122.99 From a28294f23fa9e898487c76cccc1818dc1c218a35 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 28 Aug 2025 16:45:27 +0530 Subject: [PATCH 18/61] fix code --- src/main/environment/admin_example.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/environment/admin_example.properties b/src/main/environment/admin_example.properties index b86b64d..f510b42 100644 --- a/src/main/environment/admin_example.properties +++ b/src/main/environment/admin_example.properties @@ -2,8 +2,8 @@ server.port=8082 # local env # DB Connections spring.datasource.url=jdbc:mysql://localhost:3306/db_iemr -spring.datasource.username= -spring.datasource.password= +spring.datasource.username=root +spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver callcentre-server-ip=10.208.122.99 From 093ba26f0795f40810518bf0e12b55d8ebfd4154 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 28 Aug 2025 16:46:30 +0530 Subject: [PATCH 19/61] fix code --- src/main/resources/application.properties | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5acdbbc..70d7045 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -75,15 +75,6 @@ swymed-edituser-url=swymed-base-url/SwymedWebApi/api/Contact calibrationPageSize=5 biological-screening-device-url=http://localhost:8096/ezdx-hub-connect-srv - -server.port=8082 -# local env -# DB Connections -spring.datasource.url=jdbc:mysql://localhost:3306/db_iemr -spring.datasource.username= -spring.datasource.password= -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - callcentre-server-ip=10.208.122.99 videoConsultation-apikey= From 8820fe2be0b8cbcd8b8f1dd794695e6b529b8b47 Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Tue, 2 Sep 2025 11:42:23 +0530 Subject: [PATCH 20/61] Httpheader content disposition changed --- .../EmployeeSignatureController.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) 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..1d5b039 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -21,6 +21,8 @@ */ package com.iemr.admin.controller.employeemaster; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.Base64; import org.slf4j.Logger; @@ -30,8 +32,9 @@ import org.springframework.http.HttpHeaders; 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; @@ -39,7 +42,6 @@ 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; @@ -54,12 +56,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,21 +83,22 @@ 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()); + String fileName = URLEncoder.encode(userSignID.getFileName(), StandardCharsets.UTF_8); + responseHeaders.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\""); + responseHeaders.set("filename", fileName); + + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(userSignID.getFileType())) // or MediaType.APPLICATION_PDF + .headers(responseHeaders) + .body(userSignID.getSignature()); } catch (Exception e) { logger.error("Unexpected error:", e); From 2aab70ebdc0a070340416e903383c21739a10c3f Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Tue, 2 Sep 2025 12:05:37 +0530 Subject: [PATCH 21/61] Coderabbitai comments adrressed --- .../EmployeeSignatureController.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) 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 1d5b039..dcf7868 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -21,7 +21,6 @@ */ package com.iemr.admin.controller.employeemaster; -import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -29,7 +28,9 @@ 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; @@ -91,14 +92,19 @@ public ResponseEntity fetchFile(@PathVariable("userID") Long userID) thr EmployeeSignature userSignID = employeeSignatureServiceImpl.fetchSignature(userID); HttpHeaders responseHeaders = new HttpHeaders(); - String fileName = URLEncoder.encode(userSignID.getFileName(), StandardCharsets.UTF_8); - responseHeaders.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\""); - responseHeaders.set("filename", fileName); - - return ResponseEntity.ok() - .contentType(MediaType.parseMediaType(userSignID.getFileType())) // or MediaType.APPLICATION_PDF - .headers(responseHeaders) - .body(userSignID.getSignature()); + ContentDisposition contentDisposition = ContentDisposition.attachment() + .filename(userSignID.getFileName(), StandardCharsets.UTF_8).build(); + responseHeaders.setContentDisposition(contentDisposition); + + MediaType mediaType; + try { + mediaType = MediaType.parseMediaType(userSignID.getFileType()); + } catch (InvalidMediaTypeException | NullPointerException ex) { + mediaType = MediaType.APPLICATION_OCTET_STREAM; + } + + return ResponseEntity.ok().contentType(mediaType).headers(responseHeaders) + .contentLength(userSignID.getSignature().length).body(userSignID.getSignature()); } catch (Exception e) { logger.error("Unexpected error:", e); From 20eaaed3ac31eb6df053aa6bdc3ab32944abb3b8 Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Tue, 2 Sep 2025 13:19:24 +0530 Subject: [PATCH 22/61] Httpheader content disposition changed (#100) * Httpheader content disposition changed * Coderabbitai comments adrressed --- .../EmployeeSignatureController.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) 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..dcf7868 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -21,17 +21,21 @@ */ package com.iemr.admin.controller.employeemaster; +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; @@ -39,7 +43,6 @@ 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; @@ -54,12 +57,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,21 +84,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 contentDisposition = ContentDisposition.attachment() + .filename(userSignID.getFileName(), StandardCharsets.UTF_8).build(); + responseHeaders.setContentDisposition(contentDisposition); + + MediaType mediaType; + try { + mediaType = MediaType.parseMediaType(userSignID.getFileType()); + } catch (InvalidMediaTypeException | NullPointerException ex) { + mediaType = MediaType.APPLICATION_OCTET_STREAM; + } + + return ResponseEntity.ok().contentType(mediaType).headers(responseHeaders) + .contentLength(userSignID.getSignature().length).body(userSignID.getSignature()); } catch (Exception e) { logger.error("Unexpected error:", e); From e04b9e5bcb6483a8d5c61c88de016b7887bb20ac Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Tue, 2 Sep 2025 14:34:34 +0530 Subject: [PATCH 23/61] Compile error resolved --- src/main/java/com/iemr/admin/repository/user/UserLoginRepo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..8e6c4b9 100644 --- a/src/main/java/com/iemr/admin/repository/user/UserLoginRepo.java +++ b/src/main/java/com/iemr/admin/repository/user/UserLoginRepo.java @@ -8,7 +8,7 @@ import com.iemr.admin.data.user.M_User; @Repository -public interface UserLoginRepo extends CrudRepository { +public interface UserLoginRepo extends CrudRepository { @Query(" SELECT u FROM M_User u WHERE u.userID = :userID AND u.Deleted = false ") public M_User getUserByUserID(@Param("userID") Long userID); From 0addca8678de77d44418e9415476c486bb7f2b56 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 2 Sep 2025 15:05:57 +0530 Subject: [PATCH 24/61] fix code --- src/main/resources/application.properties | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 70d7045..f86b6b6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -91,6 +91,4 @@ springdoc.swagger-ui.enabled=true logging.path=logs/ logging.file.name=logs/admin-api.log -jwt.secret=my-32-character-ultra-secure-and-ultra-long-secret - cors.allowed-origins=http://localhost:* From adc946deac81e68f741f3b67bc265ad99125c545 Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Tue, 2 Sep 2025 16:52:00 +0530 Subject: [PATCH 25/61] Main branch changes missed (#102) --- src/main/java/com/iemr/admin/data/user/M_User.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/admin/data/user/M_User.java b/src/main/java/com/iemr/admin/data/user/M_User.java index a35fb39..1b06de4 100644 --- a/src/main/java/com/iemr/admin/data/user/M_User.java +++ b/src/main/java/com/iemr/admin/data/user/M_User.java @@ -263,7 +263,7 @@ public void setEmergencyContactNo(String emergencyContactNo) { EmergencyContactNo = emergencyContactNo; } - public boolean isIsSupervisor() { + public Boolean isIsSupervisor() { return IsSupervisor; } @@ -272,7 +272,7 @@ public void setIsSupervisor(boolean isSupervisor) { } public boolean isDeleted() { - return Deleted; + return Boolean.TRUE.equals(Deleted); } public void setDeleted(boolean deleted) { From 4e3a3042e2eb7d42940777150233d71549ebbf5e Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Tue, 2 Sep 2025 20:09:28 +0530 Subject: [PATCH 26/61] Feature/signaturerelease (#103) * Main branch changes missed * Signature file changed --- .../EmployeeSignatureController.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) 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 dcf7868..2156cf7 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -21,6 +21,7 @@ */ package com.iemr.admin.controller.employeemaster; +import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -92,19 +93,25 @@ public ResponseEntity fetchFile(@PathVariable("userID") Long userID) thr EmployeeSignature userSignID = employeeSignatureServiceImpl.fetchSignature(userID); HttpHeaders responseHeaders = new HttpHeaders(); - ContentDisposition contentDisposition = ContentDisposition.attachment() - .filename(userSignID.getFileName(), StandardCharsets.UTF_8).build(); - responseHeaders.setContentDisposition(contentDisposition); + String fileName = URLEncoder.encode(userSignID.getFileName(), StandardCharsets.UTF_8); + + responseHeaders.set(HttpHeaders.CONTENT_DISPOSITION, + "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + fileName); MediaType mediaType; try { - mediaType = MediaType.parseMediaType(userSignID.getFileType()); - } catch (InvalidMediaTypeException | NullPointerException ex) { - mediaType = MediaType.APPLICATION_OCTET_STREAM; + mediaType = MediaType.parseMediaType(userSignID.getFileType()); + } catch (InvalidMediaTypeException | NullPointerException e) { + mediaType = MediaType.APPLICATION_OCTET_STREAM; } - return ResponseEntity.ok().contentType(mediaType).headers(responseHeaders) - .contentLength(userSignID.getSignature().length).body(userSignID.getSignature()); + 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); From 875e40a96d524579371e0d4fd13b540acb58e766 Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Wed, 10 Sep 2025 12:17:10 +0530 Subject: [PATCH 27/61] Feature/signaturerelease (#104) * Main branch changes missed * Signature file changed * Created new endpoint for Active and DeActive Employee Signature * coderabbit comments addressed --- .../EmployeeMasterController.java | 5 +-- .../EmployeeSignatureController.java | 37 ++++++++++++------- .../admin/data/employeemaster/M_User1.java | 24 +++++++++++- .../EmployeeMasterServiceImpl.java | 19 +++++++++- .../EmployeeSignatureService.java | 2 + .../EmployeeSignatureServiceImpl.java | 14 +++++++ 6 files changed, 82 insertions(+), 19 deletions(-) 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 2156cf7..79f7f72 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -47,6 +47,7 @@ import com.iemr.admin.utils.response.OutputResponse; import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletRequest; @PropertySource("classpath:application.properties") @@ -93,26 +94,19 @@ public ResponseEntity fetchFile(@PathVariable("userID") Long userID) thr EmployeeSignature userSignID = employeeSignatureServiceImpl.fetchSignature(userID); HttpHeaders responseHeaders = new HttpHeaders(); - String fileName = URLEncoder.encode(userSignID.getFileName(), StandardCharsets.UTF_8); - - responseHeaders.set(HttpHeaders.CONTENT_DISPOSITION, - "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + fileName); + ContentDisposition cd = ContentDisposition.attachment() + .filename(userSignID.getFileName(), StandardCharsets.UTF_8).build(); + responseHeaders.setContentDisposition(cd); MediaType mediaType; try { - mediaType = MediaType.parseMediaType(userSignID.getFileType()); + mediaType = MediaType.parseMediaType(userSignID.getFileType()); } catch (InvalidMediaTypeException | NullPointerException e) { - mediaType = MediaType.APPLICATION_OCTET_STREAM; + mediaType = MediaType.APPLICATION_OCTET_STREAM; } - byte[] fileBytes = userSignID.getSignature(); // MUST be byte[] - - return ResponseEntity.ok() - .headers(responseHeaders) - .contentType(mediaType) - .contentLength(fileBytes.length) - .body(fileBytes); - + 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); @@ -142,4 +136,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/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/service/employeemaster/EmployeeMasterServiceImpl.java b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java index 10d8440..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 = @@ -1089,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; } 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..c8de33b 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; @@ -67,4 +68,17 @@ public Boolean existSignature(Long userID) { return employeeSignatureRepo.countByUserIDAndSignatureNotNull(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); + } } From 41162a430bfde7320569a0887bfdb6ed73a38729 Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:31:49 +0530 Subject: [PATCH 28/61] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 13df3f5..368e9ad 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.admin admin-api - 3.4.0 + 3.5.0 war Admin-API Admin Page From 27241e13b9ead18a03456c8997b3934debc3c1ae Mon Sep 17 00:00:00 2001 From: SnehaRH <77656297+snehar-nd@users.noreply.github.com> Date: Fri, 26 Sep 2025 14:14:41 +0530 Subject: [PATCH 29/61] Cherry-pick the commits related to 3.5.0 form 3.6.0 (#106) * Compile error resolved * fix: cherry pic the #101 pr * fix: cherry pic the #101 pr * Main branch changes missed * fix: cherry pic the #103 pr * fix: cherry pic the #104 pr * fix: cherry pic the #104 pr * fix: cherry pick the #104 pr * fix code rabbit comments --------- Co-authored-by: Ravi Shanigarapu --- .../EmployeeMasterController.java | 2 +- .../EmployeeSignatureController.java | 53 +++++++++++++------ .../EmployeeSignatureServiceImpl.java | 14 +++++ 3 files changed, 53 insertions(+), 16 deletions(-) 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..ffe6dcd 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java @@ -1051,7 +1051,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..22826e0 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -21,17 +21,22 @@ */ 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; @@ -39,10 +44,10 @@ 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 +59,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 +86,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); @@ -128,4 +136,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(); + } +} \ No newline at end of file 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..b6a42a2 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java @@ -26,6 +26,7 @@ import com.iemr.admin.data.employeemaster.EmployeeSignature; import com.iemr.admin.repo.employeemaster.EmployeeSignatureRepo; +import org.json.JSONObject; @Service public class EmployeeSignatureServiceImpl implements EmployeeSignatureService { @@ -67,4 +68,17 @@ public Boolean existSignature(Long userID) { return employeeSignatureRepo.countByUserIDAndSignatureNotNull(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); + } } From 8fb55ce5f1c601c77bdc7d040a9ec44c1899b5ec Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Wed, 29 Oct 2025 21:28:02 +0530 Subject: [PATCH 30/61] fix:casesheet signature --- .../employeemaster/EmployeeSignatureController.java | 11 ++++++++++- .../repo/employeemaster/EmployeeSignatureRepo.java | 2 +- .../employeemaster/EmployeeSignatureServiceImpl.java | 6 +++++- 3 files changed, 16 insertions(+), 3 deletions(-) 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 79f7f72..deb1bba 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -42,6 +42,7 @@ 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.response.OutputResponse; @@ -125,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); 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 CrudRepository0; + return employeeSignatureRepo.countByUserIDAndSignatureNotNull(userID) > 0; + } + + public Boolean isSignatureActive(Long userID) { + return employeeSignatureRepo.countByUserIDAndSignatureNotNullAndDeletedFalse(userID) > 0; } @Override From 45250ea7489047e7ff7a3c9ad39dd545f3c2cd74 Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Thu, 30 Oct 2025 11:07:01 +0530 Subject: [PATCH 31/61] fix:pom file change --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c74cc29..04c5c88 100644 --- a/pom.xml +++ b/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.iemr.admin - adminapi - v3.1.0 + admin-api + 3.6.0 war Admin-API Admin Page From c824879c0cf83323e2bda13801f8d81539a4eb2a Mon Sep 17 00:00:00 2001 From: Vishwanath Balkur <118195001+vishwab1@users.noreply.github.com> Date: Thu, 30 Oct 2025 12:26:12 +0530 Subject: [PATCH 32/61] API changes in Signature enhancement for Casesheet (#107) * fix:casesheet signature * fix:pom file change --- pom.xml | 4 ++-- .../employeemaster/EmployeeSignatureController.java | 11 ++++++++++- .../repo/employeemaster/EmployeeSignatureRepo.java | 2 +- .../employeemaster/EmployeeSignatureServiceImpl.java | 6 +++++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index c74cc29..04c5c88 100644 --- a/pom.xml +++ b/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.iemr.admin - adminapi - v3.1.0 + admin-api + 3.6.0 war Admin-API Admin Page 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 79f7f72..deb1bba 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeSignatureController.java @@ -42,6 +42,7 @@ 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.response.OutputResponse; @@ -125,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); 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 CrudRepository0; + return employeeSignatureRepo.countByUserIDAndSignatureNotNull(userID) > 0; + } + + public Boolean isSignatureActive(Long userID) { + return employeeSignatureRepo.countByUserIDAndSignatureNotNullAndDeletedFalse(userID) > 0; } @Override From 7231794cd1339d2225ea2243a5c1663fd83ade47 Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Thu, 30 Oct 2025 12:51:28 +0530 Subject: [PATCH 33/61] fix: pom version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 04c5c88..5efbe6e 100644 --- a/pom.xml +++ b/pom.xml @@ -279,7 +279,7 @@ - adminapi-v3.0.0 + ${project.artifactId}-${project.version} org.owasp From 3d22060eea40ca4a3e586713c4ba789ebef05174 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 7 Nov 2025 18:40:39 +0530 Subject: [PATCH 34/61] fix code --- .../utils/JwtUserIdValidationFilter.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 64c89a9..855a930 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -73,17 +73,23 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo logger.info("JWT token from header: "); // Skip login and public endpoints - if (path.equals(contextPath + "/user/userAuthenticate") - || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") - || path.startsWith(contextPath + "/swagger-ui") - || path.startsWith(contextPath + "/v3/api-docs") - || path.startsWith(contextPath + "/user/refreshToken") - || path.startsWith(contextPath + "/public")) { - logger.info("Skipping filter for path: " + path); +// if (path.equals(contextPath + "/user/userAuthenticate") +// || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") +// || path.startsWith(contextPath + "/swagger-ui") +// || path.startsWith(contextPath + "/v3/api-docs") +// || path.startsWith(contextPath + "/user/refreshToken") +// || path.startsWith(contextPath + "/public")) { +// logger.info("Skipping filter for path: " + path); +// filterChain.doFilter(servletRequest, servletResponse); +// return; +// } + + if (true){ filterChain.doFilter(servletRequest, servletResponse); return; } + try { String jwtFromCookie = getJwtTokenFromCookies(request); String jwtFromHeader = request.getHeader(Constants.JWT_TOKEN); From 74cd35473d65cfe3e3bf661b8ce1473d2abde46d Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Mon, 10 Nov 2025 14:06:10 +0530 Subject: [PATCH 35/61] fix code --- .../BulkRegistrationController.java | 1 + .../admin/repository/user/UserLoginRepo.java | 6 +++--- .../BulkRegistrationServiceImpl.java | 10 +++++++--- .../admin/utils/JwtAuthenticationUtil.java | 2 +- .../utils/JwtUserIdValidationFilter.java | 20 ++++++++----------- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 700a767..9e63bfb 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -41,6 +41,7 @@ public class BulkRegistrationController { @PostMapping(value = "/bulkRegistration", headers = "Authorization") public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization) { + bulkRegistrationServiceimpl.bulkRegistrationErrors.clear(); logger.info("Bulk registration request received. Request payload is omitted from logs."); try { 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 8e6c4b9..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/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 6630aef..a6141ea 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -340,8 +340,10 @@ private void saveUserUser(Employee employee, Integer row, String authorization) } mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); - mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); +// mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); + mUser.setCreatedBy("HWCTMAdmin"); mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); + mUser.setModifiedBy("HWCTMAdmin"); mUser.setStatusID(1); mUser.setIsSupervisor(false); mUser.setServiceProviderID(15); @@ -351,7 +353,8 @@ private void saveUserUser(Employee employee, Integer row, String authorization) logger.info("BulkUser:" + bulkUserID); m_userServiceRoleMapping.setUserID(bulkUserID.getUserID()); m_userServiceRoleMapping.setServiceProviderID(bulkUserID.getServiceProviderID()); - m_userServiceRoleMapping.setCreatedBy(jwtUtil.extractUsername(authorization)); +// m_userServiceRoleMapping.setCreatedBy(jwtUtil.extractUsername(authorization)); + m_userServiceRoleMapping.setCreatedBy("HWCTMAdmin"); m_userServiceRoleMapping.setRoleID(122); m_userServiceRoleMapping.setProviderServiceMapID(1); // m_userServiceRoleMapping.setWorkingLocationID(117); @@ -373,7 +376,8 @@ private void saveUserUser(Employee employee, Integer row, String authorization) } // mUserDemographics.setReligionID(1); - mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); +// mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); + mUserDemographics.setCreatedBy(jwtUtil.extractUsername("HWCTMAdmin")); // mUserDemographics.setCreatedBy("Psmril2"); // Permanent Address if (!employee.getPermanentAddressLine1().isEmpty()) { 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 855a930..13b6aeb 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -73,23 +73,19 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo logger.info("JWT token from header: "); // Skip login and public endpoints -// if (path.equals(contextPath + "/user/userAuthenticate") -// || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") -// || path.startsWith(contextPath + "/swagger-ui") -// || path.startsWith(contextPath + "/v3/api-docs") -// || path.startsWith(contextPath + "/user/refreshToken") -// || path.startsWith(contextPath + "/public")) { -// logger.info("Skipping filter for path: " + path); -// filterChain.doFilter(servletRequest, servletResponse); -// return; -// } - - if (true){ + if (path.equals(contextPath + "/user/userAuthenticate") + || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") + || path.startsWith(contextPath + "/swagger-ui") + || path.startsWith(contextPath + "/v3/api-docs") + || path.startsWith(contextPath + "/user/refreshToken") + || path.startsWith(contextPath + "/public")) { + logger.info("Skipping filter for path: " + path); filterChain.doFilter(servletRequest, servletResponse); return; } + try { String jwtFromCookie = getJwtTokenFromCookies(request); String jwtFromHeader = request.getHeader(Constants.JWT_TOKEN); From f719ba5a38278fba3f275a495add2a808a0042d2 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Mon, 10 Nov 2025 14:09:13 +0530 Subject: [PATCH 36/61] fix code --- .../bulkRegistration/BulkRegistrationController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 9e63bfb..a0c1177 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -40,8 +40,12 @@ public class BulkRegistrationController { private Map response = new HashMap<>(); @PostMapping(value = "/bulkRegistration", headers = "Authorization") - public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization) { + public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization, HttpServletRequest request + ) { + 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 { From bb00223dc05ece522d17094f3b3df7362cbd6767 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Mon, 10 Nov 2025 14:23:22 +0530 Subject: [PATCH 37/61] fix code --- .../utils/JwtUserIdValidationFilter.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 13b6aeb..855a930 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -73,19 +73,23 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo logger.info("JWT token from header: "); // Skip login and public endpoints - if (path.equals(contextPath + "/user/userAuthenticate") - || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") - || path.startsWith(contextPath + "/swagger-ui") - || path.startsWith(contextPath + "/v3/api-docs") - || path.startsWith(contextPath + "/user/refreshToken") - || path.startsWith(contextPath + "/public")) { - logger.info("Skipping filter for path: " + path); +// if (path.equals(contextPath + "/user/userAuthenticate") +// || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") +// || path.startsWith(contextPath + "/swagger-ui") +// || path.startsWith(contextPath + "/v3/api-docs") +// || path.startsWith(contextPath + "/user/refreshToken") +// || path.startsWith(contextPath + "/public")) { +// logger.info("Skipping filter for path: " + path); +// filterChain.doFilter(servletRequest, servletResponse); +// return; +// } + + if (true){ filterChain.doFilter(servletRequest, servletResponse); return; } - try { String jwtFromCookie = getJwtTokenFromCookies(request); String jwtFromHeader = request.getHeader(Constants.JWT_TOKEN); From d52c9503271fa704c102b31c91b0271d707b2b1b Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Mon, 10 Nov 2025 14:30:47 +0530 Subject: [PATCH 38/61] fix code --- .../BulkRegistrationController.java | 16 ++++++++++++++++ .../utils/JwtUserIdValidationFilter.java | 19 +++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index a0c1177..1d4c84a 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -6,6 +6,7 @@ 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; @@ -42,6 +43,21 @@ public class BulkRegistrationController { @PostMapping(value = "/bulkRegistration", headers = "Authorization") public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization, HttpServletRequest request ) { + 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); diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 855a930..f61881a 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -73,18 +73,13 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo logger.info("JWT token from header: "); // Skip login and public endpoints -// if (path.equals(contextPath + "/user/userAuthenticate") -// || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") -// || path.startsWith(contextPath + "/swagger-ui") -// || path.startsWith(contextPath + "/v3/api-docs") -// || path.startsWith(contextPath + "/user/refreshToken") -// || path.startsWith(contextPath + "/public")) { -// logger.info("Skipping filter for path: " + path); -// filterChain.doFilter(servletRequest, servletResponse); -// return; -// } - - if (true){ + if (path.equals(contextPath + "/user/userAuthenticate") + || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") + || path.startsWith(contextPath + "/swagger-ui") + || path.startsWith(contextPath + "/v3/api-docs") + || path.startsWith(contextPath + "/user/refreshToken") + || path.startsWith(contextPath + "/public")) { + logger.info("Skipping filter for path: " + path); filterChain.doFilter(servletRequest, servletResponse); return; } From 86ed8cb935881f95fb4c6b55a1170e2610c73c01 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Mon, 10 Nov 2025 14:35:15 +0530 Subject: [PATCH 39/61] fix code --- .../service/bulkRegistration/BulkRegistrationServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index a6141ea..314dbc6 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -342,7 +342,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization) mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); // mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); mUser.setCreatedBy("HWCTMAdmin"); - mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); +// mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); mUser.setModifiedBy("HWCTMAdmin"); mUser.setStatusID(1); mUser.setIsSupervisor(false); From 3ae64367c0406f4ab29a206e9a7c395c54da03d2 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Mon, 10 Nov 2025 15:01:54 +0530 Subject: [PATCH 40/61] fix code --- .../bulkRegistration/BulkRegistrationServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 314dbc6..428dfb7 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -344,8 +344,8 @@ private void saveUserUser(Employee employee, Integer row, String authorization) mUser.setCreatedBy("HWCTMAdmin"); // mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); mUser.setModifiedBy("HWCTMAdmin"); - mUser.setStatusID(1); - mUser.setIsSupervisor(false); + mUser.setStatusID(2); + mUser.setEmployeeID(employee.getUserName()); mUser.setServiceProviderID(15); mUser.setPassword(generateStrongPassword(employee.getPassword())); logger.info("Register_user:" + mUser); @@ -377,7 +377,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization) } // mUserDemographics.setReligionID(1); // mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); - mUserDemographics.setCreatedBy(jwtUtil.extractUsername("HWCTMAdmin")); + mUserDemographics.setCreatedBy("HWCTMAdmin"); // mUserDemographics.setCreatedBy("Psmril2"); // Permanent Address if (!employee.getPermanentAddressLine1().isEmpty()) { From 67a42405e145119b6587845b09e23e4c845cffe7 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 11 Nov 2025 01:00:35 +0530 Subject: [PATCH 41/61] fix code --- .../BulkRegistrationController.java | 5 +-- .../repo/employeemaster/V_ShowuserRepo.java | 4 +++ .../BulkRegistrationService.java | 2 +- .../BulkRegistrationServiceImpl.java | 36 +++++++------------ 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 1d4c84a..9d58f29 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -41,7 +41,8 @@ public class BulkRegistrationController { private Map response = new HashMap<>(); @PostMapping(value = "/bulkRegistration", headers = "Authorization") - public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization, HttpServletRequest request + public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization, @RequestParam String userName, + HttpServletRequest request ) { String jwtToken = null; @@ -65,7 +66,7 @@ public ResponseEntity> registerBulkUser(@RequestBody String bulkRegistrationServiceimpl.bulkRegistrationErrors.clear(); logger.info("Bulk registration request received. Request payload is omitted from logs."); try { - bulkRegistrationService.registerBulkUser(m_user, authorization); + bulkRegistrationService.registerBulkUser(m_user, authorization,userName); response.put("status", "Success"); response.put("statusCode", 200); response.put("totalUser", bulkRegistrationServiceimpl.totalEmployeeListSize); diff --git a/src/main/java/com/iemr/admin/repo/employeemaster/V_ShowuserRepo.java b/src/main/java/com/iemr/admin/repo/employeemaster/V_ShowuserRepo.java index 722588f..cea90d0 100644 --- a/src/main/java/com/iemr/admin/repo/employeemaster/V_ShowuserRepo.java +++ b/src/main/java/com/iemr/admin/repo/employeemaster/V_ShowuserRepo.java @@ -23,6 +23,7 @@ import java.util.ArrayList; +import java.util.List; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; @@ -44,4 +45,7 @@ public interface V_ShowuserRepo 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/service/bulkRegistration/BulkRegistrationService.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java index 2e5d0dd..354cedf 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java @@ -1,5 +1,5 @@ package com.iemr.admin.service.bulkRegistration; public interface BulkRegistrationService { - void registerBulkUser(String user,String authorization); + void registerBulkUser(String user,String authorization,String userName); } diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 428dfb7..33a8029 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -7,6 +7,7 @@ import com.iemr.admin.data.locationmaster.M_District; import com.iemr.admin.data.rolemaster.StateMasterForRole; import com.iemr.admin.data.user.M_UserServiceRoleMapping; +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; @@ -54,6 +55,9 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { private EmployeeMasterInter employeeMasterInter; @Autowired private Role_MasterInter roleMasterInter; + + @Autowired + private V_ShowuserRepo showuserRepo; @Autowired private LocationMasterServiceInter locationMasterServiceInter; @@ -67,7 +71,7 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { private List m_districts; @Override - public void registerBulkUser(String xml, String authorization) { + public void registerBulkUser(String xml, String authorization,String userName) { try { xml = escapeXmlSpecialChars(xml); @@ -76,7 +80,7 @@ public void registerBulkUser(String xml, String authorization) { 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); + saveUserUser(employeeList.getEmployees().get(i), i, authorization,userName); } @@ -100,7 +104,7 @@ public static String escapeXmlSpecialChars(String xml) { } - private void saveUserUser(Employee employee, Integer row, String authorization) throws Exception { + private void saveUserUser(Employee employee, Integer row, String authorization,String createdBy) throws Exception { List validationErrors = new ArrayList<>(); BulkRegistrationError bulkRegistrationErrors_ = new BulkRegistrationError(); M_User1 mUser = new M_User1(); @@ -334,37 +338,24 @@ private void saveUserUser(Employee employee, Integer row, String authorization) mUser.setMaritalStatusID(1); mUser.setEmailID(employee.getEmail()); mUser.setGenderID(Short.parseShort(String.valueOf(getGenderId(employee.getGender())))); - mUser.setQualificationID(4); if (!employee.getQualification().isEmpty()) { mUser.setQualificationID(getQualificationId(employee.getQualification())); } mUser.setdOJ(convertStringIntoDate(employee.getDateOfJoining())); -// mUser.setCreatedBy(jwtUtil.extractUsername(authorization)); - mUser.setCreatedBy("HWCTMAdmin"); -// mUser.setModifiedBy(jwtUtil.extractUsername(authorization)); - mUser.setModifiedBy("HWCTMAdmin"); + mUser.setCreatedBy(createdBy); + mUser.setModifiedBy(createdBy); mUser.setStatusID(2); mUser.setEmployeeID(employee.getUserName()); - mUser.setServiceProviderID(15); + mUser.setServiceProviderID(showuserRepo.findByUserName(createdBy).getServiceProviderID()); 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(jwtUtil.extractUsername(authorization)); - m_userServiceRoleMapping.setCreatedBy("HWCTMAdmin"); + m_userServiceRoleMapping.setCreatedBy(createdBy); m_userServiceRoleMapping.setRoleID(122); - m_userServiceRoleMapping.setProviderServiceMapID(1); -// m_userServiceRoleMapping.setWorkingLocationID(117); - m_userServiceRoleMapping.setBlockName("Biswanath"); - String[] villageName = {"Bagijuli"}; - m_userServiceRoleMapping.setVillageName(villageName); - String[] villageID = {"25460"}; - m_userServiceRoleMapping.setVillageID(villageID); - m_userServiceRoleMapping.setBlockID(920); - mUserDemographics.setUserID(bulkUserID.getUserID()); mUserDemographics.setCountryID(91); if (!employee.getCommunity().isEmpty()) { @@ -375,10 +366,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization) mUserDemographics.setReligionID(getReligionStringId(employee.getReligion())); } -// mUserDemographics.setReligionID(1); -// mUserDemographics.setCreatedBy(jwtUtil.extractUsername(authorization)); - mUserDemographics.setCreatedBy("HWCTMAdmin"); -// mUserDemographics.setCreatedBy("Psmril2"); + mUserDemographics.setCreatedBy(createdBy); // Permanent Address if (!employee.getPermanentAddressLine1().isEmpty()) { mUserDemographics.setPermAddressLine1(employee.getPermanentAddressLine1()); From f8e646e1c0a084c633abb4300e8acb71b845e731 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 11 Nov 2025 01:10:02 +0530 Subject: [PATCH 42/61] fix code --- .../service/bulkRegistration/BulkRegistrationServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 33a8029..97759f9 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -309,9 +309,9 @@ private void saveUserUser(Employee employee, Integer row, String authorization,S mUser.setTitleID(getTitleId(employee.getTitle())); mUser.setFirstName(employee.getFirstName()); mUser.setLastName(employee.getLastName()); - mUser.setUserName(employee.getUserName()); + mUser.setUserName(employee.getContactNo()); mUser.setdOB(convertStringIntoDate(employee.getDob())); - mUser.setEmployeeID(employee.getContactNo()); + mUser.setEmployeeID(employee.getUserName()); mUser.setEmergencyContactNo(String.valueOf(employee.getEmergencyContactNo())); mUser.setContactNo(String.valueOf(employee.getContactNo())); if (!employee.getMiddleName().isEmpty()) { From 8c48069d8c0d16269bdee14b075f1cb0c556e31f Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 11 Nov 2025 11:39:12 +0530 Subject: [PATCH 43/61] fix code --- .../service/bulkRegistration/BulkRegistrationServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 97759f9..ad96798 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -346,6 +346,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization,S mUser.setCreatedBy(createdBy); mUser.setModifiedBy(createdBy); mUser.setStatusID(2); + mUser.setDeleted(false); mUser.setEmployeeID(employee.getUserName()); mUser.setServiceProviderID(showuserRepo.findByUserName(createdBy).getServiceProviderID()); mUser.setPassword(generateStrongPassword(employee.getPassword())); @@ -414,7 +415,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization,S employeeMasterInter.saveDemography(mUserDemographics); m_bulkUser.add(mUser); m_UserDemographics.add(mUserDemographics); - employeeMasterInter.saveRoleMappingeditedData(m_userServiceRoleMapping, authorization); +// employeeMasterInter.saveRoleMappingeditedData(m_userServiceRoleMapping, authorization); } catch (Exception e) { errorLogs.add("Row :" + (row + 1) + e.getMessage()); From 5f8dcf280cf641a16d682f1ee0658a0194e04b1b Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 11 Nov 2025 12:14:01 +0530 Subject: [PATCH 44/61] fix code --- .../bulkRegistration/BulkRegistrationServiceImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index ad96798..5392f0f 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -348,15 +348,15 @@ private void saveUserUser(Employee employee, Integer row, String authorization,S mUser.setStatusID(2); mUser.setDeleted(false); mUser.setEmployeeID(employee.getUserName()); - mUser.setServiceProviderID(showuserRepo.findByUserName(createdBy).getServiceProviderID()); + mUser.setServiceProviderID(13); 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); +// 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()) { From 30d3317ec41747ec55fd58659b71b0329c6dba12 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 11 Nov 2025 16:29:13 +0530 Subject: [PATCH 45/61] fix code --- .../bulkRegistration/BulkRegistrationController.java | 4 ++-- .../bulkRegistration/BulkRegistrationService.java | 2 +- .../BulkRegistrationServiceImpl.java | 12 ++++-------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 9d58f29..8e69311 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -42,7 +42,7 @@ public class BulkRegistrationController { @PostMapping(value = "/bulkRegistration", headers = "Authorization") public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization, @RequestParam String userName, - HttpServletRequest request + HttpServletRequest request, @RequestParam Integer serviceProviderID , @RequestParam Integer serviceProviderMapID ) { String jwtToken = null; @@ -66,7 +66,7 @@ public ResponseEntity> registerBulkUser(@RequestBody String bulkRegistrationServiceimpl.bulkRegistrationErrors.clear(); logger.info("Bulk registration request received. Request payload is omitted from logs."); try { - bulkRegistrationService.registerBulkUser(m_user, authorization,userName); + bulkRegistrationService.registerBulkUser(m_user, authorization,userName,serviceProviderID,serviceProviderMapID); response.put("status", "Success"); response.put("statusCode", 200); response.put("totalUser", bulkRegistrationServiceimpl.totalEmployeeListSize); diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java index 354cedf..e1f3656 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java @@ -1,5 +1,5 @@ package com.iemr.admin.service.bulkRegistration; public interface BulkRegistrationService { - void registerBulkUser(String user,String authorization,String userName); + void registerBulkUser(String user,String authorization,String userName,Integer serviceProviderID,Integer serviceProviderMapID); } diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 5392f0f..3b6caf0 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -6,7 +6,6 @@ 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.data.user.M_UserServiceRoleMapping; import com.iemr.admin.repo.employeemaster.V_ShowuserRepo; import com.iemr.admin.service.employeemaster.EmployeeMasterInter; import com.iemr.admin.service.locationmaster.LocationMasterServiceInter; @@ -20,7 +19,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import javax.crypto.SecretKeyFactory; @@ -31,10 +29,8 @@ import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException; import java.sql.Date; -import java.text.ParseException; import java.time.*; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -71,7 +67,7 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { private List m_districts; @Override - public void registerBulkUser(String xml, String authorization,String userName) { + public void registerBulkUser(String xml, String authorization,String userName,Integer serviceProviderID,Integer serviceProviderMapID) { try { xml = escapeXmlSpecialChars(xml); @@ -80,7 +76,7 @@ public void registerBulkUser(String xml, String authorization,String userName) { 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); + saveUserUser(employeeList.getEmployees().get(i), i, authorization,userName,serviceProviderID,serviceProviderMapID); } @@ -104,7 +100,7 @@ public static String escapeXmlSpecialChars(String xml) { } - private void saveUserUser(Employee employee, Integer row, String authorization,String createdBy) throws Exception { + private void saveUserUser(Employee employee, Integer row, String authorization, String createdBy, Integer serviceProviderID, Integer serviceProviderMapID) throws Exception { List validationErrors = new ArrayList<>(); BulkRegistrationError bulkRegistrationErrors_ = new BulkRegistrationError(); M_User1 mUser = new M_User1(); @@ -348,7 +344,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization,S mUser.setStatusID(2); mUser.setDeleted(false); mUser.setEmployeeID(employee.getUserName()); - mUser.setServiceProviderID(13); + mUser.setServiceProviderID(serviceProviderID); mUser.setPassword(generateStrongPassword(employee.getPassword())); logger.info("Register_user:" + mUser); M_User1 bulkUserID = employeeMasterInter.saveBulkUserEmployee(mUser); From 6f5a1013d55cba36b26498a46710e835874768c1 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 11 Nov 2025 17:03:42 +0530 Subject: [PATCH 46/61] fix code --- .../bulkRegistration/BulkRegistrationController.java | 4 ++-- .../service/bulkRegistration/BulkRegistrationService.java | 2 +- .../bulkRegistration/BulkRegistrationServiceImpl.java | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 8e69311..4832b53 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -42,7 +42,7 @@ public class BulkRegistrationController { @PostMapping(value = "/bulkRegistration", headers = "Authorization") public ResponseEntity> registerBulkUser(@RequestBody String m_user, @RequestHeader String authorization, @RequestParam String userName, - HttpServletRequest request, @RequestParam Integer serviceProviderID , @RequestParam Integer serviceProviderMapID + HttpServletRequest request, @RequestParam Integer serviceProviderID ) { String jwtToken = null; @@ -66,7 +66,7 @@ public ResponseEntity> registerBulkUser(@RequestBody String bulkRegistrationServiceimpl.bulkRegistrationErrors.clear(); logger.info("Bulk registration request received. Request payload is omitted from logs."); try { - bulkRegistrationService.registerBulkUser(m_user, authorization,userName,serviceProviderID,serviceProviderMapID); + bulkRegistrationService.registerBulkUser(m_user, authorization,userName,serviceProviderID); response.put("status", "Success"); response.put("statusCode", 200); response.put("totalUser", bulkRegistrationServiceimpl.totalEmployeeListSize); diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java index e1f3656..19ce84c 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationService.java @@ -1,5 +1,5 @@ package com.iemr.admin.service.bulkRegistration; public interface BulkRegistrationService { - void registerBulkUser(String user,String authorization,String userName,Integer serviceProviderID,Integer serviceProviderMapID); + 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 index 3b6caf0..0f2debf 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -67,7 +67,7 @@ public class BulkRegistrationServiceImpl implements BulkRegistrationService { private List m_districts; @Override - public void registerBulkUser(String xml, String authorization,String userName,Integer serviceProviderID,Integer serviceProviderMapID) { + public void registerBulkUser(String xml, String authorization,String userName,Integer serviceProviderID) { try { xml = escapeXmlSpecialChars(xml); @@ -76,7 +76,7 @@ public void registerBulkUser(String xml, String authorization,String userName,In 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,serviceProviderMapID); + saveUserUser(employeeList.getEmployees().get(i), i, authorization,userName,serviceProviderID); } @@ -100,7 +100,7 @@ public static String escapeXmlSpecialChars(String xml) { } - private void saveUserUser(Employee employee, Integer row, String authorization, String createdBy, Integer serviceProviderID, Integer serviceProviderMapID) throws Exception { + 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(); From 608773a2a89d573e2e42305127a19a2d83abd3d3 Mon Sep 17 00:00:00 2001 From: 5Amogh Date: Mon, 17 Nov 2025 17:10:20 +0530 Subject: [PATCH 47/61] fix: amm-1927 send headers only if the request is from the allowed origin --- .../com/iemr/admin/config/CorsConfig.java | 5 +- .../utils/JwtUserIdValidationFilter.java | 59 +++++++++++++++---- .../utils/http/HTTPRequestInterceptor.java | 28 ++++++++- 3 files changed, 78 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/iemr/admin/config/CorsConfig.java b/src/main/java/com/iemr/admin/config/CorsConfig.java index f43d8ef..c98af1c 100644 --- a/src/main/java/com/iemr/admin/config/CorsConfig.java +++ b/src/main/java/com/iemr/admin/config/CorsConfig.java @@ -19,8 +19,9 @@ public void addCorsMappings(CorsRegistry registry) { Arrays.stream(allowedOrigins.split(",")) .map(String::trim) .toArray(String[]::new)) - .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") - .allowedHeaders("*") + .allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS") + .allowedHeaders("Authorization", "Content-Type", "Accept", "Jwttoken", + "serverAuthorization", "ServerAuthorization", "serverauthorization", "Serverauthorization") .exposedHeaders("Authorization", "Jwttoken") .allowCredentials(true) .maxAge(3600); diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 64c89a9..e825036 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -37,23 +37,61 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo HttpServletResponse response = (HttpServletResponse) servletResponse; String origin = request.getHeader("Origin"); + String method = request.getMethod(); + String uri = request.getRequestURI(); + + logger.debug("Incoming Origin: {}", origin); + logger.debug("Request Method: {}", method); + logger.debug("Request URI: {}", uri); + logger.debug("Allowed Origins Configured: {}", allowedOrigins); + + if ("OPTIONS".equalsIgnoreCase(method)) { + if (origin == null) { + logger.warn("BLOCKED - OPTIONS request without Origin header | Method: {} | URI: {}", method, uri); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "OPTIONS request requires Origin header"); + return; + } + if (!isOriginAllowed(origin)) { + logger.warn("BLOCKED - Unauthorized Origin | Origin: {} | Method: {} | URI: {}", origin, method, uri); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "Origin not allowed"); + return; + } + } else { + // For non-OPTIONS requests, validate origin if present + if (origin != null && !isOriginAllowed(origin)) { + logger.warn("BLOCKED - Unauthorized Origin | Origin: {} | Method: {} | URI: {}", origin, method, uri); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "Origin not allowed"); + return; + } + } + + // Determine request path/context for later checks + String path = request.getRequestURI(); + String contextPath = request.getContextPath(); + if (origin != null && isOriginAllowed(origin)) { - response.setHeader("Access-Control-Allow-Origin", origin); - response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); - response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, Jwttoken"); + response.setHeader("Access-Control-Allow-Origin", origin); // Never use wildcard + response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS"); + response.setHeader("Access-Control-Allow-Headers", + "Authorization, Content-Type, Accept, Jwttoken, serverAuthorization, ServerAuthorization, serverauthorization, Serverauthorization"); response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Max-Age", "3600"); + logger.info("Origin Validated | Origin: {} | Method: {} | URI: {}", origin, method, uri); } else { logger.warn("Origin [{}] is NOT allowed. CORS headers NOT added.", origin); } - if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { - logger.info("OPTIONS request - skipping JWT validation"); + if ("OPTIONS".equalsIgnoreCase(method)) { + // OPTIONS (preflight) - respond with full allowed methods + response.setHeader("Access-Control-Allow-Origin", origin); + response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS"); + response.setHeader("Access-Control-Allow-Headers", + "Authorization, Content-Type, Accept, Jwttoken, serverAuthorization, ServerAuthorization, serverauthorization, Serverauthorization"); + response.setHeader("Access-Control-Allow-Credentials", "true"); response.setStatus(HttpServletResponse.SC_OK); return; } - String path = request.getRequestURI(); - String contextPath = request.getContextPath(); logger.info("JwtUserIdValidationFilter invoked for path: " + path); // Log cookies for debugging @@ -70,7 +108,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } // Log headers for debugging - logger.info("JWT token from header: "); + logger.debug("JWT token from header: {}", request.getHeader("Jwttoken") != null ? "present" : "not present"); // Skip login and public endpoints if (path.equals(contextPath + "/user/userAuthenticate") @@ -142,9 +180,8 @@ private boolean isOriginAllowed(String origin) { .anyMatch(pattern -> { String regex = pattern .replace(".", "\\.") - .replace("*", ".*") - .replace("http://localhost:.*", "http://localhost:\\d+"); // special case for wildcard port - + .replace("*", ".*"); + boolean matched = origin.matches(regex); return matched; }); diff --git a/src/main/java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java b/src/main/java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java index 665f156..d76dc48 100644 --- a/src/main/java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java +++ b/src/main/java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java @@ -22,11 +22,14 @@ package com.iemr.admin.utils.http; +import java.util.Arrays; + import javax.ws.rs.core.MediaType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; @@ -41,6 +44,8 @@ @Component public class HTTPRequestInterceptor implements HandlerInterceptor { Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + @Value("${cors.allowed-origins}") + private String allowedOrigins; @Autowired private RedisStorage redisStorage; @Autowired @@ -104,7 +109,13 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons response.getOutputStream().print(output.toString()); response.setContentType(MediaType.APPLICATION_JSON); response.setContentLength(output.toString().length()); - response.setHeader("Access-Control-Allow-Origin", "*"); + String origin = request.getHeader("Origin"); + if (origin != null && isOriginAllowed(origin)) { + response.setHeader("Access-Control-Allow-Origin", origin); + response.setHeader("Access-Control-Allow-Credentials", "true"); + } else if (origin != null) { + logger.warn("CORS headers NOT added for error response | Unauthorized origin: {}", origin); + } status = false; } } @@ -138,4 +149,19 @@ public void afterCompletion(HttpServletRequest request, HttpServletResponse resp logger.info("http interceptor - after completion"); } + + private boolean isOriginAllowed(String origin) { + if (origin == null || allowedOrigins == null || allowedOrigins.trim().isEmpty()) { + return false; + } + + return Arrays.stream(allowedOrigins.split(",")) + .map(String::trim) + .anyMatch(pattern -> { + String regex = pattern + .replace(".", "\\.") + .replace("*", ".*"); + return origin.matches(regex); + }); + } } From 5a7c6bf9c39c770651169b117ad0e30afd7e9db0 Mon Sep 17 00:00:00 2001 From: 5Amogh Date: Mon, 17 Nov 2025 17:24:07 +0530 Subject: [PATCH 48/61] fix: amm-1927 coderabbit fixes --- .../utils/JwtUserIdValidationFilter.java | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index e825036..1c7fd8f 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -69,27 +69,23 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo String path = request.getRequestURI(); String contextPath = request.getContextPath(); + // Set CORS headers and handle OPTIONS request only if origin is valid and allowed if (origin != null && isOriginAllowed(origin)) { - response.setHeader("Access-Control-Allow-Origin", origin); // Never use wildcard - response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS"); - response.setHeader("Access-Control-Allow-Headers", - "Authorization, Content-Type, Accept, Jwttoken, serverAuthorization, ServerAuthorization, serverauthorization, Serverauthorization"); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Max-Age", "3600"); + addCorsHeaders(response, origin); logger.info("Origin Validated | Origin: {} | Method: {} | URI: {}", origin, method, uri); + + if ("OPTIONS".equalsIgnoreCase(method)) { + // OPTIONS (preflight) - respond with full allowed methods + response.setStatus(HttpServletResponse.SC_OK); + return; + } } else { logger.warn("Origin [{}] is NOT allowed. CORS headers NOT added.", origin); - } - - if ("OPTIONS".equalsIgnoreCase(method)) { - // OPTIONS (preflight) - respond with full allowed methods - response.setHeader("Access-Control-Allow-Origin", origin); - response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS"); - response.setHeader("Access-Control-Allow-Headers", - "Authorization, Content-Type, Accept, Jwttoken, serverAuthorization, ServerAuthorization, serverauthorization, Serverauthorization"); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setStatus(HttpServletResponse.SC_OK); - return; + + if ("OPTIONS".equalsIgnoreCase(method)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "Origin not allowed for OPTIONS request"); + return; + } } logger.info("JwtUserIdValidationFilter invoked for path: " + path); @@ -169,6 +165,15 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } } + private void addCorsHeaders(HttpServletResponse response, String origin) { + response.setHeader("Access-Control-Allow-Origin", origin); // Never use wildcard + response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS"); + response.setHeader("Access-Control-Allow-Headers", + "Authorization, Content-Type, Accept, Jwttoken, serverAuthorization, ServerAuthorization, serverauthorization, Serverauthorization"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Max-Age", "3600"); + } + private boolean isOriginAllowed(String origin) { if (origin == null || allowedOrigins == null || allowedOrigins.trim().isEmpty()) { logger.warn("No allowed origins configured or origin is null"); @@ -185,9 +190,7 @@ private boolean isOriginAllowed(String origin) { boolean matched = origin.matches(regex); return matched; }); - } - - private boolean isMobileClient(String userAgent) { + } private boolean isMobileClient(String userAgent) { if (userAgent == null) return false; userAgent = userAgent.toLowerCase(); From ad6ff5eb3dd84de8a296752df7438580307419a8 Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:07:46 +0530 Subject: [PATCH 49/61] Update regex handling for localhost URLs --- .../java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java b/src/main/java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java index d76dc48..8c0fa2e 100644 --- a/src/main/java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java +++ b/src/main/java/com/iemr/admin/utils/http/HTTPRequestInterceptor.java @@ -160,7 +160,8 @@ private boolean isOriginAllowed(String origin) { .anyMatch(pattern -> { String regex = pattern .replace(".", "\\.") - .replace("*", ".*"); + .replace("*", ".*") + .replace("http://localhost:.*", "http://localhost:\\d+"); return origin.matches(regex); }); } From eb98a5a25e3f2d4075c26f272339e5973bc09943 Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:08:27 +0530 Subject: [PATCH 50/61] Enhance regex pattern for URL matching --- .../java/com/iemr/admin/utils/JwtUserIdValidationFilter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 1c7fd8f..1b75a6d 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -185,7 +185,8 @@ private boolean isOriginAllowed(String origin) { .anyMatch(pattern -> { String regex = pattern .replace(".", "\\.") - .replace("*", ".*"); + .replace("*", ".*") + .replace("http://localhost:.*", "http://localhost:\\d+"); boolean matched = origin.matches(regex); return matched; From b421d8be896078818912425f332d112d34fcc0c3 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Wed, 3 Dec 2025 17:27:41 +0530 Subject: [PATCH 51/61] fix code --- .../service/employeemaster/EmployeeSignatureServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 fd4a047..837bafc 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java @@ -72,6 +72,7 @@ public Boolean isSignatureActive(Long userID) { return employeeSignatureRepo.countByUserIDAndSignatureNotNullAndDeletedFalse(userID) > 0; } + @Override public EmployeeSignature updateUserSignatureStatus(String activateUser) { JSONObject obj = new JSONObject(activateUser); From 76db67cfd3447834a6133249902ec61a219885cd Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Wed, 3 Dec 2025 17:29:33 +0530 Subject: [PATCH 52/61] fix code --- .../service/employeemaster/EmployeeSignatureServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 a8d8aa0..58e5cce 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeSignatureServiceImpl.java @@ -74,6 +74,7 @@ public Boolean isSignatureActive(Long userID) { } + @Override public EmployeeSignature updateUserSignatureStatus(String activateUser) { JSONObject obj = new JSONObject(activateUser); From 711128e4730186c68d31dd657b512f7c2580acfd Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Wed, 14 Jan 2026 10:59:01 +0530 Subject: [PATCH 53/61] fix vulnerabilitie code --- .../BulkRegistrationController.java | 18 ------------------ .../BulkRegistrationServiceImpl.java | 2 -- 2 files changed, 20 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java index 4832b53..2ca9134 100644 --- a/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java +++ b/src/main/java/com/iemr/admin/controller/bulkRegistration/BulkRegistrationController.java @@ -44,25 +44,7 @@ public class BulkRegistrationController { 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 { diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index 0f2debf..bcd35e9 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -346,9 +346,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization, 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); From f76f68c018eb38d2a62f1fc876957ea6e3a79e3a Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Wed, 14 Jan 2026 11:08:58 +0530 Subject: [PATCH 54/61] fix security hotspots --- .../service/bulkRegistration/BulkRegistrationServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index bcd35e9..d1b5a9f 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -783,7 +783,6 @@ public byte[] insertErrorLog() { } catch (IOException e) { logger.error("IOException" + e.getMessage()); - e.printStackTrace(); } return baos.toByteArray(); From ea22db4a65d92d5773362b9438ddcbe909c324ba Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Fri, 27 Feb 2026 19:13:27 +0530 Subject: [PATCH 55/61] fixed conflicts --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a4ffda0..a1a6664 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.admin admin-api - 3.6.0 + 3.6.2 war Admin-API Admin Page From 68e4130cda95ad46740c55054a3f0abcb997e26b Mon Sep 17 00:00:00 2001 From: Vishwanath Balkur <118195001+vishwab1@users.noreply.github.com> Date: Mon, 2 Mar 2026 19:06:30 +0530 Subject: [PATCH 56/61] Add facility hierarchy creation with village and parent-child mapping (#121) * fix:changed the pom xml * fix: added facilty type master change * feat: created facility creation * fix: rabiit review fix * fix: rabiit review fix * fix: rabiit review fix * fix: pom version --- pom.xml | 2 +- .../facilitytype/FacilitytypeController.java | 100 +++++++++++++- .../controller/store/StoreController.java | 125 ++++++++++++++++++ .../data/facilitytype/M_facilitytype.java | 104 +++++++++------ .../data/store/FacilityHierarchyRequest.java | 21 +++ .../data/store/FacilityVillageMapping.java | 68 ++++++++++ .../com/iemr/admin/data/store/M_Facility.java | 44 ++++++ .../admin/data/store/M_FacilityLevel.java | 88 ++++++++++++ .../facilitytype/M_FacilityLevelRepo.java | 36 +++++ .../facilitytype/M_facilitytypeRepo.java | 21 ++- .../store/FacilityVillageMappingRepo.java | 23 ++++ .../admin/repository/store/MainStoreRepo.java | 16 ++- .../facilitytype/M_facilitytypeInter.java | 10 ++ .../M_facilitytypeServiceImpl.java | 46 +++++-- .../admin/service/store/StoreService.java | 19 ++- .../admin/service/store/StoreServiceImpl.java | 109 +++++++++++++++ 16 files changed, 768 insertions(+), 64 deletions(-) create mode 100644 src/main/java/com/iemr/admin/data/store/FacilityHierarchyRequest.java create mode 100644 src/main/java/com/iemr/admin/data/store/FacilityVillageMapping.java create mode 100644 src/main/java/com/iemr/admin/data/store/M_FacilityLevel.java create mode 100644 src/main/java/com/iemr/admin/repository/facilitytype/M_FacilityLevelRepo.java create mode 100644 src/main/java/com/iemr/admin/repository/store/FacilityVillageMappingRepo.java diff --git a/pom.xml b/pom.xml index a1a6664..c48e8d8 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.admin admin-api - 3.6.2 + 3.8.1 war Admin-API Admin Page diff --git a/src/main/java/com/iemr/admin/controller/facilitytype/FacilitytypeController.java b/src/main/java/com/iemr/admin/controller/facilitytype/FacilitytypeController.java index bf55ebe..da7af7a 100644 --- a/src/main/java/com/iemr/admin/controller/facilitytype/FacilitytypeController.java +++ b/src/main/java/com/iemr/admin/controller/facilitytype/FacilitytypeController.java @@ -28,20 +28,20 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; - +import org.springframework.web.bind.annotation.GetMapping; 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.iemr.admin.data.facilitytype.M_facilitytype; +import com.iemr.admin.data.store.M_FacilityLevel; import com.iemr.admin.service.facilitytype.M_facilitytypeInter; import com.iemr.admin.utils.mapper.InputMapper; import com.iemr.admin.utils.response.OutputResponse; import io.swagger.v3.oas.annotations.Operation; - @RestController public class FacilitytypeController { private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); @@ -186,4 +186,100 @@ public String checkFacilityTypeCode(@RequestBody String deleteManufacturer) { return response.toString(); } + + @Operation(summary = "Get facility types by rural/urban") + @RequestMapping(value = "/getFacilityTypesByRuralUrban", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getFacilityTypesByRuralUrban(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + + try { + + M_facilitytype facilityDetails = InputMapper.gson().fromJson(request, M_facilitytype.class); + + ArrayList facilityData = m_facilitytypeInter + .getFacilityTypesByRuralUrban(facilityDetails.getProviderServiceMapID(), + facilityDetails.getRuralUrban()); + + response.setResponse(facilityData.toString()); + + } catch (Exception e) { + + logger.error("Unexpected error:", e); + response.setError(e); + + } + + return response.toString(); + } + + @Operation(summary = "Get all facility levels") + @RequestMapping(value = "/getFacilityLevels", headers = "Authorization", method = { + RequestMethod.GET }, produces = { "application/json" }) + public String getFacilityLevels() { + + OutputResponse response = new OutputResponse(); + try { + ArrayList data = m_facilitytypeInter.getFacilityLevels(); + response.setResponse(data.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Get facility types by block") + @RequestMapping(value = "/getFacilityTypesByBlock", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getFacilityTypesByBlock(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + M_facilitytype facilityDetails = InputMapper.gson().fromJson(request, M_facilitytype.class); + ArrayList data = m_facilitytypeInter.getFacilityTypesByBlock(facilityDetails.getBlockID()); + response.setResponse(data.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Get facility types by state") + @RequestMapping(value = "/getFacilityTypesByState", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getFacilityTypesByState(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + M_facilitytype facilityDetails = InputMapper.gson().fromJson(request, M_facilitytype.class); + ArrayList data = m_facilitytypeInter.getFacilityTypesByState(facilityDetails.getStateID()); + response.setResponse(data.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Check if facility type name exists in state") + @RequestMapping(value = "/checkFacilityTypeName", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String checkFacilityTypeName(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + M_facilitytype facilityDetails = InputMapper.gson().fromJson(request, M_facilitytype.class); + boolean exists = m_facilitytypeInter.checkFacilityTypeNameExists( + facilityDetails.getFacilityTypeName(), facilityDetails.getStateID()); + response.setResponse(String.valueOf(exists)); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + } diff --git a/src/main/java/com/iemr/admin/controller/store/StoreController.java b/src/main/java/com/iemr/admin/controller/store/StoreController.java index afd4be4..359c39b 100644 --- a/src/main/java/com/iemr/admin/controller/store/StoreController.java +++ b/src/main/java/com/iemr/admin/controller/store/StoreController.java @@ -35,6 +35,8 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import com.iemr.admin.data.store.FacilityHierarchyRequest; +import com.iemr.admin.data.store.FacilityVillageMapping; import com.iemr.admin.data.store.M_Facility; import com.iemr.admin.data.store.M_facilityMap; import com.iemr.admin.data.store.V_FetchFacility; @@ -286,6 +288,23 @@ public String getMapStore(@RequestBody V_FetchFacility facilitymap) { } + @Operation(summary = "Get facilities by block/taluk") + @RequestMapping(value = "/getFacilitiesByBlock", headers = "Authorization", method = { RequestMethod.POST }, produces = { + "application/json" }) + public String getFacilitiesByBlock(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + M_Facility facility = InputMapper.gson().fromJson(request, M_Facility.class); + ArrayList data = storeService.getFacilitiesByBlock(facility.getBlockID()); + response.setResponse(data.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + @Operation(summary = "Check store code") @RequestMapping(value = "/checkStoreCode", headers = "Authorization", method = { RequestMethod.POST }, produces = { "application/json" }) @@ -311,4 +330,110 @@ public String checkStoreCode(@RequestBody String deleteManufacturer) { return response.toString(); } + + @Operation(summary = "Get facilities by block and facility level") + @RequestMapping(value = "/getFacilitiesByBlockAndLevel", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getFacilitiesByBlockAndLevel(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + com.iemr.admin.data.facilitytype.M_facilitytype reqObj = InputMapper.gson().fromJson(request, + com.iemr.admin.data.facilitytype.M_facilitytype.class); + ArrayList data = storeService.getFacilitiesByBlockAndLevel(reqObj.getBlockID(), + reqObj.getFacilityLevelID()); + response.setResponse(data.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Create facility with hierarchy mapping") + @RequestMapping(value = "/createFacilityWithHierarchy", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String createFacilityWithHierarchy(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + FacilityHierarchyRequest reqObj = InputMapper.gson().fromJson(request, FacilityHierarchyRequest.class); + M_Facility savedFacility = storeService.createFacilityWithHierarchy(reqObj.getFacility(), + reqObj.getVillageIDs(), reqObj.getChildFacilityIDs()); + response.setResponse(savedFacility.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Get village IDs already mapped to facilities in a block") + @RequestMapping(value = "/getMappedVillageIDs", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getMappedVillageIDs(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + M_Facility facility = InputMapper.gson().fromJson(request, M_Facility.class); + List mappedIDs = storeService.getMappedVillageIDs(facility.getBlockID()); + response.setResponse(mappedIDs.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Get village mappings for a facility") + @RequestMapping(value = "/getVillageMappingsByFacility", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getVillageMappingsByFacility(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + M_Facility facility = InputMapper.gson().fromJson(request, M_Facility.class); + ArrayList mappings = storeService.getVillageMappingsByFacility(facility.getFacilityID()); + response.setResponse(mappings.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Get child facilities by parent facility ID") + @RequestMapping(value = "/getChildFacilitiesByParent", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getChildFacilitiesByParent(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + M_Facility facility = InputMapper.gson().fromJson(request, M_Facility.class); + ArrayList children = storeService.getChildFacilitiesByParent(facility.getFacilityID()); + response.setResponse(children.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Update facility with hierarchy mapping") + @RequestMapping(value = "/updateFacilityWithHierarchy", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String updateFacilityWithHierarchy(@RequestBody String request) { + + OutputResponse response = new OutputResponse(); + try { + FacilityHierarchyRequest reqObj = InputMapper.gson().fromJson(request, FacilityHierarchyRequest.class); + M_Facility updatedFacility = storeService.updateFacilityWithHierarchy(reqObj.getFacility(), + reqObj.getVillageIDs(), reqObj.getChildFacilityIDs()); + response.setResponse(updatedFacility.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } } diff --git a/src/main/java/com/iemr/admin/data/facilitytype/M_facilitytype.java b/src/main/java/com/iemr/admin/data/facilitytype/M_facilitytype.java index 2a14596..16d65ea 100644 --- a/src/main/java/com/iemr/admin/data/facilitytype/M_facilitytype.java +++ b/src/main/java/com/iemr/admin/data/facilitytype/M_facilitytype.java @@ -35,7 +35,7 @@ import jakarta.persistence.Transient; @Entity -@Table(name="m_facilitytype") +@Table(name = "m_facilitytype") public class M_facilitytype { @Id @@ -43,59 +43,67 @@ public class M_facilitytype { @Column(name = "FacilityTypeID") @Expose private Integer facilityTypeID; - + @Column(name = "FacilityTypeName") @Expose private String facilityTypeName; - + @Column(name = "FacilityTypeDesc") @Expose private String facilityTypeDesc; - + @Column(name = "FacilityTypeCode") @Expose private String facilityTypeCode; - + @Column(name = "Status") @Expose private String status; - + @Column(name = "ProviderServiceMapID") @Expose private Integer providerServiceMapID; - + @Column(name = "Deleted", insertable = false, updatable = true) @Expose private Boolean deleted; - + @Column(name = "CreatedBy") @Expose private String createdBy; - + @Column(name = "CreatedDate", insertable = false, updatable = false) @Expose private Timestamp createdDate; - + @Column(name = "ModifiedBy") @Expose private String modifiedBy; - + @Column(name = "LastModDate", insertable = false, updatable = false) @Expose private Timestamp lastModDate; - - - + + @Expose + @Column(name = "RuralUrban") + private String ruralUrban; + + @Expose + @Column(name = "FacilityLevelID") + private Integer facilityLevelID; + + @Expose + @Column(name = "StateID") + private Integer stateID; + + @Transient + @Expose + private Integer blockID; + public M_facilitytype() { // TODO Auto-generated constructor stub } - - - - - - - + public Integer getFacilityTypeID() { return facilityTypeID; } @@ -160,8 +168,6 @@ public void setCreatedBy(String createdBy) { this.createdBy = createdBy; } - - public String getModifiedBy() { return modifiedBy; } @@ -170,50 +176,60 @@ public void setModifiedBy(String modifiedBy) { this.modifiedBy = modifiedBy; } - - public Timestamp getCreatedDate() { return createdDate; } - - - - - - public void setCreatedDate(Timestamp createdDate) { this.createdDate = createdDate; } - - - - - - public Timestamp getLastModDate() { return lastModDate; } + public void setLastModDate(Timestamp lastModDate) { + this.lastModDate = lastModDate; + } + @Transient + private OutputMapper outputMapper = new OutputMapper(); + @Override + public String toString() { + return outputMapper.gson().toJson(this); + } + public String getRuralUrban() { + return ruralUrban; + } + public void setRuralUrban(String ruralUrban) { + this.ruralUrban = ruralUrban; + } + public Integer getFacilityLevelID() { + return facilityLevelID; + } - public void setLastModDate(Timestamp lastModDate) { - this.lastModDate = lastModDate; + public void setFacilityLevelID(Integer facilityLevelID) { + this.facilityLevelID = facilityLevelID; } + public Integer getStateID() { + return stateID; + } + public void setStateID(Integer stateID) { + this.stateID = stateID; + } - @Transient - private OutputMapper outputMapper = new OutputMapper(); + public Integer getBlockID() { + return blockID; + } - @Override - public String toString() { - return outputMapper.gson().toJson(this); + public void setBlockID(Integer blockID) { + this.blockID = blockID; } } diff --git a/src/main/java/com/iemr/admin/data/store/FacilityHierarchyRequest.java b/src/main/java/com/iemr/admin/data/store/FacilityHierarchyRequest.java new file mode 100644 index 0000000..5d3fdef --- /dev/null +++ b/src/main/java/com/iemr/admin/data/store/FacilityHierarchyRequest.java @@ -0,0 +1,21 @@ +package com.iemr.admin.data.store; + +import java.util.List; + +import com.google.gson.annotations.Expose; + +import lombok.Data; + +@Data +public class FacilityHierarchyRequest { + + @Expose + private M_Facility facility; + + @Expose + private List villageIDs; + + @Expose + private List childFacilityIDs; + +} diff --git a/src/main/java/com/iemr/admin/data/store/FacilityVillageMapping.java b/src/main/java/com/iemr/admin/data/store/FacilityVillageMapping.java new file mode 100644 index 0000000..aaa84db --- /dev/null +++ b/src/main/java/com/iemr/admin/data/store/FacilityVillageMapping.java @@ -0,0 +1,68 @@ +package com.iemr.admin.data.store; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; +import java.sql.Timestamp; + +import org.hibernate.annotations.Formula; + +import com.google.gson.annotations.Expose; +import com.iemr.admin.utils.mapper.OutputMapper; + +import lombok.Data; + +@Entity +@Table(name = "facility_village_mapping") +@Data +public class FacilityVillageMapping { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Expose + @Column(name = "FacilityVillageMappingID") + private Long facilityVillageMappingID; + + @Expose + @Column(name = "FacilityID") + private Integer facilityID; + + @Expose + @Column(name = "DistrictBranchID") + private Integer districtBranchID; + + @Expose + @Formula("(SELECT dbm.VillageName FROM m_DistrictBranchMapping dbm WHERE dbm.DistrictBranchID = {alias}.DistrictBranchID)") + private String villageName; + + @Expose + @Column(name = "Deleted", insertable = true, updatable = true) + private Boolean deleted = false; + + @Expose + @Column(name = "CreatedBy") + private String createdBy; + + @Expose + @Column(name = "CreatedDate", insertable = false, updatable = false) + private Timestamp createdDate; + + @Expose + @Column(name = "ModifiedBy") + private String modifiedBy; + + @Expose + @Column(name = "LastModDate", insertable = false, updatable = false) + private Timestamp lastModDate; + + @Transient + private OutputMapper outputMapper = new OutputMapper(); + + @Override + public String toString() { + return outputMapper.gson().toJson(this); + } +} diff --git a/src/main/java/com/iemr/admin/data/store/M_Facility.java b/src/main/java/com/iemr/admin/data/store/M_Facility.java index fdb575d..fc825b2 100644 --- a/src/main/java/com/iemr/admin/data/store/M_Facility.java +++ b/src/main/java/com/iemr/admin/data/store/M_Facility.java @@ -78,6 +78,18 @@ public class M_Facility { @Expose @Column(name="ProviderServiceMapID") private Integer providerServiceMapID; + @Expose + @Column(name="StateID") + private Integer stateID; + @Expose + @Column(name="DistrictID") + private Integer districtID; + @Expose + @Column(name="BlockID") + private Integer blockID; + @Expose + @Column(name="ParentFacilityID") + private Integer parentFacilityID; @Expose @Column(name="Deleted",insertable = false, updatable = true) @@ -204,6 +216,38 @@ public void setProviderServiceMapID(Integer providerServiceMapID) { this.providerServiceMapID = providerServiceMapID; } + public Integer getStateID() { + return stateID; + } + + public void setStateID(Integer stateID) { + this.stateID = stateID; + } + + public Integer getDistrictID() { + return districtID; + } + + public void setDistrictID(Integer districtID) { + this.districtID = districtID; + } + + public Integer getBlockID() { + return blockID; + } + + public void setBlockID(Integer blockID) { + this.blockID = blockID; + } + + public Integer getParentFacilityID() { + return parentFacilityID; + } + + public void setParentFacilityID(Integer parentFacilityID) { + this.parentFacilityID = parentFacilityID; + } + public Boolean getDeleted() { return deleted; } diff --git a/src/main/java/com/iemr/admin/data/store/M_FacilityLevel.java b/src/main/java/com/iemr/admin/data/store/M_FacilityLevel.java new file mode 100644 index 0000000..ef8de67 --- /dev/null +++ b/src/main/java/com/iemr/admin/data/store/M_FacilityLevel.java @@ -0,0 +1,88 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.admin.data.store; + +import java.sql.Date; + +import com.google.gson.annotations.Expose; +import com.iemr.admin.utils.mapper.OutputMapper; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; +import lombok.Data; + +@Entity +@Table(name = "m_facility_level") +@Data +public class M_FacilityLevel { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Expose + @Column(name = "FacilityLevelID") + private Integer facilityLevelID; + + @Expose + @Column(name = "LevelName") + private String levelName; + + @Expose + @Column(name = "LevelDescription") + private String levelDescription; + + @Expose + @Column(name = "LevelValue") + private Integer levelValue; + + @Expose + @Column(name = "Deleted", insertable = false, updatable = true) + private Boolean deleted; + + @Expose + @Column(name = "CreatedBy") + private String createdBy; + + @Expose + @Column(name = "CreatedDate", insertable = false, updatable = false) + private Date createdDate; + + @Expose + @Column(name = "ModifiedBy") + private String modifiedBy; + + @Expose + @Column(name = "LastModDate", insertable = false, updatable = false) + private Date lastModDate; + + @Transient + private OutputMapper outputMapper = new OutputMapper(); + + @Override + public String toString() { + return outputMapper.gson().toJson(this); + } +} diff --git a/src/main/java/com/iemr/admin/repository/facilitytype/M_FacilityLevelRepo.java b/src/main/java/com/iemr/admin/repository/facilitytype/M_FacilityLevelRepo.java new file mode 100644 index 0000000..0dd5d93 --- /dev/null +++ b/src/main/java/com/iemr/admin/repository/facilitytype/M_FacilityLevelRepo.java @@ -0,0 +1,36 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.admin.repository.facilitytype; + +import java.util.ArrayList; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.iemr.admin.data.store.M_FacilityLevel; + +@Repository +public interface M_FacilityLevelRepo extends CrudRepository { + + ArrayList findByDeletedFalseOrderByLevelName(); + +} diff --git a/src/main/java/com/iemr/admin/repository/facilitytype/M_facilitytypeRepo.java b/src/main/java/com/iemr/admin/repository/facilitytype/M_facilitytypeRepo.java index f4a2155..9c459c8 100644 --- a/src/main/java/com/iemr/admin/repository/facilitytype/M_facilitytypeRepo.java +++ b/src/main/java/com/iemr/admin/repository/facilitytype/M_facilitytypeRepo.java @@ -32,16 +32,29 @@ import com.iemr.admin.data.facilitytype.M_facilitytype; @Repository -public interface M_facilitytypeRepo extends CrudRepository{ +public interface M_facilitytypeRepo extends CrudRepository { - - @Query("SELECT u FROM M_facilitytype u WHERE u.providerServiceMapID=:providerServiceMapID order by u.facilityTypeName") ArrayList getAllFicilityData(@Param("providerServiceMapID") Integer providerServiceMapID); List findByFacilityTypeCodeAndProviderServiceMapID(String facilityTypeCode, Integer providerServiceMapID); - + M_facilitytype findByFacilityTypeID(Integer facilityTypeID); + @Query("SELECT f FROM M_facilitytype f WHERE f.providerServiceMapID=:psm AND f.ruralUrban=:ruralUrban AND f.deleted=false ORDER BY f.facilityTypeName") + List findByProviderServiceMapIDAndRuralUrban(@Param("psm") Integer psm, + @Param("ruralUrban") String ruralUrban); + + @Query("SELECT DISTINCT ft FROM M_facilitytype ft WHERE ft.facilityTypeID IN " + + "(SELECT DISTINCT f.facilityTypeID FROM com.iemr.admin.data.store.M_Facility f " + + "WHERE f.blockID = :blockID AND f.deleted = false) " + + "AND ft.deleted = false ORDER BY ft.facilityTypeName") + List findFacilityTypesByBlock(@Param("blockID") Integer blockID); + + @Query("SELECT f FROM M_facilitytype f WHERE f.stateID = :stateID AND f.deleted = false ORDER BY f.facilityTypeName") + List findByStateID(@Param("stateID") Integer stateID); + + boolean existsByFacilityTypeNameAndStateIDAndDeletedFalse(String facilityTypeName, Integer stateID); + } diff --git a/src/main/java/com/iemr/admin/repository/store/FacilityVillageMappingRepo.java b/src/main/java/com/iemr/admin/repository/store/FacilityVillageMappingRepo.java new file mode 100644 index 0000000..c1857f5 --- /dev/null +++ b/src/main/java/com/iemr/admin/repository/store/FacilityVillageMappingRepo.java @@ -0,0 +1,23 @@ +package com.iemr.admin.repository.store; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import com.iemr.admin.data.store.FacilityVillageMapping; + +@Repository +public interface FacilityVillageMappingRepo extends CrudRepository { + + ArrayList findByFacilityIDAndDeletedFalse(Integer facilityID); + + @Query("SELECT DISTINCT fvm.districtBranchID FROM FacilityVillageMapping fvm WHERE fvm.facilityID IN " + + "(SELECT f.facilityID FROM M_Facility f WHERE f.blockID = :blockID AND f.deleted = false) " + + "AND fvm.deleted = false") + List findMappedVillageIDsByBlockID(@Param("blockID") Integer blockID); + +} diff --git a/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java b/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java index 644a795..5cb0a0d 100644 --- a/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java +++ b/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.List; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; @@ -55,6 +56,19 @@ ArrayList getAllMainFacility(@Param("providerServiceMapID")Integer p List findByFacilityCodeAndProviderServiceMapID(String facilityCode, Integer providerServiceMapID); M_Facility findByFacilityID(Integer facilityID); - + + ArrayList findByBlockIDAndDeletedFalseOrderByFacilityName(Integer blockID); + + @Query("SELECT f FROM M_Facility f WHERE f.blockID = :blockID AND f.facilityTypeID IN " + + "(SELECT ft.facilityTypeID FROM M_facilitytype ft WHERE ft.facilityLevelID = :facilityLevelID " + + "AND ft.deleted = false) AND f.deleted = false AND f.parentFacilityID IS NULL ORDER BY f.facilityName") + ArrayList findByBlockIDAndFacilityLevel(@Param("blockID") Integer blockID, + @Param("facilityLevelID") Integer facilityLevelID); + + ArrayList findByParentFacilityIDAndDeletedFalseOrderByFacilityName(Integer parentFacilityID); + + @Modifying + @Query("UPDATE M_Facility f SET f.parentFacilityID = NULL, f.modifiedBy = :modifiedBy WHERE f.parentFacilityID = :parentFacilityID") + int clearParentFacilityID(@Param("parentFacilityID") Integer parentFacilityID, @Param("modifiedBy") String modifiedBy); } diff --git a/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeInter.java b/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeInter.java index bcb14d1..a3c8d3f 100644 --- a/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeInter.java +++ b/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeInter.java @@ -38,4 +38,14 @@ public interface M_facilitytypeInter { Boolean checkFacilityTypeCode(M_facilitytype manufacturer); + ArrayList getFacilityTypesByRuralUrban(Integer providerServiceMapID, String ruralUrban); + + ArrayList getFacilityLevels(); + + ArrayList getFacilityTypesByBlock(Integer blockID); + + ArrayList getFacilityTypesByState(Integer stateID); + + boolean checkFacilityTypeNameExists(String facilityTypeName, Integer stateID); + } diff --git a/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeServiceImpl.java b/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeServiceImpl.java index 17bb0d7..1188c3b 100644 --- a/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeServiceImpl.java @@ -28,46 +28,76 @@ import org.springframework.stereotype.Service; import com.iemr.admin.data.facilitytype.M_facilitytype; -import com.iemr.admin.data.manufacturer.M_Manufacturer; +import com.iemr.admin.data.store.M_FacilityLevel; +import com.iemr.admin.repository.facilitytype.M_FacilityLevelRepo; import com.iemr.admin.repository.facilitytype.M_facilitytypeRepo; @Service -public class M_facilitytypeServiceImpl implements M_facilitytypeInter{ +public class M_facilitytypeServiceImpl implements M_facilitytypeInter { @Autowired private M_facilitytypeRepo m_facilitytypeRepo; + @Autowired + private M_FacilityLevelRepo m_facilityLevelRepo; + @Override public ArrayList getAllFicilityData(Integer providerServiceMapID) { - ArrayList data=m_facilitytypeRepo.getAllFicilityData(providerServiceMapID); + ArrayList data = m_facilitytypeRepo.getAllFicilityData(providerServiceMapID); return data; } + @Override + public ArrayList getFacilityTypesByRuralUrban(Integer providerServiceMapID, String ruralUrban) { + return new ArrayList<>(m_facilitytypeRepo.findByProviderServiceMapIDAndRuralUrban(providerServiceMapID, ruralUrban)); + } + @Override public ArrayList addAllFicilityData(List addfacilityDetails) { - ArrayList data=(ArrayList) m_facilitytypeRepo.saveAll(addfacilityDetails); + ArrayList data = (ArrayList) m_facilitytypeRepo.saveAll(addfacilityDetails); return data; } @Override public M_facilitytype editAllFicilityData(Integer facilityTypeID) { - M_facilitytype data=m_facilitytypeRepo.findByFacilityTypeID(facilityTypeID); + M_facilitytype data = m_facilitytypeRepo.findByFacilityTypeID(facilityTypeID); return data; } @Override public M_facilitytype updateFacilityData(M_facilitytype allFacilityData) { - M_facilitytype data=m_facilitytypeRepo.save(allFacilityData); + M_facilitytype data = m_facilitytypeRepo.save(allFacilityData); return data; } @Override public Boolean checkFacilityTypeCode(M_facilitytype manufacturer) { // TODO Auto-generated method stub - List manuList=m_facilitytypeRepo.findByFacilityTypeCodeAndProviderServiceMapID(manufacturer.getFacilityTypeCode() ,manufacturer.getProviderServiceMapID()); - if(manuList.size()>0) + List manuList = m_facilitytypeRepo.findByFacilityTypeCodeAndProviderServiceMapID( + manufacturer.getFacilityTypeCode(), manufacturer.getProviderServiceMapID()); + if (manuList.size() > 0) return true; return false; } + @Override + public ArrayList getFacilityLevels() { + return m_facilityLevelRepo.findByDeletedFalseOrderByLevelName(); + } + + @Override + public ArrayList getFacilityTypesByBlock(Integer blockID) { + return new ArrayList<>(m_facilitytypeRepo.findFacilityTypesByBlock(blockID)); + } + + @Override + public ArrayList getFacilityTypesByState(Integer stateID) { + return new ArrayList<>(m_facilitytypeRepo.findByStateID(stateID)); + } + + @Override + public boolean checkFacilityTypeNameExists(String facilityTypeName, Integer stateID) { + return m_facilitytypeRepo.existsByFacilityTypeNameAndStateIDAndDeletedFalse(facilityTypeName, stateID); + } + } diff --git a/src/main/java/com/iemr/admin/service/store/StoreService.java b/src/main/java/com/iemr/admin/service/store/StoreService.java index 3c0edd2..2768781 100644 --- a/src/main/java/com/iemr/admin/service/store/StoreService.java +++ b/src/main/java/com/iemr/admin/service/store/StoreService.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.List; +import com.iemr.admin.data.store.FacilityVillageMapping; import com.iemr.admin.data.store.M_Facility; import com.iemr.admin.data.store.M_facilityMap; import com.iemr.admin.data.store.V_FetchFacility; @@ -54,9 +55,19 @@ public interface StoreService { List getMapStore(V_FetchFacility facilitymap); Boolean checkStoreCode(M_Facility manufacturer); - - - - + ArrayList getFacilitiesByBlock(Integer blockID); + + ArrayList getFacilitiesByBlockAndLevel(Integer blockID, Integer facilityLevelID); + + M_Facility createFacilityWithHierarchy(M_Facility facility, List villageIDs, List childFacilityIDs); + + List getMappedVillageIDs(Integer blockID); + + ArrayList getVillageMappingsByFacility(Integer facilityID); + + ArrayList getChildFacilitiesByParent(Integer parentFacilityID); + + M_Facility updateFacilityWithHierarchy(M_Facility facility, List villageIDs, List childFacilityIDs); + } diff --git a/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java b/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java index da1bba8..7ea3b42 100644 --- a/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java @@ -26,14 +26,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.iemr.admin.data.facilitytype.M_facilitytype; import com.iemr.admin.data.parkingPlace.M_Parkingplace; +import com.iemr.admin.data.store.FacilityVillageMapping; import com.iemr.admin.data.store.M_Facility; import com.iemr.admin.data.store.M_facilityMap; import com.iemr.admin.data.store.V_FetchFacility; import com.iemr.admin.data.vanMaster.M_Van; import com.iemr.admin.repository.parkingPlace.ParkingPlaceRepository; +import com.iemr.admin.repository.store.FacilityVillageMappingRepo; import com.iemr.admin.repository.store.MainStoreRepo; import com.iemr.admin.repository.store.V_FetchFacilityRepo; import com.iemr.admin.repository.vanMaster.VanMasterRepository; @@ -54,6 +57,9 @@ public class StoreServiceImpl implements StoreService { @Autowired private V_FetchFacilityRepo fetchFacilityRepo; + @Autowired + private FacilityVillageMappingRepo facilityVillageMappingRepo; + // @Autowired // private SubStoreRepo subStoreRepo; @@ -233,4 +239,107 @@ public Boolean checkStoreCode(M_Facility manufacturer) { return false; } + @Override + public ArrayList getFacilitiesByBlock(Integer blockID) { + return mainStoreRepo.findByBlockIDAndDeletedFalseOrderByFacilityName(blockID); + } + + @Override + public ArrayList getFacilitiesByBlockAndLevel(Integer blockID, Integer facilityLevelID) { + return mainStoreRepo.findByBlockIDAndFacilityLevel(blockID, facilityLevelID); + } + + @Transactional + @Override + public M_Facility createFacilityWithHierarchy(M_Facility facility, List villageIDs, + List childFacilityIDs) { + M_Facility savedFacility = mainStoreRepo.save(facility); + + if (villageIDs != null && !villageIDs.isEmpty()) { + for (Integer villageID : villageIDs) { + FacilityVillageMapping mapping = new FacilityVillageMapping(); + mapping.setFacilityID(savedFacility.getFacilityID()); + mapping.setDistrictBranchID(villageID); + mapping.setCreatedBy(facility.getCreatedBy()); + mapping.setDeleted(false); + facilityVillageMappingRepo.save(mapping); + } + } + + if (childFacilityIDs != null && !childFacilityIDs.isEmpty()) { + for (Integer childID : childFacilityIDs) { + M_Facility child = mainStoreRepo.findByFacilityID(childID); + if (child != null) { + child.setParentFacilityID(savedFacility.getFacilityID()); + child.setModifiedBy(facility.getCreatedBy()); + mainStoreRepo.save(child); + } + } + } + + return savedFacility; + } + + @Override + public List getMappedVillageIDs(Integer blockID) { + return facilityVillageMappingRepo.findMappedVillageIDsByBlockID(blockID); + } + + @Override + public ArrayList getVillageMappingsByFacility(Integer facilityID) { + return facilityVillageMappingRepo.findByFacilityIDAndDeletedFalse(facilityID); + } + + @Override + public ArrayList getChildFacilitiesByParent(Integer parentFacilityID) { + return mainStoreRepo.findByParentFacilityIDAndDeletedFalseOrderByFacilityName(parentFacilityID); + } + + @Transactional + @Override + public M_Facility updateFacilityWithHierarchy(M_Facility facility, List villageIDs, + List childFacilityIDs) { + M_Facility existing = mainStoreRepo.findByFacilityID(facility.getFacilityID()); + if (existing == null) { + throw new RuntimeException("Facility not found"); + } + + existing.setFacilityName(facility.getFacilityName()); + existing.setFacilityDesc(facility.getFacilityDesc()); + existing.setModifiedBy(facility.getModifiedBy()); + M_Facility savedFacility = mainStoreRepo.save(existing); + + if (villageIDs != null) { + List oldMappings = facilityVillageMappingRepo + .findByFacilityIDAndDeletedFalse(facility.getFacilityID()); + for (FacilityVillageMapping old : oldMappings) { + old.setDeleted(true); + old.setModifiedBy(facility.getModifiedBy()); + facilityVillageMappingRepo.save(old); + } + for (Integer villageID : villageIDs) { + FacilityVillageMapping mapping = new FacilityVillageMapping(); + mapping.setFacilityID(savedFacility.getFacilityID()); + mapping.setDistrictBranchID(villageID); + mapping.setCreatedBy(facility.getModifiedBy()); + mapping.setDeleted(false); + facilityVillageMappingRepo.save(mapping); + } + } + + if (childFacilityIDs != null) { + mainStoreRepo.clearParentFacilityID(facility.getFacilityID(), facility.getModifiedBy()); + for (Integer childID : childFacilityIDs) { + M_Facility child = mainStoreRepo.findByFacilityID(childID); + if (child != null) { + child.setParentFacilityID(savedFacility.getFacilityID()); + child.setModifiedBy(facility.getModifiedBy()); + mainStoreRepo.save(child); + } + } + } + + return savedFacility; + } + } From c701ce9f923b33b2ac4bbf980a73bfbe6d34a1fd Mon Sep 17 00:00:00 2001 From: Vishwanath Balkur <118195001+vishwab1@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:23:28 +0530 Subject: [PATCH 57/61] fix: facility hierarchy and facility type management (#125) * fix:changed the pom xml * fix: added facilty type master change * feat: created facility creation * feat:added work location * feat:added work location * fix: rabiit review fix * fix: rabiit review fix * fix: rabiit review fix * fix: ui chnges * fix: pom version * fix: corrections * fix: facilty hierachy * fix: facility heirachy * fix: remove logs folder from repository Co-Authored-By: Claude Opus 4.6 (1M context) * fix: add logs/ to .gitignore Co-Authored-By: Claude Opus 4.6 (1M context) --------- Co-authored-by: Claude Opus 4.6 (1M context) --- .gitignore | 5 +- logs/admin-api.log.json | 163 ------------ logs/admin-api.log.json.2025-06-13.gz | Bin 4051 -> 0 bytes .../AshaSupervisorMappingController.java | 234 ++++++++++++++++++ .../EmployeeMasterController.java | 30 +++ .../facilitytype/FacilitytypeController.java | 25 +- .../controller/store/StoreController.java | 39 ++- .../employeemaster/AshaSupervisorMapping.java | 107 ++++++++ .../M_UserServiceRoleMapping2.java | 9 + .../V_Userservicerolemapping.java | 18 +- .../data/facilitytype/M_facilitytype.java | 22 +- .../data/store/FacilityHierarchyRequest.java | 3 + .../com/iemr/admin/data/store/M_Facility.java | 24 ++ .../employeemaster/EmployeeMasterRepo.java | 29 +++ .../facilitytype/M_facilitytypeRepo.java | 4 + .../store/FacilityVillageMappingRepo.java | 2 + .../admin/repository/store/MainStoreRepo.java | 57 +++-- .../user/AshaSupervisorMappingRepo.java | 73 ++++++ .../AshaSupervisorMappingService.java | 57 +++++ .../AshaSupervisorMappingServiceImpl.java | 206 +++++++++++++++ .../employeemaster/EmployeeMasterInter.java | 6 + .../EmployeeMasterServiceImpl.java | 222 +++++++++++++++++ .../M_facilitytypeServiceImpl.java | 6 + .../store/FacilityHierarchyService.java | 5 + .../store/FacilityHierarchyServiceImpl.java | 0 .../admin/service/store/StoreService.java | 10 +- .../admin/service/store/StoreServiceImpl.java | 168 +++++++++++-- .../to/employeemaster/Previleges1097_3.java | 27 +- 28 files changed, 1323 insertions(+), 228 deletions(-) delete mode 100644 logs/admin-api.log.json delete mode 100644 logs/admin-api.log.json.2025-06-13.gz create mode 100644 src/main/java/com/iemr/admin/controller/employeemaster/AshaSupervisorMappingController.java create mode 100644 src/main/java/com/iemr/admin/data/employeemaster/AshaSupervisorMapping.java create mode 100644 src/main/java/com/iemr/admin/repository/user/AshaSupervisorMappingRepo.java create mode 100644 src/main/java/com/iemr/admin/service/employeemaster/AshaSupervisorMappingService.java create mode 100644 src/main/java/com/iemr/admin/service/employeemaster/AshaSupervisorMappingServiceImpl.java create mode 100644 src/main/java/com/iemr/admin/service/store/FacilityHierarchyService.java create mode 100644 src/main/java/com/iemr/admin/service/store/FacilityHierarchyServiceImpl.java diff --git a/.gitignore b/.gitignore index 39d476c..c9a2255 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,7 @@ mvnw.cmd # Properties src/main/environment/admin_local.properties -node_modules \ No newline at end of file +node_modules + +# Logs +logs/ \ No newline at end of file diff --git a/logs/admin-api.log.json b/logs/admin-api.log.json deleted file mode 100644 index fbb9ba9..0000000 --- a/logs/admin-api.log.json +++ /dev/null @@ -1,163 +0,0 @@ -{"@timestamp":"2025-06-17T03:30:48.217Z", "log.level": "INFO", "message":"Starting RoleMasterApplication using Java 17.0.15 with PID 46435 (/home/navadhiti/Documents/Amrit_Repo_original/final/Admin-API/target/classes started by navadhiti in /home/navadhiti/Documents/Amrit_Repo_original/final/Admin-API)", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"com.iemr.admin.RoleMasterApplication"} -{"@timestamp":"2025-06-17T03:30:48.218Z", "log.level":"DEBUG", "message":"Running with Spring Boot v3.2.2, Spring v6.1.3", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"com.iemr.admin.RoleMasterApplication"} -{"@timestamp":"2025-06-17T03:30:48.219Z", "log.level": "INFO", "message":"The following 1 profile is active: \"test\"", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"com.iemr.admin.RoleMasterApplication"} -{"@timestamp":"2025-06-17T03:30:48.261Z", "log.level": "INFO", "message":"Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.devtools.env.DevToolsPropertyDefaultsPostProcessor"} -{"@timestamp":"2025-06-17T03:30:48.262Z", "log.level": "INFO", "message":"For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.devtools.env.DevToolsPropertyDefaultsPostProcessor"} -{"@timestamp":"2025-06-17T03:30:49.095Z", "log.level": "INFO", "message":"Multiple Spring Data modules found, entering strict repository configuration mode", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationDelegate"} -{"@timestamp":"2025-06-17T03:30:49.096Z", "log.level": "INFO", "message":"Bootstrapping Spring Data JPA repositories in DEFAULT mode.", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationDelegate"} -{"@timestamp":"2025-06-17T03:30:49.491Z", "log.level": "INFO", "message":"Finished Spring Data repository scanning in 388 ms. Found 119 JPA repository interfaces.", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationDelegate"} -{"@timestamp":"2025-06-17T03:30:49.518Z", "log.level": "INFO", "message":"Multiple Spring Data modules found, entering strict repository configuration mode", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationDelegate"} -{"@timestamp":"2025-06-17T03:30:49.519Z", "log.level": "INFO", "message":"Bootstrapping Spring Data Redis repositories in DEFAULT mode.", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationDelegate"} -{"@timestamp":"2025-06-17T03:30:49.542Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.VanSpokeMappingRepo.VanSpokeMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.542Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.DrugStrangthRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.542Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.MProviderservicemappingBlockingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.543Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.MServiceproviderBlockingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.543Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.MStatusRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.543Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.M_ServicemasterForBlockingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.543Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.T_ProviderservicemappingdetailRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.543Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.T_ServiceproviderdetailRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.543Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.T_UserDetailRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.544Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.UserBlockingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.544Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.blocking.V_ShowproviderservicemappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.544Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.calibration.CalibrationAPIRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.544Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.calibration.CalibrationRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.545Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.drugtype.DrugtypeRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.545Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.EmployeeMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.545Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.EmployeeMasterRepoo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.545Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.EmployeeSignatureRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.545Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_CommunityRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.546Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_DesignationRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.546Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_GenderRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.546Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_LanguageRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.546Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_ProviderServiceMap1Repo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.546Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_QualificationRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.547Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_ReligionRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.547Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_TitleRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.547Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_UserDemographicsRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.547Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.M_UserLangMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.548Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.RoleRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.548Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.Showofficedetails1Repo1; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.548Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.ShowuserdetailsfromuserservicerolemappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.548Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.USRAgentMappingRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.548Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.V_ShowuserRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.548Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.employeemaster.V_UserservicerolemappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.549Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.foetalmonitormaster.FoetalMonitorDeviceIDRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.549Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.foetalmonitormaster.FoetalMonitorRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.549Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.labmodule.ComponentMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.549Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.labmodule.ComponentResultMapRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.549Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.labmodule.IOTRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.549Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.labmodule.ProcedureComponentMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.550Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.labmodule.ProcedureMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.550Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.locationmaster.DistrictBlockRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.550Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.locationmaster.DistrictBranchMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.550Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.locationmaster.LocationMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.550Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.locationmaster.M_ProviderServiceAddMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.550Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.locationmaster.MdistrictRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.550Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.locationmaster.ShowofficedetailsRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.551Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.manufacturer.ManufacturerRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.551Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.pharmacologicalcategory.PharmacologicalcategoryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.551Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.questionnaire.QuestionnaireRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.551Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.questionnaire.QuestionnaireValuesRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.551Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.stockEntry.ItemStockEntryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.551Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.stockEntry.PhysicalStockEntryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.551Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.stockExit.ItemStockExitRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.552Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.stockExit.PatientIssueRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.552Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.supplier.SupplierRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.552Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.telemedicine.SpecializationRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.552Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.telemedicine.UserRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.552Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.telemedicine.UserSpecializationMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.553Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.telemedicine.UserVideoConsultationRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.553Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.telemedicine.VideoConsultationDomainRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.553Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repo.uom.UomRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.553Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.emailconfig.InstituteEmailRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.553Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.facilitytype.M_facilitytypeRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.554Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.item.ItemCategoryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.554Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.item.ItemFormRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.554Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.item.ItemRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.554Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.item.RouteRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.554Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.itemfacilitymapping.M_itemfacilitymappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.555Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.itemfacilitymapping.V_fetchItemFacilityMapRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.555Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.parkingPlace.ParkingPlaceRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.555Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.parkingPlace.ParkingPlaceTalukMappingRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.555Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.CalltypeRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.555Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.CategoryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.555Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.DrugGroupRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.556Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.DrugMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.556Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.DrugMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.556Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.IemrServiceRepository1; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.556Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.InstuteDirectoryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.556Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_FeedbacknatureRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.556Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_FeedbacktypeRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.556Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_InstitutedirectorymappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.557Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_InstitutesubdirectoryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.557Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_InstitutionRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.557Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_InstitutiontypeRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.557Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_ProviderServiceMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.557Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_ServiceMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.557Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_SeverityRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.558Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_SubservicemasterPArepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.558Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.M_UserservicerolemappingForRoleRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.558Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.SubCategoryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.558Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.SubserviceMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.558Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.V_ShowprovideradminRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.559Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.provideronboard.V_ShowsubcategoryRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.559Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.rolemaster.M_RoleRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.559Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.rolemaster.M_ScreenRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.559Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.rolemaster.M_UserservicerolemappingForRoleProviderAdminRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.559Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.rolemaster.RoleMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.559Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.rolemaster.RoleScreenMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.559Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.rolemaster.StateMasterRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.559Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.servicePoint.ServicePointRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.560Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.servicePoint.ServicePointVillageMapRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.560Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.snomedRepo.SnomedImmunizationRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.560Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.snomedRepo.SnomedMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.560Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.snomedRepo.SnomedVaccinationRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.560Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.store.MainStoreRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.560Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.store.V_FetchFacilityRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.560Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.uptsu.CDSSMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.560Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.uptsu.FacilityRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.561Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.user.IemrUserRepositoryImplCustom; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.561Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.user.M_UserMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.561Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.user.UserLoginRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.561Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.userParkingPlaceMap.UserParkingPlaceMapRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.561Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.userParkingPlaceMap.UserVanMappingRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.561Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.vanMaster.VanMasterRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.561Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.vanServicePointMapping.VanServicePointMappingRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.562Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.vanType.VanTypeRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.562Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.villageMaster.VillageMasterRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.562Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.zonemaster.ZoneDistrictMappingRepo; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.562Z", "log.level": "INFO", "message":"Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.iemr.admin.repository.zonemaster.ZoneMasterRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport"} -{"@timestamp":"2025-06-17T03:30:49.562Z", "log.level": "INFO", "message":"Finished Spring Data repository scanning in 35 ms. Found 0 Redis repository interfaces.", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.repository.config.RepositoryConfigurationDelegate"} -{"@timestamp":"2025-06-17T03:30:50.339Z", "log.level": "INFO", "message":"Tomcat initialized with port 8082 (http)", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer"} -{"@timestamp":"2025-06-17T03:30:50.350Z", "log.level": "INFO", "message":"Starting service [Tomcat]", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.apache.catalina.core.StandardService"} -{"@timestamp":"2025-06-17T03:30:50.351Z", "log.level": "INFO", "message":"Starting Servlet engine: [Apache Tomcat/10.1.18]", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.apache.catalina.core.StandardEngine"} -{"@timestamp":"2025-06-17T03:30:50.402Z", "log.level": "INFO", "message":"Initializing Spring embedded WebApplicationContext", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]"} -{"@timestamp":"2025-06-17T03:30:50.403Z", "log.level": "INFO", "message":"Root WebApplicationContext: initialization completed in 2140 ms", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext"} -{"@timestamp":"2025-06-17T03:30:50.769Z", "log.level": "INFO", "message":"HHH000204: Processing PersistenceUnitInfo [name: default]", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.hibernate.jpa.internal.util.LogHelper"} -{"@timestamp":"2025-06-17T03:30:50.811Z", "log.level": "INFO", "message":"HHH000412: Hibernate ORM core version 6.4.1.Final", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.hibernate.Version"} -{"@timestamp":"2025-06-17T03:30:50.840Z", "log.level": "INFO", "message":"HHH000026: Second-level cache disabled", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.hibernate.cache.internal.RegionFactoryInitiator"} -{"@timestamp":"2025-06-17T03:30:51.015Z", "log.level": "INFO", "message":"No LoadTimeWeaver setup: ignoring JPA class transformer", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo"} -{"@timestamp":"2025-06-17T03:30:51.034Z", "log.level": "INFO", "message":"HikariPool-1 - Starting...", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"com.zaxxer.hikari.HikariDataSource"} -{"@timestamp":"2025-06-17T03:30:51.242Z", "log.level": "INFO", "message":"HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@23feca34", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"com.zaxxer.hikari.pool.HikariPool"} -{"@timestamp":"2025-06-17T03:30:51.242Z", "log.level": "INFO", "message":"HikariPool-1 - Start completed.", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"com.zaxxer.hikari.HikariDataSource"} -{"@timestamp":"2025-06-17T03:30:51.284Z", "log.level": "WARN", "message":"HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.hibernate.orm.deprecation"} -{"@timestamp":"2025-06-17T03:30:53.490Z", "log.level": "INFO", "message":"HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator"} -{"@timestamp":"2025-06-17T03:30:53.492Z", "log.level": "INFO", "message":"Initialized JPA EntityManagerFactory for persistence unit 'default'", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"} -{"@timestamp":"2025-06-17T03:30:53.663Z", "log.level": "INFO", "message":"Hibernate is in classpath; If applicable, HQL parser will be used.", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.data.jpa.repository.query.QueryEnhancerFactory"} -{"@timestamp":"2025-06-17T03:30:54.761Z", "log.level": "INFO", "message":"Autowired annotation is not supported on static fields: private static java.lang.Boolean com.iemr.admin.utils.config.ConfigProperties.extendExpiryTime", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"} -{"@timestamp":"2025-06-17T03:30:54.762Z", "log.level": "INFO", "message":"Autowired annotation is not supported on static fields: private static java.lang.Integer com.iemr.admin.utils.config.ConfigProperties.sessionExpiryTime", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"} -{"@timestamp":"2025-06-17T03:30:54.762Z", "log.level": "INFO", "message":"Autowired annotation is not supported on static fields: private static java.lang.String com.iemr.admin.utils.config.ConfigProperties.redisurl", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"} -{"@timestamp":"2025-06-17T03:30:54.762Z", "log.level": "INFO", "message":"Autowired annotation is not supported on static fields: private static java.lang.Integer com.iemr.admin.utils.config.ConfigProperties.redisport", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"} -{"@timestamp":"2025-06-17T03:30:56.178Z", "log.level": "WARN", "message":"spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration$JpaWebConfiguration"} -{"@timestamp":"2025-06-17T03:30:56.680Z", "log.level": "INFO", "message":"LiveReload server is running on port 35729", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.devtools.autoconfigure.OptionalLiveReloadServer"} -{"@timestamp":"2025-06-17T03:30:56.712Z", "log.level": "INFO", "message":"Tomcat started on port 8082 (http) with context path ''", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer"} -{"@timestamp":"2025-06-17T03:30:56.722Z", "log.level": "INFO", "message":"Started RoleMasterApplication in 9.035 seconds (process running for 9.391)", "ecs.version": "1.2.0","process.thread.name":"restartedMain","log.logger":"com.iemr.admin.RoleMasterApplication"} -{"@timestamp":"2025-06-17T03:33:01.594Z", "log.level": "INFO", "message":"Initializing Spring DispatcherServlet 'dispatcherServlet'", "ecs.version": "1.2.0","process.thread.name":"http-nio-8082-exec-1","log.logger":"org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]"} -{"@timestamp":"2025-06-17T03:33:01.594Z", "log.level": "INFO", "message":"Initializing Servlet 'dispatcherServlet'", "ecs.version": "1.2.0","process.thread.name":"http-nio-8082-exec-1","log.logger":"org.springframework.web.servlet.DispatcherServlet"} -{"@timestamp":"2025-06-17T03:33:01.596Z", "log.level": "INFO", "message":"Completed initialization in 1 ms", "ecs.version": "1.2.0","process.thread.name":"http-nio-8082-exec-1","log.logger":"org.springframework.web.servlet.DispatcherServlet"} -{"@timestamp":"2025-06-17T03:33:01.598Z", "log.level": "INFO", "message":"OPTIONS request - skipping JWT validation", "ecs.version": "1.2.0","process.thread.name":"http-nio-8082-exec-1","log.logger":"com.iemr.admin.utils.JwtUserIdValidationFilter"} -{"@timestamp":"2025-06-17T03:33:14.017Z", "log.level": "WARN", "message":"Origin [http://localhost:4208] is NOT allowed. CORS headers NOT added.", "ecs.version": "1.2.0","process.thread.name":"http-nio-8082-exec-2","log.logger":"com.iemr.admin.utils.JwtUserIdValidationFilter"} -{"@timestamp":"2025-06-17T03:33:14.018Z", "log.level": "INFO", "message":"OPTIONS request - skipping JWT validation", "ecs.version": "1.2.0","process.thread.name":"http-nio-8082-exec-2","log.logger":"com.iemr.admin.utils.JwtUserIdValidationFilter"} -{"@timestamp":"2025-06-17T03:33:18.540Z", "log.level": "INFO", "message":"Closing JPA EntityManagerFactory for persistence unit 'default'", "ecs.version": "1.2.0","process.thread.name":"SpringApplicationShutdownHook","log.logger":"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"} -{"@timestamp":"2025-06-17T03:33:18.542Z", "log.level": "INFO", "message":"HikariPool-1 - Shutdown initiated...", "ecs.version": "1.2.0","process.thread.name":"SpringApplicationShutdownHook","log.logger":"com.zaxxer.hikari.HikariDataSource"} -{"@timestamp":"2025-06-17T03:33:18.545Z", "log.level": "INFO", "message":"HikariPool-1 - Shutdown completed.", "ecs.version": "1.2.0","process.thread.name":"SpringApplicationShutdownHook","log.logger":"com.zaxxer.hikari.HikariDataSource"} diff --git a/logs/admin-api.log.json.2025-06-13.gz b/logs/admin-api.log.json.2025-06-13.gz deleted file mode 100644 index db2d7d84d947b13115a386925b475bf82684d6c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4051 zcmV;^4=nH>iwFP!00000|LvV^QzJJLfWP0b&{0>#rfLzk0b{r?@nQ(9<^F6jr8x0Z=Fh{bt1_&4mVnj z*4|d5z17^gYBmmc_78V<`Od-KKQ~^p4Q<9;%c;~Ghiv2Q`;#B=Bs^-xSi++NCvvCK zF}pNcUI^=C-pw+tBH@%tSz+_k2Me4&31#m+Mbw1Zl`ch zJW)<<_e@kIGIe&lo8-#fT*}Pcm|TrjD)jcq|90a6}D4{$g7EDBcrvsLy?*c@;p*nGG&>FoSMo*_Vb2=lz!e= zS4npdT6HAt$*D6&TNE*qxtp#P21zHfyI}#L`)T&tK%u44ioddu&tE=U^IXt(yECtl3uZ5dI zD{-%Gjk|!?s|>1GWk!0!36_|+&|r{9rby%03{0)`7p==xJE)^IG{B$?k!7fsRn@)icbEEs8j9^# z@A#zq{`|_Thlj17PNSA}J5i~!6R3!*s#(FtMxt!hKs(^9u*7n9g0Qh>^WeS?XK)YT zHxi(l(3RJ!1s7Gx`&!#+{IM!|DWO^Xsw?GQJ$L^TooulqQ|Oqb;7(dGk{T*o3}~ql zR8h#3WZ;;qaf;41keA=XOr)^_spPVLvIkxi-p#K?I>^i|xKqAlE`Q_P-`UxS%}l}W z1f=CAt0m@Joj$ir)LtRV_rq|$LVsbpq^&A*k4Tj9||_B(|I zX+b&VlKW&&g`KchSuRI1hil)whDVpl%a2ZiLLl{JQY)^kn`QH?_}nc;_?;Zw%Gp%t zLauW24>`NWb4zg6joo9^1mU@ZZD4;Hvb)DpD;QH#uy(@WHb zMeX&?U}EmFM;%|Hm?&OriX)-bu#}D;E&q4>XM`@H8zQ>IEpgk~t2HI_&*3)Ci!qj< zpW}dkh*%tmW`r)G8y31fX}#U0I0M1!;jQ(Z*_y!n9h5co*NEHDxIGu?xPTlHxkPSQijtzYcVXhx8O%6$)JF-Q%4_h61gFgdns+9F(^Us61;)Hd-lT>(Mq%iLaW~hFD`Pq z;w@0~9!SMCIXOW=kC?k98G319+vtpQF%TEInIUJ~r? z$^nr}z|MBz0Gx5CEJpWQa-a(>ND4^lp>d{gOMDYJR z!E3y!=I;>f3&Rq}#Bl%|!+WCJ^ae%mN99(` zE*ufJ#BCtl_CZ8=(V4Xct;<8$t~s_KiB>pjQT-ueiP%nijrW0dQp*HVi&QH4Ad`_2 zTK!6^RTH~`vHPADCm~{kBlf<mGx%Va^PKnb_dwq9;t;CjKQ*|Z#S!w~V!pUPiNdObT0RRk_l~!(sWyvpYRu73_ zA~*nom6M4d2|l7Jyu@vQ+@6@6++AW8m|fpZU>`C|yb`aW@Oo*WPe#BJuz>(O?}JsV z`a`emk+Z}z@f;}6*Eb{SqKS8Xt4p+IF996}(3!|@A@RP3+jxKFV5tbAm?#dF;wvbS zTiVu*h`vws{`zh=KPS3c)XbzqBl4IZ39V@mgYXR&UmD9Ge1pZemlxyja#K*Rj`$6g zUz)g11cy#AEl^DW2MX{R+*Pemy;Mb$Kqinw139%gDY&O{89D0G5yoL+d~tIkWjqwo zZ7Oi(U&5F$?(8?i#h9YQ1aYtsFTOR3=WYef3nHSw3ZiW>jLBCfn!gH~Y1s&3_$y$T zd}ZP|SdJg;cSz%Ug!2ODR(LosFs8vhqBvlRLFvj-503y26yRcLOG{jC>e=t+gfgKV zBFebhWyNxCw5%e@CnmpyBQnrLb%0cZd8Rq^L~z&yTk7f&#(`seeS^E*&(HeXiDV+V zv%eE2$+j5MUg5-XKpdBSI&>kRuSZ=v;xWJf|j+F-pw`{_k0m6lt}AGkF%oaEJ_3ua58y7~g9VMJgo=Ob7>qFuskW z(gygCs3mHHq4xUb1oxzw??*%I61xGgTV&1_{HQk=kh4qNF1XzbgWFYOOQAACHw<*G z%>CNLIIU+X{8^IeqXLpjh+$$l1cu9rY2-H$xPgI-*q)m)O_wBSgMoH+i$yTGp5X`Q z$O|T>gJ=3$q_lY`;rsyS_PXOdMQr_y%Io<*;+OahiQm;(Xq5>@m>)S!WE0tQviAcZ z`wEH?QNF6yASQN+-7wglPX;bMi`66Im^coG<6ogUH9lcyNv-AUro*1patt-Aj_%rg zzf^8&W^~66osAc>xkBCO~@fiE5OzmG!FR#c%G?5%$4th>SX+$9XG!}VWMFi@} z)@jt+r*tkGzFbQO)^Ds*dB}e1`mC^0)a_=2H+i%3(jp)G+|-n~T`SsiHmBH2T^fTq zO$-3)W|>xzuS`(09GK@9k{MHj`(^${Sjp#%@t?Gbgq|3S|F{2DR~NO6;w4n4$7McT z)^>jy+vg1U03CsWZ0+o~z(l@aeYYi^X#FsIyux)+;U6ir8j9NIJFQyV;+&qIHX4mq zWA~8tOUV$MKFST=NE*rapsllXWY|wA>LH8eNEG@xOvFSDWuAhG=N~e`eN&VQ%?qbA zKR4r3sk3_a4}|a3T9dRCez(~=WT*4Q*$;eO zS`&dw0UNFMA(%lREZ*`rgP)2P5E_3m)G~ffseDSy!n~AYNZ~~IofJ!h1^?>F+}^F# zsC{qPxe@UdyzNIRKqhG2T#-S&AE(9}#kc(~i!^xg%;h4r;KL`7^JlN}kc=lgTUM?D zG{8$!{YaIosg`$B)pdnfN4mnKHVi1Mu_f zHS_!YVE0SJ>iWhGNKa)nx9&Wd*<`;aMrx$sSboHIQ#t6q7rsr~TpFdge8VPtmCM9TrSF-7DxhY%8JY|4ID(_bl!Fd| z*8bHJpMf_IXY)qz8TtjwOrp7nC3LRK#=nMAcN@IDR}Yx7;p-e6GBB5KuevPL!l5B# zVk(rzW`Vr|MXYMg8%yD94*vjMxA`NRsC$|EXYRcUt^T;|y*;a@O3(f`^S5k$-a65* zPJT|?gL-Y(@}|yKI+EDR9Am^~b|F%@oL8-$j~T7B0Sp@fwpk&y`Eu>hIlA8q-~6$x zzLBCPcb!(Pwt4AgDU0s5Z-q1ACO+0BN>>*+dd*JXowH2fB9)5@SlB1GWxpAgK>e(Q zCVnX-{Jz8A<8&gR)aELxqn;)|*sIlp>lV)3sT|;0#^X>^J``Doj^G-cvv@6HVCZyg z55aV)DJr!({Q>GQ*8&>%H_#+N89t0bqDyV(@s={m(l4!_l9rcoyW@|U%4g_By+CIO z@@V;})F@xd&KC;lF3us7edse*y_I?u_|GeWGqiy+|GW~g*bT$5Ar-+B6v4oGum7`3 zz(=}^{24lY|3`}dBKE!JeULnS)$j1#$2Ld#)X6P#=35<5M7pKYt*MfCsQuEhTJ<_P zyPC*cf*S$tB(_#VVI{*R3deR5F~i0Z)am=RF^db2zkgp2hF$uk*zwXoj;c62y3dd2 z101|6SWu2b-H9BB6kaGyCZISLd0e}M#CwATe}j`h%Hh3pbqZ>iH(Iso$hn%z zOR0^Beasx-#sQR~9AJT};RgqzwZ0MgErI_)yz1%2{V#|c5XDw= F0RSP=??eCq diff --git a/src/main/java/com/iemr/admin/controller/employeemaster/AshaSupervisorMappingController.java b/src/main/java/com/iemr/admin/controller/employeemaster/AshaSupervisorMappingController.java new file mode 100644 index 0000000..0b7539a --- /dev/null +++ b/src/main/java/com/iemr/admin/controller/employeemaster/AshaSupervisorMappingController.java @@ -0,0 +1,234 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.admin.controller.employeemaster; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +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.iemr.admin.data.employeemaster.AshaSupervisorMapping; +import com.iemr.admin.data.employeemaster.M_UserServiceRoleMapping2; +import com.iemr.admin.data.store.M_Facility; +import com.iemr.admin.repo.employeemaster.EmployeeMasterRepo; +import com.iemr.admin.repository.store.MainStoreRepo; +import com.iemr.admin.service.employeemaster.AshaSupervisorMappingService; +import com.iemr.admin.utils.mapper.InputMapper; +import com.iemr.admin.utils.response.OutputResponse; + +import io.swagger.v3.oas.annotations.Operation; + +@RestController +public class AshaSupervisorMappingController { + + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + @Autowired + private AshaSupervisorMappingService ashaSupervisorMappingService; + + @Autowired + private EmployeeMasterRepo employeeMasterRepo; + + @Autowired + private MainStoreRepo mainStoreRepo; + + @Operation(summary = "Get ASHA users by facility IDs") + @RequestMapping(value = "/userFacilityMapping/getAshasByFacility", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getAshasByFacility(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + AshaSupervisorMapping reqObj = InputMapper.gson().fromJson(request, AshaSupervisorMapping.class); + List facilityIDs = reqObj.getFacilityIDs(); + if (facilityIDs == null || facilityIDs.isEmpty()) { + if (reqObj.getFacilityID() != null) { + facilityIDs = Arrays.asList(reqObj.getFacilityID()); + } + } + ArrayList ashaUsers = ashaSupervisorMappingService + .getAshasByFacility(facilityIDs); + response.setResponse(ashaUsers.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Save ASHA supervisor mappings") + @RequestMapping(value = "/userFacilityMapping/ashaSupervisorMapping/save", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String saveAshaSupervisorMapping(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + AshaSupervisorMapping[] reqArray = InputMapper.gson().fromJson(request, AshaSupervisorMapping[].class); + List mappings = Arrays.asList(reqArray); + ArrayList savedMappings = ashaSupervisorMappingService + .saveAshaSupervisorMappings(mappings); + response.setResponse(savedMappings.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Get supervisor mappings by facility ID") + @RequestMapping(value = "/userFacilityMapping/ashaSupervisorMapping/getByFacility", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getSupervisorMappingByFacility(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + AshaSupervisorMapping reqObj = InputMapper.gson().fromJson(request, AshaSupervisorMapping.class); + ArrayList mappings = ashaSupervisorMappingService + .getSupervisorMappingByFacility(reqObj.getFacilityID()); + response.setResponse(mappings.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Delete ASHA supervisor mappings by supervisor and facility IDs") + @RequestMapping(value = "/userFacilityMapping/ashaSupervisorMapping/delete", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String deleteAshaSupervisorMapping(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + AshaSupervisorMapping reqObj = InputMapper.gson().fromJson(request, AshaSupervisorMapping.class); + Integer supervisorUserID = reqObj.getSupervisorUserID(); + List facilityIDs = reqObj.getFacilityIDs(); + if (supervisorUserID != null && facilityIDs != null && !facilityIDs.isEmpty()) { + ashaSupervisorMappingService.deleteBySupervisorAndFacilities(supervisorUserID, facilityIDs, "Admin"); + response.setResponse("Deleted successfully"); + } else { + response.setError(5000, "supervisorUserID and facilityIDs are required"); + } + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Atomically delete old and save new ASHA supervisor mappings (Fix 7)") + @RequestMapping(value = "/userFacilityMapping/ashaSupervisorMapping/updateAtomically", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String updateAshaSupervisorMappingAtomically(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + com.google.gson.JsonObject reqObj = InputMapper.gson().fromJson(request, com.google.gson.JsonObject.class); + Integer supervisorUserID = reqObj.get("supervisorUserID").getAsInt(); + String modifiedBy = reqObj.has("modifiedBy") ? reqObj.get("modifiedBy").getAsString() : "Admin"; + List facilityIDs = new ArrayList<>(); + if (reqObj.has("facilityIDs")) { + for (com.google.gson.JsonElement el : reqObj.getAsJsonArray("facilityIDs")) { + facilityIDs.add(el.getAsInt()); + } + } + List newMappings = new ArrayList<>(); + if (reqObj.has("newMappings")) { + AshaSupervisorMapping[] arr = InputMapper.gson().fromJson( + reqObj.getAsJsonArray("newMappings").toString(), AshaSupervisorMapping[].class); + newMappings = Arrays.asList(arr); + } + ArrayList saved = ashaSupervisorMappingService + .updateAshaMappingsAtomically(supervisorUserID, facilityIDs, newMappings, modifiedBy); + response.setResponse(saved.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Restore soft-deleted ASHA supervisor mappings by IDs") + @RequestMapping(value = "/userFacilityMapping/ashaSupervisorMapping/restore", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String restoreAshaSupervisorMapping(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + AshaSupervisorMapping reqObj = InputMapper.gson().fromJson(request, AshaSupervisorMapping.class); + List ids = reqObj.getIds(); + if (ids != null && !ids.isEmpty()) { + ashaSupervisorMappingService.restoreMappings(ids, "Admin"); + response.setResponse("Restored successfully"); + } else { + response.setError(5000, "ids are required"); + } + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + + @Operation(summary = "Get facility details by USR mapping ID") + @RequestMapping(value = "/userFacilityMapping/getFacilityByMappingID", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getFacilityByMappingID(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + M_UserServiceRoleMapping2 reqObj = InputMapper.gson().fromJson(request, M_UserServiceRoleMapping2.class); + Integer mappingID = reqObj.getuSRMappingID(); + if (mappingID != null) { + M_UserServiceRoleMapping2 mapping = employeeMasterRepo.findById(mappingID).orElse(null); + // Skip if mapping is soft-deleted or has no facility + if (mapping != null && Boolean.TRUE.equals(mapping.getDeleted())) { + mapping = null; + } + if (mapping != null && mapping.getFacilityID() != null) { + // Use deleted filter to exclude soft-deleted facilities + M_Facility facility = mainStoreRepo.findByFacilityIDAndDeleted(mapping.getFacilityID(), false); + StringBuilder json = new StringBuilder("{"); + json.append("\"facilityID\": ").append(mapping.getFacilityID()); + if (facility != null) { + json.append(", \"facilityName\": \"").append(facility.getFacilityName() != null ? facility.getFacilityName() : "").append("\""); + json.append(", \"facilityTypeID\": ").append(facility.getFacilityTypeID()); + json.append(", \"ruralUrban\": \"").append(facility.getRuralUrban() != null ? facility.getRuralUrban() : "").append("\""); + } else { + // Facility was deleted — return null so frontend knows + json = new StringBuilder("{\"facilityID\": null, \"facilityDeleted\": true"); + } + json.append("}"); + response.setResponse(json.toString()); + } else { + response.setResponse("{\"facilityID\": null}"); + } + } else { + response.setResponse("{\"facilityID\": null}"); + } + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } +} 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 227baf2..35b6ed6 100644 --- a/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java +++ b/src/main/java/com/iemr/admin/controller/employeemaster/EmployeeMasterController.java @@ -1804,12 +1804,15 @@ public String UserRoleMappings(@RequestBody String userRoleMapping, HttpServletR resDataMap1.setUserID(employeeMaster.get(x).getUserID()); resDataMap1.setProviderServiceMapID(previl.getProviderServiceMapID()); resDataMap1.setWorkingLocationID(previl.getWorkingLocationID()); + resDataMap1.setStateID(previl.getStateID()); + resDataMap1.setDistrictID(previl.getDistrictID()); resDataMap1.setCreatedBy(employeeMaster.get(x).getCreatedBy()); resDataMap1.setServiceProviderID(employeeMaster.get(x).getServiceProviderID()); resDataMap1.setBlockID(previl.getBlockID()); resDataMap1.setBlockName(previl.getBlockName()); resDataMap1.setVillageID(previl.getVillageID()); resDataMap1.setVillageName(previl.getVillageName()); + resDataMap1.setFacilityID(previl.getFacilityID()); resList1.add(resDataMap1); } @@ -1845,16 +1848,32 @@ public String updateUserRoleMapping(@RequestBody String updateUserRoleMapping, H M_UserServiceRoleMapping2 usrRole = employeeMasterInter.getDataUsrId(pre.getuSRMappingID()); + // Fix 1/3: cascade asha_supervisor_mapping BEFORE modifying entity to avoid JPA L1 cache issue + if (usrRole != null && usrRole.getUserID() != null) { + boolean roleChanged = pre.getRoleID() != null && usrRole.getRoleID() != null + && !usrRole.getRoleID().equals(pre.getRoleID()); + boolean facilityChanged = usrRole.getFacilityID() != null && pre.getFacilityID() != null + && !usrRole.getFacilityID().equals(pre.getFacilityID()); + if (roleChanged || facilityChanged) { + logger.info("Fix1/3: cascading asha_supervisor_mapping for userID={}, roleChanged={}, facilityChanged={}", + usrRole.getUserID(), roleChanged, facilityChanged); + employeeMasterInter.cascadeDeleteAshaMappingsForUser(usrRole.getUserID()); + } + } + usrRole.setUserID(pre.getUserID()); usrRole.setRoleID(pre.getRoleID()); usrRole.setAgentPassword(pre.getAgentPassword()); usrRole.setProviderServiceMapID(pre.getProviderServiceMapID()); usrRole.setWorkingLocationID(pre.getWorkingLocationID()); + usrRole.setStateID(pre.getStateID()); + usrRole.setDistrictID(pre.getDistrictID()); usrRole.setModifiedBy(pre.getModifiedBy()); usrRole.setBlockID(pre.getBlockID()); usrRole.setBlockName(pre.getBlockName()); usrRole.setVillageID(pre.getVillageID()); usrRole.setVillageName(pre.getVillageName()); + usrRole.setFacilityID(pre.getFacilityID()); if (pre.getTeleConsultation() != null) { usrRole.setTeleConsultation(pre.getTeleConsultation()); @@ -1897,6 +1916,17 @@ public String deleteUserRoleMapping(@RequestBody String deletedUserRoleMapping, M_UserServiceRoleMapping2 usrRole = employeeMasterInter.getDataUsrId(pre.getuSRMappingID()); + // Fix 2: cascade asha_supervisor_mapping BEFORE setDeleted() to avoid JPA L1 cache issue. + // After setDeleted(true), findById() in saveRoleMappingeditedData hits the L1 cache + // returning the already-modified entity, so the "old vs new deleted" check always fails. + // For ASHA Supervisor with multiple facilities: only delete mappings for this facilityID + if (Boolean.TRUE.equals(pre.getDeleted()) && !Boolean.TRUE.equals(usrRole.getDeleted()) + && usrRole.getUserID() != null) { + logger.info("Fix2: cascading asha_supervisor_mapping soft-delete for userID={}, uSRMappingID={}", + usrRole.getUserID(), pre.getuSRMappingID()); + employeeMasterInter.cascadeDeleteAshaMappingsForDeactivation(usrRole); + } + usrRole.setDeleted(pre.getDeleted()); M_UserServiceRoleMapping2 savedata = employeeMasterInter.saveRoleMappingeditedData(usrRole, diff --git a/src/main/java/com/iemr/admin/controller/facilitytype/FacilitytypeController.java b/src/main/java/com/iemr/admin/controller/facilitytype/FacilitytypeController.java index da7af7a..4c49f8c 100644 --- a/src/main/java/com/iemr/admin/controller/facilitytype/FacilitytypeController.java +++ b/src/main/java/com/iemr/admin/controller/facilitytype/FacilitytypeController.java @@ -35,7 +35,9 @@ import org.springframework.web.bind.annotation.RestController; import com.iemr.admin.data.facilitytype.M_facilitytype; +import com.iemr.admin.data.store.M_Facility; import com.iemr.admin.data.store.M_FacilityLevel; +import com.iemr.admin.repository.store.MainStoreRepo; import com.iemr.admin.service.facilitytype.M_facilitytypeInter; import com.iemr.admin.utils.mapper.InputMapper; import com.iemr.admin.utils.response.OutputResponse; @@ -49,6 +51,9 @@ public class FacilitytypeController { @Autowired private M_facilitytypeInter m_facilitytypeInter; + @Autowired + private MainStoreRepo mainStoreRepo; + @Operation(summary = "Get facility") @RequestMapping(value = "/getFacility", headers = "Authorization", method = { RequestMethod.POST }, produces = { "application/json" }) @@ -115,7 +120,15 @@ public String editFacility(@RequestBody String editFacility) { M_facilitytype allFacilityData = m_facilitytypeInter .editAllFicilityData(facilityDetails.getFacilityTypeID()); - allFacilityData.setFacilityTypeDesc(facilityDetails.getFacilityTypeDesc()); + if (facilityDetails.getFacilityTypeName() != null) { + allFacilityData.setFacilityTypeName(facilityDetails.getFacilityTypeName()); + } + if (facilityDetails.getRuralUrban() != null) { + allFacilityData.setRuralUrban(facilityDetails.getRuralUrban()); + } + if (facilityDetails.getFacilityTypeDesc() != null) { + allFacilityData.setFacilityTypeDesc(facilityDetails.getFacilityTypeDesc()); + } allFacilityData.setModifiedBy(facilityDetails.getModifiedBy()); M_facilitytype saveFacilityData = m_facilitytypeInter.updateFacilityData(allFacilityData); @@ -145,6 +158,16 @@ public String deleteFacility(@RequestBody String deleteFacility) { M_facilitytype allFacilityData = m_facilitytypeInter .editAllFicilityData(facilityDetails.getFacilityTypeID()); + + // Block deactivation if facility type is in use by active facilities + if (Boolean.TRUE.equals(facilityDetails.getDeleted())) { + List activeFacilities = mainStoreRepo + .findByFacilityTypeIDAndDeletedFalse(facilityDetails.getFacilityTypeID()); + if (activeFacilities != null && !activeFacilities.isEmpty()) { + throw new Exception("Cannot deactivate: facility type is in use by " + activeFacilities.size() + " active facilities"); + } + } + allFacilityData.setDeleted(facilityDetails.getDeleted()); M_facilitytype saveFacilityData = m_facilitytypeInter.updateFacilityData(allFacilityData); diff --git a/src/main/java/com/iemr/admin/controller/store/StoreController.java b/src/main/java/com/iemr/admin/controller/store/StoreController.java index 359c39b..29cddf1 100644 --- a/src/main/java/com/iemr/admin/controller/store/StoreController.java +++ b/src/main/java/com/iemr/admin/controller/store/StoreController.java @@ -305,6 +305,22 @@ public String getFacilitiesByBlock(@RequestBody String request) { return response.toString(); } + @Operation(summary = "Get all facilities by block (including deleted)") + @RequestMapping(value = "/getAllFacilitiesByBlock", headers = "Authorization", method = { RequestMethod.POST }, produces = { + "application/json" }) + public String getAllFacilitiesByBlock(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + M_Facility facility = InputMapper.gson().fromJson(request, M_Facility.class); + ArrayList data = storeService.getAllFacilitiesByBlock(facility.getBlockID()); + response.setResponse(data.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + @Operation(summary = "Check store code") @RequestMapping(value = "/checkStoreCode", headers = "Authorization", method = { RequestMethod.POST }, produces = { "application/json" }) @@ -341,7 +357,7 @@ public String getFacilitiesByBlockAndLevel(@RequestBody String request) { com.iemr.admin.data.facilitytype.M_facilitytype reqObj = InputMapper.gson().fromJson(request, com.iemr.admin.data.facilitytype.M_facilitytype.class); ArrayList data = storeService.getFacilitiesByBlockAndLevel(reqObj.getBlockID(), - reqObj.getFacilityLevelID()); + reqObj.getLevelValue(), reqObj.getRuralUrban()); response.setResponse(data.toString()); } catch (Exception e) { logger.error("Unexpected error:", e); @@ -359,7 +375,7 @@ public String createFacilityWithHierarchy(@RequestBody String request) { try { FacilityHierarchyRequest reqObj = InputMapper.gson().fromJson(request, FacilityHierarchyRequest.class); M_Facility savedFacility = storeService.createFacilityWithHierarchy(reqObj.getFacility(), - reqObj.getVillageIDs(), reqObj.getChildFacilityIDs()); + reqObj.getVillageIDs(), reqObj.getMainVillageID(), reqObj.getChildFacilityIDs()); response.setResponse(savedFacility.toString()); } catch (Exception e) { logger.error("Unexpected error:", e); @@ -428,7 +444,7 @@ public String updateFacilityWithHierarchy(@RequestBody String request) { try { FacilityHierarchyRequest reqObj = InputMapper.gson().fromJson(request, FacilityHierarchyRequest.class); M_Facility updatedFacility = storeService.updateFacilityWithHierarchy(reqObj.getFacility(), - reqObj.getVillageIDs(), reqObj.getChildFacilityIDs()); + reqObj.getVillageIDs(), reqObj.getMainVillageID(), reqObj.getChildFacilityIDs()); response.setResponse(updatedFacility.toString()); } catch (Exception e) { logger.error("Unexpected error:", e); @@ -436,4 +452,21 @@ public String updateFacilityWithHierarchy(@RequestBody String request) { } return response.toString(); } + + @Operation(summary = "Deactivate facility with hierarchy cascade (Fix 8 + Fix 19)") + @RequestMapping(value = "/deleteFacilityWithHierarchy", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String deleteFacilityWithHierarchy(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + M_Facility reqObj = InputMapper.gson().fromJson(request, M_Facility.class); + M_Facility result = storeService.deleteFacilityWithHierarchy( + reqObj.getFacilityID(), reqObj.getModifiedBy()); + response.setResponse(result.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } } diff --git a/src/main/java/com/iemr/admin/data/employeemaster/AshaSupervisorMapping.java b/src/main/java/com/iemr/admin/data/employeemaster/AshaSupervisorMapping.java new file mode 100644 index 0000000..26600e9 --- /dev/null +++ b/src/main/java/com/iemr/admin/data/employeemaster/AshaSupervisorMapping.java @@ -0,0 +1,107 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.admin.data.employeemaster; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; +import java.sql.Timestamp; +import java.util.List; + +import org.hibernate.annotations.Formula; + +import com.google.gson.annotations.Expose; +import com.iemr.admin.utils.mapper.OutputMapper; + +import lombok.Data; + +@Entity +@Table(name = "asha_supervisor_mapping") +@Data +public class AshaSupervisorMapping { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Expose + @Column(name = "id") + private Long id; + + @Expose + @Column(name = "supervisorUserID") + private Integer supervisorUserID; + + @Expose + @Column(name = "ashaUserID") + private Integer ashaUserID; + + @Expose + @Column(name = "facilityID") + private Integer facilityID; + + @Expose + @Formula("(SELECT u.FirstName FROM m_User u WHERE u.UserID = ashaUserID)") + private String ashaFirstName; + + @Expose + @Formula("(SELECT u.LastName FROM m_User u WHERE u.UserID = ashaUserID)") + private String ashaLastName; + + @Expose + @Column(name = "deleted", insertable = false, updatable = true) + private Boolean deleted; + + @Expose + @Column(name = "createdBy") + private String createdBy; + + @Expose + @Column(name = "createdDate", insertable = false, updatable = false) + private Timestamp createdDate; + + @Expose + @Column(name = "modifiedBy") + private String modifiedBy; + + @Expose + @Column(name = "lastModDate", insertable = false, updatable = false) + private Timestamp lastModDate; + + @Transient + @Expose + private List facilityIDs; + + @Transient + @Expose + private List ids; + + @Transient + private OutputMapper outputMapper = new OutputMapper(); + + @Override + public String toString() { + return outputMapper.gson().toJson(this); + } +} diff --git a/src/main/java/com/iemr/admin/data/employeemaster/M_UserServiceRoleMapping2.java b/src/main/java/com/iemr/admin/data/employeemaster/M_UserServiceRoleMapping2.java index 23c115e..ad6575a 100644 --- a/src/main/java/com/iemr/admin/data/employeemaster/M_UserServiceRoleMapping2.java +++ b/src/main/java/com/iemr/admin/data/employeemaster/M_UserServiceRoleMapping2.java @@ -87,6 +87,12 @@ public class M_UserServiceRoleMapping2 { @Column(name = "WorkingLocationID") private Integer workingLocationID; @Expose + @Column(name = "StateID") + private Integer stateID; + @Expose + @Column(name = "DistrictID") + private Integer districtID; + @Expose @Column(name = "Blockid") private Integer blockID; @Expose @@ -98,6 +104,9 @@ public class M_UserServiceRoleMapping2 { @Expose @Column(name = "VillageName") private String villageNameDb; + @Expose + @Column(name = "FacilityID") + private Integer facilityID; @Transient private String[] villageID; @Transient diff --git a/src/main/java/com/iemr/admin/data/employeemaster/V_Userservicerolemapping.java b/src/main/java/com/iemr/admin/data/employeemaster/V_Userservicerolemapping.java index 7b4b266..6a61d1a 100644 --- a/src/main/java/com/iemr/admin/data/employeemaster/V_Userservicerolemapping.java +++ b/src/main/java/com/iemr/admin/data/employeemaster/V_Userservicerolemapping.java @@ -145,8 +145,20 @@ public class V_Userservicerolemapping { @Transient private String[] villageID; @Transient - private String[] villageName; - + private String[] villageName; + @Transient + @Expose + private Integer facilityID; + @Transient + @Expose + private String facilityName; + @Transient + @Expose + private Integer facilityTypeID; + @Transient + @Expose + private String ruralUrban; + @Expose @Column(name="teleConsultation") private String teleConsultation; @@ -385,5 +397,5 @@ public void setOutbound(Boolean outbound) { public String toString() { return outputMapper.gson().toJson(this); } - + } diff --git a/src/main/java/com/iemr/admin/data/facilitytype/M_facilitytype.java b/src/main/java/com/iemr/admin/data/facilitytype/M_facilitytype.java index 16d65ea..373efb1 100644 --- a/src/main/java/com/iemr/admin/data/facilitytype/M_facilitytype.java +++ b/src/main/java/com/iemr/admin/data/facilitytype/M_facilitytype.java @@ -89,8 +89,8 @@ public class M_facilitytype { private String ruralUrban; @Expose - @Column(name = "FacilityLevelID") - private Integer facilityLevelID; + @Column(name = "LevelValue") + private Integer levelValue; @Expose @Column(name = "StateID") @@ -109,7 +109,7 @@ public Integer getFacilityTypeID() { } public void setFacilityTypeID(Integer facilityTypeID) { - facilityTypeID = facilityTypeID; + this.facilityTypeID = facilityTypeID; } public String getFacilityTypeName() { @@ -208,14 +208,6 @@ public void setRuralUrban(String ruralUrban) { this.ruralUrban = ruralUrban; } - public Integer getFacilityLevelID() { - return facilityLevelID; - } - - public void setFacilityLevelID(Integer facilityLevelID) { - this.facilityLevelID = facilityLevelID; - } - public Integer getStateID() { return stateID; } @@ -224,6 +216,14 @@ public void setStateID(Integer stateID) { this.stateID = stateID; } + public Integer getLevelValue() { + return levelValue; + } + + public void setLevelValue(Integer levelValue) { + this.levelValue = levelValue; + } + public Integer getBlockID() { return blockID; } diff --git a/src/main/java/com/iemr/admin/data/store/FacilityHierarchyRequest.java b/src/main/java/com/iemr/admin/data/store/FacilityHierarchyRequest.java index 5d3fdef..c28a364 100644 --- a/src/main/java/com/iemr/admin/data/store/FacilityHierarchyRequest.java +++ b/src/main/java/com/iemr/admin/data/store/FacilityHierarchyRequest.java @@ -18,4 +18,7 @@ public class FacilityHierarchyRequest { @Expose private List childFacilityIDs; + @Expose + private Integer mainVillageID; + } diff --git a/src/main/java/com/iemr/admin/data/store/M_Facility.java b/src/main/java/com/iemr/admin/data/store/M_Facility.java index fc825b2..bc09d05 100644 --- a/src/main/java/com/iemr/admin/data/store/M_Facility.java +++ b/src/main/java/com/iemr/admin/data/store/M_Facility.java @@ -90,6 +90,14 @@ public class M_Facility { @Expose @Column(name="ParentFacilityID") private Integer parentFacilityID; + + @Expose + @Column(name="MainVillageID") + private Integer mainVillageID; + + @Expose + @Column(name="RuralUrban") + private String ruralUrban; @Expose @Column(name="Deleted",insertable = false, updatable = true) @@ -248,6 +256,22 @@ public void setParentFacilityID(Integer parentFacilityID) { this.parentFacilityID = parentFacilityID; } + public Integer getMainVillageID() { + return mainVillageID; + } + + public void setMainVillageID(Integer mainVillageID) { + this.mainVillageID = mainVillageID; + } + + public String getRuralUrban() { + return ruralUrban; + } + + public void setRuralUrban(String ruralUrban) { + this.ruralUrban = ruralUrban; + } + public Boolean getDeleted() { return deleted; } diff --git a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepo.java b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepo.java index 53fb06b..401b0c1 100644 --- a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepo.java +++ b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepo.java @@ -126,4 +126,33 @@ List getAllEmpByProviderServiceMapIDAndDesignationNotInUserID(@Param(" @Query("SELECT u FROM M_UserServiceRoleMapping2 u WHERE u.uSRMappingID=:uSRMappingID") M_UserServiceRoleMapping2 findByUSRMappingID(@Param("uSRMappingID") Integer uSRMappingID); + @Query("SELECT u FROM M_UserServiceRoleMapping2 u JOIN u.mRole rm WHERE u.facilityID IN :facilityIDs AND LOWER(rm.roleName) = 'asha' AND u.deleted = false") + ArrayList findAshaUsersByFacilityIDs(@Param("facilityIDs") List facilityIDs); + + @Query(value = "SELECT usrm.USRMappingID, usrm.StateID, s.StateName, usrm.DistrictID, d.DistrictName, " + + "usrm.Blockid, usrm.BlockName " + + "FROM m_userservicerolemapping usrm " + + "LEFT JOIN m_state s ON usrm.StateID = s.StateID " + + "LEFT JOIN m_district d ON usrm.DistrictID = d.DistrictID " + + "WHERE usrm.USRMappingID IN :mappingIDs", nativeQuery = true) + List getDirectStateDistrictByMappingIDs(@Param("mappingIDs") List mappingIDs); + + @Query(value = "SELECT usrm.USRMappingID, usrm.FacilityID, f.FacilityName, f.FacilityTypeID, ft.RuralUrban " + + "FROM m_userservicerolemapping usrm " + + "LEFT JOIN m_facility f ON usrm.FacilityID = f.FacilityID AND f.Deleted = false " + + "LEFT JOIN m_facilitytype ft ON f.FacilityTypeID = ft.FacilityTypeID " + + "WHERE usrm.USRMappingID IN :mappingIDs AND usrm.FacilityID IS NOT NULL", nativeQuery = true) + List getFacilityInfoByMappingIDs(@Param("mappingIDs") List mappingIDs); + + // Fix 18: detect duplicate USR row before create + boolean existsByUserIDAndRoleIDAndProviderServiceMapIDAndDeletedFalse( + Integer userID, Integer roleID, Integer providerServiceMapID); + + // Fix 18: ASHA Supervisor duplicate check includes facilityID + boolean existsByUserIDAndRoleIDAndProviderServiceMapIDAndFacilityIDAndDeletedFalse( + Integer userID, Integer roleID, Integer providerServiceMapID, Integer facilityID); + + // Fix 2: count active USR rows for supervisor (check if other facilities remain) + long countByUserIDAndRoleIDAndDeletedFalse(Integer userID, Integer roleID); + } diff --git a/src/main/java/com/iemr/admin/repository/facilitytype/M_facilitytypeRepo.java b/src/main/java/com/iemr/admin/repository/facilitytype/M_facilitytypeRepo.java index 9c459c8..c1e3573 100644 --- a/src/main/java/com/iemr/admin/repository/facilitytype/M_facilitytypeRepo.java +++ b/src/main/java/com/iemr/admin/repository/facilitytype/M_facilitytypeRepo.java @@ -57,4 +57,8 @@ List findByProviderServiceMapIDAndRuralUrban(@Param("psm") Integ boolean existsByFacilityTypeNameAndStateIDAndDeletedFalse(String facilityTypeName, Integer stateID); + // Fix 17: get the highest levelValue (= SC level) for a given service line + @Query("SELECT MAX(f.levelValue) FROM M_facilitytype f WHERE f.providerServiceMapID = :psm AND f.deleted = false") + Integer findMaxLevelValueByProviderServiceMapID(@Param("psm") Integer psm); + } diff --git a/src/main/java/com/iemr/admin/repository/store/FacilityVillageMappingRepo.java b/src/main/java/com/iemr/admin/repository/store/FacilityVillageMappingRepo.java index c1857f5..3ae0635 100644 --- a/src/main/java/com/iemr/admin/repository/store/FacilityVillageMappingRepo.java +++ b/src/main/java/com/iemr/admin/repository/store/FacilityVillageMappingRepo.java @@ -15,6 +15,8 @@ public interface FacilityVillageMappingRepo extends CrudRepository findByFacilityIDAndDeletedFalse(Integer facilityID); + FacilityVillageMapping findByFacilityIDAndDistrictBranchIDAndDeletedTrue(Integer facilityID, Integer districtBranchID); + @Query("SELECT DISTINCT fvm.districtBranchID FROM FacilityVillageMapping fvm WHERE fvm.facilityID IN " + "(SELECT f.facilityID FROM M_Facility f WHERE f.blockID = :blockID AND f.deleted = false) " + "AND fvm.deleted = false") diff --git a/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java b/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java index 5cb0a0d..c9c1ef3 100644 --- a/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java +++ b/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java @@ -33,42 +33,61 @@ import com.iemr.admin.data.store.M_Facility; @Repository -public interface MainStoreRepo extends CrudRepository{ - +public interface MainStoreRepo extends CrudRepository { + List findByProviderServiceMapIDOrderByFacilityName(Integer providerServiceMapID); - + @Query("SELECT u FROM M_Facility u WHERE u.providerServiceMapID=:providerServiceMapID AND u.isMainFacility=:isMainFacility AND deleted=false order by u.facilityName") - ArrayList getAllMainFacility(@Param("providerServiceMapID")Integer providerServiceMapID,@Param("isMainFacility") Boolean isMainFacility); - - + ArrayList getAllMainFacility(@Param("providerServiceMapID") Integer providerServiceMapID, + @Param("isMainFacility") Boolean isMainFacility); + @Query("SELECT u FROM M_Facility u WHERE u.providerServiceMapID=:providerServiceMapID AND u.isMainFacility=:isMainFacility AND u.mainFacilityID=:mainFacilityID AND deleted=false order by u.facilityName") - ArrayList getAllMainFacility(@Param("providerServiceMapID")Integer providerServiceMapID,@Param("isMainFacility") Boolean isMainFacility, + ArrayList getAllMainFacility(@Param("providerServiceMapID") Integer providerServiceMapID, + @Param("isMainFacility") Boolean isMainFacility, @Param("mainFacilityID") Integer mainFacilityID); @Query("SELECT u FROM M_Facility u WHERE u.providerServiceMapID=:providerServiceMapID AND u.mainFacilityID=:mainFacilityID AND deleted=false order by u.facilityName") - ArrayList getChildFacility(@Param("providerServiceMapID")Integer providerServiceMapID,@Param("mainFacilityID") Integer mainFacilityID); - - - ArrayList findByMainFacilityIDAndDeletedOrderByFacilityName(Integer mainfacID,Boolean deleted); - - M_Facility findByFacilityIDAndDeleted(Integer mainfacID,Boolean deleted); + ArrayList getChildFacility(@Param("providerServiceMapID") Integer providerServiceMapID, + @Param("mainFacilityID") Integer mainFacilityID); + + ArrayList findByMainFacilityIDAndDeletedOrderByFacilityName(Integer mainfacID, Boolean deleted); + + M_Facility findByFacilityIDAndDeleted(Integer mainfacID, Boolean deleted); List findByFacilityCodeAndProviderServiceMapID(String facilityCode, Integer providerServiceMapID); - + M_Facility findByFacilityID(Integer facilityID); ArrayList findByBlockIDAndDeletedFalseOrderByFacilityName(Integer blockID); - @Query("SELECT f FROM M_Facility f WHERE f.blockID = :blockID AND f.facilityTypeID IN " + - "(SELECT ft.facilityTypeID FROM M_facilitytype ft WHERE ft.facilityLevelID = :facilityLevelID " + - "AND ft.deleted = false) AND f.deleted = false AND f.parentFacilityID IS NULL ORDER BY f.facilityName") + ArrayList findByBlockIDOrderByFacilityName(Integer blockID); + + @Query("SELECT f FROM M_Facility f WHERE f.blockID = :blockID AND f.ruralUrban = :ruralUrban AND f.facilityTypeID IN " + + "(SELECT ft.facilityTypeID FROM M_facilitytype ft WHERE ft.levelValue = :levelValue " + + "AND ft.deleted = false) AND f.deleted = false ORDER BY f.facilityName") ArrayList findByBlockIDAndFacilityLevel(@Param("blockID") Integer blockID, - @Param("facilityLevelID") Integer facilityLevelID); + @Param("levelValue") Integer levelValue, + @Param("ruralUrban") String ruralUrban); + + // All SCs in block regardless of rural/urban (for main village selection) + @Query("SELECT f FROM M_Facility f WHERE f.blockID = :blockID AND f.facilityTypeID IN " + + "(SELECT ft.facilityTypeID FROM M_facilitytype ft WHERE ft.levelValue = :levelValue " + + "AND ft.deleted = false) AND f.deleted = false ORDER BY f.facilityName") + ArrayList findByBlockIDAndLevelValue(@Param("blockID") Integer blockID, + @Param("levelValue") Integer levelValue); ArrayList findByParentFacilityIDAndDeletedFalseOrderByFacilityName(Integer parentFacilityID); + List findByFacilityTypeIDAndDeletedFalse(Integer facilityTypeID); + + boolean existsByFacilityNameAndBlockIDAndDeletedFalse(String facilityName, Integer blockID); + + @Query("SELECT CASE WHEN COUNT(f) > 0 THEN true ELSE false END FROM M_Facility f WHERE f.facilityName = :facilityName AND f.blockID = :blockID AND f.facilityID != :facilityID AND f.deleted = false") + boolean existsByFacilityNameAndBlockIDAndNotFacilityID(@Param("facilityName") String facilityName, @Param("blockID") Integer blockID, @Param("facilityID") Integer facilityID); + @Modifying @Query("UPDATE M_Facility f SET f.parentFacilityID = NULL, f.modifiedBy = :modifiedBy WHERE f.parentFacilityID = :parentFacilityID") - int clearParentFacilityID(@Param("parentFacilityID") Integer parentFacilityID, @Param("modifiedBy") String modifiedBy); + int clearParentFacilityID(@Param("parentFacilityID") Integer parentFacilityID, + @Param("modifiedBy") String modifiedBy); } diff --git a/src/main/java/com/iemr/admin/repository/user/AshaSupervisorMappingRepo.java b/src/main/java/com/iemr/admin/repository/user/AshaSupervisorMappingRepo.java new file mode 100644 index 0000000..f39acbd --- /dev/null +++ b/src/main/java/com/iemr/admin/repository/user/AshaSupervisorMappingRepo.java @@ -0,0 +1,73 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.admin.repository.user; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import com.iemr.admin.data.employeemaster.AshaSupervisorMapping; + +@Repository +public interface AshaSupervisorMappingRepo extends CrudRepository { + + ArrayList findBySupervisorUserIDAndDeletedFalse(Integer supervisorUserID); + + ArrayList findByFacilityIDAndDeletedFalse(Integer facilityID); + + ArrayList findBySupervisorUserIDAndFacilityIDAndDeletedFalse(Integer supervisorUserID, Integer facilityID); + + ArrayList findBySupervisorUserIDAndFacilityIDInAndDeletedFalse(Integer supervisorUserID, List facilityIDs); + + AshaSupervisorMapping findBySupervisorUserIDAndAshaUserIDAndFacilityIDAndDeletedTrue(Integer supervisorUserID, Integer ashaUserID, Integer facilityID); + + ArrayList findByAshaUserIDAndDeletedFalse(Integer ashaUserID); + + ArrayList findByAshaUserIDAndFacilityIDAndDeletedFalse(Integer ashaUserID, Integer facilityID); + + // Fix 5: find active row for this ASHA at this facility under a DIFFERENT supervisor + ArrayList findByAshaUserIDAndFacilityIDAndDeletedFalseAndSupervisorUserIDNot( + Integer ashaUserID, Integer facilityID, Integer supervisorUserID); + + // Fix 6: find existing active row for exact (supervisor, ASHA, facility) — for idempotent save + AshaSupervisorMapping findBySupervisorUserIDAndAshaUserIDAndFacilityIDAndDeletedFalse( + Integer supervisorUserID, Integer ashaUserID, Integer facilityID); + + /** + * Get active supervisor mappings at a facility, excluding mappings where + * the supervisor user has been soft-deleted in m_User. + * Prevents deleted supervisors from blocking ASHA reassignment. + */ + @Query(value = "SELECT asm.*, " + + "(SELECT u.FirstName FROM m_User u WHERE u.UserID = asm.ashaUserID) AS ashaFirstName, " + + "(SELECT u.LastName FROM m_User u WHERE u.UserID = asm.ashaUserID) AS ashaLastName " + + "FROM asha_supervisor_mapping asm " + + "JOIN m_User su ON su.UserID = asm.supervisorUserID " + + "WHERE asm.facilityID = :facilityID " + + "AND asm.deleted = false " + + "AND su.Deleted = false", nativeQuery = true) + ArrayList findActiveMappingsByFacilityID(@Param("facilityID") Integer facilityID); +} diff --git a/src/main/java/com/iemr/admin/service/employeemaster/AshaSupervisorMappingService.java b/src/main/java/com/iemr/admin/service/employeemaster/AshaSupervisorMappingService.java new file mode 100644 index 0000000..077c434 --- /dev/null +++ b/src/main/java/com/iemr/admin/service/employeemaster/AshaSupervisorMappingService.java @@ -0,0 +1,57 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.admin.service.employeemaster; + +import java.util.ArrayList; +import java.util.List; + +import com.iemr.admin.data.employeemaster.AshaSupervisorMapping; +import com.iemr.admin.data.employeemaster.M_UserServiceRoleMapping2; + +public interface AshaSupervisorMappingService { + + ArrayList saveAshaSupervisorMappings(List mappings); + + ArrayList getSupervisorMappingByFacility(Integer facilityID); + + ArrayList getAshasByFacility(List facilityIDs); + + void deleteMappings(List ids, String modifiedBy); + + void deleteBySupervisorAndFacilities(Integer supervisorUserID, List facilityIDs, String modifiedBy); + + void restoreMappings(List ids, String modifiedBy); + + // Cascade: soft-delete all asha_supervisor_mapping rows for a user (as supervisor or ASHA) + void cascadeDeleteByUserID(Integer userID, String modifiedBy); + + // Cascade: soft-delete rows for a user at a specific old facility (role or facility change) + void cascadeDeleteByUserIDAndFacilityID(Integer userID, Integer facilityID, String modifiedBy); + + // Cascade: soft-delete all asha_supervisor_mapping rows for a facility (facility soft-deleted) + void cascadeDeleteByFacilityID(Integer facilityID, String modifiedBy); + + // Fix 7: atomic delete-old + save-new in one transaction + ArrayList updateAshaMappingsAtomically( + Integer supervisorUserID, List facilityIDs, + List newMappings, String modifiedBy); +} diff --git a/src/main/java/com/iemr/admin/service/employeemaster/AshaSupervisorMappingServiceImpl.java b/src/main/java/com/iemr/admin/service/employeemaster/AshaSupervisorMappingServiceImpl.java new file mode 100644 index 0000000..c287c18 --- /dev/null +++ b/src/main/java/com/iemr/admin/service/employeemaster/AshaSupervisorMappingServiceImpl.java @@ -0,0 +1,206 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.admin.service.employeemaster; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.iemr.admin.data.employeemaster.AshaSupervisorMapping; +import com.iemr.admin.data.employeemaster.M_UserServiceRoleMapping2; +import com.iemr.admin.data.store.M_Facility; +import com.iemr.admin.repo.employeemaster.EmployeeMasterRepo; +import com.iemr.admin.repository.store.MainStoreRepo; +import com.iemr.admin.repository.user.AshaSupervisorMappingRepo; + +@Service +public class AshaSupervisorMappingServiceImpl implements AshaSupervisorMappingService { + + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + @Autowired + private AshaSupervisorMappingRepo ashaSupervisorMappingRepo; + + @Autowired + private EmployeeMasterRepo employeeMasterRepo; + + @Autowired + private MainStoreRepo mainStoreRepo; + + @Transactional + @Override + public ArrayList saveAshaSupervisorMappings(List mappings) { + ArrayList savedMappings = new ArrayList<>(); + for (AshaSupervisorMapping mapping : mappings) { + // Fix 12: reject if facilityID points to a soft-deleted or missing facility + M_Facility facility = mainStoreRepo.findByFacilityIDAndDeleted(mapping.getFacilityID(), false); + if (facility == null) { + throw new RuntimeException("Facility ID " + mapping.getFacilityID() + + " is no longer active. Cannot save ASHA supervisor mapping."); + } + // Fix 6: skip if identical active row already exists (network retry / duplicate save) + AshaSupervisorMapping existingActive = ashaSupervisorMappingRepo + .findBySupervisorUserIDAndAshaUserIDAndFacilityIDAndDeletedFalse( + mapping.getSupervisorUserID(), mapping.getAshaUserID(), mapping.getFacilityID()); + if (existingActive != null) { + savedMappings.add(existingActive); + continue; + } + // Fix 5: if ASHA already has an active row under a DIFFERENT supervisor → soft-delete it + ArrayList otherSupervisorMappings = ashaSupervisorMappingRepo + .findByAshaUserIDAndFacilityIDAndDeletedFalseAndSupervisorUserIDNot( + mapping.getAshaUserID(), mapping.getFacilityID(), mapping.getSupervisorUserID()); + for (AshaSupervisorMapping old : otherSupervisorMappings) { + old.setDeleted(true); + old.setModifiedBy(mapping.getCreatedBy()); + ashaSupervisorMappingRepo.save(old); + } + // Always create new row for clean audit trail (old soft-deleted rows stay as history) + savedMappings.add(ashaSupervisorMappingRepo.save(mapping)); + } + return savedMappings; + } + + @Override + public ArrayList getSupervisorMappingByFacility(Integer facilityID) { + // Use native query that also filters out mappings where supervisor user is deleted + return ashaSupervisorMappingRepo.findActiveMappingsByFacilityID(facilityID); + } + + @Override + public ArrayList getAshasByFacility(List facilityIDs) { + return employeeMasterRepo.findAshaUsersByFacilityIDs(facilityIDs); + } + + @Transactional + @Override + public void deleteMappings(List ids, String modifiedBy) { + for (Long id : ids) { + AshaSupervisorMapping mapping = ashaSupervisorMappingRepo.findById(id).orElse(null); + if (mapping != null) { + mapping.setDeleted(true); + mapping.setModifiedBy(modifiedBy); + ashaSupervisorMappingRepo.save(mapping); + } + } + } + + @Transactional + @Override + public void deleteBySupervisorAndFacilities(Integer supervisorUserID, List facilityIDs, String modifiedBy) { + ArrayList mappings = ashaSupervisorMappingRepo + .findBySupervisorUserIDAndFacilityIDInAndDeletedFalse(supervisorUserID, facilityIDs); + for (AshaSupervisorMapping mapping : mappings) { + mapping.setDeleted(true); + mapping.setModifiedBy(modifiedBy); + ashaSupervisorMappingRepo.save(mapping); + } + } + + @Transactional + @Override + public void restoreMappings(List ids, String modifiedBy) { + for (Long id : ids) { + AshaSupervisorMapping mapping = ashaSupervisorMappingRepo.findById(id).orElse(null); + if (mapping != null) { + mapping.setDeleted(false); + mapping.setModifiedBy(modifiedBy); + ashaSupervisorMappingRepo.save(mapping); + } + } + } + + @Transactional + @Override + public void cascadeDeleteByUserID(Integer userID, String modifiedBy) { + // Soft-delete all rows where this user is supervisor + ArrayList asSupervisor = ashaSupervisorMappingRepo + .findBySupervisorUserIDAndDeletedFalse(userID); + logger.info("cascadeDeleteByUserID: userID={}, found {} supervisor rows to soft-delete", userID, asSupervisor.size()); + for (AshaSupervisorMapping m : asSupervisor) { + m.setDeleted(true); + m.setModifiedBy(modifiedBy); + ashaSupervisorMappingRepo.save(m); + } + // Soft-delete all rows where this user is ASHA + ArrayList asAsha = ashaSupervisorMappingRepo + .findByAshaUserIDAndDeletedFalse(userID); + logger.info("cascadeDeleteByUserID: userID={}, found {} ASHA rows to soft-delete", userID, asAsha.size()); + for (AshaSupervisorMapping m : asAsha) { + m.setDeleted(true); + m.setModifiedBy(modifiedBy); + ashaSupervisorMappingRepo.save(m); + } + } + + @Transactional + @Override + public void cascadeDeleteByFacilityID(Integer facilityID, String modifiedBy) { + // Fix 8: soft-delete all asha_supervisor_mapping rows for a deleted facility + ArrayList mappings = ashaSupervisorMappingRepo.findByFacilityIDAndDeletedFalse(facilityID); + for (AshaSupervisorMapping m : mappings) { + m.setDeleted(true); + m.setModifiedBy(modifiedBy); + ashaSupervisorMappingRepo.save(m); + } + } + + @Transactional + @Override + public void cascadeDeleteByUserIDAndFacilityID(Integer userID, Integer facilityID, String modifiedBy) { + // Soft-delete rows where this user is supervisor at this facility + ArrayList asSupervisor = ashaSupervisorMappingRepo + .findBySupervisorUserIDAndFacilityIDAndDeletedFalse(userID, facilityID); + for (AshaSupervisorMapping m : asSupervisor) { + m.setDeleted(true); + m.setModifiedBy(modifiedBy); + ashaSupervisorMappingRepo.save(m); + } + // Soft-delete rows where this user is ASHA at this facility + ArrayList asAsha = ashaSupervisorMappingRepo + .findByAshaUserIDAndFacilityIDAndDeletedFalse(userID, facilityID); + for (AshaSupervisorMapping m : asAsha) { + m.setDeleted(true); + m.setModifiedBy(modifiedBy); + ashaSupervisorMappingRepo.save(m); + } + } + + @Transactional + @Override + public ArrayList updateAshaMappingsAtomically( + Integer supervisorUserID, List facilityIDs, + List newMappings, String modifiedBy) { + // Fix 7: delete old + save new in a SINGLE transaction + // If anything fails, the entire operation rolls back — no partial wipe + deleteBySupervisorAndFacilities(supervisorUserID, facilityIDs, modifiedBy); + if (newMappings != null && !newMappings.isEmpty()) { + return saveAshaSupervisorMappings(newMappings); + } + return new ArrayList<>(); + } +} 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 ff284cb..81b5f45 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterInter.java @@ -163,6 +163,12 @@ Boolean checkingEmpDetails(String userName, String aadhaarNo, String getpAN, Str // M_UserServiceRoleMapping2 saveRoleMappingeditedData(M_UserServiceRoleMapping2 usrRole, String string); public M_UserServiceRoleMapping2 saveRoleMappingeditedData(M_UserServiceRoleMapping2 usrRole, String authToken) throws JsonMappingException, JsonProcessingException; + // Fix 2: cascade soft-delete asha_supervisor_mapping rows when a user is deactivated + void cascadeDeleteAshaMappingsForUser(Integer userID); + + // Fix 2: smart cascade — for supervisor with multiple facilities, only delete mappings for this facility + void cascadeDeleteAshaMappingsForDeactivation(M_UserServiceRoleMapping2 usrRole); + // ArrayList getMappedLanguge(); ArrayList getMappedRole(Integer serviceProviderID); 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 62593f1..ecf1106 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java @@ -95,8 +95,13 @@ import com.iemr.admin.repo.employeemaster.ShowuserdetailsfromuserservicerolemappingRepo; import com.iemr.admin.repo.employeemaster.V_ShowuserRepo; import com.iemr.admin.repo.employeemaster.V_UserservicerolemappingRepo; +import com.iemr.admin.data.facilitytype.M_facilitytype; +import com.iemr.admin.data.store.M_Facility; +import com.iemr.admin.repository.facilitytype.M_facilitytypeRepo; import com.iemr.admin.repository.provideronboard.M_ServiceMasterRepo; import com.iemr.admin.repository.rolemaster.M_UserservicerolemappingForRoleProviderAdminRepo; +import com.iemr.admin.repository.store.MainStoreRepo; +import com.iemr.admin.service.employeemaster.AshaSupervisorMappingService; import com.iemr.admin.service.user.EncryptUserPassword; import com.iemr.admin.utils.CookieUtil; import com.iemr.admin.utils.RestTemplateUtil; @@ -138,6 +143,9 @@ public class EmployeeMasterServiceImpl implements EmployeeMasterInter { @Autowired private MProviderservicemappingBlockingRepo mProviderservicemappingBlockingRepo; + @Autowired + private AshaSupervisorMappingService ashaSupervisorMappingService; + @Autowired private EncryptUserPassword encryptUserPassword; @Autowired @@ -191,6 +199,12 @@ public void setConfigProperties(ConfigProperties configProperties) { @Autowired M_ServiceMasterRepo serviceMasterRepo; + + @Autowired + private MainStoreRepo mainStoreRepo; + + @Autowired + private M_facilitytypeRepo facilityTypeRepo; @Autowired private EmployeeSignatureRepo employeeSignatureRepo; @@ -327,6 +341,61 @@ public ArrayList mapLanguage(List resList) @Override public ArrayList mapRole(List resList1, String authToken) throws JsonMappingException, JsonProcessingException { + // Fix 4 + Fix 16 + Fix 17: validate each mapping before any save + for (M_UserServiceRoleMapping2 mapping : resList1) { + M_Role role = null; + if (mapping.getRoleID() != null) { + role = roleRepo.findByRoleID(mapping.getRoleID()); + // Fix 4: ASHA must have a facilityID + if (role != null && "asha".equalsIgnoreCase(role.getRoleName()) + && mapping.getFacilityID() == null) { + throw new RuntimeException( + "Facility (SC) is mandatory for ASHA role. Please select a facility before saving."); + } + } + if (mapping.getFacilityID() != null) { + M_Facility facility = mainStoreRepo.findByFacilityIDAndDeleted(mapping.getFacilityID(), false); + // Fix 16: facility must not be soft-deleted + if (facility == null) { + throw new RuntimeException("Facility ID " + mapping.getFacilityID() + + " is no longer active. Please select a valid facility."); + } + // Fix 17: ASHA must be at SC level (max levelValue for this service line) + if (role != null && "asha".equalsIgnoreCase(role.getRoleName()) + && facility.getFacilityTypeID() != null + && mapping.getProviderServiceMapID() != null) { + M_facilitytype ft = facilityTypeRepo.findByFacilityTypeID(facility.getFacilityTypeID()); + Integer maxLevel = facilityTypeRepo + .findMaxLevelValueByProviderServiceMapID(mapping.getProviderServiceMapID()); + if (ft != null && maxLevel != null && ft.getLevelValue() != null + && !ft.getLevelValue().equals(maxLevel)) { + throw new RuntimeException( + "ASHA role must be mapped to a Sub-Centre (SC) level facility. Please select a facility at the lowest hierarchy level."); + } + } + } + // Fix 18: prevent duplicate active USR row (same user + role + service line) + // ASHA Supervisor can have multiple USR rows (one per facility) — check user+role+PSMID+facilityID + boolean isAshaSupervisor = role != null && "asha supervisor".equalsIgnoreCase(role.getRoleName()); + if (mapping.getUserID() != null && mapping.getRoleID() != null + && mapping.getProviderServiceMapID() != null) { + if (isAshaSupervisor) { + if (mapping.getFacilityID() != null && employeeMasterRepo + .existsByUserIDAndRoleIDAndProviderServiceMapIDAndFacilityIDAndDeletedFalse( + mapping.getUserID(), mapping.getRoleID(), + mapping.getProviderServiceMapID(), mapping.getFacilityID())) { + throw new RuntimeException( + "User already has an active work location mapping for this facility. Duplicate mapping is not allowed."); + } + } else { + if (employeeMasterRepo.existsByUserIDAndRoleIDAndProviderServiceMapIDAndDeletedFalse( + mapping.getUserID(), mapping.getRoleID(), mapping.getProviderServiceMapID())) { + throw new RuntimeException( + "User already has an active work location mapping with this role and service line. Duplicate mapping is not allowed."); + } + } + } + } ArrayList reslist = (ArrayList) employeeMasterRepo .saveAll(resList1); if (ENABLE_CTI_USER_CREATION) { @@ -942,9 +1011,108 @@ public M_UserServiceRoleMapping2 getDataUsrId(Integer uSRMappingID) { return data; } + @Override + public void cascadeDeleteAshaMappingsForUser(Integer userID) { + // Fix 2: called from controller BEFORE setDeleted() to avoid JPA L1 cache issue + ashaSupervisorMappingService.cascadeDeleteByUserID(userID, "Admin"); + } + + @Override + public void cascadeDeleteAshaMappingsForDeactivation(M_UserServiceRoleMapping2 usrRole) { + Integer userID = usrRole.getUserID(); + M_Role role = usrRole.getRoleID() != null ? roleRepo.findByRoleID(usrRole.getRoleID()) : null; + boolean isSupervisor = role != null && "asha supervisor".equalsIgnoreCase(role.getRoleName()); + if (isSupervisor && usrRole.getFacilityID() != null) { + // Count active USR rows for this user+role (exclude current row being deleted) + long activeCount = employeeMasterRepo.countByUserIDAndRoleIDAndDeletedFalse(userID, usrRole.getRoleID()) - 1; + if (activeCount > 0) { + // Other facilities still active — only delete this supervisor's mappings at this facility + ashaSupervisorMappingService.cascadeDeleteByUserIDAndFacilityID(userID, usrRole.getFacilityID(), "Admin"); + return; + } + } + // Last facility or non-supervisor — delete all + ashaSupervisorMappingService.cascadeDeleteByUserID(userID, "Admin"); + } + @Override public M_UserServiceRoleMapping2 saveRoleMappingeditedData(M_UserServiceRoleMapping2 usrRole, String authToken) throws JsonMappingException, JsonProcessingException { + // Fix 4 + Fix 16 + Fix 17 + Fix 14: validate only on create/update, skip for deactivation + M_Role role = null; + if (!Boolean.TRUE.equals(usrRole.getDeleted())) { + if (usrRole.getRoleID() != null) { + role = roleRepo.findByRoleID(usrRole.getRoleID()); + // Fix 4: ASHA must have a facilityID + if (role != null && "asha".equalsIgnoreCase(role.getRoleName()) + && usrRole.getFacilityID() == null) { + throw new RuntimeException( + "Facility (SC) is mandatory for ASHA role. Please select a facility before saving."); + } + } + if (usrRole.getFacilityID() != null) { + M_Facility facility = mainStoreRepo.findByFacilityIDAndDeleted(usrRole.getFacilityID(), false); + // Fix 16: facility must not be soft-deleted + if (facility == null) { + throw new RuntimeException("Facility ID " + usrRole.getFacilityID() + + " is no longer active. Please select a valid facility."); + } + if (facility.getFacilityTypeID() != null && usrRole.getProviderServiceMapID() != null) { + M_facilitytype ft = facilityTypeRepo.findByFacilityTypeID(facility.getFacilityTypeID()); + Integer maxLevel = facilityTypeRepo + .findMaxLevelValueByProviderServiceMapID(usrRole.getProviderServiceMapID()); + // Fix 17: ASHA must be at SC level + if (role != null && "asha".equalsIgnoreCase(role.getRoleName()) + && ft != null && maxLevel != null && ft.getLevelValue() != null + && !ft.getLevelValue().equals(maxLevel)) { + throw new RuntimeException( + "ASHA role must be mapped to a Sub-Centre (SC) level facility. Please select a facility at the lowest hierarchy level."); + } + // Fix 14: non-SC facility → clear saved village mappings + if (ft != null && maxLevel != null && ft.getLevelValue() != null + && !ft.getLevelValue().equals(maxLevel)) { + usrRole.setVillageidDb(null); + usrRole.setVillageNameDb(null); + } + } + } + } + + // CASCADE: fetch old USR row and soft-delete stale asha_supervisor_mapping rows + if (usrRole.getuSRMappingID() != null) { + M_UserServiceRoleMapping2 oldUSR = employeeMasterRepo.findById(usrRole.getuSRMappingID()).orElse(null); + if (oldUSR != null) { + Integer userID = oldUSR.getUserID(); + // Fix 1 & 11: Role changed → cascade soft-delete all mappings for this user + if (oldUSR.getRoleID() != null && !oldUSR.getRoleID().equals(usrRole.getRoleID())) { + ashaSupervisorMappingService.cascadeDeleteByUserID(userID, "Admin"); + } + // Fix 2: User deleted/deactivated → cascade soft-delete mappings + // For ASHA Supervisor with multiple facilities: only delete mappings for this facilityID + // For other roles or single facility: delete all mappings for this user + if (Boolean.TRUE.equals(usrRole.getDeleted()) && !Boolean.TRUE.equals(oldUSR.getDeleted())) { + M_Role oldRole = oldUSR.getRoleID() != null ? roleRepo.findByRoleID(oldUSR.getRoleID()) : null; + boolean isSupervisor = oldRole != null && "asha supervisor".equalsIgnoreCase(oldRole.getRoleName()); + // Check if supervisor still has other active USR rows + // Count excludes current row being deleted (subtract 1 since it's still active in DB) + long activeCount = isSupervisor ? employeeMasterRepo.countByUserIDAndRoleIDAndDeletedFalse(userID, oldUSR.getRoleID()) - 1 : 0; + if (isSupervisor && activeCount > 0 && oldUSR.getFacilityID() != null) { + // Other facilities still active — only delete mappings for this facility + ashaSupervisorMappingService.cascadeDeleteByFacilityID(oldUSR.getFacilityID(), "Admin"); + } else { + // Last facility or non-supervisor — delete all + ashaSupervisorMappingService.cascadeDeleteByUserID(userID, "Admin"); + } + } + // Fix 3, 9, 10: Facility changed → cascade delete ALL asha_supervisor_mapping rows for this user + // Supervisor may have multiple facilityIDs in asha_supervisor_mapping (SC1, SC2, SC3) + // but USR stores only one facilityID — so delete all, not just the old facilityID + if (oldUSR.getFacilityID() != null && !oldUSR.getFacilityID().equals(usrRole.getFacilityID())) { + ashaSupervisorMappingService.cascadeDeleteByUserID(userID, "Admin"); + } + } + } + M_UserServiceRoleMapping2 data = employeeMasterRepo.save(usrRole); if (ENABLE_CTI_USER_CREATION) { List list = new ArrayList(); @@ -1003,7 +1171,61 @@ public ArrayList getMappedRole(Integer serviceProvider ArrayList mappedRoles = new ArrayList<>(); if (getData != null) { + // Collect mapping IDs where stateID OR workingDistrictID is null + // (view derives these from WorkingLocationID JOIN — null when workLocationID was nullified for HWC/FLW) + List patchMappingIDs = new ArrayList<>(); + for (V_Userservicerolemapping mapping : getData) { + if (mapping.getuSRMappingID() != null + && (mapping.getStateID() == null || mapping.getWorkingDistrictID() == null)) { + patchMappingIDs.add(mapping.getuSRMappingID()); + } + } + + // Batch lookup: get stateID/districtID directly from m_userservicerolemapping table + Map stateDistrictMap = new HashMap<>(); + if (!patchMappingIDs.isEmpty()) { + List results = employeeMasterRepo.getDirectStateDistrictByMappingIDs(patchMappingIDs); + for (Object[] row : results) { + stateDistrictMap.put((Integer) row[0], row); + } + } + + // Batch lookup: get facilityID/Name/TypeID/ruralUrban from m_userservicerolemapping + m_facility + List allMappingIDs = new ArrayList<>(); for (V_Userservicerolemapping mapping : getData) { + if (mapping.getuSRMappingID() != null) { + allMappingIDs.add(mapping.getuSRMappingID()); + } + } + Map facilityMap = new HashMap<>(); + if (!allMappingIDs.isEmpty()) { + List facilityResults = employeeMasterRepo.getFacilityInfoByMappingIDs(allMappingIDs); + for (Object[] row : facilityResults) { + facilityMap.put((Integer) row[0], row); + } + } + + for (V_Userservicerolemapping mapping : getData) { + // Patch null stateID/districtID/blockID from direct columns in m_userservicerolemapping + if (stateDistrictMap.containsKey(mapping.getuSRMappingID())) { + Object[] row = stateDistrictMap.get(mapping.getuSRMappingID()); + if (mapping.getStateID() == null && row[1] != null) mapping.setStateID((Integer) row[1]); + if (mapping.getStateName() == null && row[2] != null) mapping.setStateName((String) row[2]); + if (mapping.getWorkingDistrictID() == null && row[3] != null) mapping.setWorkingDistrictID(String.valueOf(row[3])); + if (mapping.getWorkingDistrictName() == null && row[4] != null) mapping.setWorkingDistrictName((String) row[4]); + if (mapping.getBlockID() == null && row[5] != null) mapping.setBlockID((Integer) row[5]); + if (mapping.getBlockName() == null && row[6] != null) mapping.setBlockName((String) row[6]); + } + + // Set facility info from batch lookup + if (facilityMap.containsKey(mapping.getuSRMappingID())) { + Object[] fRow = facilityMap.get(mapping.getuSRMappingID()); + if (fRow[1] != null) mapping.setFacilityID((Integer) fRow[1]); + if (fRow[2] != null) mapping.setFacilityName((String) fRow[2]); + if (fRow[3] != null) mapping.setFacilityTypeID((Integer) fRow[3]); + if (fRow[4] != null) mapping.setRuralUrban((String) fRow[4]); + } + if (mapping.getVillageidDb() != null) { mapping.setVillageID(mapping.getVillageidDb().split(",")); } else { diff --git a/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeServiceImpl.java b/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeServiceImpl.java index 1188c3b..e339973 100644 --- a/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/facilitytype/M_facilitytypeServiceImpl.java @@ -54,6 +54,12 @@ public ArrayList getFacilityTypesByRuralUrban(Integer providerSe @Override public ArrayList addAllFicilityData(List addfacilityDetails) { + for (M_facilitytype ft : addfacilityDetails) { + if (m_facilitytypeRepo.existsByFacilityTypeNameAndStateIDAndDeletedFalse( + ft.getFacilityTypeName(), ft.getStateID())) { + throw new RuntimeException("Facility type '" + ft.getFacilityTypeName() + "' already exists"); + } + } ArrayList data = (ArrayList) m_facilitytypeRepo.saveAll(addfacilityDetails); return data; } diff --git a/src/main/java/com/iemr/admin/service/store/FacilityHierarchyService.java b/src/main/java/com/iemr/admin/service/store/FacilityHierarchyService.java new file mode 100644 index 0000000..d41ab4e --- /dev/null +++ b/src/main/java/com/iemr/admin/service/store/FacilityHierarchyService.java @@ -0,0 +1,5 @@ +package com.iemr.admin.service.store; + +public class FacilityHierarchyService { + +} diff --git a/src/main/java/com/iemr/admin/service/store/FacilityHierarchyServiceImpl.java b/src/main/java/com/iemr/admin/service/store/FacilityHierarchyServiceImpl.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/iemr/admin/service/store/StoreService.java b/src/main/java/com/iemr/admin/service/store/StoreService.java index 2768781..5f76ab2 100644 --- a/src/main/java/com/iemr/admin/service/store/StoreService.java +++ b/src/main/java/com/iemr/admin/service/store/StoreService.java @@ -58,9 +58,11 @@ public interface StoreService { ArrayList getFacilitiesByBlock(Integer blockID); - ArrayList getFacilitiesByBlockAndLevel(Integer blockID, Integer facilityLevelID); + ArrayList getAllFacilitiesByBlock(Integer blockID); - M_Facility createFacilityWithHierarchy(M_Facility facility, List villageIDs, List childFacilityIDs); + ArrayList getFacilitiesByBlockAndLevel(Integer blockID, Integer levelValue, String ruralUrban); + + M_Facility createFacilityWithHierarchy(M_Facility facility, List villageIDs, Integer mainVillageID, List childFacilityIDs); List getMappedVillageIDs(Integer blockID); @@ -68,6 +70,8 @@ public interface StoreService { ArrayList getChildFacilitiesByParent(Integer parentFacilityID); - M_Facility updateFacilityWithHierarchy(M_Facility facility, List villageIDs, List childFacilityIDs); + M_Facility updateFacilityWithHierarchy(M_Facility facility, List villageIDs, Integer mainVillageID, List childFacilityIDs); + + M_Facility deleteFacilityWithHierarchy(Integer facilityID, String modifiedBy) throws Exception; } diff --git a/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java b/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java index 7ea3b42..db300f8 100644 --- a/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java @@ -35,11 +35,13 @@ import com.iemr.admin.data.store.M_facilityMap; import com.iemr.admin.data.store.V_FetchFacility; import com.iemr.admin.data.vanMaster.M_Van; +import com.iemr.admin.repository.facilitytype.M_facilitytypeRepo; import com.iemr.admin.repository.parkingPlace.ParkingPlaceRepository; import com.iemr.admin.repository.store.FacilityVillageMappingRepo; import com.iemr.admin.repository.store.MainStoreRepo; import com.iemr.admin.repository.store.V_FetchFacilityRepo; import com.iemr.admin.repository.vanMaster.VanMasterRepository; +import com.iemr.admin.service.employeemaster.AshaSupervisorMappingService; import com.iemr.admin.utils.exception.IEMRException; @Service @@ -60,6 +62,12 @@ public class StoreServiceImpl implements StoreService { @Autowired private FacilityVillageMappingRepo facilityVillageMappingRepo; + @Autowired + private AshaSupervisorMappingService ashaSupervisorMappingService; + + @Autowired + private M_facilitytypeRepo facilityTypeRepo; + // @Autowired // private SubStoreRepo subStoreRepo; @@ -245,24 +253,64 @@ public ArrayList getFacilitiesByBlock(Integer blockID) { } @Override - public ArrayList getFacilitiesByBlockAndLevel(Integer blockID, Integer facilityLevelID) { - return mainStoreRepo.findByBlockIDAndFacilityLevel(blockID, facilityLevelID); + public ArrayList getAllFacilitiesByBlock(Integer blockID) { + return mainStoreRepo.findByBlockIDOrderByFacilityName(blockID); + } + + @Override + public ArrayList getFacilitiesByBlockAndLevel(Integer blockID, Integer levelValue, String ruralUrban) { + if (ruralUrban == null || ruralUrban.isEmpty()) { + return mainStoreRepo.findByBlockIDAndLevelValue(blockID, levelValue); + } + return mainStoreRepo.findByBlockIDAndFacilityLevel(blockID, levelValue, ruralUrban); } @Transactional @Override public M_Facility createFacilityWithHierarchy(M_Facility facility, List villageIDs, - List childFacilityIDs) { + Integer mainVillageID, List childFacilityIDs) { + if (mainStoreRepo.existsByFacilityNameAndBlockIDAndDeletedFalse(facility.getFacilityName(), facility.getBlockID())) { + throw new RuntimeException("Facility with this name already exists in this block"); + } + // Fix 20: validate that child facilities selected are exactly one level below this facility + // (parentFacilityID is not sent from frontend on create; the hierarchy is built via childFacilityIDs) + if (childFacilityIDs != null && !childFacilityIDs.isEmpty() + && facility.getFacilityTypeID() != null) { + M_facilitytype ft = facilityTypeRepo.findByFacilityTypeID(facility.getFacilityTypeID()); + if (ft != null && ft.getLevelValue() != null) { + for (Integer childID : childFacilityIDs) { + M_Facility child = mainStoreRepo.findByFacilityIDAndDeleted(childID, false); + if (child != null && child.getFacilityTypeID() != null) { + M_facilitytype childFt = facilityTypeRepo.findByFacilityTypeID(child.getFacilityTypeID()); + if (childFt != null && childFt.getLevelValue() != null + && !childFt.getLevelValue().equals(ft.getLevelValue() + 1)) { + throw new RuntimeException( + "Hierarchy level mismatch: selected child facility is not at the expected level. " + + "Children must be exactly one level below this facility."); + } + } + } + } + } + facility.setMainVillageID(mainVillageID); M_Facility savedFacility = mainStoreRepo.save(facility); if (villageIDs != null && !villageIDs.isEmpty()) { for (Integer villageID : villageIDs) { - FacilityVillageMapping mapping = new FacilityVillageMapping(); - mapping.setFacilityID(savedFacility.getFacilityID()); - mapping.setDistrictBranchID(villageID); - mapping.setCreatedBy(facility.getCreatedBy()); - mapping.setDeleted(false); - facilityVillageMappingRepo.save(mapping); + FacilityVillageMapping existing = facilityVillageMappingRepo + .findByFacilityIDAndDistrictBranchIDAndDeletedTrue(savedFacility.getFacilityID(), villageID); + if (existing != null) { + existing.setDeleted(false); + existing.setModifiedBy(facility.getCreatedBy()); + facilityVillageMappingRepo.save(existing); + } else { + FacilityVillageMapping mapping = new FacilityVillageMapping(); + mapping.setFacilityID(savedFacility.getFacilityID()); + mapping.setDistrictBranchID(villageID); + mapping.setCreatedBy(facility.getCreatedBy()); + mapping.setDeleted(false); + facilityVillageMappingRepo.save(mapping); + } } } @@ -287,6 +335,11 @@ public List getMappedVillageIDs(Integer blockID) { @Override public ArrayList getVillageMappingsByFacility(Integer facilityID) { + // Return empty if facility itself is deleted + M_Facility facility = mainStoreRepo.findByFacilityIDAndDeleted(facilityID, false); + if (facility == null) { + return new ArrayList<>(); + } return facilityVillageMappingRepo.findByFacilityIDAndDeletedFalse(facilityID); } @@ -295,39 +348,116 @@ public ArrayList getChildFacilitiesByParent(Integer parentFacilityID return mainStoreRepo.findByParentFacilityIDAndDeletedFalseOrderByFacilityName(parentFacilityID); } + @Transactional + @Override + public M_Facility deleteFacilityWithHierarchy(Integer facilityID, String modifiedBy) throws Exception { + M_Facility facility = mainStoreRepo.findByFacilityID(facilityID); + if (facility == null) { + throw new Exception("Facility not found"); + } + // Fix 19: clear parentFacilityID on children (unlink from hierarchy, don't block) + ArrayList children = mainStoreRepo.findByParentFacilityIDAndDeletedFalseOrderByFacilityName(facilityID); + for (M_Facility child : children) { + child.setParentFacilityID(null); + child.setModifiedBy(modifiedBy); + mainStoreRepo.save(child); + } + facility.setDeleted(true); + facility.setModifiedBy(modifiedBy); + M_Facility saved = mainStoreRepo.save(facility); + // Fix 8: cascade soft-delete all asha_supervisor_mapping rows for this facility + ashaSupervisorMappingService.cascadeDeleteByFacilityID(facilityID, modifiedBy); + // Cascade soft-delete facility_village_mapping rows + ArrayList villageMappings = facilityVillageMappingRepo.findByFacilityIDAndDeletedFalse(facilityID); + for (FacilityVillageMapping vm : villageMappings) { + vm.setDeleted(true); + vm.setModifiedBy(modifiedBy); + facilityVillageMappingRepo.save(vm); + } + return saved; + } + @Transactional @Override public M_Facility updateFacilityWithHierarchy(M_Facility facility, List villageIDs, - List childFacilityIDs) { + Integer mainVillageID, List childFacilityIDs) { M_Facility existing = mainStoreRepo.findByFacilityID(facility.getFacilityID()); if (existing == null) { throw new RuntimeException("Facility not found"); } + if (mainStoreRepo.existsByFacilityNameAndBlockIDAndNotFacilityID(facility.getFacilityName(), existing.getBlockID(), facility.getFacilityID())) { + throw new RuntimeException("Facility with this name already exists in this block"); + } + existing.setFacilityName(facility.getFacilityName()); existing.setFacilityDesc(facility.getFacilityDesc()); + existing.setFacilityCode(facility.getFacilityCode()); + // Rural/Urban and FacilityType are read-only on edit — admin must delete and recreate to change + existing.setMainVillageID(mainVillageID); existing.setModifiedBy(facility.getModifiedBy()); M_Facility savedFacility = mainStoreRepo.save(existing); if (villageIDs != null) { List oldMappings = facilityVillageMappingRepo .findByFacilityIDAndDeletedFalse(facility.getFacilityID()); + // Build set of new village IDs for quick lookup + java.util.Set newVillageSet = new java.util.HashSet<>(villageIDs); + // Soft-delete old mappings that are NOT in the new list for (FacilityVillageMapping old : oldMappings) { - old.setDeleted(true); - old.setModifiedBy(facility.getModifiedBy()); - facilityVillageMappingRepo.save(old); + if (!newVillageSet.contains(old.getDistrictBranchID())) { + old.setDeleted(true); + old.setModifiedBy(facility.getModifiedBy()); + facilityVillageMappingRepo.save(old); + } } + // Build set of currently active village IDs + java.util.Set activeVillageSet = new java.util.HashSet<>(); + for (FacilityVillageMapping old : oldMappings) { + if (!Boolean.TRUE.equals(old.getDeleted())) { + activeVillageSet.add(old.getDistrictBranchID()); + } + } + // Add only truly new villages (not already active) for (Integer villageID : villageIDs) { - FacilityVillageMapping mapping = new FacilityVillageMapping(); - mapping.setFacilityID(savedFacility.getFacilityID()); - mapping.setDistrictBranchID(villageID); - mapping.setCreatedBy(facility.getModifiedBy()); - mapping.setDeleted(false); - facilityVillageMappingRepo.save(mapping); + if (!activeVillageSet.contains(villageID)) { + FacilityVillageMapping softDeleted = facilityVillageMappingRepo + .findByFacilityIDAndDistrictBranchIDAndDeletedTrue(savedFacility.getFacilityID(), villageID); + if (softDeleted != null) { + softDeleted.setDeleted(false); + softDeleted.setModifiedBy(facility.getModifiedBy()); + facilityVillageMappingRepo.save(softDeleted); + } else { + FacilityVillageMapping mapping = new FacilityVillageMapping(); + mapping.setFacilityID(savedFacility.getFacilityID()); + mapping.setDistrictBranchID(villageID); + mapping.setCreatedBy(facility.getModifiedBy()); + mapping.setDeleted(false); + facilityVillageMappingRepo.save(mapping); + } + } } } if (childFacilityIDs != null) { + // Fix 20: validate child levels before updating + if (!childFacilityIDs.isEmpty() && existing.getFacilityTypeID() != null) { + M_facilitytype ft = facilityTypeRepo.findByFacilityTypeID(existing.getFacilityTypeID()); + if (ft != null && ft.getLevelValue() != null) { + for (Integer childID : childFacilityIDs) { + M_Facility child = mainStoreRepo.findByFacilityIDAndDeleted(childID, false); + if (child != null && child.getFacilityTypeID() != null) { + M_facilitytype childFt = facilityTypeRepo.findByFacilityTypeID(child.getFacilityTypeID()); + if (childFt != null && childFt.getLevelValue() != null + && !childFt.getLevelValue().equals(ft.getLevelValue() + 1)) { + throw new RuntimeException( + "Hierarchy level mismatch: selected child facility is not at the expected level. " + + "Children must be exactly one level below this facility."); + } + } + } + } + } mainStoreRepo.clearParentFacilityID(facility.getFacilityID(), facility.getModifiedBy()); for (Integer childID : childFacilityIDs) { M_Facility child = mainStoreRepo.findByFacilityID(childID); diff --git a/src/main/java/com/iemr/admin/to/employeemaster/Previleges1097_3.java b/src/main/java/com/iemr/admin/to/employeemaster/Previleges1097_3.java index 519c4b0..d8bb0f3 100644 --- a/src/main/java/com/iemr/admin/to/employeemaster/Previleges1097_3.java +++ b/src/main/java/com/iemr/admin/to/employeemaster/Previleges1097_3.java @@ -27,11 +27,14 @@ public class Previleges1097_3 { Priveleges1097_2[] ID; private Integer providerServiceMapID; private Integer workingLocationID; + private Integer stateID; + private Integer districtID; private Integer blockID; private String blockName; private String[] villageID; private String[] villageName; - + private Integer facilityID; + public Integer getProviderServiceMapID() { return providerServiceMapID; } @@ -50,6 +53,18 @@ public Priveleges1097_2[] getID() { public void setID(Priveleges1097_2[] iD) { this.ID = iD; } + public Integer getStateID() { + return stateID; + } + public void setStateID(Integer stateID) { + this.stateID = stateID; + } + public Integer getDistrictID() { + return districtID; + } + public void setDistrictID(Integer districtID) { + this.districtID = districtID; + } public Integer getBlockID() { return blockID; } @@ -74,8 +89,10 @@ public String[] getVillageName() { public void setVillageName(String[] villageName) { this.villageName = villageName; } - - - - + public Integer getFacilityID() { + return facilityID; + } + public void setFacilityID(Integer facilityID) { + this.facilityID = facilityID; + } } From 7f10a54b624ef66556e46b69bc88eb3866e357ca Mon Sep 17 00:00:00 2001 From: Vishwanath Balkur <118195001+vishwab1@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:21:36 +0530 Subject: [PATCH 58/61] Facility hierarchy inventory mapping and store field management (#128) * fix:changed the pom xml * fix: added facilty type master change * feat: created facility creation * feat:added work location * feat:added work location * fix: rabiit review fix * fix: rabiit review fix * fix: rabiit review fix * fix: ui chnges * fix: pom version * fix: corrections * fix: facilty hierachy * fix: facility heirachy * fix: item facility mapping and store updates Co-Authored-By: Claude Opus 4.6 (1M context) * fix: fixed inventory flow --------- Co-authored-by: Claude Opus 4.6 (1M context) --- logs/admin-api.log.json.2026-02-26.gz | Bin 0 -> 4235 bytes .../MItemFacilityMappingController.java | 17 ++++ .../V_fetchItemFacilityMapRepo.java | 8 ++ .../admin/repository/store/MainStoreRepo.java | 10 +++ .../M_itemfacilitymappingImpl.java | 5 ++ .../M_itemfacilitymappingInter.java | 4 +- .../admin/service/store/StoreServiceImpl.java | 73 ++++++++++++++++-- 7 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 logs/admin-api.log.json.2026-02-26.gz diff --git a/logs/admin-api.log.json.2026-02-26.gz b/logs/admin-api.log.json.2026-02-26.gz new file mode 100644 index 0000000000000000000000000000000000000000..510c59d383b51c527096e11968b56ae40cc128d8 GIT binary patch literal 4235 zcmV;65OnV!iwFP!00000|LvVybKAI*fZz95U|n0~OjQi)>e$+sqgeJtSvyuF$Ei9w zQ!a>vB*Y}aAwW5rQ~Tey8>B9=omnQwc7!?oq7uOi(2Wn>jSInl?)=TFSQ;zhbf>e^ zs5RPqwS&F-tIJxm)2ww`hrCgL_4l2ZY$wuF9?7|kb~J3DiBubgyja$y%lr8>aTc>*W2t?*%=%3d#rWPYPQ*n{h5yCegc<- zGiB9&PX~D{6KnRnai;9`P^S7?XKJbv5$#XhZ#RrpvezB-_aXbKwEICMjFE;JERGD> zc)?arWGZ3*QYOEk$TBc|E;9pCp(g6Q!D~A&chXD;pbTzjnG_*UM2uR=WLc1Np%S>t zDN#?SGJ}(Wj=7R?#sy};A5`4V|Nh56tJKlq-8$OooxJ|=>(_NO%##GG!D)V!X88ZL z)|SniAVuTlGHrgq>%6(W!X8xt@^U8GL`RXnMUmL019d2@8xgTvIcAxR1X>U*I}#M=#Hdha%t-4Dodv*l%d^F^Io!9qt_9SmYlXXB zEAfcej@ng}cn*(ODKxRtjP!&REY@KjfkB?=JPBViFtyU1G&WO#1uduAD66vtDtMx% zc~&?KxbGR*3!#X7T?Ss1fe%+H$D4)f$w*ECimF;WsG>DAz@Q9~rl^)p)x8~b*ZP4L zivFv2a@zfHcIni^{nk(GsFHO%Rf#e)Xo#Dt*}%pGqVQ^oiw$R|2pg-{kG|I7 z09tE6hX^Dv(O9+b6pdMd8)_N+hFH-#|F!YG(M2wEt%P z30vr#-3rLd&NgezdF3$_=5AFkUambn7!+-VbMo+*3|ol85UB{9bt0Lbp!+v+bt&B1 zVSiFtkQdZbCb`S@jW9FzBF*GPW^nG8mvHMkd-=smPzdC{&T1o+wTpCF6j!>n2!B$7 z8@ZT^D3_bu{Eu8*VcHs;ZDaQYHGw4=W&BgS5qPe)*6lBt~$wM4BS z)Sg4vVUG1}WHwiUj0>~-x;#%H6UgmW(+7}81;A;^GZ9P#`$jNulN$n-fb|5}>(Mf3 zz~S&yO-7d(_Ke}n>xTp2P+FlP;+Q!0h2uN%F9A#d`vvd^u)sZ{mZ&YMZFxW~GD|@( zQR^4ASJ$JNzD*wte2HSBc&jN6M5M-rbo_YzzdPs?x`eKe=n}WYZM#)zN#@VtHq7!V z)}UMCfPaWsB6h2Zm2n#Bg)C<#_(^$KtlKAgiC(|yC432A@9-VLV};E#iXI4HuK+&3 zKGt!ZC(14eT|&3rs`MV%mY~~{#@SsOXCQdJgZEdcYwE8Nx4v`7m=EjTeA?pgm1f5ZO^Oiz;`GkH6?P1T<^%eR5qfZm$3B= z+hXN;tf!esXDXmqFo|Ff3C2MO+BJs&UIAQbN3pE{828j9W{Fv!n8jBp^kkv}S-fg# z+(22K5GI6uLO3_ecZJO)(=i^FF9c;^lFOlmPxgRKuAdbJmaiuN0e-6hJ4UupZ>jZBrVLo+f=S5miBGUaHkxV4}O)|yA z#IXk)M`B!j-hvLaX}_UYKWc zBU+%L2V%HjxLxy#VG4AKTp!5Q#fui@C__&b-yL+@q7u9Wub1#On%s0IvRDKf3a0`QfgP4pRK(!nbmEzK-fEtI&!OxfQ6d!3@P6}Xtpp;N2={b(NWh7(BEl`Q%qf`b;MCuRPt(w^N zjNK2kISCQ#9kE|qTv}U37_TsHdW7*6WT8Q7e5aUV2SV60gzw?o(=jNLASQ^n8sZ$% zKIoV@B~G`Q(^6~+HZ>|`?ufFg))X*m*U%%3b}TSN1?E@k~6o z+if3tzPg@B8_ZnjTb`mldkJVifKEkr1DOvZxQq`r4%Uhwiiu)hDZYdXxuMUx5z*ce zU2bZold%?A$d5%7(If`p>n*-CmqGY?i*GN>r@v-8r(PZL3;Z7V$S*BiCxU$^m^P>; zfIS7c4_B2tRIgQ0Cy)tb-#|_bE(-3cOa_*^bcC^=7@uFCN*RttaFYn!`Ij&zjJ?K~ zMu!PvZy{d2YZNZS3R)LLM6ZZ`FvZHmv9}!G`Q9PT z>k-aAe*+-Odx66{{Oh>XD zNj}xt5RS+|6V)D44d$8F&=bLa6KtrfM;LpK@zphc?S7f+E+>+S4;k&xg7*fDhSUg4Z8-%RqRb;bK18I9Mx!DE>F6_@L%3#aAkdpm^nW#>6x6><7<@ zj%A2a^O5`8kK;TkKj2J}1u^U+!_=!Id_BhZN(6yQ$O03>-XM%m~5vlhM| zr_pf^S;fRKG3*1w#lkd-8wgy_z(s7&^puuM613hxyZMPlFu9K5J82XJ6Vu)^eI*k5 zcqrlQ8_sjY)~%?#TK*$`iC>@i-CTuMnqY+afn*|^$X=4&@PO<~s76HjvfP81*d=!T zV0XC~xQHw^kBDR9*c*=jfSN5|IQl#M?I~k36<8WNCWyU-n9MK{`~w7^szjNY4A~~i z8=x3~GQkrnVa+y+4QHo1PeN9^$IhBs!?#U`JsHUA zB0KC;*A;~oqVCsgyw2-~&n@zaD@`?tTeV7tpueQpNnIF&B~1(f>ZWO=0@s+JWmz!K z&m=SE2G`5%wJ?$|8RMTK9f)YA4gTN%t*S1XRdg|g=Jc@4opoz>$>^U`-~)672C`9a z)xbnPV|zCRo@o8Bc)Y}Q)!-kfwMvS5bx_FyzIpSeR;x8?tqvO$k|8z&lpCUvB#<9K zTm59B*(VgW!$LU`dGr(}Vy4D2OTfhQ&#B!+mQ#kk$cmsDj7jG~^QGX!Ncd{StXuVv>eg>+YG$m9U}jAd`7S_8%! zsMLTTy$1Sd17-GoHDItChQo$b1&>e#BkQ96@2UYe(w%2d(Bb+B8HJ3vfX%V_HbATHsQ1W7e1)7GNIB2$C zHIAN1H=&$caPsDkk}gsdT}12hR-ZmN;IHbH3`RM7QWkq9{>HpXF`H5jZ88k>*zPk# zxQ{uR0@`R)n@KL!u-<=qW9Sxx-6LLWwgDR)hch^B>SSHfgWZB7-aM*5a$o6=^?k5- z|F0sNom!o@k1CBcJv0x|QyAt4v*L^AI32Sa-c9;`Fp#mmMCm<5Zcl!Z!Cw8jXC;1I zGe1EQcN@y)1jM~6sw(tFP>ctF8denM&NY8Hyg|L zn7L7IeG+^7@siC!2Vv3ro7*sjD9v$uCP@8ciI`|AG0M h?^4Jk4DXi$SDLN+mcakQ?8W1Y`+rL=*ydw-0RT_Y|40A; literal 0 HcmV?d00001 diff --git a/src/main/java/com/iemr/admin/controller/itemfacilitymapping/MItemFacilityMappingController.java b/src/main/java/com/iemr/admin/controller/itemfacilitymapping/MItemFacilityMappingController.java index a827f18..0bf5bd5 100644 --- a/src/main/java/com/iemr/admin/controller/itemfacilitymapping/MItemFacilityMappingController.java +++ b/src/main/java/com/iemr/admin/controller/itemfacilitymapping/MItemFacilityMappingController.java @@ -228,6 +228,23 @@ public String getAllFacilityMappedData(@RequestBody String getAllFacilityMappedD } + @RequestMapping(value = "/getItemMappingsByFacility", headers = "Authorization", method = { + RequestMethod.POST }, produces = { "application/json" }) + public String getItemMappingsByFacility(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + V_fetchItemFacilityMap reqObj = InputMapper.gson().fromJson(request, + V_fetchItemFacilityMap.class); + ArrayList data = M_itemfacilitymappingInter + .getItemMappingsByFacilityID(reqObj.getFacilityID()); + response.setResponse(data.toString()); + } catch (Exception e) { + logger.error("Unexpected error:", e); + response.setError(e); + } + return response.toString(); + } + @Operation(summary = "Get item from store id") @RequestMapping(value = "/getItemFromStoreID/{storeID}", headers = "Authorization", method = { RequestMethod.POST }, produces = { "application/json" }) diff --git a/src/main/java/com/iemr/admin/repository/itemfacilitymapping/V_fetchItemFacilityMapRepo.java b/src/main/java/com/iemr/admin/repository/itemfacilitymapping/V_fetchItemFacilityMapRepo.java index e94dba5..07b52bd 100644 --- a/src/main/java/com/iemr/admin/repository/itemfacilitymapping/V_fetchItemFacilityMapRepo.java +++ b/src/main/java/com/iemr/admin/repository/itemfacilitymapping/V_fetchItemFacilityMapRepo.java @@ -36,4 +36,12 @@ public interface V_fetchItemFacilityMapRepo extends CrudRepository getAllFacilityMappedData(@Param("providerServiceMapID") Integer providerServiceMapID); + @Query("SELECT u FROM V_fetchItemFacilityMap u where u.facilityID = :facilityID") + ArrayList getItemMappingsByFacilityID(@Param("facilityID") Integer facilityID); + + @Query(value = "SELECT u.* FROM v_fetchItemFacilityMap u WHERE u.FacilityID = :facilityID " + + "OR u.FacilityID IN (SELECT f.FacilityID FROM m_facility f WHERE f.MainFacilityID = :facilityID AND f.Deleted = false)", + nativeQuery = true) + ArrayList getItemMappingsByFacilityAndSubStores(@Param("facilityID") Integer facilityID); + } diff --git a/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java b/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java index c9c1ef3..45b1015 100644 --- a/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java +++ b/src/main/java/com/iemr/admin/repository/store/MainStoreRepo.java @@ -37,6 +37,9 @@ public interface MainStoreRepo extends CrudRepository { List findByProviderServiceMapIDOrderByFacilityName(Integer providerServiceMapID); + @Query("SELECT f FROM M_Facility f WHERE (f.providerServiceMapID = :providerServiceMapID OR f.providerServiceMapID IS NULL) ORDER BY f.facilityName") + List findByProviderServiceMapIDOrNullOrderByFacilityName(@Param("providerServiceMapID") Integer providerServiceMapID); + @Query("SELECT u FROM M_Facility u WHERE u.providerServiceMapID=:providerServiceMapID AND u.isMainFacility=:isMainFacility AND deleted=false order by u.facilityName") ArrayList getAllMainFacility(@Param("providerServiceMapID") Integer providerServiceMapID, @Param("isMainFacility") Boolean isMainFacility); @@ -90,4 +93,11 @@ ArrayList findByBlockIDAndLevelValue(@Param("blockID") Integer block int clearParentFacilityID(@Param("parentFacilityID") Integer parentFacilityID, @Param("modifiedBy") String modifiedBy); + @Modifying + @Query(value = "UPDATE m_facility SET IsMainFacility = :isMainFacility, MainFacilityID = :mainFacilityID, StoreType = :storeType WHERE FacilityID = :facilityID", nativeQuery = true) + int updateStoreFields(@Param("facilityID") Integer facilityID, + @Param("isMainFacility") Boolean isMainFacility, + @Param("mainFacilityID") Integer mainFacilityID, + @Param("storeType") String storeType); + } diff --git a/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingImpl.java b/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingImpl.java index 2d5ce00..e12a844 100644 --- a/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingImpl.java +++ b/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingImpl.java @@ -91,6 +91,11 @@ public ArrayList getAllFacilityMappedData(Integer provid return data; } + @Override + public ArrayList getItemMappingsByFacilityID(Integer facilityID) { + return v_fetchItemFacilityMapRepo.getItemMappingsByFacilityAndSubStores(facilityID); + } + @Override public List getItemMastersFromStoreID(Integer storeID) { // TODO Auto-generated method stub diff --git a/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingInter.java b/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingInter.java index d41d661..54115cf 100644 --- a/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingInter.java +++ b/src/main/java/com/iemr/admin/service/itemfacilitymapping/M_itemfacilitymappingInter.java @@ -39,7 +39,9 @@ public interface M_itemfacilitymappingInter{ ArrayList getsubitemforsubStote(Integer providerServiceMapID, Integer facilityID); ArrayList getAllFacilityMappedData(Integer providerServiceMapID); - + + ArrayList getItemMappingsByFacilityID(Integer facilityID); + List getItemMastersFromStoreID(Integer storeID); Integer deleteItemStoreMapping(M_itemfacilitymapping storeID); diff --git a/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java b/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java index db300f8..a08e8cd 100644 --- a/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/store/StoreServiceImpl.java @@ -100,7 +100,7 @@ public M_Facility getMainStore(Integer mainStoreID) { @Override public List getAllMainStore(Integer providerServiceMapID) { // TODO Auto-generated method stub - return (List) mainStoreRepo.findByProviderServiceMapIDOrderByFacilityName(providerServiceMapID); + return (List) mainStoreRepo.findByProviderServiceMapIDOrNullOrderByFacilityName(providerServiceMapID); } // @Override @@ -321,6 +321,15 @@ public M_Facility createFacilityWithHierarchy(M_Facility facility, List child.setParentFacilityID(savedFacility.getFacilityID()); child.setModifiedBy(facility.getCreatedBy()); mainStoreRepo.save(child); + + // Only update store fields for NEW hierarchy facilities (PSMID is NULL) + // Existing stores (PSMID set) keep their store chain intact for inventory compatibility + if (child.getProviderServiceMapID() == null) { + if (child.getIsMainFacility() == null || child.getIsMainFacility()) { + mainStoreRepo.updateStoreFields(childID, false, + savedFacility.getFacilityID(), "SUB"); + } + } } } } @@ -356,11 +365,16 @@ public M_Facility deleteFacilityWithHierarchy(Integer facilityID, String modifie throw new Exception("Facility not found"); } // Fix 19: clear parentFacilityID on children (unlink from hierarchy, don't block) + // Revert children to MainStore since parent is being deleted ArrayList children = mainStoreRepo.findByParentFacilityIDAndDeletedFalseOrderByFacilityName(facilityID); for (M_Facility child : children) { child.setParentFacilityID(null); child.setModifiedBy(modifiedBy); mainStoreRepo.save(child); + // Only revert store fields for new facilities (PSMID NULL) + if (child.getProviderServiceMapID() == null) { + mainStoreRepo.updateStoreFields(child.getFacilityID(), true, null, "MAIN"); + } } facility.setDeleted(true); facility.setModifiedBy(modifiedBy); @@ -386,14 +400,39 @@ public M_Facility updateFacilityWithHierarchy(M_Facility facility, List throw new RuntimeException("Facility not found"); } - if (mainStoreRepo.existsByFacilityNameAndBlockIDAndNotFacilityID(facility.getFacilityName(), existing.getBlockID(), facility.getFacilityID())) { - throw new RuntimeException("Facility with this name already exists in this block"); + if (existing.getBlockID() != null && facility.getFacilityName() != null) { + if (mainStoreRepo.existsByFacilityNameAndBlockIDAndNotFacilityID(facility.getFacilityName(), existing.getBlockID(), facility.getFacilityID())) { + throw new RuntimeException("Facility with this name already exists in this block"); + } } - existing.setFacilityName(facility.getFacilityName()); - existing.setFacilityDesc(facility.getFacilityDesc()); - existing.setFacilityCode(facility.getFacilityCode()); - // Rural/Urban and FacilityType are read-only on edit — admin must delete and recreate to change + if (facility.getFacilityName() != null) { + existing.setFacilityName(facility.getFacilityName()); + } + if (facility.getFacilityDesc() != null) { + existing.setFacilityDesc(facility.getFacilityDesc()); + } + if (facility.getFacilityCode() != null) { + existing.setFacilityCode(facility.getFacilityCode()); + } + // Set hierarchy fields: facilityType, ruralUrban, and location + if (facility.getFacilityTypeID() != null) { + existing.setFacilityTypeID(facility.getFacilityTypeID()); + } + if (facility.getRuralUrban() != null) { + existing.setRuralUrban(facility.getRuralUrban()); + } + if (facility.getStateID() != null) { + existing.setStateID(facility.getStateID()); + } + if (facility.getDistrictID() != null) { + existing.setDistrictID(facility.getDistrictID()); + } + if (facility.getBlockID() != null) { + existing.setBlockID(facility.getBlockID()); + } + // Keep store relationships intact (isMainFacility, mainFacilityID, storeType) + // Only hierarchy columns are added. Store chain stays for inventory compatibility. existing.setMainVillageID(mainVillageID); existing.setModifiedBy(facility.getModifiedBy()); M_Facility savedFacility = mainStoreRepo.save(existing); @@ -458,13 +497,33 @@ public M_Facility updateFacilityWithHierarchy(M_Facility facility, List } } } + // Revert old children to MainStore before re-linking + ArrayList oldChildren = mainStoreRepo + .findByParentFacilityIDAndDeletedFalseOrderByFacilityName(facility.getFacilityID()); mainStoreRepo.clearParentFacilityID(facility.getFacilityID(), facility.getModifiedBy()); + for (M_Facility oldChild : oldChildren) { + if (!childFacilityIDs.contains(oldChild.getFacilityID())) { + // Child was removed — revert to MainStore only for new facilities (PSMID NULL) + if (oldChild.getProviderServiceMapID() == null) { + mainStoreRepo.updateStoreFields(oldChild.getFacilityID(), true, null, "MAIN"); + } + } + } + for (Integer childID : childFacilityIDs) { M_Facility child = mainStoreRepo.findByFacilityID(childID); if (child != null) { child.setParentFacilityID(savedFacility.getFacilityID()); child.setModifiedBy(facility.getModifiedBy()); mainStoreRepo.save(child); + + // Only update store fields for NEW hierarchy facilities (PSMID is NULL) + if (child.getProviderServiceMapID() == null) { + if (child.getIsMainFacility() == null || child.getIsMainFacility()) { + mainStoreRepo.updateStoreFields(childID, false, + savedFacility.getFacilityID(), "SUB"); + } + } } } } From 1c6a0629c87d2bb11e1bc04d6d6ed92f51d2e53d Mon Sep 17 00:00:00 2001 From: Vishwanath Balkur <118195001+vishwab1@users.noreply.github.com> Date: Thu, 21 May 2026 14:55:27 +0530 Subject: [PATCH 59/61] merge 3.6.2 to release 3.8.1 (#132) * Cherry-pick health and version API enhancements to release-3.6.1 (#124) * feat(health,version): add health and version endponts * fix(health): add constant and remove duplicates * fix(health): avoid permanent DEGRADED from historical deadlocks * fix(health): Removed the unnecessary boolean literal * fix(health): Fixed the broken lock-wait detection * fix(health): avoid blocking DB I/O under write lock and restore interrupt flag * fix(health): add cancelFutures in healthservice * fix(health): close basic DB connection before advanced checks and remove shared-map race * feat: expose account lock state in SearchEmployee4 (#129) Co-authored-by: Varun Deep Saini * Fix the reset password issue (#131) * fix: reset password * fix: build issue * fix: update the url * fix: update config properties * fix: initialize constructor --------- Co-authored-by: KOPPIREDDY DURGA PRASAD <144464542+DurgaPrasad-54@users.noreply.github.com> Co-authored-by: Varun Deep Saini Co-authored-by: Varun Deep Saini Co-authored-by: Vanitha S <116701245+vanitha1822@users.noreply.github.com> --- .../controller/version/VersionController.java | 6 +++ .../admin/data/employeemaster/M_User1.java | 11 +++++ .../admin/data/employeemaster/V_Showuser.java | 36 +++++++++++++++ .../employeemaster/EmployeeMasterRepoo.java | 3 ++ .../EmployeeMasterServiceImpl.java | 45 ++++++++++++++++--- .../EncryptUserPassword123.java | 23 ++++++++-- .../service/user/EncryptUserPassword.java | 26 +++++++++-- .../utils/JwtUserIdValidationFilter.java | 7 ++- .../admin/utils/config/ConfigProperties.java | 24 ++++++++-- 9 files changed, 165 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/iemr/admin/controller/version/VersionController.java b/src/main/java/com/iemr/admin/controller/version/VersionController.java index 67f7c74..353fc77 100644 --- a/src/main/java/com/iemr/admin/controller/version/VersionController.java +++ b/src/main/java/com/iemr/admin/controller/version/VersionController.java @@ -19,6 +19,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see https://www.gnu.org/licenses/. */ + package com.iemr.admin.controller.version; import java.util.Map; @@ -33,6 +34,11 @@ import com.iemr.admin.service.version.VersionService; import io.swagger.v3.oas.annotations.Operation; +import java.io.IOException; +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.Properties; +import org.springframework.http.MediaType; @RestController public class VersionController { 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 1c319a8..164e2d6 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 @@ -231,6 +231,9 @@ public void setSignatureStatus(String signatureStatus) { @Expose @Column(name = "failed_attempt", insertable = false) private Integer failedAttempt; + @Expose + @Column(name = "lock_timestamp", insertable = false) + private Timestamp lockTimestamp; public M_User1() { // TODO Auto-generated constructor stub } @@ -251,6 +254,14 @@ public void setFailedAttempt(Integer failedAttempt) { this.failedAttempt = failedAttempt; } + public Timestamp getLockTimestamp() { + return lockTimestamp; + } + + public void setLockTimestamp(Timestamp lockTimestamp) { + this.lockTimestamp = lockTimestamp; + } + public Integer getUserID() { return userID; } diff --git a/src/main/java/com/iemr/admin/data/employeemaster/V_Showuser.java b/src/main/java/com/iemr/admin/data/employeemaster/V_Showuser.java index 6efd2e5..bafbf8c 100644 --- a/src/main/java/com/iemr/admin/data/employeemaster/V_Showuser.java +++ b/src/main/java/com/iemr/admin/data/employeemaster/V_Showuser.java @@ -246,6 +246,18 @@ public class V_Showuser { @Column(name="DistrictID") private Integer districtID; + @Expose + @Transient + private Integer failedAttempt; + + @Expose + @Transient + private Timestamp lockTimestamp; + + @Expose + @Transient + private Boolean lockedDueToFailedAttempts; + @@ -922,6 +934,30 @@ public void setDistrictID(Integer districtID) { this.districtID = districtID; } + public Integer getFailedAttempt() { + return failedAttempt; + } + + public void setFailedAttempt(Integer failedAttempt) { + this.failedAttempt = failedAttempt; + } + + public Timestamp getLockTimestamp() { + return lockTimestamp; + } + + public void setLockTimestamp(Timestamp lockTimestamp) { + this.lockTimestamp = lockTimestamp; + } + + public Boolean getLockedDueToFailedAttempts() { + return lockedDueToFailedAttempts; + } + + public void setLockedDueToFailedAttempts(Boolean lockedDueToFailedAttempts) { + this.lockedDueToFailedAttempts = lockedDueToFailedAttempts; + } + 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 3c90c81..e2b017a 100644 --- a/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepoo.java +++ b/src/main/java/com/iemr/admin/repo/employeemaster/EmployeeMasterRepoo.java @@ -22,6 +22,7 @@ package com.iemr.admin.repo.employeemaster; import java.util.ArrayList; +import java.util.List; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -87,4 +88,6 @@ M_User1 checkingEmpDetails(@Param("userName") String userName, @Param("aadhaarNo ArrayList getempByDesiganation(@Param("designationID") Integer designationID,@Param("serviceProviderID") Integer serviceProviderID); M_User1 findByUserID(Integer userID); + + List findByUserIDIn(List userIDs); } 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 ecf1106..f4c07f3 100644 --- a/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/employeemaster/EmployeeMasterServiceImpl.java @@ -25,6 +25,7 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -44,6 +45,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; @@ -117,7 +119,10 @@ public class EmployeeMasterServiceImpl implements EmployeeMasterInter { private static HttpUtils httpUtils = new HttpUtils(); - private String common_url = ConfigProperties.getPropertyByName("common-url"); + @Value("${common-url}") + private String common_url; + + // private String common_url = ConfigProperties.getPropertyByName("common-url"); private final String COMMON_BASE_URL = "common-url"; @@ -538,7 +543,7 @@ private Set getCTICampaignRoles(String campaignName, String authToken) t ObjectMapper objectMapper = new ObjectMapper(); Set resultSet = new HashSet(); HttpEntity request = RestTemplateUtil.createRequestEntity(campaignName, authToken); - String url = configProperties.getPropertyByName("common-url") + configProperties.getPropertyByName("create-feedback"); + String url = common_url +"/" + configProperties.getPropertyByName("create-feedback"); ResponseEntity responseStr = restTemplate.exchange(url, HttpMethod.POST, request, String.class); OutputResponse response = objectMapper.readValue(responseStr.getBody(), OutputResponse.class); @@ -781,7 +786,8 @@ public void createUserInCallCentre(M_User1 user, String authToken) { logger.info("EmployeeMasterServiceImpl.createUserInCallCentre - start"); if (ENABLE_CTI_USER_CREATION) { String UserCreateAPIURL = ""; - String ctiServer = configProperties.getPropertyByName("common-url"); + // String ctiServer = configProperties.getPropertyByName("common-url"); + String ctiServer=common_url; UserCreateAPIURL = ctiServer + configProperties.getPropertyByName("create-update-users-url"); HashMap headers = new HashMap(); JSONObject request = new JSONObject(); @@ -815,7 +821,8 @@ public void updateUserInCallCentre(String userName, String ctiRole, String authT if (ENABLE_CTI_USER_CREATION) { String UserCreateAPIURL = ""; - String ctiServer = configProperties.getPropertyByName("common-url"); + // String ctiServer = configProperties.getPropertyByName("common-url"); + String ctiServer=common_url; UserCreateAPIURL = ctiServer + configProperties.getPropertyByName("create-update-users-url"); HashMap headers = new HashMap(); JSONObject request = new JSONObject(); @@ -1307,8 +1314,36 @@ public ArrayList getAllCommunity() { @Override public ArrayList getEmployeeDetails4(Integer serviceProviderID) { + ArrayList users = v_ShowuserRepo.EmployeeDetails4(serviceProviderID); + if (users.isEmpty()) { + return users; + } + + ArrayList userIDs = new ArrayList(users.size()); + for (V_Showuser user : users) { + userIDs.add(user.getUserID()); + } + + Map userRecords = new HashMap(); + for (M_User1 userRecord : employeeMasterRepoo.findByUserIDIn(userIDs)) { + userRecords.put(userRecord.getUserID(), userRecord); + } + + for (V_Showuser user : users) { + enrichAccountLockState(user, userRecords.get(user.getUserID())); + } + return users; + } + + private void enrichAccountLockState(V_Showuser user, M_User1 userRecord) { + if (userRecord == null) { + return; + } - return v_ShowuserRepo.EmployeeDetails4(serviceProviderID); + Timestamp lockTimestamp = userRecord.getLockTimestamp(); + user.setFailedAttempt(userRecord.getFailedAttempt() != null ? userRecord.getFailedAttempt() : 0); + user.setLockTimestamp(lockTimestamp); + user.setLockedDueToFailedAttempts(Boolean.TRUE.equals(userRecord.getDeleted()) && lockTimestamp != null); } @Override diff --git a/src/main/java/com/iemr/admin/service/provideronboard/EncryptUserPassword123.java b/src/main/java/com/iemr/admin/service/provideronboard/EncryptUserPassword123.java index 009842c..19ef749 100644 --- a/src/main/java/com/iemr/admin/service/provideronboard/EncryptUserPassword123.java +++ b/src/main/java/com/iemr/admin/service/provideronboard/EncryptUserPassword123.java @@ -24,6 +24,7 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -34,15 +35,31 @@ import com.iemr.admin.utils.mapper.InputMapper; import com.iemr.admin.utils.response.OutputResponse; +import jakarta.annotation.PostConstruct; + @Service public class EncryptUserPassword123 { private static HttpUtils utils = new HttpUtils(); - private static String commonBaseURL = ConfigProperties.getPropertyByName("common-url"); - private static String encryptPasswordURL = commonBaseURL - + ConfigProperties.getPropertyByName("encrypt-password-url"); + // private static String commonBaseURL = + // ConfigProperties.getPropertyByName("common-url"); + + @Value("${common-url}") + private String commonBaseURL; + + // private String encryptPasswordURL = commonBaseURL + "/" + // + ConfigProperties.getPropertyByName("encrypt-password-url"); private Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + private String encryptPasswordURL; + + @PostConstruct + public void init() { + encryptPasswordURL = commonBaseURL + "/" + + ConfigProperties.getPropertyByName("encrypt-password-url"); + logger.info("commonBaseURL=" + encryptPasswordURL); + } + @Async public OutputResponse encryptUserCredentials(M_User data) { JSONObject request = new JSONObject(); diff --git a/src/main/java/com/iemr/admin/service/user/EncryptUserPassword.java b/src/main/java/com/iemr/admin/service/user/EncryptUserPassword.java index 14ff8cb..165120e 100644 --- a/src/main/java/com/iemr/admin/service/user/EncryptUserPassword.java +++ b/src/main/java/com/iemr/admin/service/user/EncryptUserPassword.java @@ -24,6 +24,7 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -33,15 +34,34 @@ import com.iemr.admin.utils.mapper.InputMapper; import com.iemr.admin.utils.response.OutputResponse; +import jakarta.annotation.PostConstruct; + @Service public class EncryptUserPassword { private static HttpUtils utils = new HttpUtils(); - private static String commonBaseURL = ConfigProperties.getPropertyByName("common-url"); - private static String encryptPasswordURL = commonBaseURL - + ConfigProperties.getPropertyByName("encrypt-password-url"); + + @Value("${common-url}") + private String commonBaseURL; + + // @Value("${encrypt-password-url}") + // private String encryptPasswordEndpoint; + + // private static String commonBaseURL = + // ConfigProperties.getPropertyByName("common-url"); + // private String encryptPasswordURL = commonBaseURL + "/" + + // ConfigProperties.getPropertyByName("encrypt-password-url"); private Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + private String encryptPasswordURL; + + @PostConstruct + public void init() { + encryptPasswordURL = commonBaseURL + "/" + + ConfigProperties.getPropertyByName("encrypt-password-url"); + logger.info("commonBaseURL" + encryptPasswordURL); + } + @Async public OutputResponse encryptUserCredentials(M_User1 data) { JSONObject request = new JSONObject(); diff --git a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java index 14a295d..f82b98b 100644 --- a/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/admin/utils/JwtUserIdValidationFilter.java @@ -19,6 +19,9 @@ public class JwtUserIdValidationFilter implements Filter { + private static final String HEALTH_ENDPOINT = "/health"; + private static final String VERSION_ENDPOINT = "/version"; + private final JwtAuthenticationUtil jwtAuthenticationUtil; private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); private final String allowedOrigins; @@ -98,7 +101,9 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo || path.startsWith(contextPath + "/swagger-ui") || path.startsWith(contextPath + "/v3/api-docs") || path.startsWith(contextPath + "/user/refreshToken") - || path.startsWith(contextPath + "/public")) { + || path.startsWith(contextPath + "/public") + || path.equals(contextPath + HEALTH_ENDPOINT) + || path.equals(contextPath + VERSION_ENDPOINT)) { logger.info("Skipping filter for path: " + path); filterChain.doFilter(servletRequest, servletResponse); return; diff --git a/src/main/java/com/iemr/admin/utils/config/ConfigProperties.java b/src/main/java/com/iemr/admin/utils/config/ConfigProperties.java index 2aacef9..9fdb90f 100644 --- a/src/main/java/com/iemr/admin/utils/config/ConfigProperties.java +++ b/src/main/java/com/iemr/admin/utils/config/ConfigProperties.java @@ -118,11 +118,27 @@ public static int getSessionExpiryTime() { public static String getPropertyByName(String propertyName) { String result = null; try { - if (properties == null) { - initalizeProperties(); + // if (properties == null) { + // initalizeProperties(); + // } + // // result = environment.getProperty(propertyName); + // result = properties.getProperty(propertyName); + + if (environment != null) + { + result = environment.getProperty(propertyName); + } + if (result == null) + { + if (properties == null) + { + initalizeProperties(); + } + result = properties.getProperty(propertyName).trim(); + } else + { + result = result.trim(); } - // result = environment.getProperty(propertyName); - result = properties.getProperty(propertyName); } catch (Exception e) { logger.error(propertyName + " retrival failed.", e); } From 0599abdb2eaa371e1450b9babb2fc2d6fb5e063a Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Tue, 16 Jun 2026 12:13:19 +0530 Subject: [PATCH 60/61] fix: avoid ONLY_FULL_GROUP_BY violation in service lookup queries GROUP BY sm.serviceName selected non-aggregated, non-functionally-dependent columns (serviceID, isNational, statusID), which MySQL rejects under ONLY_FULL_GROUP_BY. Use SELECT DISTINCT instead since no aggregation is actually needed. --- .../repo/blocking/MProviderservicemappingBlockingRepo.java | 2 +- .../M_UserservicerolemappingForRoleProviderAdminRepo.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/iemr/admin/repo/blocking/MProviderservicemappingBlockingRepo.java b/src/main/java/com/iemr/admin/repo/blocking/MProviderservicemappingBlockingRepo.java index 1b7b082..e0a0ffe 100644 --- a/src/main/java/com/iemr/admin/repo/blocking/MProviderservicemappingBlockingRepo.java +++ b/src/main/java/com/iemr/admin/repo/blocking/MProviderservicemappingBlockingRepo.java @@ -85,7 +85,7 @@ void blockProviderByProviderIdAndServiceId(@Param("serviceProviderID") Integer s @Query(" SELECT distinct srm.providerServiceMapID,srm.serviceProviderID,srm.serviceID," + " sm.serviceName as serviceName," + " sm.isNational as isNational " + " FROM M_Providerservicemapping_Blocking srm " + " JOIN srm.m_ServicemasterForBlocking sm" - + " WHERE srm.serviceProviderID =:serviceProviderID AND srm.deleted=false" + " GROUP BY sm.serviceName") + + " WHERE srm.serviceProviderID =:serviceProviderID AND srm.deleted=false") ArrayList getServiceLiensUsingProvider(@Param("serviceProviderID") Integer serviceProviderID); @Transactional diff --git a/src/main/java/com/iemr/admin/repository/rolemaster/M_UserservicerolemappingForRoleProviderAdminRepo.java b/src/main/java/com/iemr/admin/repository/rolemaster/M_UserservicerolemappingForRoleProviderAdminRepo.java index 759be90..b6937b5 100644 --- a/src/main/java/com/iemr/admin/repository/rolemaster/M_UserservicerolemappingForRoleProviderAdminRepo.java +++ b/src/main/java/com/iemr/admin/repository/rolemaster/M_UserservicerolemappingForRoleProviderAdminRepo.java @@ -49,15 +49,14 @@ public interface M_UserservicerolemappingForRoleProviderAdminRepo * serviceProviderID, Integer serviceID); */ - @Query("SELECT sm.serviceName as serviceName," + + @Query("SELECT DISTINCT sm.serviceName as serviceName," + " ssm.serviceID," + " sm.isNational as isNational," + " ssm.statusID" + " FROM M_UserservicerolemappingForRoleProviderAdmin usr" + " JOIN usr.stateServiceMapping ssm" + " JOIN ssm.serviceMaster sm" + - " WHERE usr.userID = :userID AND ssm.statusID = 2 AND usr.deleted = false" + - " GROUP BY sm.serviceName") + " WHERE usr.userID = :userID AND ssm.statusID = 2 AND usr.deleted = false") ArrayList getServiceByServiceProviderIds(@Param("userID") Integer serviceProviderID); @Query("SELECT distinct ssm.stateID," + " sm.stateName, " + " ssm.providerServiceMapID," + " ssm.statusID" From 300d7aef1ba1d3233ca164aa8fdf13e1a96d3da7 Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Thu, 18 Jun 2026 16:21:59 +0530 Subject: [PATCH 61/61] fix: bulk employee registration sets username from contact number instead of username field mUser.setUserName(employee.getContactNo()) was using the uploaded contact number as the login username, ignoring the actual UserName column in the bulk upload sheet. Co-Authored-By: Claude Sonnet 4.6 --- .../service/bulkRegistration/BulkRegistrationServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java index d1b5a9f..4bd0012 100644 --- a/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java +++ b/src/main/java/com/iemr/admin/service/bulkRegistration/BulkRegistrationServiceImpl.java @@ -305,7 +305,7 @@ private void saveUserUser(Employee employee, Integer row, String authorization, mUser.setTitleID(getTitleId(employee.getTitle())); mUser.setFirstName(employee.getFirstName()); mUser.setLastName(employee.getLastName()); - mUser.setUserName(employee.getContactNo()); + mUser.setUserName(employee.getUserName()); mUser.setdOB(convertStringIntoDate(employee.getDob())); mUser.setEmployeeID(employee.getUserName()); mUser.setEmergencyContactNo(String.valueOf(employee.getEmergencyContactNo()));