From 3c2135eb2d7cb447211a77a762df983e42b9b843 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Tue, 4 Mar 2025 10:37:17 +0530 Subject: [PATCH 01/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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/59] 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); }