From 81fc4b01c5c8495c11c15ed8bfc469968be07c92 Mon Sep 17 00:00:00 2001 From: indraniBan <133205641+indraniBan@users.noreply.github.com> Date: Mon, 17 Mar 2025 16:41:31 +0530 Subject: [PATCH 01/30] sameSite strict for production change (#172) * sameSite strict for production change * environment property added for isproduction --------- Co-authored-by: IN40068837 --- src/main/environment/common_ci.properties | 3 +++ src/main/environment/common_dev.properties | 2 ++ src/main/environment/common_example.properties | 2 +- src/main/environment/common_test.properties | 2 +- src/main/environment/common_uat.properties | 2 +- src/main/java/com/iemr/common/utils/CookieUtil.java | 7 +++++++ 6 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/environment/common_ci.properties b/src/main/environment/common_ci.properties index 84c70090..9e393ebc 100644 --- a/src/main/environment/common_ci.properties +++ b/src/main/environment/common_ci.properties @@ -160,6 +160,9 @@ grievanceDataSyncDuration = @env.GRIEVANCE_DATA_SYNC_DURATION@ springdoc.api-docs.enabled=false springdoc.swagger-ui.enabled=false + +isProduction=false grievanceAllocationRetryConfiguration=3 + diff --git a/src/main/environment/common_dev.properties b/src/main/environment/common_dev.properties index d59acb42..54e3e5da 100644 --- a/src/main/environment/common_dev.properties +++ b/src/main/environment/common_dev.properties @@ -186,4 +186,6 @@ grievanceDataSyncDuration = springdoc.api-docs.enabled=true springdoc.swagger-ui.enabled=true +isProduction=false grievanceAllocationRetryConfiguration=3 + diff --git a/src/main/environment/common_example.properties b/src/main/environment/common_example.properties index bcc6c6ca..f039b0d3 100644 --- a/src/main/environment/common_example.properties +++ b/src/main/environment/common_example.properties @@ -186,7 +186,7 @@ grievanceDataSyncDuration = springdoc.api-docs.enabled=true springdoc.swagger-ui.enabled=true +isProduction=false grievanceAllocationRetryConfiguration=3 - diff --git a/src/main/environment/common_test.properties b/src/main/environment/common_test.properties index 169317db..79a0f9a1 100644 --- a/src/main/environment/common_test.properties +++ b/src/main/environment/common_test.properties @@ -187,5 +187,5 @@ grievanceDataSyncDuration = springdoc.api-docs.enabled=true springdoc.swagger-ui.enabled=true - +isProduction=false grievanceAllocationRetryConfiguration=3 diff --git a/src/main/environment/common_uat.properties b/src/main/environment/common_uat.properties index 0b55a003..718ff110 100644 --- a/src/main/environment/common_uat.properties +++ b/src/main/environment/common_uat.properties @@ -158,5 +158,5 @@ grievanceDataSyncDuration = springdoc.api-docs.enabled=true springdoc.swagger-ui.enabled=true - +isProduction=false grievanceAllocationRetryConfiguration=3 diff --git a/src/main/java/com/iemr/common/utils/CookieUtil.java b/src/main/java/com/iemr/common/utils/CookieUtil.java index 8c0a0b76..678f639c 100644 --- a/src/main/java/com/iemr/common/utils/CookieUtil.java +++ b/src/main/java/com/iemr/common/utils/CookieUtil.java @@ -3,6 +3,7 @@ import java.util.Arrays; import java.util.Optional; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import jakarta.servlet.http.Cookie; @@ -11,6 +12,9 @@ @Service public class CookieUtil { + + @Value("${isProduction}") + private Boolean isProduction; public Optional getCookieValue(HttpServletRequest request, String cookieName) { Cookie[] cookies = request.getCookies(); @@ -39,6 +43,9 @@ public void addJwtTokenToCookie(String Jwttoken, HttpServletResponse response, H // Set the SameSite attribute for cross-site request handling (if needed) String sameSite = "None"; // Allow cross-site cookies (can be 'Strict', 'Lax', or 'None') + if(isProduction) { + sameSite= "Strict"; + } cookie.setSecure(true); // Build the Set-Cookie header manually (to add SameSite attribute support) From 5ccc278bc8285166f7035e7ff35326c167ebc1b5 Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Thu, 20 Mar 2025 14:01:07 +0530 Subject: [PATCH 02/30] Feature/grievence/changes (#175) * Scheduler changes * Scheduler time farmat corrected * Format corrected * format corrected --- src/main/environment/common_ci.properties | 5 +- src/main/environment/common_dev.properties | 4 +- .../environment/common_example.properties | 4 +- src/main/environment/common_test.properties | 4 +- src/main/environment/common_uat.properties | 4 +- .../grievance/GrievanceDataRepo.java | 15 +- .../GrievanceOutboundRepository.java | 5 +- .../grievance/GrievanceDataSyncImpl.java | 666 ++++++++---------- .../GrievanceHandlingServiceImpl.java | 9 +- 9 files changed, 332 insertions(+), 384 deletions(-) diff --git a/src/main/environment/common_ci.properties b/src/main/environment/common_ci.properties index 9e393ebc..1f82e9ea 100644 --- a/src/main/environment/common_ci.properties +++ b/src/main/environment/common_ci.properties @@ -148,7 +148,7 @@ logging.file.name=@env.COMMON_API_LOGGING_FILE_NAME@ ##grievance API call -updateGrievanceDetails = @env.GRIEVANCE_API_BASE_URL@/grsbepro/igemr1097/public/api/v1/state-wise/grievance-list +updateGrievanceDetails = @env.GRIEVANCE_API_BASE_URL@/grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 updateGrievanceTransactionDetails=@env.GRIEVANCE_API_BASE_URL@/grsbepro/igemr1097/public/api/v1/grievance_details/ ## grievance variables @@ -164,5 +164,8 @@ springdoc.swagger-ui.enabled=false isProduction=false grievanceAllocationRetryConfiguration=3 +start-grievancedatasync-scheduler=false +cron-scheduler-grievancedatasync=0 0/2 * * * ? + diff --git a/src/main/environment/common_dev.properties b/src/main/environment/common_dev.properties index 54e3e5da..597a8bf6 100644 --- a/src/main/environment/common_dev.properties +++ b/src/main/environment/common_dev.properties @@ -118,7 +118,7 @@ nhm.agent.real.time.data.cron.flag=true ##----------------------------------------------------#grievance data sync----------------------------------------------------------- start-grievancedatasync-scheduler=false -cron-scheduler-grievancedatasync=0 0/5 * * * ? * +cron-scheduler-grievancedatasync=0 0/2 * * * ? carestream_socket_ip = 192.168.43.39 carestream_socket_port = 1235 @@ -173,7 +173,7 @@ fileBasePath =/Doc jwt.secret= ##grievance API call -updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list +updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 updateGrievanceTransactionDetails=/grsbepro/igemr1097/public/api/v1/grievance_details/ ## grievance variables diff --git a/src/main/environment/common_example.properties b/src/main/environment/common_example.properties index f039b0d3..9a90154d 100644 --- a/src/main/environment/common_example.properties +++ b/src/main/environment/common_example.properties @@ -88,7 +88,7 @@ cron-scheduler-nhmdashboard=0 1 * * * ? * ##----------------------------------------------------#grievance data sync----------------------------------------------------------- start-grievancedatasync-scheduler=false -cron-scheduler-grievancedatasync=0 0/5 * * * ? * +cron-scheduler-grievancedatasync=0 0/2 * * * ? ### Redis IP spring.redis.host=localhost @@ -173,7 +173,7 @@ jwt.secret= fileBasePath =/Doc ##grievance API call -updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list +updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 updateGrievanceTransactionDetails=/grsbepro/igemr1097/public/api/v1/grievance_details/ ## grievance variables diff --git a/src/main/environment/common_test.properties b/src/main/environment/common_test.properties index 79a0f9a1..df9007ee 100644 --- a/src/main/environment/common_test.properties +++ b/src/main/environment/common_test.properties @@ -84,7 +84,7 @@ cron-scheduler-everwelldatasync=0 0/5 * * * ? * ##----------------------------------------------------#grievance data sync----------------------------------------------------------- start-grievancedatasync-scheduler=false -cron-scheduler-grievancedatasync=0 0/5 * * * ? * +cron-scheduler-grievancedatasync=0 0/2 * * * ? ##-----------------------------------------------#NHM data dashboard schedular---------------------------------------------------------------- # run at everyday 12:01AM start-nhmdashboard-scheduler=true @@ -175,7 +175,7 @@ jwt.secret= ##grievance API call -updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list +updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 updateGrievanceTransactionDetails=/grsbepro/igemr1097/public/api/v1/grievance_details/ ## grievance variables diff --git a/src/main/environment/common_uat.properties b/src/main/environment/common_uat.properties index 718ff110..92c55f4a 100644 --- a/src/main/environment/common_uat.properties +++ b/src/main/environment/common_uat.properties @@ -59,7 +59,7 @@ cron-scheduler-ctidatacheck=0 10 00 * * * ##----------------------------------------------------#grievance data sync----------------------------------------------------------- start-grievancedatasync-scheduler=false -cron-scheduler-grievancedatasync=0 0/5 * * * ? * +cron-scheduler-grievancedatasync=0 0/2 * * * ? ### generate Beneficiary IDs URL genben-api=/bengenapi-v1.0 @@ -146,7 +146,7 @@ fileBasePath =/Doc jwt.secret= ##grievance API call -updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list +updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 updateGrievanceTransactionDetails=/grsbepro/igemr1097/public/api/v1/grievance_details/ ## grievance variables diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java index 7d8f39b7..1ff10da6 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java @@ -1,5 +1,6 @@ package com.iemr.common.repository.grievance; +import java.math.BigInteger; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; @@ -33,8 +34,8 @@ List findGrievancesInDateRangeAndLanguage(@Param("startDate") public int allocateGrievance(@Param("grievanceId") Long grievanceId, @Param("userId") Integer userId); - @Query(nativeQuery = true, value = "SELECT PreferredLanguageId, PreferredLanguage, VanSerialNo, VanID, ParkingPlaceId, VehicalNo FROM db_1097_identity.i_beneficiarydetails WHERE BeneficiaryRegID = :benRegId") - public ArrayList getBeneficiaryGrievanceDetails(@Param("benRegId") Long benRegId); + @Query(nativeQuery = true, value = "SELECT preferredLanguageId, preferredLanguage, VanSerialNo, VanID, ParkingPlaceID, VehicalNo FROM db_1097_identity.i_beneficiarydetails WHERE beneficiarydetailsid = :beneficiarydetailsid") + public ArrayList getBeneficiaryGrievanceDetails(@Param("beneficiarydetailsid") Long beneficiarydetailsid); @Query(nativeQuery = true, value = "SELECT t2.preferredPhoneNum FROM db_1097_identity.i_beneficiarymapping t1 join" + " db_1097_identity.i_beneficiarycontacts t2 on t1.benContactsId = t2.benContactsID" @@ -43,11 +44,10 @@ public int allocateGrievance(@Param("grievanceId") Long grievanceId, @Query("select grievance.preferredLanguage, count(distinct grievance.grievanceId) " - + "from GrievanceDetails grievance " + "where grievance.providerServiceMapID = :providerServiceMapID " - + "and grievance.userID = :userID " + "and grievance.deleted = false " + + "from GrievanceDetails grievance " + "where " + + "grievance.userID = :userID " + "and grievance.deleted = false " + "group by grievance.preferredLanguage") - public Set fetchGrievanceRecordsCount(@Param("providerServiceMapID") Integer providerServiceMapID, - @Param("userID") Integer userID); + public Set fetchGrievanceRecordsCount(@Param("userID") Integer userID); @Query("SELECT g FROM GrievanceDetails g WHERE g.userID = :userID AND g.preferredLanguage = :language AND g.isAllocated = true") List findAllocatedGrievancesByUserAndLanguage(@Param("userID") Integer userID, @@ -160,6 +160,9 @@ List fetchGrievanceDetailsBasedOnParams( @Query("SELECT g.gwid FROM GrievanceDetails g WHERE g.grievanceId = :grievanceId") Long getUniqueGwid(@Param("grievanceId")Long grievanceIdObj); +@Query(value = "SELECT BenDetailsId FROM db_1097_identity.i_beneficiarymapping WHERE BenRegId = :beneficiaryRegID", nativeQuery = true) +Long getBeneficiaryMapping(@Param("beneficiaryRegID") Long beneficiaryRegID); + } diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceOutboundRepository.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceOutboundRepository.java index 88c8dfa9..6df5853e 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceOutboundRepository.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceOutboundRepository.java @@ -15,8 +15,7 @@ public interface GrievanceOutboundRepository extends JpaRepository { - @Query(value =" call db_iemr.Pr_Grievanceworklist(:providerServiceMapID, :userId)", nativeQuery = true) - List getGrievanceWorklistData(@Param("providerServiceMapID") Integer providerServiceMapID, - @Param("userId") Integer userId); + @Query(value =" call db_iemr.Pr_Grievanceworklist(:userId)", nativeQuery = true) + List getGrievanceWorklistData(@Param("userId") Integer userId); } diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java index 113a6c7c..d4c6dce4 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java @@ -1,5 +1,7 @@ package com.iemr.common.service.grievance; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; @@ -30,6 +32,7 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -73,8 +76,8 @@ public class GrievanceDataSyncImpl implements GrievanceDataSync { // Constructor-based injection @Autowired public GrievanceDataSyncImpl(GrievanceDataRepo grievanceDataRepo, GrievanceTransactionRepo grievanceTransactionRepo, - GrievanceFetchBenDetailsRepo grievanceFetchBenDetailsRepo, - LocationStateRepository locationStateRepository, IEMRCalltypeRepositoryImplCustom iEMRCalltypeRepositoryImplCustom) { + GrievanceFetchBenDetailsRepo grievanceFetchBenDetailsRepo, LocationStateRepository locationStateRepository, + IEMRCalltypeRepositoryImplCustom iEMRCalltypeRepositoryImplCustom) { this.grievanceDataRepo = grievanceDataRepo; this.grievanceTransactionRepo = grievanceTransactionRepo; this.grievanceFetchBenDetailsRepo = grievanceFetchBenDetailsRepo; @@ -102,284 +105,204 @@ public GrievanceDataSyncImpl(GrievanceDataRepo grievanceDataRepo, GrievanceTrans @Value("${grievanceAllocationRetryConfiguration}") private int grievanceAllocationRetryConfiguration; - + private String GRIEVANCE_AUTH_TOKEN; private Long GRIEVANCE_TOKEN_EXP; - //public List> dataSyncToGrievance() { - public String dataSyncToGrievance() { + public String dataSyncToGrievance() { - int count = 0; - String registeringUser = ""; - List> responseData = new ArrayList<>(); - List grievanceDetailsListAS = new ArrayList<>(); - // List grievanceDetailsListAS = new ArrayList<>(); - List grievanceDetailsListAll = new ArrayList<>(); + List grievanceDetailsListAll = new ArrayList<>(); List grievanceTransactionList = new ArrayList<>(); - // GrievanceTransaction grievanceTransaction = new GrievanceTransaction(); GrievanceTransaction grievanceTransactionListObj = new GrievanceTransaction(); - List grievanceIds = new ArrayList<>(); // List to collect all grievance IDs - + List grievanceIds = new ArrayList<>(); Long gwid; try { - // Loop to fetch data for multiple pages while (count >= 0) { RestTemplate restTemplate = new RestTemplate(); if (GRIEVANCE_AUTH_TOKEN != null && GRIEVANCE_TOKEN_EXP != null && GRIEVANCE_TOKEN_EXP > System.currentTimeMillis()) { - // no need of calling auth API } else { - // call method to generate Auth Token at Everwell end generateGrievanceAuthToken(); } HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + headers.setContentType(MediaType.APPLICATION_JSON); headers.add(USER_AGENT_HEADER, USER_AGENT_VALUE); headers.add("AUTHORIZATION", GRIEVANCE_AUTH_TOKEN); - //headers.add("Authorization", "Bearer " + GRIEVANCE_AUTH_TOKEN); Date date = new Date(); java.sql.Date sqlDate = new java.sql.Date(date.getTime()); Calendar calendar = Calendar.getInstance(); calendar.setTime(sqlDate); calendar.add(Calendar.DATE, -Integer.parseInt(grievanceDataSyncDuration)); - - // Request object - HttpEntity request = new HttpEntity(headers); - - // Call rest-template to call API to download master data for given table - ResponseEntity response = restTemplate.exchange(updateGrievanceDetails, HttpMethod.POST, - request, String.class); + String json = prepareRequestObject(); + int contentLength = json.getBytes(StandardCharsets.UTF_8).length; + headers.add("Content-Length", String.valueOf(contentLength)); + HttpEntity request = new HttpEntity<>(json, headers); + String url = updateGrievanceDetails.replace("PageNumber", "1"); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, request, String.class); if (response != null && response.hasBody()) { JSONObject obj = new JSONObject(response.getBody()); - //if (obj != null && obj.has("data") && obj.has(STATUS_CODE) && obj.getInt(STATUS_CODE) == 200) { if (obj != null && obj.has("data") && obj.has("status") && obj.getInt("status") == 200) { - logger.info("Grievance data details response received successfully "); + logger.info("Grievance data details response received successfully "); String responseStr = response.getBody(); JsonObject jsnOBJ = new JsonObject(); JsonParser jsnParser = new JsonParser(); JsonElement jsnElmnt = jsnParser.parse(responseStr); jsnOBJ = jsnElmnt.getAsJsonObject(); - - // Handle "data" as a JsonArray - JsonArray grievanceJsonDataArray = jsnOBJ.getAsJsonArray("data"); - // registeringUser = grievanceJsonDataArray.get(0).getAsJsonObject().get("userName").getAsString(); - - // registeringUser = grievanceJsonData.get("userName").getAsString(); - - - // if (Integer.parseInt(jsnOBJ.get("TotalRecords").toString()) > 0) { - if (Integer.parseInt(jsnOBJ.get("total").toString()) > 0) { - - - List grievanceDetailsList = new ArrayList<>(); - - - // Iterate over the data array - for (JsonElement grievanceElement : grievanceJsonDataArray) { - JsonObject grievanceJsonData = grievanceElement.getAsJsonObject(); - - - GrievanceDetails grievance = new GrievanceDetails(); - - // Loop through the fetched grievance list and integrate transaction details - String complaintId = grievanceJsonData.get("complainId").getAsString(); - String formattedComplaintId = complaintId.replace("\\/", "/"); - - // Check if the complaintId is already present in the t_grievance_worklist table - boolean complaintExists = grievanceDataRepo.existsByComplaintId(formattedComplaintId); - if (complaintExists) { - throw new RuntimeException("Complaint ID " + formattedComplaintId - + " already exists in the grievance worklist table."); - } - - grievance.setComplaintID(formattedComplaintId); - - // Fetch related grievance transaction details - Long grievanceID = grievanceJsonData.get("grievanceId").getAsLong(); - grievance.setGrievanceId(grievanceID); - grievanceIds.add(grievanceJsonData.get("grievanceId").getAsLong()); - - - // Adding other grievance-related fields - - grievance.setSubjectOfComplaint(grievanceJsonData.has("subject") && !grievanceJsonData.get("subject").isJsonNull() - ? grievanceJsonData.get("subject").getAsString() : null); - ArrayList lists = grievanceFetchBenDetailsRepo - .findByComplaintId(formattedComplaintId); - grievance.setComplaint(grievanceJsonData.has("Complaint") - ? grievanceJsonData.get("Complaint").getAsString() : null); - String severityName = grievanceJsonData.has("severity") && grievanceJsonData.get("severity").getAsJsonObject().has("severity") - ? grievanceJsonData.get("severity").getAsJsonObject().get("severity").getAsString() - : null; - grievance.setSeverety(severityName); - - // Setting Level - Integer levelId = grievanceJsonData.has("level") && grievanceJsonData.get("level").getAsJsonObject().has("levelId") - ? grievanceJsonData.get("level").getAsJsonObject().get("levelId").getAsInt() - : null; - grievance.setLevel(levelId); - - // Setting state - String stateName = grievanceJsonData.has("state") && grievanceJsonData.get("state").getAsJsonObject().has("stateName") - ? grievanceJsonData.get("state").getAsJsonObject().get("stateName").getAsString() - : null; - grievance.setState(stateName);; - for (Object[] objects : lists) { - if (objects != null && objects.length <= 4) { - grievance.setComplaintID((String) objects[0]); - grievance.setBenCallID((Long) objects[1]); - grievance.setBeneficiaryRegID((Long) objects[2]); - grievance.setProviderServiceMapID((Integer) objects[3]); - // String state = locationStateRepository - // .findByStateIDForGrievance((Integer) objects[4]); - // grievance.setState(state); + int total = jsnOBJ.get("total").getAsInt(); + String GrievanceUrl = updateGrievanceDetails.replace("PageNumber", String.valueOf(total)); + ResponseEntity grievienceResponse = restTemplate.exchange(GrievanceUrl, HttpMethod.POST, + request, String.class); + String respStr = grievienceResponse.getBody(); + + JsonElement jsnElmntResp = jsnParser.parse(respStr); + jsnOBJ = jsnElmntResp.getAsJsonObject(); + JsonArray grievanceJsonDataArray = jsnOBJ.getAsJsonArray("data"); + if (Integer.parseInt(jsnOBJ.get("total").toString()) > 0) { + for (JsonElement grievanceElement : grievanceJsonDataArray) { + String formattedComplaintId = null; + try { + JsonObject grievanceJsonData = grievanceElement.getAsJsonObject(); + GrievanceDetails grievance = new GrievanceDetails(); + String complaintId = grievanceJsonData.get("complainId").getAsString(); + formattedComplaintId = complaintId.replace("\\/", "/"); + boolean complaintExists = grievanceDataRepo + .existsByComplaintId(formattedComplaintId); + if (complaintExists) { + logger.info("Complaint ID " + formattedComplaintId + + " already exists in the grievance worklist table."); + continue; } - } - - - - - // setting language related properties and other - ArrayList list1 = grievanceDataRepo - .getBeneficiaryGrievanceDetails(grievance.getBeneficiaryRegID()); - for (Object[] objects : list1) { - if (objects != null && objects.length >= 6) { - grievance.setPreferredLanguageId((Integer) objects[0]); - grievance.setPreferredLanguage((String) objects[1]); - grievance.setVanSerialNo((Long) objects[2]); - grievance.setVanID((Integer) objects[3]); - grievance.setParkingPlaceID((Integer) objects[4]); - grievance.setVehicalNo((String) objects[5]); + grievance.setComplaintID(formattedComplaintId); + + // Fetch related grievance transaction details + Long grievanceID = grievanceJsonData.get("grievanceId").getAsLong(); + grievance.setGrievanceId(grievanceID); + grievanceIds.add(grievanceJsonData.get("grievanceId").getAsLong()); + + grievance.setSubjectOfComplaint(grievanceJsonData.has("subject") + && !grievanceJsonData.get("subject").isJsonNull() + ? grievanceJsonData.get("subject").getAsString() + : null); + ArrayList lists = grievanceFetchBenDetailsRepo + .findByComplaintId(formattedComplaintId); + grievance.setComplaint(grievanceJsonData.has("Complaint") + ? grievanceJsonData.get("Complaint").getAsString() + : null); + String severityName = grievanceJsonData.has("severity") + && grievanceJsonData.get("severity").getAsJsonObject().has("severity") + ? grievanceJsonData.get("severity").getAsJsonObject() + .get("severity").getAsString() + : null; + grievance.setSeverety(severityName); + + // Setting Level + Integer levelId = grievanceJsonData.has("level") + && grievanceJsonData.get("level").getAsJsonObject().has("levelId") + ? grievanceJsonData.get("level").getAsJsonObject().get("levelId") + .getAsInt() + : null; + grievance.setLevel(levelId); + + // Setting state + String stateName = grievanceJsonData.has("state") + && grievanceJsonData.get("state").getAsJsonObject().has("stateName") + ? grievanceJsonData.get("state").getAsJsonObject().get("stateName") + .getAsString() + : null; + grievance.setState(stateName); + + for (Object[] objects : lists) { + if (objects != null && objects.length <= 4) { + grievance.setComplaintID((String) objects[0]); + grievance.setBenCallID((Long) objects[1]); + grievance.setBeneficiaryRegID((Long) objects[2]); + grievance.setProviderServiceMapID((Integer) objects[3]); + } } - } - - String phoneNum = grievanceDataRepo.getPrimaryNumber(grievance.getBeneficiaryRegID()); - grievance.setPrimaryNumber(phoneNum); - - // Setting remaining grievance properties (similar to the existing code) - // grievance.setAgentid(grievance.getAgentid()); - grievance.setDeleted(grievance.getDeleted()); - //grievance.setCreatedBy(registeringUser); - grievance.setCreatedBy("Admin"); - grievance.setProcessed('N'); - grievance.setIsAllocated(false); - grievance.setCallCounter(0); - grievance.setRetryNeeded(true); - - grievanceDetailsList.add(grievance); + Long benDetailsID = grievanceDataRepo + .getBeneficiaryMapping(grievance.getBeneficiaryRegID()); + ArrayList list1 = grievanceDataRepo + .getBeneficiaryGrievanceDetails(benDetailsID); + for (Object[] objects : list1) { + if (objects != null && objects.length >= 6) { + grievance.setPreferredLanguageId((Integer) objects[0]); + grievance.setPreferredLanguage((String) objects[1]); + grievance.setVanSerialNo((Long) objects[2]); + grievance.setVanID((Integer) objects[3]); + grievance.setParkingPlaceID((Integer) objects[4]); + grievance.setVehicalNo((String) objects[5]); + } + } + String phoneNum = grievanceDataRepo + .getPrimaryNumber(grievance.getBeneficiaryRegID()); + grievance.setPrimaryNumber(phoneNum); + grievance.setDeleted(grievance.getDeleted()); + grievance.setCreatedBy("Admin"); + grievance.setProcessed('N'); + grievance.setIsAllocated(false); + grievance.setCallCounter(0); + grievance.setRetryNeeded(true); + + grievanceDataRepo.save(grievance); + + JsonArray transactionDetailsList = fetchGrievanceTransactions(grievanceID); + if (transactionDetailsList != null && !transactionDetailsList.isEmpty()) { + for (JsonElement transactionElement : transactionDetailsList) { + JsonObject transactionDetailsJson = transactionElement.getAsJsonObject(); + GrievanceTransaction grievanceTransaction = new GrievanceTransaction(); + gwid = grievanceDataRepo.getUniqueGwid(grievanceID); + grievanceTransaction.setGwid(gwid); + grievanceTransaction.setGrievanceId(grievanceID); + + grievanceTransaction + .setActionTakenBy(transactionDetailsJson.has("actionTakenBy") + ? transactionDetailsJson.get("actionTakenBy").getAsString() + : null); + grievanceTransaction.setStatus(transactionDetailsJson.has("status") + ? transactionDetailsJson.get("status").getAsString() + : null); + grievanceTransaction.setFileName(transactionDetailsJson.has(FILE_NAME) + ? transactionDetailsJson.get(FILE_NAME).getAsString() + : null); + grievanceTransaction.setFileType(transactionDetailsJson.has(FILE_TYPE) + ? transactionDetailsJson.get(FILE_TYPE).getAsString() + : null); + grievanceTransaction.setRedressed(transactionDetailsJson.has("redressed") + ? transactionDetailsJson.get("redressed").getAsString() + : null); + grievanceTransaction.setCreatedAt(Timestamp + .valueOf(transactionDetailsJson.get("createdAt").getAsString())); + grievanceTransaction.setUpdatedAt(Timestamp + .valueOf(transactionDetailsJson.get("updatedAt").getAsString())); + grievanceTransaction.setComments(transactionDetailsJson.has("comment") + ? transactionDetailsJson.get("comment").getAsString() + : null); + grievanceTransaction.setCreatedBy("Admin"); + Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + grievanceTransaction.setCreatedDate(timestamp); + + grievanceTransactionListObj = grievanceTransactionRepo + .save(grievanceTransaction); + grievanceTransactionList.add(grievanceTransactionListObj); + + } - } - // Add all new grievances to the main list - grievanceDetailsListAll.addAll(grievanceDetailsList); - - // Save the grievance details to the t_grievance table - grievanceDetailsListAS = (List) grievanceDataRepo - .saveAll(grievanceDetailsListAll); - - for (Long grievanceIdObj : grievanceIds) { - - JsonArray transactionDetailsList = fetchGrievanceTransactions(grievanceIdObj); - - if (transactionDetailsList != null && !transactionDetailsList.isEmpty()) { - // Loop through each transaction and set individual properties - for (JsonElement transactionElement : transactionDetailsList) { - JsonObject transactionDetailsJson = transactionElement.getAsJsonObject(); - GrievanceTransaction grievanceTransaction = new GrievanceTransaction(); - gwid = grievanceDataRepo.getUniqueGwid(grievanceIdObj); - grievanceTransaction.setGwid(gwid); - grievanceTransaction.setGrievanceId(grievanceIdObj); - - - grievanceTransaction.setActionTakenBy(transactionDetailsJson.has("actionTakenBy") - ? transactionDetailsJson.get("actionTakenBy").getAsString() - : null); - grievanceTransaction.setStatus(transactionDetailsJson.has("status") - ? transactionDetailsJson.get("status").getAsString() - : null); - grievanceTransaction.setFileName(transactionDetailsJson.has(FILE_NAME) - ? transactionDetailsJson.get(FILE_NAME).getAsString() - : null); - grievanceTransaction.setFileType(transactionDetailsJson.has(FILE_TYPE) - ? transactionDetailsJson.get(FILE_TYPE).getAsString() - : null); - grievanceTransaction.setRedressed(transactionDetailsJson.has("redressed") - ? transactionDetailsJson.get("redressed").getAsString() - : null); - grievanceTransaction.setCreatedAt(Timestamp - .valueOf(transactionDetailsJson.get("createdAt").getAsString())); - grievanceTransaction.setUpdatedAt(Timestamp - .valueOf(transactionDetailsJson.get("updatedAt").getAsString())); - grievanceTransaction.setComments(transactionDetailsJson.has("comment") - ? transactionDetailsJson.get("comment").getAsString() - : null); - grievanceTransaction.setCreatedBy("Admin"); - Timestamp timestamp = new Timestamp(System.currentTimeMillis()); - grievanceTransaction.setCreatedDate(timestamp); - - // Save individual transaction detail in the t_grievance_transaction table - grievanceTransactionListObj = grievanceTransactionRepo.save(grievanceTransaction); - grievanceTransactionList.add(grievanceTransactionListObj); - } - - // Add the transaction list to the grievance object - // grievance.setGrievanceTransactionDetails(grievanceTransactionList); + } + } catch (Exception e) { + logger.error("Error while Grievance Details " + e.getMessage() + " Complaint ID " + + formattedComplaintId); } } - // Combine grievance and transaction data for response -// -// for (GrievanceDetails grievanceValue : grievanceDetailsListAS) { -// Map combinedData = new HashMap<>(); -// combinedData.put("complaintID", grievanceValue.getGrievanceId()); -// combinedData.put("subjectOfComplaint", grievanceValue.getSubjectOfComplaint()); -// combinedData.put("complaint", grievanceValue.getComplaint()); -// combinedData.put("beneficiaryRegID", grievanceValue.getBeneficiaryRegID()); -// combinedData.put("providerServiceMapId", grievanceValue.getProviderServiceMapID()); -// -// combinedData.put("primaryNumber", grievanceValue.getPrimaryNumber()); -// -// // Add transaction data -// List> transactions = new ArrayList<>(); -// for (GrievanceTransaction transaction : grievanceValue.getGrievanceTransactionDetails()) { -// Map transactionData = new HashMap<>(); -// //transactionData.put("actionTakenBy", transaction.getActionTakenBy()); -// // transactionData.put("status", transaction.getStatus()); -// transactionData.put(FILE_NAME, transaction.getFileName()); -// transactionData.put(FILE_TYPE, transaction.getFileType()); -// transactionData.put("redressed", transaction.getRedressed()); -// transactionData.put("createdAt", transaction.getCreatedAt().toString()); -// transactionData.put("updatedAt", transaction.getUpdatedAt().toString()); -// transactionData.put("comments", transaction.getComments()); -// transactions.add(transactionData); -// } -// -// combinedData.put("transaction", transactions); -// combinedData.put("severity", grievanceValue.getSeverety()); -// combinedData.put("state", grievanceValue.getState()); -// // combinedData.put("agentId", grievanceValue.getAgentid()); -// combinedData.put("deleted", grievanceValue.getDeleted()); -// combinedData.put("createdBy", grievanceValue.getCreatedBy()); -// combinedData.put("createdDate", grievanceValue.getCreatedDate()); -// combinedData.put("lastModDate", grievanceValue.getLastModDate()); -// combinedData.put("isCompleted", grievanceValue.getIsCompleted()); -// -// combinedData.put("retryNeeded", grievanceValue.getRetryNeeded()); -// combinedData.put("callCounter", grievanceValue.getCallCounter()); -// -// responseData.add(combinedData); -// } - - // Return the combined response as required - } else { logger.info("No records found for page = {}", count); count = -1; @@ -390,10 +313,40 @@ public String dataSyncToGrievance() { } catch (Exception e) { logger.error("Error in saving data into t_grievanceworklist: ", e); } - // return responseData; + // return responseData; return "Grievance Data saved successfully"; } + private String prepareRequestObject() { + Map bodyMap = new HashMap<>(); + bodyMap.put("draw", 1); + bodyMap.put("columns", new Object[] {}); + bodyMap.put("order", new Object[] {}); + bodyMap.put("start", 0); + bodyMap.put("length", 10); + + Map search = new HashMap<>(); + search.put("value", ""); + search.put("regex", false); + bodyMap.put("search", search); + + bodyMap.put("state_id", ""); + bodyMap.put("complain_id", ""); + bodyMap.put("color", ""); + bodyMap.put("level", "3"); + bodyMap.put("start_date", ""); + bodyMap.put("end_date", ""); + + ObjectMapper objectMapper = new ObjectMapper(); + String jsonBody = ""; + try { + jsonBody = objectMapper.writeValueAsString(bodyMap); + } catch (Exception e) { + logger.error("Error while preparing Grievance jsonRequest"); + } + return jsonBody; + } + private JsonArray fetchGrievanceTransactions(Long grievanceId) { List transactionDetailsList = new ArrayList<>(); JsonArray transactionDataArray = new JsonArray(); @@ -417,16 +370,15 @@ private JsonArray fetchGrievanceTransactions(Long grievanceId) { JsonElement jsnElmnt = jsnParser.parse(response.getBody()); jsnOBJ = jsnElmnt.getAsJsonObject(); - - transactionDataArray = jsnOBJ.getAsJsonArray("data"); + transactionDataArray = jsnOBJ.getAsJsonArray("data"); // if (transactionDataArray != null && transactionDataArray.size() > 0) { // GrievanceTransaction[] transactionDetailsArray = new Gson() // .fromJson(transactionDataArray, GrievanceTransaction[].class); // transactionDetailsList = Arrays.asList(transactionDetailsArray); // } + } } - } - + } catch (Exception e) { logger.error("Error fetching grievance transaction details for grievanceId " + grievanceId, e); } @@ -452,36 +404,34 @@ private void generateGrievanceAuthToken() { // JSONObject requestObj = new JSONObject(request); // String complaintResolution = requestObj.optString("ComplaintResolution", null); // String state = requestObj.optString("State", null); - + String responseBody = responseEntity.getBody(); JsonObject jsnOBJ = new JsonObject(); JsonParser jsnParser = new JsonParser(); JsonElement jsnElmnt = jsnParser.parse(responseBody); jsnOBJ = jsnElmnt.getAsJsonObject(); - - // Accessing the "data" object first - if (jsnOBJ.has("data")) { - JsonObject dataObj = jsnOBJ.getAsJsonObject("data"); - - // Now check for "token_type" and "access_token" inside the "data" object - if (dataObj.has("token_type") && dataObj.has("access_token")) { - String tokenType = dataObj.get("token_type").getAsString(); - String accessToken = dataObj.get("access_token").getAsString(); - GRIEVANCE_AUTH_TOKEN = tokenType + " " + accessToken; - } else { - logger.error("Missing token_type or access_token in 'data' object: {}", responseBody); - // Handle missing tokens gracefully - return; - } - } else { - logger.error("'data' object is missing in response: {}", responseBody); - return; - } - - - - // GRIEVANCE_AUTH_TOKEN = jsnOBJ.get("token_type").getAsString() + " " - // + jsnOBJ.get("access_token").getAsString(); + + // Accessing the "data" object first + if (jsnOBJ.has("data")) { + JsonObject dataObj = jsnOBJ.getAsJsonObject("data"); + + // Now check for "token_type" and "access_token" inside the "data" object + if (dataObj.has("token_type") && dataObj.has("access_token")) { + String tokenType = dataObj.get("token_type").getAsString(); + String accessToken = dataObj.get("access_token").getAsString(); + GRIEVANCE_AUTH_TOKEN = tokenType + " " + accessToken; + } else { + logger.error("Missing token_type or access_token in 'data' object: {}", responseBody); + // Handle missing tokens gracefully + return; + } + } else { + logger.error("'data' object is missing in response: {}", responseBody); + return; + } + + // GRIEVANCE_AUTH_TOKEN = jsnOBJ.get("token_type").getAsString() + " " + // + jsnOBJ.get("access_token").getAsString(); JsonObject grievanceLoginJsonData = jsnOBJ.getAsJsonObject("data"); @@ -499,7 +449,7 @@ private void generateGrievanceAuthToken() { int count = 3; while (count > 0) { try { - // List> savedGrievanceData = dataSyncToGrievance(); + // List> savedGrievanceData = dataSyncToGrievance(); String savedGrievanceData = dataSyncToGrievance(); if (savedGrievanceData != null) break; @@ -520,7 +470,7 @@ private void generateGrievanceAuthToken() { } @Override - public String fetchUnallocatedGrievanceCount(String preferredLanguage, Timestamp filterStartDate, + public String fetchUnallocatedGrievanceCount(String preferredLanguage, Timestamp filterStartDate, Timestamp filterEndDate, Integer providerServiceMapID) throws IEMRException, JSONException { logger.debug("Request received for fetchUnallocatedGrievanceCount"); @@ -587,112 +537,106 @@ public String fetchUnallocatedGrievanceCount(String preferredLanguage, Timestamp return resultArray.toString(); } - - + @Override @Transactional public String completeGrievanceCall(String request) throws Exception { - + GrievanceCallRequest grievanceCallRequest = InputMapper.gson().fromJson(request, GrievanceCallRequest.class); - String complaintID = grievanceCallRequest.getComplaintID(); - Integer userID = grievanceCallRequest.getUserID(); - Boolean isCompleted = grievanceCallRequest.getIsCompleted(); - Long beneficiaryRegID = grievanceCallRequest.getBeneficiaryRegID(); - Integer callTypeID = grievanceCallRequest.getCallTypeID(); - Integer providerServiceMapID = grievanceCallRequest.getProviderServiceMapID(); - - CallType callTypeObj = new CallType(); - String response = "failure"; - int updateCount = 0; - int updateCallCounter = 0; - try { - - GrievanceDetails grievanceCallStatus = new GrievanceDetails(); - - List lists = grievanceDataRepo.getCallCounter(complaintID); - for (Object[] objects : lists) { - if (objects != null && objects.length >= 2) { - grievanceCallStatus.setCallCounter((Integer) objects[0]); - grievanceCallStatus.setRetryNeeded((Boolean)objects[1]); - } + String complaintID = grievanceCallRequest.getComplaintID(); + Integer userID = grievanceCallRequest.getUserID(); + Boolean isCompleted = grievanceCallRequest.getIsCompleted(); + Long beneficiaryRegID = grievanceCallRequest.getBeneficiaryRegID(); + Integer callTypeID = grievanceCallRequest.getCallTypeID(); + Integer providerServiceMapID = grievanceCallRequest.getProviderServiceMapID(); + + CallType callTypeObj = new CallType(); + String response = "failure"; + int updateCount = 0; + int updateCallCounter = 0; + try { + + GrievanceDetails grievanceCallStatus = new GrievanceDetails(); + + List lists = grievanceDataRepo.getCallCounter(complaintID); + for (Object[] objects : lists) { + if (objects != null && objects.length >= 2) { + grievanceCallStatus.setCallCounter((Integer) objects[0]); + grievanceCallStatus.setRetryNeeded((Boolean) objects[1]); } - - // Fetching CallDetails using BenCallID and CallTypeID - Set callTypesArray = new HashSet(); - callTypesArray = iEMRCalltypeRepositoryImplCustom.getCallDetails(callTypeID); - for (Object[] object : callTypesArray) - { - if (object != null && object.length >= 2) - { - callTypeObj.setCallGroupType((String) object[0]); - callTypeObj.setCallType((String) object[1]); - - } - - } - - String callGroupType = callTypeObj.getCallGroupType(); - String callType = callTypeObj.getCallType(); - - - // Logic for reattempt based on call group type and call type - - boolean isRetryNeeded = grievanceCallStatus.getRetryNeeded(); - if (callGroupType.equals("Valid")) { - // Conditions when no reattempt is needed - if (callType.equals("Valid") || callType.equals("Test Call")) { - isRetryNeeded = false; - } else if (callType.equals("Disconnected Call") || callType.equals("Serviced Call") || - callType.equals("Silent Call") || callType.equals("Call Back")) { - // Reattempt is needed for these call subtypes - isRetryNeeded = true; - } - } - if (callGroupType.equals("Invalid") && callType.equals("Wrong Number")) { - isRetryNeeded = false; - //isCompleted = true; - grievanceDataRepo.updateCompletedStatusInCall(isCompleted, isRetryNeeded, complaintID, userID, beneficiaryRegID, providerServiceMapID); - } - - // Check if max attempts (3) are reached - if (isRetryNeeded == true && grievanceCallStatus.getCallCounter() < grievanceAllocationRetryConfiguration) { - // Increment the call counter for reattempt - grievanceCallStatus.setCallCounter(grievanceCallStatus.getCallCounter() + 1); - // Update the retryNeeded flag - isRetryNeeded = true; - //isCompleted = false; - updateCallCounter = grievanceDataRepo.updateCallCounter(grievanceCallStatus.getCallCounter(), isRetryNeeded, grievanceCallRequest.getComplaintID(), - grievanceCallRequest.getBeneficiaryRegID(), grievanceCallRequest.getProviderServiceMapID(), - grievanceCallRequest.getUserID()); - // Return success when reattempt logic is applied successfully. The grievance call needs to be retried, and a reattempt is performed. - if (updateCallCounter > 0) - response = "Successfully closing call"; - else { - response = "failure in closing call"; - } - } else if (grievanceCallStatus.getCallCounter()== grievanceAllocationRetryConfiguration) { - // Max attempts reached, no further reattempt - isRetryNeeded = false; - //isCompleted = true; - updateCount = grievanceDataRepo.updateCompletedStatusInCall(isCompleted, isRetryNeeded, complaintID, userID, beneficiaryRegID, providerServiceMapID); - response = "max_attempts_reached"; // Indicate that max attempts are reached - - - } else { + } - response = "no_reattempt_needed"; // No reattempt needed - } + // Fetching CallDetails using BenCallID and CallTypeID + Set callTypesArray = new HashSet(); + callTypesArray = iEMRCalltypeRepositoryImplCustom.getCallDetails(callTypeID); + for (Object[] object : callTypesArray) { + if (object != null && object.length >= 2) { + callTypeObj.setCallGroupType((String) object[0]); + callTypeObj.setCallType((String) object[1]); + } + + } + + String callGroupType = callTypeObj.getCallGroupType(); + String callType = callTypeObj.getCallType(); + + // Logic for reattempt based on call group type and call type + + boolean isRetryNeeded = grievanceCallStatus.getRetryNeeded(); + if (callGroupType.equals("Valid")) { + // Conditions when no reattempt is needed + if (callType.equals("Valid") || callType.equals("Test Call")) { + isRetryNeeded = false; + } else if (callType.equals("Disconnected Call") || callType.equals("Serviced Call") + || callType.equals("Silent Call") || callType.equals("Call Back")) { + // Reattempt is needed for these call subtypes + isRetryNeeded = true; + } + } + if (callGroupType.equals("Invalid") && callType.equals("Wrong Number")) { + isRetryNeeded = false; + // isCompleted = true; + grievanceDataRepo.updateCompletedStatusInCall(isCompleted, isRetryNeeded, complaintID, userID, + beneficiaryRegID, providerServiceMapID); + } + // Check if max attempts (3) are reached + if (isRetryNeeded == true && grievanceCallStatus.getCallCounter() < grievanceAllocationRetryConfiguration) { + // Increment the call counter for reattempt + grievanceCallStatus.setCallCounter(grievanceCallStatus.getCallCounter() + 1); + // Update the retryNeeded flag + isRetryNeeded = true; + // isCompleted = false; + updateCallCounter = grievanceDataRepo.updateCallCounter(grievanceCallStatus.getCallCounter(), + isRetryNeeded, grievanceCallRequest.getComplaintID(), + grievanceCallRequest.getBeneficiaryRegID(), grievanceCallRequest.getProviderServiceMapID(), + grievanceCallRequest.getUserID()); + // Return success when reattempt logic is applied successfully. The grievance + // call needs to be retried, and a reattempt is performed. + if (updateCallCounter > 0) + response = "Successfully closing call"; + else { + response = "failure in closing call"; + } + } else if (grievanceCallStatus.getCallCounter() == grievanceAllocationRetryConfiguration) { + // Max attempts reached, no further reattempt + isRetryNeeded = false; + // isCompleted = true; + updateCount = grievanceDataRepo.updateCompletedStatusInCall(isCompleted, isRetryNeeded, complaintID, + userID, beneficiaryRegID, providerServiceMapID); + response = "max_attempts_reached"; // Indicate that max attempts are reached - } - catch (Exception e) { - response = "error: " + e.getMessage(); - } + } else { - return response; // Return the response (either success or error message) - } + response = "no_reattempt_needed"; // No reattempt needed + } + } catch (Exception e) { + response = "error: " + e.getMessage(); + } + return response; // Return the response (either success or error message) + } } diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java index b930bce3..c9296c3b 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java @@ -123,7 +123,7 @@ public String allocatedGrievanceRecordsCount(String request) throws IEMRExceptio Integer providerServiceMapID = grievanceRequest.getProviderServiceMapID(); Integer userID = grievanceRequest.getUserID(); - Set resultSet = grievanceDataRepo.fetchGrievanceRecordsCount(providerServiceMapID, userID); + Set resultSet = grievanceDataRepo.fetchGrievanceRecordsCount(userID); JSONObject result = new JSONObject(); result.put("All", 0); @@ -277,11 +277,10 @@ public List getFormattedGrievanceData(String request) thro // Fetch grievance worklist data using @Procedure annotation List worklistData; try { - if (getGrievanceWorklistRequest.getProviderServiceMapID() == null || - getGrievanceWorklistRequest.getUserId() == null) { - throw new IllegalArgumentException("ProviderServiceMapID and UserId are required"); + if (getGrievanceWorklistRequest.getUserId() == null) { + throw new IllegalArgumentException("UserId are required"); } - worklistData = grievanceOutboundRepo.getGrievanceWorklistData(getGrievanceWorklistRequest.getProviderServiceMapID(), getGrievanceWorklistRequest.getUserId()); + worklistData = grievanceOutboundRepo.getGrievanceWorklistData(getGrievanceWorklistRequest.getUserId()); if (worklistData == null || worklistData.isEmpty()) { logger.info("No grievance data found for the given criteria"); return new ArrayList<>(); From 73ee64c6915845ac7644a3bc025672cea57096b3 Mon Sep 17 00:00:00 2001 From: Mithun James Date: Fri, 21 Mar 2025 12:51:02 +0530 Subject: [PATCH 03/30] Fix .java-version, add plugins for successful build (#176) * Fix .java-version, add plugins for successful build * Add swagger UI to skip JWT checks * update lombok version --- .java-version | 2 +- pom.xml | 16 ++++++++++++++-- .../common/utils/JwtUserIdValidationFilter.java | 2 ++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.java-version b/.java-version index 62593409..03b6389f 100644 --- a/.java-version +++ b/.java-version @@ -1 +1 @@ -1.8 +17.0 diff --git a/pom.xml b/pom.xml index f29e4dca..db199065 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ 17 jdt_apt 1.2.0.Final - 1.16.18 + 1.18.36 commonapi-v1.0 ${ENV_VAR} target/classes/application.properties @@ -511,12 +511,24 @@ org.apache.maven.plugins maven-compiler-plugin + 3.14.0 17 17 + + + org.projectlombok + lombok + ${org.projectlombok.version} + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + - org.apache.maven.plugins maven-resources-plugin diff --git a/src/main/java/com/iemr/common/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/common/utils/JwtUserIdValidationFilter.java index 0c12c3a6..2eb2ee2e 100644 --- a/src/main/java/com/iemr/common/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/common/utils/JwtUserIdValidationFilter.java @@ -55,6 +55,8 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo // 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 + "/public")) { logger.info("Skipping filter for path: " + path); filterChain.doFilter(servletRequest, servletResponse); From 21593efbfab823a0d352be8fafec6f7be13cf1cd Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Mon, 24 Mar 2025 14:46:00 +0530 Subject: [PATCH 04/30] Scheduler changes --- .../grievance/GrievanceDataRepo.java | 4 +- .../grievance/GrievanceDataSyncImpl.java | 74 ++++++++++--------- .../GrievanceHandlingServiceImpl.java | 3 +- 3 files changed, 41 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java index 1ff10da6..47b8e848 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java @@ -44,8 +44,8 @@ public int allocateGrievance(@Param("grievanceId") Long grievanceId, @Query("select grievance.preferredLanguage, count(distinct grievance.grievanceId) " - + "from GrievanceDetails grievance " + "where " - + "grievance.userID = :userID " + "and grievance.deleted = false " + + "from GrievanceDetails grievance where " + + "grievance.userID = :userID and grievance.isCompleted=false and grievance.deleted = false " + "group by grievance.preferredLanguage") public Set fetchGrievanceRecordsCount(@Param("userID") Integer userID); diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java index d4c6dce4..d50b1df1 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java @@ -259,42 +259,44 @@ public String dataSyncToGrievance() { if (transactionDetailsList != null && !transactionDetailsList.isEmpty()) { for (JsonElement transactionElement : transactionDetailsList) { JsonObject transactionDetailsJson = transactionElement.getAsJsonObject(); - GrievanceTransaction grievanceTransaction = new GrievanceTransaction(); - gwid = grievanceDataRepo.getUniqueGwid(grievanceID); - grievanceTransaction.setGwid(gwid); - grievanceTransaction.setGrievanceId(grievanceID); - - grievanceTransaction - .setActionTakenBy(transactionDetailsJson.has("actionTakenBy") - ? transactionDetailsJson.get("actionTakenBy").getAsString() - : null); - grievanceTransaction.setStatus(transactionDetailsJson.has("status") - ? transactionDetailsJson.get("status").getAsString() - : null); - grievanceTransaction.setFileName(transactionDetailsJson.has(FILE_NAME) - ? transactionDetailsJson.get(FILE_NAME).getAsString() - : null); - grievanceTransaction.setFileType(transactionDetailsJson.has(FILE_TYPE) - ? transactionDetailsJson.get(FILE_TYPE).getAsString() - : null); - grievanceTransaction.setRedressed(transactionDetailsJson.has("redressed") - ? transactionDetailsJson.get("redressed").getAsString() - : null); - grievanceTransaction.setCreatedAt(Timestamp - .valueOf(transactionDetailsJson.get("createdAt").getAsString())); - grievanceTransaction.setUpdatedAt(Timestamp - .valueOf(transactionDetailsJson.get("updatedAt").getAsString())); - grievanceTransaction.setComments(transactionDetailsJson.has("comment") - ? transactionDetailsJson.get("comment").getAsString() - : null); - grievanceTransaction.setCreatedBy("Admin"); - Timestamp timestamp = new Timestamp(System.currentTimeMillis()); - grievanceTransaction.setCreatedDate(timestamp); - - grievanceTransactionListObj = grievanceTransactionRepo - .save(grievanceTransaction); - grievanceTransactionList.add(grievanceTransactionListObj); - + JsonArray asJsonArray = transactionDetailsJson.get("transaction") + .getAsJsonArray(); + for (JsonElement arr : asJsonArray) { + JsonObject transaction = transactionElement.getAsJsonObject(); + GrievanceTransaction grievanceTransaction = new GrievanceTransaction(); + gwid = grievanceDataRepo.getUniqueGwid(grievanceID); + grievanceTransaction.setGwid(gwid); + grievanceTransaction.setGrievanceId(grievanceID); + grievanceTransaction.setActionTakenBy(transaction.has("actionTakenBy") + ? transaction.get("actionTakenBy").getAsString() + : null); + grievanceTransaction.setStatus(transaction.has("status") + ? transaction.get("status").getAsString() + : null); + grievanceTransaction.setFileName(transaction.has(FILE_NAME) + ? transaction.get(FILE_NAME).getAsString() + : null); + grievanceTransaction.setFileType(transaction.has(FILE_TYPE) + ? transaction.get(FILE_TYPE).getAsString() + : null); + grievanceTransaction.setRedressed(transaction.has("redressed") + ? transaction.get("redressed").getAsString() + : null); + grievanceTransaction.setCreatedAt( + Timestamp.valueOf(transaction.get("createdAt").getAsString())); + grievanceTransaction.setUpdatedAt( + Timestamp.valueOf(transaction.get("updatedAt").getAsString())); + grievanceTransaction.setComments(transaction.has("comment") + ? transaction.get("comment").getAsString() + : null); + grievanceTransaction.setCreatedBy("Admin"); + Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + grievanceTransaction.setCreatedDate(timestamp); + + grievanceTransactionListObj = grievanceTransactionRepo + .save(grievanceTransaction); + grievanceTransactionList.add(grievanceTransactionListObj); + } } } diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java index c9296c3b..ded5322e 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java @@ -120,7 +120,6 @@ public String allocateGrievances(String request) throws Exception { public String allocatedGrievanceRecordsCount(String request) throws IEMRException, JSONException { GrievanceDetails grievanceRequest = InputMapper.gson().fromJson(request, GrievanceDetails.class); - Integer providerServiceMapID = grievanceRequest.getProviderServiceMapID(); Integer userID = grievanceRequest.getUserID(); Set resultSet = grievanceDataRepo.fetchGrievanceRecordsCount(userID); @@ -333,7 +332,7 @@ public List getFormattedGrievanceData(String request) thro ageFormatted, (Boolean) row[26], // retryNeeded (Integer) row[27], // callCounter - (Timestamp) row[17] //lastCall yet to fill + (Timestamp) row[18] //lastCall yet to fill ); // Extract transactions from the current row and add them to the grievance object From b7eeeb9bf52be0d5a8f2d56c1a68e743f8c7b243 Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Mon, 24 Mar 2025 17:01:47 +0530 Subject: [PATCH 05/30] Scheduler changes --- .../grievance/GrievanceDataSyncImpl.java | 373 +++++++++--------- 1 file changed, 183 insertions(+), 190 deletions(-) diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java index d50b1df1..e70a25e6 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java @@ -121,197 +121,197 @@ public String dataSyncToGrievance() { Long gwid; try { - while (count >= 0) { - RestTemplate restTemplate = new RestTemplate(); - if (GRIEVANCE_AUTH_TOKEN != null && GRIEVANCE_TOKEN_EXP != null - && GRIEVANCE_TOKEN_EXP > System.currentTimeMillis()) { - } else { - generateGrievanceAuthToken(); - } + RestTemplate restTemplate = new RestTemplate(); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.add(USER_AGENT_HEADER, USER_AGENT_VALUE); - headers.add("AUTHORIZATION", GRIEVANCE_AUTH_TOKEN); - - Date date = new Date(); - java.sql.Date sqlDate = new java.sql.Date(date.getTime()); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(sqlDate); - calendar.add(Calendar.DATE, -Integer.parseInt(grievanceDataSyncDuration)); - String json = prepareRequestObject(); - int contentLength = json.getBytes(StandardCharsets.UTF_8).length; - headers.add("Content-Length", String.valueOf(contentLength)); - HttpEntity request = new HttpEntity<>(json, headers); - String url = updateGrievanceDetails.replace("PageNumber", "1"); - ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, request, String.class); - - if (response != null && response.hasBody()) { - JSONObject obj = new JSONObject(response.getBody()); - if (obj != null && obj.has("data") && obj.has("status") && obj.getInt("status") == 200) { - logger.info("Grievance data details response received successfully "); - - String responseStr = response.getBody(); - JsonObject jsnOBJ = new JsonObject(); - JsonParser jsnParser = new JsonParser(); - JsonElement jsnElmnt = jsnParser.parse(responseStr); - jsnOBJ = jsnElmnt.getAsJsonObject(); - int total = jsnOBJ.get("total").getAsInt(); - String GrievanceUrl = updateGrievanceDetails.replace("PageNumber", String.valueOf(total)); - ResponseEntity grievienceResponse = restTemplate.exchange(GrievanceUrl, HttpMethod.POST, - request, String.class); - String respStr = grievienceResponse.getBody(); - - JsonElement jsnElmntResp = jsnParser.parse(respStr); - jsnOBJ = jsnElmntResp.getAsJsonObject(); - JsonArray grievanceJsonDataArray = jsnOBJ.getAsJsonArray("data"); - if (Integer.parseInt(jsnOBJ.get("total").toString()) > 0) { - for (JsonElement grievanceElement : grievanceJsonDataArray) { - String formattedComplaintId = null; - try { - JsonObject grievanceJsonData = grievanceElement.getAsJsonObject(); - GrievanceDetails grievance = new GrievanceDetails(); - String complaintId = grievanceJsonData.get("complainId").getAsString(); - formattedComplaintId = complaintId.replace("\\/", "/"); - boolean complaintExists = grievanceDataRepo - .existsByComplaintId(formattedComplaintId); - if (complaintExists) { - logger.info("Complaint ID " + formattedComplaintId - + " already exists in the grievance worklist table."); - continue; - } + if (GRIEVANCE_AUTH_TOKEN != null && GRIEVANCE_TOKEN_EXP != null + && GRIEVANCE_TOKEN_EXP > System.currentTimeMillis()) { + } else { + generateGrievanceAuthToken(); + } - grievance.setComplaintID(formattedComplaintId); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add(USER_AGENT_HEADER, USER_AGENT_VALUE); + headers.add("AUTHORIZATION", GRIEVANCE_AUTH_TOKEN); - // Fetch related grievance transaction details - Long grievanceID = grievanceJsonData.get("grievanceId").getAsLong(); - grievance.setGrievanceId(grievanceID); - grievanceIds.add(grievanceJsonData.get("grievanceId").getAsLong()); + Date date = new Date(); + java.sql.Date sqlDate = new java.sql.Date(date.getTime()); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(sqlDate); + calendar.add(Calendar.DATE, -Integer.parseInt(grievanceDataSyncDuration)); + String json = prepareRequestObject(); + int contentLength = json.getBytes(StandardCharsets.UTF_8).length; + headers.add("Content-Length", String.valueOf(contentLength)); + HttpEntity request = new HttpEntity<>(json, headers); + String url = updateGrievanceDetails.replace("PageNumber", "1"); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, request, String.class); - grievance.setSubjectOfComplaint(grievanceJsonData.has("subject") - && !grievanceJsonData.get("subject").isJsonNull() - ? grievanceJsonData.get("subject").getAsString() - : null); - ArrayList lists = grievanceFetchBenDetailsRepo - .findByComplaintId(formattedComplaintId); - grievance.setComplaint(grievanceJsonData.has("Complaint") - ? grievanceJsonData.get("Complaint").getAsString() - : null); - String severityName = grievanceJsonData.has("severity") - && grievanceJsonData.get("severity").getAsJsonObject().has("severity") - ? grievanceJsonData.get("severity").getAsJsonObject() - .get("severity").getAsString() - : null; - grievance.setSeverety(severityName); - - // Setting Level - Integer levelId = grievanceJsonData.has("level") - && grievanceJsonData.get("level").getAsJsonObject().has("levelId") - ? grievanceJsonData.get("level").getAsJsonObject().get("levelId") - .getAsInt() - : null; - grievance.setLevel(levelId); - - // Setting state - String stateName = grievanceJsonData.has("state") - && grievanceJsonData.get("state").getAsJsonObject().has("stateName") - ? grievanceJsonData.get("state").getAsJsonObject().get("stateName") - .getAsString() - : null; - grievance.setState(stateName); - - for (Object[] objects : lists) { - if (objects != null && objects.length <= 4) { - grievance.setComplaintID((String) objects[0]); - grievance.setBenCallID((Long) objects[1]); - grievance.setBeneficiaryRegID((Long) objects[2]); - grievance.setProviderServiceMapID((Integer) objects[3]); - } + if (response != null && response.hasBody()) { + JSONObject obj = new JSONObject(response.getBody()); + if (obj != null && obj.has("data") && obj.has("status") && obj.getInt("status") == 200) { + logger.info("Grievance data details response received successfully "); + + String responseStr = response.getBody(); + JsonObject jsnOBJ = new JsonObject(); + JsonParser jsnParser = new JsonParser(); + JsonElement jsnElmnt = jsnParser.parse(responseStr); + jsnOBJ = jsnElmnt.getAsJsonObject(); + int total = jsnOBJ.get("total").getAsInt(); + String GrievanceUrl = updateGrievanceDetails.replace("PageNumber", String.valueOf(total)); + ResponseEntity grievienceResponse = restTemplate.exchange(GrievanceUrl, HttpMethod.POST, + request, String.class); + String respStr = grievienceResponse.getBody(); + + JsonElement jsnElmntResp = jsnParser.parse(respStr); + jsnOBJ = jsnElmntResp.getAsJsonObject(); + JsonArray grievanceJsonDataArray = jsnOBJ.getAsJsonArray("data"); + if (Integer.parseInt(jsnOBJ.get("total").toString()) > 0) { + for (JsonElement grievanceElement : grievanceJsonDataArray) { + String formattedComplaintId = null; + try { + JsonObject grievanceJsonData = grievanceElement.getAsJsonObject(); + GrievanceDetails grievance = new GrievanceDetails(); + String complaintId = grievanceJsonData.get("complainId").getAsString(); + formattedComplaintId = complaintId.replace("\\/", "/"); + boolean complaintExists = grievanceDataRepo.existsByComplaintId(formattedComplaintId); + if (complaintExists) { + logger.info("Complaint ID " + formattedComplaintId + + " already exists in the grievance worklist table."); + continue; + } + + grievance.setComplaintID(formattedComplaintId); + + // Fetch related grievance transaction details + Long grievanceID = grievanceJsonData.get("grievanceId").getAsLong(); + grievance.setGrievanceId(grievanceID); + grievanceIds.add(grievanceJsonData.get("grievanceId").getAsLong()); + + grievance.setSubjectOfComplaint(grievanceJsonData.has("subject") + && !grievanceJsonData.get("subject").isJsonNull() + ? grievanceJsonData.get("subject").getAsString() + : null); + ArrayList lists = grievanceFetchBenDetailsRepo + .findByComplaintId(formattedComplaintId); + grievance.setComplaint(grievanceJsonData.has("Complaint") + ? grievanceJsonData.get("Complaint").getAsString() + : null); + String severityName = grievanceJsonData.has("severity") + && grievanceJsonData.get("severity").getAsJsonObject().has("severity") + ? grievanceJsonData.get("severity").getAsJsonObject().get("severity") + .getAsString() + : null; + grievance.setSeverety(severityName); + + // Setting Level + Integer levelId = grievanceJsonData.has("level") + && grievanceJsonData.get("level").getAsJsonObject().has("levelId") + ? grievanceJsonData.get("level").getAsJsonObject().get("levelId") + .getAsInt() + : null; + grievance.setLevel(levelId); + + // Setting state + String stateName = grievanceJsonData.has("state") + && grievanceJsonData.get("state").getAsJsonObject().has("stateName") + ? grievanceJsonData.get("state").getAsJsonObject().get("stateName") + .getAsString() + : null; + grievance.setState(stateName); + + for (Object[] objects : lists) { + if (objects != null && objects.length <= 4) { + grievance.setComplaintID((String) objects[0]); + grievance.setBenCallID((Long) objects[1]); + grievance.setBeneficiaryRegID((Long) objects[2]); + grievance.setProviderServiceMapID((Integer) objects[3]); } - Long benDetailsID = grievanceDataRepo - .getBeneficiaryMapping(grievance.getBeneficiaryRegID()); - ArrayList list1 = grievanceDataRepo - .getBeneficiaryGrievanceDetails(benDetailsID); - for (Object[] objects : list1) { - if (objects != null && objects.length >= 6) { - grievance.setPreferredLanguageId((Integer) objects[0]); - grievance.setPreferredLanguage((String) objects[1]); - grievance.setVanSerialNo((Long) objects[2]); - grievance.setVanID((Integer) objects[3]); - grievance.setParkingPlaceID((Integer) objects[4]); - grievance.setVehicalNo((String) objects[5]); - } + } + Long benDetailsID = grievanceDataRepo + .getBeneficiaryMapping(grievance.getBeneficiaryRegID()); + ArrayList list1 = grievanceDataRepo + .getBeneficiaryGrievanceDetails(benDetailsID); + for (Object[] objects : list1) { + if (objects != null && objects.length >= 6) { + grievance.setPreferredLanguageId((Integer) objects[0]); + grievance.setPreferredLanguage((String) objects[1]); + grievance.setVanSerialNo((Long) objects[2]); + grievance.setVanID((Integer) objects[3]); + grievance.setParkingPlaceID((Integer) objects[4]); + grievance.setVehicalNo((String) objects[5]); } - String phoneNum = grievanceDataRepo - .getPrimaryNumber(grievance.getBeneficiaryRegID()); - grievance.setPrimaryNumber(phoneNum); - grievance.setDeleted(grievance.getDeleted()); - grievance.setCreatedBy("Admin"); - grievance.setProcessed('N'); - grievance.setIsAllocated(false); - grievance.setCallCounter(0); - grievance.setRetryNeeded(true); - - grievanceDataRepo.save(grievance); - - JsonArray transactionDetailsList = fetchGrievanceTransactions(grievanceID); - if (transactionDetailsList != null && !transactionDetailsList.isEmpty()) { - for (JsonElement transactionElement : transactionDetailsList) { - JsonObject transactionDetailsJson = transactionElement.getAsJsonObject(); - JsonArray asJsonArray = transactionDetailsJson.get("transaction") - .getAsJsonArray(); - for (JsonElement arr : asJsonArray) { - JsonObject transaction = transactionElement.getAsJsonObject(); - GrievanceTransaction grievanceTransaction = new GrievanceTransaction(); - gwid = grievanceDataRepo.getUniqueGwid(grievanceID); - grievanceTransaction.setGwid(gwid); - grievanceTransaction.setGrievanceId(grievanceID); - grievanceTransaction.setActionTakenBy(transaction.has("actionTakenBy") - ? transaction.get("actionTakenBy").getAsString() - : null); - grievanceTransaction.setStatus(transaction.has("status") - ? transaction.get("status").getAsString() - : null); - grievanceTransaction.setFileName(transaction.has(FILE_NAME) - ? transaction.get(FILE_NAME).getAsString() - : null); - grievanceTransaction.setFileType(transaction.has(FILE_TYPE) - ? transaction.get(FILE_TYPE).getAsString() - : null); - grievanceTransaction.setRedressed(transaction.has("redressed") - ? transaction.get("redressed").getAsString() - : null); - grievanceTransaction.setCreatedAt( - Timestamp.valueOf(transaction.get("createdAt").getAsString())); - grievanceTransaction.setUpdatedAt( - Timestamp.valueOf(transaction.get("updatedAt").getAsString())); - grievanceTransaction.setComments(transaction.has("comment") - ? transaction.get("comment").getAsString() - : null); - grievanceTransaction.setCreatedBy("Admin"); - Timestamp timestamp = new Timestamp(System.currentTimeMillis()); - grievanceTransaction.setCreatedDate(timestamp); - - grievanceTransactionListObj = grievanceTransactionRepo - .save(grievanceTransaction); - grievanceTransactionList.add(grievanceTransactionListObj); - } - } + } + String phoneNum = grievanceDataRepo.getPrimaryNumber(grievance.getBeneficiaryRegID()); + grievance.setPrimaryNumber(phoneNum); + grievance.setDeleted(grievance.getDeleted()); + grievance.setCreatedBy("Admin"); + grievance.setProcessed('N'); + grievance.setIsAllocated(false); + grievance.setCallCounter(0); + grievance.setRetryNeeded(true); + + grievanceDataRepo.save(grievance); + + JsonArray transactionDetailsList = fetchGrievanceTransactions(grievanceID); + if (transactionDetailsList != null && !transactionDetailsList.isEmpty()) { + for (JsonElement transactionElement : transactionDetailsList) { + JsonObject transactionDetailsJson = transactionElement.getAsJsonObject(); + JsonArray asJsonArray = transactionDetailsJson.get("transaction") + .getAsJsonArray(); + for (JsonElement arr : asJsonArray) { + JsonObject transaction = arr.getAsJsonObject(); + GrievanceTransaction grievanceTransaction = new GrievanceTransaction(); + gwid = grievanceDataRepo.getUniqueGwid(grievanceID); + grievanceTransaction.setGwid(gwid); + grievanceTransaction.setGrievanceId(grievanceID); + grievanceTransaction.setActionTakenBy(transaction.has("actionTakenBy") + && !transaction.get("actionTakenBy").isJsonNull() + ? transaction.get("actionTakenBy").getAsString() + : null); + grievanceTransaction.setStatus( + transaction.has("status") && !transaction.get("status").isJsonNull() + ? transaction.get("status").getAsString() + : null); + grievanceTransaction.setFileName(transaction.has(FILE_NAME) + && !transaction.get(FILE_NAME).isJsonNull() + ? transaction.get(FILE_NAME).getAsString() + : null); + grievanceTransaction.setFileType(transaction.has(FILE_TYPE) + && !transaction.get(FILE_TYPE).isJsonNull() + ? transaction.get(FILE_TYPE).getAsString() + : null); + grievanceTransaction.setRedressed(transaction.has("redressed") + && !transaction.get("redressed").isJsonNull() + ? transaction.get("redressed").getAsString() + : null); + grievanceTransaction.setCreatedAt( + Timestamp.valueOf(transaction.get("createdAt").getAsString())); + grievanceTransaction.setUpdatedAt( + Timestamp.valueOf(transaction.get("updatedAt").getAsString())); + grievanceTransaction.setComments(transaction.has("comment") + ? transaction.get("comment").getAsString() + : null); + grievanceTransaction.setCreatedBy("Admin"); + Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + grievanceTransaction.setCreatedDate(timestamp); + grievanceTransactionListObj = grievanceTransactionRepo + .save(grievanceTransaction); + grievanceTransactionList.add(grievanceTransactionListObj); + } } - } catch (Exception e) { - logger.error("Error while Grievance Details " + e.getMessage() + " Complaint ID " - + formattedComplaintId); + } + } catch (Exception e) { + logger.error("Error while Grievance Details " + e.getMessage() + " Complaint ID " + + formattedComplaintId); } - } else { - logger.info("No records found for page = {}", count); - count = -1; } } } } + } catch (Exception e) { logger.error("Error in saving data into t_grievanceworklist: ", e); } @@ -479,52 +479,45 @@ public String fetchUnallocatedGrievanceCount(String preferredLanguage, Timestamp // Fetch all unallocated grievances count from the database Set resultSet = grievanceDataRepo.fetchUnallocatedGrievanceCount(filterStartDate, filterEndDate); - // Initialize the result JSON object to hold counts JSONObject result = new JSONObject(); boolean preferredLanguageFound = false; result.put("All", 0); // Initialize the "All" language count to 0 - // Loop through the resultSet and populate the counts for each language if (resultSet != null && !resultSet.isEmpty()) { for (Object[] recordSet : resultSet) { - String language = ((String) recordSet[0]).trim(); - Long count = (Long) recordSet[1]; + String language = null; + Long count = null; + if(null != recordSet[0]) + language = ((String) recordSet[0]).trim(); + if(null != recordSet[1]) + count = (Long) recordSet[1]; - // Add the count to the result for the current language result.put(language, count); result.put("All", result.getLong("All") + count); // Add to the total "All" count - // If the preferred language matches, mark it as found if (preferredLanguage != null && preferredLanguage.equalsIgnoreCase(language)) { preferredLanguageFound = true; } } } - // If the preferred language is provided but not found in the results, add it - // with count 0 if (preferredLanguage != null && !preferredLanguageFound) { result.put(preferredLanguage, 0); } - // Create the final JSON response array JSONArray resultArray = new JSONArray(); - // Case 1: If preferredLanguage is provided, return only that language's count if (preferredLanguage != null) { JSONObject preferredLanguageEntry = new JSONObject(); preferredLanguageEntry.put(PREFERRED_LANGUAGE, preferredLanguage); preferredLanguageEntry.put(COUNT_OF_PREFERRED_LANGUAGE, result.getLong(preferredLanguage)); resultArray.put(preferredLanguageEntry); } else { - // Case 2: If no preferredLanguage is provided, return counts for all languages - // Add the "All" entry first + JSONObject allEntry = new JSONObject(); allEntry.put(PREFERRED_LANGUAGE, "All"); allEntry.put(COUNT_OF_PREFERRED_LANGUAGE, result.getLong("All")); resultArray.put(allEntry); - - // Add counts for other languages Iterator keys = result.keys(); while (keys.hasNext()) { String key = keys.next(); From 482f441713c8d205b3f3db697ceadab5af816cf9 Mon Sep 17 00:00:00 2001 From: ravishanigarapu <133210792+ravishanigarapu@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:09:02 +0530 Subject: [PATCH 06/30] AMM-1301 : ActionTakenBy and comments saving as null in working (#177) * Scheduler changes * Scheduler changes --- .../grievance/GrievanceDataRepo.java | 4 +- .../grievance/GrievanceDataSyncImpl.java | 345 +++++++++--------- .../GrievanceHandlingServiceImpl.java | 3 +- 3 files changed, 173 insertions(+), 179 deletions(-) diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java index 1ff10da6..47b8e848 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java @@ -44,8 +44,8 @@ public int allocateGrievance(@Param("grievanceId") Long grievanceId, @Query("select grievance.preferredLanguage, count(distinct grievance.grievanceId) " - + "from GrievanceDetails grievance " + "where " - + "grievance.userID = :userID " + "and grievance.deleted = false " + + "from GrievanceDetails grievance where " + + "grievance.userID = :userID and grievance.isCompleted=false and grievance.deleted = false " + "group by grievance.preferredLanguage") public Set fetchGrievanceRecordsCount(@Param("userID") Integer userID); diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java index d4c6dce4..e70a25e6 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java @@ -121,171 +121,176 @@ public String dataSyncToGrievance() { Long gwid; try { - while (count >= 0) { - RestTemplate restTemplate = new RestTemplate(); - if (GRIEVANCE_AUTH_TOKEN != null && GRIEVANCE_TOKEN_EXP != null - && GRIEVANCE_TOKEN_EXP > System.currentTimeMillis()) { - } else { - generateGrievanceAuthToken(); - } + RestTemplate restTemplate = new RestTemplate(); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.add(USER_AGENT_HEADER, USER_AGENT_VALUE); - headers.add("AUTHORIZATION", GRIEVANCE_AUTH_TOKEN); - - Date date = new Date(); - java.sql.Date sqlDate = new java.sql.Date(date.getTime()); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(sqlDate); - calendar.add(Calendar.DATE, -Integer.parseInt(grievanceDataSyncDuration)); - String json = prepareRequestObject(); - int contentLength = json.getBytes(StandardCharsets.UTF_8).length; - headers.add("Content-Length", String.valueOf(contentLength)); - HttpEntity request = new HttpEntity<>(json, headers); - String url = updateGrievanceDetails.replace("PageNumber", "1"); - ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, request, String.class); - - if (response != null && response.hasBody()) { - JSONObject obj = new JSONObject(response.getBody()); - if (obj != null && obj.has("data") && obj.has("status") && obj.getInt("status") == 200) { - logger.info("Grievance data details response received successfully "); - - String responseStr = response.getBody(); - JsonObject jsnOBJ = new JsonObject(); - JsonParser jsnParser = new JsonParser(); - JsonElement jsnElmnt = jsnParser.parse(responseStr); - jsnOBJ = jsnElmnt.getAsJsonObject(); - int total = jsnOBJ.get("total").getAsInt(); - String GrievanceUrl = updateGrievanceDetails.replace("PageNumber", String.valueOf(total)); - ResponseEntity grievienceResponse = restTemplate.exchange(GrievanceUrl, HttpMethod.POST, - request, String.class); - String respStr = grievienceResponse.getBody(); - - JsonElement jsnElmntResp = jsnParser.parse(respStr); - jsnOBJ = jsnElmntResp.getAsJsonObject(); - JsonArray grievanceJsonDataArray = jsnOBJ.getAsJsonArray("data"); - if (Integer.parseInt(jsnOBJ.get("total").toString()) > 0) { - for (JsonElement grievanceElement : grievanceJsonDataArray) { - String formattedComplaintId = null; - try { - JsonObject grievanceJsonData = grievanceElement.getAsJsonObject(); - GrievanceDetails grievance = new GrievanceDetails(); - String complaintId = grievanceJsonData.get("complainId").getAsString(); - formattedComplaintId = complaintId.replace("\\/", "/"); - boolean complaintExists = grievanceDataRepo - .existsByComplaintId(formattedComplaintId); - if (complaintExists) { - logger.info("Complaint ID " + formattedComplaintId - + " already exists in the grievance worklist table."); - continue; - } + if (GRIEVANCE_AUTH_TOKEN != null && GRIEVANCE_TOKEN_EXP != null + && GRIEVANCE_TOKEN_EXP > System.currentTimeMillis()) { + } else { + generateGrievanceAuthToken(); + } + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add(USER_AGENT_HEADER, USER_AGENT_VALUE); + headers.add("AUTHORIZATION", GRIEVANCE_AUTH_TOKEN); - grievance.setComplaintID(formattedComplaintId); + Date date = new Date(); + java.sql.Date sqlDate = new java.sql.Date(date.getTime()); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(sqlDate); + calendar.add(Calendar.DATE, -Integer.parseInt(grievanceDataSyncDuration)); + String json = prepareRequestObject(); + int contentLength = json.getBytes(StandardCharsets.UTF_8).length; + headers.add("Content-Length", String.valueOf(contentLength)); + HttpEntity request = new HttpEntity<>(json, headers); + String url = updateGrievanceDetails.replace("PageNumber", "1"); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, request, String.class); - // Fetch related grievance transaction details - Long grievanceID = grievanceJsonData.get("grievanceId").getAsLong(); - grievance.setGrievanceId(grievanceID); - grievanceIds.add(grievanceJsonData.get("grievanceId").getAsLong()); + if (response != null && response.hasBody()) { + JSONObject obj = new JSONObject(response.getBody()); + if (obj != null && obj.has("data") && obj.has("status") && obj.getInt("status") == 200) { + logger.info("Grievance data details response received successfully "); - grievance.setSubjectOfComplaint(grievanceJsonData.has("subject") - && !grievanceJsonData.get("subject").isJsonNull() - ? grievanceJsonData.get("subject").getAsString() - : null); - ArrayList lists = grievanceFetchBenDetailsRepo - .findByComplaintId(formattedComplaintId); - grievance.setComplaint(grievanceJsonData.has("Complaint") - ? grievanceJsonData.get("Complaint").getAsString() - : null); - String severityName = grievanceJsonData.has("severity") - && grievanceJsonData.get("severity").getAsJsonObject().has("severity") - ? grievanceJsonData.get("severity").getAsJsonObject() - .get("severity").getAsString() - : null; - grievance.setSeverety(severityName); - - // Setting Level - Integer levelId = grievanceJsonData.has("level") - && grievanceJsonData.get("level").getAsJsonObject().has("levelId") - ? grievanceJsonData.get("level").getAsJsonObject().get("levelId") - .getAsInt() - : null; - grievance.setLevel(levelId); - - // Setting state - String stateName = grievanceJsonData.has("state") - && grievanceJsonData.get("state").getAsJsonObject().has("stateName") - ? grievanceJsonData.get("state").getAsJsonObject().get("stateName") - .getAsString() - : null; - grievance.setState(stateName); - - for (Object[] objects : lists) { - if (objects != null && objects.length <= 4) { - grievance.setComplaintID((String) objects[0]); - grievance.setBenCallID((Long) objects[1]); - grievance.setBeneficiaryRegID((Long) objects[2]); - grievance.setProviderServiceMapID((Integer) objects[3]); - } + String responseStr = response.getBody(); + JsonObject jsnOBJ = new JsonObject(); + JsonParser jsnParser = new JsonParser(); + JsonElement jsnElmnt = jsnParser.parse(responseStr); + jsnOBJ = jsnElmnt.getAsJsonObject(); + int total = jsnOBJ.get("total").getAsInt(); + String GrievanceUrl = updateGrievanceDetails.replace("PageNumber", String.valueOf(total)); + ResponseEntity grievienceResponse = restTemplate.exchange(GrievanceUrl, HttpMethod.POST, + request, String.class); + String respStr = grievienceResponse.getBody(); + + JsonElement jsnElmntResp = jsnParser.parse(respStr); + jsnOBJ = jsnElmntResp.getAsJsonObject(); + JsonArray grievanceJsonDataArray = jsnOBJ.getAsJsonArray("data"); + if (Integer.parseInt(jsnOBJ.get("total").toString()) > 0) { + for (JsonElement grievanceElement : grievanceJsonDataArray) { + String formattedComplaintId = null; + try { + JsonObject grievanceJsonData = grievanceElement.getAsJsonObject(); + GrievanceDetails grievance = new GrievanceDetails(); + String complaintId = grievanceJsonData.get("complainId").getAsString(); + formattedComplaintId = complaintId.replace("\\/", "/"); + boolean complaintExists = grievanceDataRepo.existsByComplaintId(formattedComplaintId); + if (complaintExists) { + logger.info("Complaint ID " + formattedComplaintId + + " already exists in the grievance worklist table."); + continue; + } + + grievance.setComplaintID(formattedComplaintId); + + // Fetch related grievance transaction details + Long grievanceID = grievanceJsonData.get("grievanceId").getAsLong(); + grievance.setGrievanceId(grievanceID); + grievanceIds.add(grievanceJsonData.get("grievanceId").getAsLong()); + + grievance.setSubjectOfComplaint(grievanceJsonData.has("subject") + && !grievanceJsonData.get("subject").isJsonNull() + ? grievanceJsonData.get("subject").getAsString() + : null); + ArrayList lists = grievanceFetchBenDetailsRepo + .findByComplaintId(formattedComplaintId); + grievance.setComplaint(grievanceJsonData.has("Complaint") + ? grievanceJsonData.get("Complaint").getAsString() + : null); + String severityName = grievanceJsonData.has("severity") + && grievanceJsonData.get("severity").getAsJsonObject().has("severity") + ? grievanceJsonData.get("severity").getAsJsonObject().get("severity") + .getAsString() + : null; + grievance.setSeverety(severityName); + + // Setting Level + Integer levelId = grievanceJsonData.has("level") + && grievanceJsonData.get("level").getAsJsonObject().has("levelId") + ? grievanceJsonData.get("level").getAsJsonObject().get("levelId") + .getAsInt() + : null; + grievance.setLevel(levelId); + + // Setting state + String stateName = grievanceJsonData.has("state") + && grievanceJsonData.get("state").getAsJsonObject().has("stateName") + ? grievanceJsonData.get("state").getAsJsonObject().get("stateName") + .getAsString() + : null; + grievance.setState(stateName); + + for (Object[] objects : lists) { + if (objects != null && objects.length <= 4) { + grievance.setComplaintID((String) objects[0]); + grievance.setBenCallID((Long) objects[1]); + grievance.setBeneficiaryRegID((Long) objects[2]); + grievance.setProviderServiceMapID((Integer) objects[3]); } - Long benDetailsID = grievanceDataRepo - .getBeneficiaryMapping(grievance.getBeneficiaryRegID()); - ArrayList list1 = grievanceDataRepo - .getBeneficiaryGrievanceDetails(benDetailsID); - for (Object[] objects : list1) { - if (objects != null && objects.length >= 6) { - grievance.setPreferredLanguageId((Integer) objects[0]); - grievance.setPreferredLanguage((String) objects[1]); - grievance.setVanSerialNo((Long) objects[2]); - grievance.setVanID((Integer) objects[3]); - grievance.setParkingPlaceID((Integer) objects[4]); - grievance.setVehicalNo((String) objects[5]); - } + } + Long benDetailsID = grievanceDataRepo + .getBeneficiaryMapping(grievance.getBeneficiaryRegID()); + ArrayList list1 = grievanceDataRepo + .getBeneficiaryGrievanceDetails(benDetailsID); + for (Object[] objects : list1) { + if (objects != null && objects.length >= 6) { + grievance.setPreferredLanguageId((Integer) objects[0]); + grievance.setPreferredLanguage((String) objects[1]); + grievance.setVanSerialNo((Long) objects[2]); + grievance.setVanID((Integer) objects[3]); + grievance.setParkingPlaceID((Integer) objects[4]); + grievance.setVehicalNo((String) objects[5]); } - String phoneNum = grievanceDataRepo - .getPrimaryNumber(grievance.getBeneficiaryRegID()); - grievance.setPrimaryNumber(phoneNum); - grievance.setDeleted(grievance.getDeleted()); - grievance.setCreatedBy("Admin"); - grievance.setProcessed('N'); - grievance.setIsAllocated(false); - grievance.setCallCounter(0); - grievance.setRetryNeeded(true); - - grievanceDataRepo.save(grievance); - - JsonArray transactionDetailsList = fetchGrievanceTransactions(grievanceID); - if (transactionDetailsList != null && !transactionDetailsList.isEmpty()) { - for (JsonElement transactionElement : transactionDetailsList) { - JsonObject transactionDetailsJson = transactionElement.getAsJsonObject(); + } + String phoneNum = grievanceDataRepo.getPrimaryNumber(grievance.getBeneficiaryRegID()); + grievance.setPrimaryNumber(phoneNum); + grievance.setDeleted(grievance.getDeleted()); + grievance.setCreatedBy("Admin"); + grievance.setProcessed('N'); + grievance.setIsAllocated(false); + grievance.setCallCounter(0); + grievance.setRetryNeeded(true); + + grievanceDataRepo.save(grievance); + + JsonArray transactionDetailsList = fetchGrievanceTransactions(grievanceID); + if (transactionDetailsList != null && !transactionDetailsList.isEmpty()) { + for (JsonElement transactionElement : transactionDetailsList) { + JsonObject transactionDetailsJson = transactionElement.getAsJsonObject(); + JsonArray asJsonArray = transactionDetailsJson.get("transaction") + .getAsJsonArray(); + for (JsonElement arr : asJsonArray) { + JsonObject transaction = arr.getAsJsonObject(); GrievanceTransaction grievanceTransaction = new GrievanceTransaction(); gwid = grievanceDataRepo.getUniqueGwid(grievanceID); grievanceTransaction.setGwid(gwid); grievanceTransaction.setGrievanceId(grievanceID); - - grievanceTransaction - .setActionTakenBy(transactionDetailsJson.has("actionTakenBy") - ? transactionDetailsJson.get("actionTakenBy").getAsString() + grievanceTransaction.setActionTakenBy(transaction.has("actionTakenBy") + && !transaction.get("actionTakenBy").isJsonNull() + ? transaction.get("actionTakenBy").getAsString() : null); - grievanceTransaction.setStatus(transactionDetailsJson.has("status") - ? transactionDetailsJson.get("status").getAsString() - : null); - grievanceTransaction.setFileName(transactionDetailsJson.has(FILE_NAME) - ? transactionDetailsJson.get(FILE_NAME).getAsString() - : null); - grievanceTransaction.setFileType(transactionDetailsJson.has(FILE_TYPE) - ? transactionDetailsJson.get(FILE_TYPE).getAsString() - : null); - grievanceTransaction.setRedressed(transactionDetailsJson.has("redressed") - ? transactionDetailsJson.get("redressed").getAsString() - : null); - grievanceTransaction.setCreatedAt(Timestamp - .valueOf(transactionDetailsJson.get("createdAt").getAsString())); - grievanceTransaction.setUpdatedAt(Timestamp - .valueOf(transactionDetailsJson.get("updatedAt").getAsString())); - grievanceTransaction.setComments(transactionDetailsJson.has("comment") - ? transactionDetailsJson.get("comment").getAsString() + grievanceTransaction.setStatus( + transaction.has("status") && !transaction.get("status").isJsonNull() + ? transaction.get("status").getAsString() + : null); + grievanceTransaction.setFileName(transaction.has(FILE_NAME) + && !transaction.get(FILE_NAME).isJsonNull() + ? transaction.get(FILE_NAME).getAsString() + : null); + grievanceTransaction.setFileType(transaction.has(FILE_TYPE) + && !transaction.get(FILE_TYPE).isJsonNull() + ? transaction.get(FILE_TYPE).getAsString() + : null); + grievanceTransaction.setRedressed(transaction.has("redressed") + && !transaction.get("redressed").isJsonNull() + ? transaction.get("redressed").getAsString() + : null); + grievanceTransaction.setCreatedAt( + Timestamp.valueOf(transaction.get("createdAt").getAsString())); + grievanceTransaction.setUpdatedAt( + Timestamp.valueOf(transaction.get("updatedAt").getAsString())); + grievanceTransaction.setComments(transaction.has("comment") + ? transaction.get("comment").getAsString() : null); grievanceTransaction.setCreatedBy("Admin"); Timestamp timestamp = new Timestamp(System.currentTimeMillis()); @@ -294,22 +299,19 @@ public String dataSyncToGrievance() { grievanceTransactionListObj = grievanceTransactionRepo .save(grievanceTransaction); grievanceTransactionList.add(grievanceTransactionListObj); - } - } - } catch (Exception e) { - logger.error("Error while Grievance Details " + e.getMessage() + " Complaint ID " - + formattedComplaintId); + } + } catch (Exception e) { + logger.error("Error while Grievance Details " + e.getMessage() + " Complaint ID " + + formattedComplaintId); } - } else { - logger.info("No records found for page = {}", count); - count = -1; } } } } + } catch (Exception e) { logger.error("Error in saving data into t_grievanceworklist: ", e); } @@ -477,52 +479,45 @@ public String fetchUnallocatedGrievanceCount(String preferredLanguage, Timestamp // Fetch all unallocated grievances count from the database Set resultSet = grievanceDataRepo.fetchUnallocatedGrievanceCount(filterStartDate, filterEndDate); - // Initialize the result JSON object to hold counts JSONObject result = new JSONObject(); boolean preferredLanguageFound = false; result.put("All", 0); // Initialize the "All" language count to 0 - // Loop through the resultSet and populate the counts for each language if (resultSet != null && !resultSet.isEmpty()) { for (Object[] recordSet : resultSet) { - String language = ((String) recordSet[0]).trim(); - Long count = (Long) recordSet[1]; + String language = null; + Long count = null; + if(null != recordSet[0]) + language = ((String) recordSet[0]).trim(); + if(null != recordSet[1]) + count = (Long) recordSet[1]; - // Add the count to the result for the current language result.put(language, count); result.put("All", result.getLong("All") + count); // Add to the total "All" count - // If the preferred language matches, mark it as found if (preferredLanguage != null && preferredLanguage.equalsIgnoreCase(language)) { preferredLanguageFound = true; } } } - // If the preferred language is provided but not found in the results, add it - // with count 0 if (preferredLanguage != null && !preferredLanguageFound) { result.put(preferredLanguage, 0); } - // Create the final JSON response array JSONArray resultArray = new JSONArray(); - // Case 1: If preferredLanguage is provided, return only that language's count if (preferredLanguage != null) { JSONObject preferredLanguageEntry = new JSONObject(); preferredLanguageEntry.put(PREFERRED_LANGUAGE, preferredLanguage); preferredLanguageEntry.put(COUNT_OF_PREFERRED_LANGUAGE, result.getLong(preferredLanguage)); resultArray.put(preferredLanguageEntry); } else { - // Case 2: If no preferredLanguage is provided, return counts for all languages - // Add the "All" entry first + JSONObject allEntry = new JSONObject(); allEntry.put(PREFERRED_LANGUAGE, "All"); allEntry.put(COUNT_OF_PREFERRED_LANGUAGE, result.getLong("All")); resultArray.put(allEntry); - - // Add counts for other languages Iterator keys = result.keys(); while (keys.hasNext()) { String key = keys.next(); diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java index c9296c3b..ded5322e 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java @@ -120,7 +120,6 @@ public String allocateGrievances(String request) throws Exception { public String allocatedGrievanceRecordsCount(String request) throws IEMRException, JSONException { GrievanceDetails grievanceRequest = InputMapper.gson().fromJson(request, GrievanceDetails.class); - Integer providerServiceMapID = grievanceRequest.getProviderServiceMapID(); Integer userID = grievanceRequest.getUserID(); Set resultSet = grievanceDataRepo.fetchGrievanceRecordsCount(userID); @@ -333,7 +332,7 @@ public List getFormattedGrievanceData(String request) thro ageFormatted, (Boolean) row[26], // retryNeeded (Integer) row[27], // callCounter - (Timestamp) row[17] //lastCall yet to fill + (Timestamp) row[18] //lastCall yet to fill ); // Extract transactions from the current row and add them to the grievance object From 7d7340bb3ca444de4f7048857668f10888830061 Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Tue, 25 Mar 2025 18:28:50 +0530 Subject: [PATCH 07/30] GrieVANCE WORKLIST Changes --- .../data/grievance/GrievanceTransaction.java | 14 ++- .../dto/grivance/GrievanceWorklistDTO.java | 15 ++- .../grievance/GrievanceTransactionRepo.java | 6 ++ .../GrievanceHandlingServiceImpl.java | 93 +++++++++---------- 4 files changed, 68 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/iemr/common/data/grievance/GrievanceTransaction.java b/src/main/java/com/iemr/common/data/grievance/GrievanceTransaction.java index 628c9ca8..51232dcc 100644 --- a/src/main/java/com/iemr/common/data/grievance/GrievanceTransaction.java +++ b/src/main/java/com/iemr/common/data/grievance/GrievanceTransaction.java @@ -1,16 +1,22 @@ package com.iemr.common.data.grievance; -import jakarta.persistence.*; +import java.util.Date; import com.google.gson.annotations.Expose; -import jakarta.validation.constraints.NotBlank; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import jakarta.validation.constraints.Size; import lombok.Data; -import java.util.Date; - @Entity @Data @Table(name = "t_grievancetransaction") diff --git a/src/main/java/com/iemr/common/dto/grivance/GrievanceWorklistDTO.java b/src/main/java/com/iemr/common/dto/grivance/GrievanceWorklistDTO.java index 365c76a3..dc58cab3 100644 --- a/src/main/java/com/iemr/common/dto/grivance/GrievanceWorklistDTO.java +++ b/src/main/java/com/iemr/common/dto/grivance/GrievanceWorklistDTO.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.List; - import lombok.Data; import lombok.NoArgsConstructor; @@ -15,6 +14,7 @@ public class GrievanceWorklistDTO implements Serializable { private static final long serialVersionUID = 1L; private String complaintID; + private Long grievanceId; private String subjectOfComplaint; private String complaint; private Long beneficiaryRegID; @@ -39,22 +39,19 @@ public class GrievanceWorklistDTO implements Serializable { private Integer callCounter; private Timestamp lastCall; - public GrievanceWorklistDTO(String complaintID, String subjectOfComplaint, String complaint, - Long beneficiaryRegID, Integer providerServiceMapID, String firstName, String lastName, - String primaryNumber, List transactions, String severety, String state, + public GrievanceWorklistDTO(String complaintID,Long grievanceId, String subjectOfComplaint, String complaint, + Long beneficiaryRegID, Integer providerServiceMapID,String primaryNumber,String severety,String state, Integer userId, Boolean deleted, String createdBy, Timestamp createdDate, Timestamp lastModDate, - Boolean isCompleted, String gender, String district, Long beneficiaryID, String age, + Boolean isCompleted,String firstName, String lastName, String gender, String district, Long beneficiaryID, String age, Boolean retryNeeded, Integer callCounter, Timestamp lastCall) { super(); this.complaintID = complaintID; + this.grievanceId = grievanceId; this.subjectOfComplaint = subjectOfComplaint; this.complaint = complaint; this.beneficiaryRegID = beneficiaryRegID; this.providerServiceMapID = providerServiceMapID; - this.firstName = firstName; - this.lastName = lastName; this.primaryNumber = primaryNumber; - this.transactions = transactions; this.severety = severety; this.state = state; this.userId = userId; @@ -63,6 +60,8 @@ public GrievanceWorklistDTO(String complaintID, String subjectOfComplaint, Strin this.createdDate = createdDate; this.lastModDate = lastModDate; this.isCompleted = isCompleted; + this.firstName = firstName; + this.lastName = lastName; this.gender = gender; this.district = district; this.beneficiaryID = beneficiaryID; diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceTransactionRepo.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceTransactionRepo.java index 2c513836..b1d2d1a1 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceTransactionRepo.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceTransactionRepo.java @@ -1,11 +1,17 @@ package com.iemr.common.repository.grievance; +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.common.data.grievance.GrievanceTransaction; @Repository public interface GrievanceTransactionRepo extends CrudRepository { + @Query(value = "select actionTakenBy,status,FileName,FileType,Redressed,createdAt,updatedAt,Comments from t_grievancetransaction t where t.grievanceId = :grievanceId",nativeQuery = true) + List getGrievanceTransaction(@Param("grievanceId") Long grievanceId); } diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java index ded5322e..c07f59c2 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java @@ -4,10 +4,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Comparator; import java.util.Date; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -33,6 +31,7 @@ import com.iemr.common.repository.callhandling.BeneficiaryCallRepository; import com.iemr.common.repository.grievance.GrievanceDataRepo; import com.iemr.common.repository.grievance.GrievanceOutboundRepository; +import com.iemr.common.repository.grievance.GrievanceTransactionRepo; import com.iemr.common.utils.exception.IEMRException; import com.iemr.common.utils.mapper.InputMapper; @@ -46,13 +45,15 @@ public class GrievanceHandlingServiceImpl implements GrievanceHandlingService { private final GrievanceDataRepo grievanceDataRepo; private final GrievanceOutboundRepository grievanceOutboundRepo; private final BeneficiaryCallRepository beneficiaryCallRepo; + private final GrievanceTransactionRepo grievanceTransactionRepo; @Autowired public GrievanceHandlingServiceImpl(GrievanceDataRepo grievanceDataRepo, GrievanceOutboundRepository grievanceOutboundRepo, - BeneficiaryCallRepository beneficiaryCallRepo) { + BeneficiaryCallRepository beneficiaryCallRepo,GrievanceTransactionRepo grievanceTransactionRepo) { this.grievanceDataRepo = grievanceDataRepo; this.grievanceOutboundRepo = grievanceOutboundRepo; this.beneficiaryCallRepo = beneficiaryCallRepo; + this.grievanceTransactionRepo = grievanceTransactionRepo; } @Value("${grievanceAllocationRetryConfiguration}") @@ -60,7 +61,6 @@ public GrievanceHandlingServiceImpl(GrievanceDataRepo grievanceDataRepo, Grievan // configure // retry logic - private InputMapper inputMapper = new InputMapper(); // InputMapper used to map the JSON request @Override public String allocateGrievances(String request) throws Exception { @@ -82,9 +82,7 @@ public String allocateGrievances(String request) throws Exception { int allocateNo = allocationRequest.getAllocateNo(); // Number of grievances to allocate per user // Step 4: Initialize counters - int totalAllocated = 0; int grievanceIndex = 0; // Start from the first grievance - int totalUsers = userIds.size(); int totalGrievances = grievances.size(); // Step 5: Allocate grievances to users, ensuring each user gets exactly 'allocateNo' grievances @@ -98,7 +96,6 @@ public String allocateGrievances(String request) throws Exception { // Allocate the grievance to the user int rowsAffected = grievanceDataRepo.allocateGrievance(grievance.getGrievanceId(), userId); if (rowsAffected > 0) { - totalAllocated++; logger.debug("Allocated grievance ID {} to user ID {}", grievance.getGrievanceId(), userId); } else { logger.error("Failed to allocate grievance ID {} to user ID {}", grievance.getGrievanceId(), userId); @@ -292,7 +289,7 @@ public List getFormattedGrievanceData(String request) thro // Loop through the worklist data and format the response for (Object[] row : worklistData) { - if (row == null || row.length < 30) + if (row == null || row.length < 22) { logger.warn("invalid row data received"); continue; @@ -300,56 +297,56 @@ public List getFormattedGrievanceData(String request) thro // Handle age conversion from Double to "x years" format String ageFormatted = null; // Default value for age if it's not available - if (row[25] != null) { - Long age = (Long) row[25]; + if (row[20] != null) { + Long age = (Long) row[20]; ageFormatted = age.intValue() + " years"; // Convert the age to integer and append " years" } GrievanceWorklistDTO grievance = new GrievanceWorklistDTO( (String) row[0], // complaintID - (String) row[1], // subjectOfComplaint - (String) row[2], // complaint - (Long) row[3], // beneficiaryRegID - (Integer) row[4],// providerServiceMapID - - (String) row[20], // firstName - (String) row[21], // lastName - (String) row[5], // primaryNumber - - new ArrayList<>(),// transactions (initially empty, will be populated later) - (String) row[12], // severety - (String) row[13], // state - (Integer) row[14],// userId - (Boolean) row[15],// deleted - (String) row[16],// createdBy - (Timestamp) row[17], // createdDate - (Timestamp) row[18], // lastModDate - (Boolean) row[19], // isCompleted - (String) row[22], // gender - (String) row[23], // district - (Long) row[24], // beneficiaryID - // (Double) row[25], // age + (Long) row[1], //grievanceId + (String) row[2], // subjectOfComplaint + (String) row[3], // complaint + (Long) row[4], // beneficiaryRegID + (Integer) row[5],// providerServiceMapID + (String) row[6], // primaryNumber + (String) row[7], // severety + (String) row[8], // state + (Integer) row[9],// userId + (Boolean) row[10],// deleted + (String) row[11],// createdBy + (Timestamp) row[12], // createdDate + (Timestamp) row[13], // lastModDate + (Boolean) row[14], // isCompleted + + (String) row[15], // firstName + (String) row[16], // lastName + (String) row[17], // gender + (String) row[18], // district + (Long) row[19], // beneficiaryID ageFormatted, - (Boolean) row[26], // retryNeeded - (Integer) row[27], // callCounter - (Timestamp) row[18] //lastCall yet to fill + (Boolean) row[21], // retryNeeded + (Integer) row[22], // callCounter + (Timestamp) row[13] //lastCall ); // Extract transactions from the current row and add them to the grievance object - GrievanceTransactionDTO transaction = new GrievanceTransactionDTO( - (String) row[28], //actionTakenBy yet to fill - (String) row[29], //status yet to fill - (String) row[6], // fileName - (String) row[7], // fileType - (String) row[8], // redressed - (Timestamp) row[9], // createdAt - (Timestamp) row[10], // updatedAt - (String) row[11] // comment - ); + List transaction = grievanceTransactionRepo.getGrievanceTransaction((Long) row[1]); + List arrayList = new ArrayList<>(); + for (Object[] tras : transaction) { + String actionTakenBy = (tras[0]!=null)?(String) tras[0]:null; + String status = (tras[1]!=null)?(String) tras[1]:null; + String fileName = (tras[2]!=null)?(String) tras[2]:null; + String fileType = (tras[3]!=null)?(String) tras[3]:null; + String redressed = (tras[4]!=null)?(String) tras[4]:null; + Timestamp createdAt = (tras[5]!=null)?(Timestamp) tras[5]:null; + Timestamp updatedAt = (tras[6]!=null)?(Timestamp) tras[6]:null; + String comment = (tras[7]!=null)?(String) tras[7]:null; + GrievanceTransactionDTO grievanceTransactionDTO = new GrievanceTransactionDTO(actionTakenBy, status, fileName, fileType, redressed, createdAt, updatedAt,comment); + arrayList.add(grievanceTransactionDTO); + } + grievance.setTransactions(arrayList); - grievance.getTransactions().add(transaction); // Add the transaction to the grievance's list - - // Add the grievance to the result list formattedGrievances.add(grievance); } From 0563e98c5fc10de224cf088b91c940ccd4a84745 Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Sat, 29 Mar 2025 10:16:21 +0530 Subject: [PATCH 08/30] Grievance changes --- .../grievance/GrievanceController.java | 33 +++++++++++--- .../dto/grivance/GrievanceWorklistDTO.java | 2 + .../grievance/GrievanceDataRepo.java | 17 +++---- .../grievance/GrievanceDataSyncImpl.java | 44 +++++++------------ .../GrievanceHandlingServiceImpl.java | 31 +++++-------- 5 files changed, 65 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java b/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java index a4e3212c..d27be652 100644 --- a/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java +++ b/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java @@ -1,6 +1,11 @@ package com.iemr.common.controller.grievance; +import java.lang.reflect.Type; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -19,6 +24,15 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import com.iemr.common.data.grievance.UnallocationRequest; import com.iemr.common.dto.grivance.GrievanceWorklistDTO; import com.iemr.common.service.grievance.GrievanceDataSync; @@ -130,11 +144,12 @@ public String moveToBin(@RequestBody String request) { @Operation(summary = "get grievance outbound worklist)") @PostMapping(value = "/getGrievanceOutboundWorklist", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON, headers = "Authorization") - public ResponseEntity> getGrievanceOutboundWorklist(@Param(value = "{\"providerServiceMapId\":\" called service ID integer\", " - + "\"userId\":\"Optional - Integer ID of user that is assigned to\"}") @RequestBody String request) { + public String getGrievanceOutboundWorklist(@Param(value = "{\"providerServiceMapId\":\" called service ID integer\", " + + "\"userId\":\"Optional - Integer ID of user that is assigned to\"}") @RequestBody String request) throws JsonProcessingException { logger.info("Request received for grievance worklist"); List response = new ArrayList<>(); Map responseMap = new HashMap<>(); + ObjectMapper objectMapper = new ObjectMapper(); try { response = grievanceHandlingService.getFormattedGrievanceData(request); @@ -160,9 +175,17 @@ public ResponseEntity> getGrievanceOutboundWorklist(@Param(v responseMap.put("errorMessage", e.getMessage()); responseMap.put("status", "Error"); } - - - return ResponseEntity.ok(responseMap); + Gson gson = new GsonBuilder() + .registerTypeAdapter(Date.class, new JsonSerializer() { + @Override + public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return context.serialize(sdf.format(date)); // Format date + } + }) + .create(); + + return gson.toJson(responseMap); } diff --git a/src/main/java/com/iemr/common/dto/grivance/GrievanceWorklistDTO.java b/src/main/java/com/iemr/common/dto/grivance/GrievanceWorklistDTO.java index dc58cab3..b8184162 100644 --- a/src/main/java/com/iemr/common/dto/grivance/GrievanceWorklistDTO.java +++ b/src/main/java/com/iemr/common/dto/grivance/GrievanceWorklistDTO.java @@ -5,6 +5,8 @@ import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.annotation.JsonFormat; + import lombok.Data; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java index 47b8e848..c289bc20 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java @@ -85,7 +85,7 @@ public Set fetchUnallocatedGrievanceCount( @Modifying @Query("UPDATE GrievanceDetails g SET g.complaintResolution = :complaintResolution, g.remarks = :remarks, g.modifiedBy = :modifiedBy, " + "g.benCallID = :benCallID " - + "WHERE g.complaintID = :complaintID AND g.beneficiaryRegID = :beneficiaryRegID AND g.providerServiceMapID = :providerServiceMapID" + + "WHERE g.complaintID = :complaintID AND g.beneficiaryRegID = :beneficiaryRegID " + " AND g.userID = :userID") @Transactional int updateComplaintResolution(@Param("complaintResolution") String complaintResolution, @@ -94,13 +94,12 @@ int updateComplaintResolution(@Param("complaintResolution") String complaintReso @Param("benCallID") Long benCallID, @Param("complaintID") String complaintID, @Param("beneficiaryRegID") Long beneficiaryRegID, - @Param("providerServiceMapID") Integer providerServiceMapID, @Param("userID") Integer userID); @Modifying @Query("UPDATE GrievanceDetails g SET g.complaintResolution = :complaintResolution, g.modifiedBy = :modifiedBy, " + "g.benCallID = :benCallID " - + "WHERE g.complaintID = :complaintID AND g.beneficiaryRegID = :beneficiaryRegID AND g.providerServiceMapID = :providerServiceMapID" + + "WHERE g.complaintID = :complaintID AND g.beneficiaryRegID = :beneficiaryRegID " + " AND g.userID = :userID") @Transactional int updateComplaintResolution(@Param("complaintResolution") String complaintResolution, @@ -108,35 +107,31 @@ int updateComplaintResolution(@Param("complaintResolution") String complaintReso @Param("benCallID") Long benCallID, @Param("complaintID") String complaintID, @Param("beneficiaryRegID") Long beneficiaryRegID, - @Param("providerServiceMapID") Integer providerServiceMapID, @Param("userID") Integer userID); - @Query(" Select grievance.callCounter, grievance.retryNeeded FROM GrievanceDetails grievance where grievance.complaintID = :complaintID") + @Query(" Select grievance.callCounter, grievance.retryNeeded,grievance.complaintResolution FROM GrievanceDetails grievance where grievance.complaintID = :complaintID") public List getCallCounter(@Param("complaintID") String complaintID); @Modifying @Query("UPDATE GrievanceDetails g SET g.isCompleted = :isCompleted, g.retryNeeded = :retryNeeded " - + "WHERE g.complaintID = :complaintID AND g.userID = :userID AND g.beneficiaryRegID = :beneficiaryRegID " - + "AND g.providerServiceMapID = :providerServiceMapID") + + "WHERE g.complaintID = :complaintID AND g.userID = :userID AND g.beneficiaryRegID = :beneficiaryRegID ") @Transactional public int updateCompletedStatusInCall(@Param("isCompleted") Boolean isCompleted, @Param("retryNeeded") Boolean retryNeeded, @Param("complaintID") String complaintID, @Param("userID") Integer userID, - @Param("beneficiaryRegID") Long beneficiaryRegID, - @Param("providerServiceMapID") Integer providerServiceMapID); + @Param("beneficiaryRegID") Long beneficiaryRegID); @Modifying @Query("UPDATE GrievanceDetails g SET g.callCounter = :callCounter, g.retryNeeded = :retryNeeded " - + "WHERE g.complaintID = :complaintID AND g.beneficiaryRegID = :beneficiaryRegID AND g.providerServiceMapID = :providerServiceMapID" + + "WHERE g.complaintID = :complaintID AND g.beneficiaryRegID = :beneficiaryRegID " + " AND g.userID = :userID") @Transactional public int updateCallCounter(@Param("callCounter") Integer callCounter, @Param("retryNeeded") Boolean retryNeeded, @Param("complaintID") String complaintID, @Param("beneficiaryRegID") Long beneficiaryRegID, - @Param("providerServiceMapID") Integer providerServiceMapID, @Param("userID") Integer userID); @Query("SELECT g FROM GrievanceDetails g WHERE " diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java index e70a25e6..5a05b94f 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceDataSyncImpl.java @@ -558,6 +558,7 @@ public String completeGrievanceCall(String request) throws Exception { if (objects != null && objects.length >= 2) { grievanceCallStatus.setCallCounter((Integer) objects[0]); grievanceCallStatus.setRetryNeeded((Boolean) objects[1]); + grievanceCallStatus.setComplaintResolution((String) objects[2]); } } @@ -577,38 +578,28 @@ public String completeGrievanceCall(String request) throws Exception { String callType = callTypeObj.getCallType(); // Logic for reattempt based on call group type and call type - boolean isRetryNeeded = grievanceCallStatus.getRetryNeeded(); - if (callGroupType.equals("Valid")) { - // Conditions when no reattempt is needed - if (callType.equals("Valid") || callType.equals("Test Call")) { - isRetryNeeded = false; - } else if (callType.equals("Disconnected Call") || callType.equals("Serviced Call") - || callType.equals("Silent Call") || callType.equals("Call Back")) { - // Reattempt is needed for these call subtypes - isRetryNeeded = true; - } + if ((null != grievanceCallStatus.getComplaintResolution() + && grievanceCallStatus.getComplaintResolution().equalsIgnoreCase("Resolved")) || (callGroupType.equalsIgnoreCase("Valid") && (callType.equalsIgnoreCase("Valid") || callType.equals("Test Call")))) { + isRetryNeeded = false; + updateCount = grievanceDataRepo.updateCompletedStatusInCall(true, false, complaintID, userID, beneficiaryRegID); } - if (callGroupType.equals("Invalid") && callType.equals("Wrong Number")) { + else if (callGroupType.equalsIgnoreCase("Invalid") && (callType.equalsIgnoreCase("Wrong Number") || callType.equalsIgnoreCase("Invalid Call"))) { isRetryNeeded = false; - // isCompleted = true; - grievanceDataRepo.updateCompletedStatusInCall(isCompleted, isRetryNeeded, complaintID, userID, - beneficiaryRegID, providerServiceMapID); + updateCount = grievanceDataRepo.updateCompletedStatusInCall(true, isRetryNeeded, complaintID, userID, + beneficiaryRegID); + }else { + isRetryNeeded = true; + updateCount = grievanceDataRepo.updateCompletedStatusInCall(false, isRetryNeeded, complaintID, + userID, beneficiaryRegID); } - // Check if max attempts (3) are reached - if (isRetryNeeded == true && grievanceCallStatus.getCallCounter() < grievanceAllocationRetryConfiguration) { - // Increment the call counter for reattempt + if (isRetryNeeded && grievanceCallStatus.getCallCounter() < grievanceAllocationRetryConfiguration) { grievanceCallStatus.setCallCounter(grievanceCallStatus.getCallCounter() + 1); - // Update the retryNeeded flag - isRetryNeeded = true; - // isCompleted = false; updateCallCounter = grievanceDataRepo.updateCallCounter(grievanceCallStatus.getCallCounter(), isRetryNeeded, grievanceCallRequest.getComplaintID(), - grievanceCallRequest.getBeneficiaryRegID(), grievanceCallRequest.getProviderServiceMapID(), + grievanceCallRequest.getBeneficiaryRegID(), grievanceCallRequest.getUserID()); - // Return success when reattempt logic is applied successfully. The grievance - // call needs to be retried, and a reattempt is performed. if (updateCallCounter > 0) response = "Successfully closing call"; else { @@ -619,12 +610,11 @@ public String completeGrievanceCall(String request) throws Exception { isRetryNeeded = false; // isCompleted = true; updateCount = grievanceDataRepo.updateCompletedStatusInCall(isCompleted, isRetryNeeded, complaintID, - userID, beneficiaryRegID, providerServiceMapID); + userID, beneficiaryRegID); response = "max_attempts_reached"; // Indicate that max attempts are reached - } else { - - response = "no_reattempt_needed"; // No reattempt needed + }else if(updateCount > 0) { + response = "Successfully closing call"; } } catch (Exception e) { diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java index c07f59c2..3fbe6e47 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java @@ -401,12 +401,12 @@ public String saveComplaintResolution(String request) throws Exception { int updateCount = 0; if (remarks == null) { updateCount = grievanceDataRepo.updateComplaintResolution(complaintResolution, modifiedBy, benCallID, complaintID, - beneficiaryRegID, providerServiceMapID, userID); + beneficiaryRegID, userID); logger.debug("updated complaint resolution without remarks for complaint id: {}", complaintID); } else { updateCount = grievanceDataRepo.updateComplaintResolution(complaintResolution, remarks, modifiedBy, benCallID, complaintID, - beneficiaryRegID, providerServiceMapID, userID); + beneficiaryRegID, userID); logger.debug("updated complaint resolution with remarks for complaint id: {}", complaintID); } @@ -473,24 +473,16 @@ public String getGrievanceDetailsWithRemarks(String request) throws Exception { // Fetch and set remarks based on complaintResolution value String remarks = ""; - if ("unresolved".equalsIgnoreCase(complaintResolution)) { - // Fetch remarks from t_bencall by joining with t_grievanceworklist based on benRegId - remarks = fetchRemarksFromBenCallByComplaint(grievance.getComplaintID()); - } else if ("resolved".equalsIgnoreCase(complaintResolution)) { - // Fetch remarks from t_grievanceworklist - remarks = fetchRemarksFromGrievanceWorklist(grievance.getComplaintID()); - } else { - // Default: Fetch remarks based on the grievance's specific conditions (no specific resolution status) - String callRemarks = fetchRemarksFromBenCallByComplaint(grievance.getComplaintID()); - if(remarks != null && !remarks.startsWith("No remarks found")) { - remarks = callRemarks; - } - else { - remarks = fetchRemarksFromGrievanceWorklist(grievance.getComplaintID()); - + if(null != complaintResolution) { + remarks = fetchRemarksFromGrievanceWorklist(grievance.getComplaintID()); + if(remarks== null) { + remarks = fetchRemarksFromBenCallByComplaint(grievance.getComplaintID()); } + }else { + remarks = fetchRemarksFromBenCallByComplaint(grievance.getComplaintID()); } + grievanceResponse.setRemarks(remarks); // Add to response list @@ -520,11 +512,12 @@ private String fetchRemarksFromBenCallByComplaint(String complaintID) throws Exc List benCallResults = beneficiaryCallRepo.fetchBenCallRemarks(beneficiaryRegID); if (benCallResults != null && !benCallResults.isEmpty()) { - return (String) benCallResults.get(0)[0]; // Fetch the remarks + if(null != benCallResults.get(0) && null != benCallResults.get(0)[0]) + return (String) benCallResults.get(0)[0]; // Fetch the remarks } } - return "No remarks found in t_bencall"; + return "No remarks found"; } private String fetchRemarksFromGrievanceWorklist(String complaintID) throws JSONException { From 75e5f18a24ecfcdd0a1f0bfe1228d5c2e524b6d2 Mon Sep 17 00:00:00 2001 From: Keval Kanpariya Date: Mon, 31 Mar 2025 11:53:52 +0530 Subject: [PATCH 09/30] Generate a JWT token in the response body for mobile users instead of setting a cookie, Implement refresh tokens with a long expiry for session management, Create a new API to refresh JWT tokens securely, Modify middleware to handle both cookies (for web) and Authorization headers (for mobile). --- .../controller/users/IEMRAdminController.java | 119 +++++++++++++----- .../service/users/IEMRAdminUserService.java | 2 +- .../utils/JwtUserIdValidationFilter.java | 27 ++-- .../java/com/iemr/common/utils/JwtUtil.java | 86 +++++++++---- .../com/iemr/common/utils/UserAgentUtil.java | 9 ++ .../utils/http/HTTPRequestInterceptor.java | 3 +- 6 files changed, 178 insertions(+), 68 deletions(-) create mode 100644 src/main/java/com/iemr/common/utils/UserAgentUtil.java diff --git a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java index c05436e1..246b9713 100644 --- a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java +++ b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java @@ -21,17 +21,14 @@ */ package com.iemr.common.controller.users; -import java.security.NoSuchAlgorithmException; -import java.security.spec.InvalidKeySpecException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; import javax.ws.rs.core.MediaType; +import com.iemr.common.utils.UserAgentUtil; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; @@ -40,20 +37,13 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -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 org.springframework.web.bind.annotation.*; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.iemr.common.config.encryption.SecurePassword; -import com.iemr.common.data.directory.Directory; import com.iemr.common.data.users.LoginSecurityQuestions; import com.iemr.common.data.users.M_Role; import com.iemr.common.data.users.ServiceRoleScreenMapping; @@ -63,10 +53,8 @@ import com.iemr.common.model.user.ChangePasswordModel; import com.iemr.common.model.user.ForceLogoutRequestModel; import com.iemr.common.model.user.LoginRequestModel; -import com.iemr.common.model.user.LoginResponseModel; import com.iemr.common.service.users.IEMRAdminUserService; import com.iemr.common.utils.CookieUtil; -import com.iemr.common.utils.JwtAuthenticationUtil; import com.iemr.common.utils.JwtUtil; import com.iemr.common.utils.encryption.AESUtil; import com.iemr.common.utils.exception.IEMRException; @@ -94,8 +82,6 @@ public class IEMRAdminController { @Autowired private CookieUtil cookieUtil; @Autowired - private JwtAuthenticationUtil jwtAuthenticationUtil; - @Autowired private RedisTemplate redisTemplate; private AESUtil aesUtil; @@ -164,21 +150,39 @@ public String userAuthenticate( } else if (m_User.getUserName() != null && m_User.getDoLogout() != null && m_User.getDoLogout() == true) { deleteSessionObject(m_User.getUserName().trim().toLowerCase()); } + + String jwtToken = null; + String refreshToken = null; + boolean isMobile = false; if (mUser.size() == 1) { - String Jwttoken = jwtUtil.generateToken(m_User.getUserName(), mUser.get(0).getUserID().toString()); - logger.info("jwt token is:" + Jwttoken); + jwtToken = jwtUtil.generateToken(m_User.getUserName(), mUser.get(0).getUserID().toString()); User user = new User(); // Assuming the Users class exists user.setUserID(mUser.get(0).getUserID()); user.setUserName(mUser.get(0).getUserName()); - - String redisKey = "user_" + mUser.get(0).getUserID(); // Use user ID to create a unique key - // Store the user in Redis (set a TTL of 30 minutes) - redisTemplate.opsForValue().set(redisKey, user, 30, TimeUnit.MINUTES); + String userAgent = request.getHeader("User-Agent"); + isMobile = UserAgentUtil.isMobileDevice(userAgent); + logger.info("UserAgentUtil isMobile : " + isMobile); + + if (isMobile) { + refreshToken = jwtUtil.generateRefreshToken(m_User.getUserName(), user.getUserID().toString()); + logger.info("Generated refresh token: {}", refreshToken); + String jti = jwtUtil.getJtiFromToken(refreshToken); + redisTemplate.opsForValue().set( + "refresh:" + jti, + user.getUserID().toString(), + jwtUtil.getRefreshTokenExpiration(), + TimeUnit.MILLISECONDS + ); + } else { + cookieUtil.addJwtTokenToCookie(jwtToken, httpResponse, request); + } + + String redisKey = "user_" + mUser.get(0).getUserID(); // Use user ID to create a unique key - // Set Jwttoken in the response cookie - cookieUtil.addJwtTokenToCookie(Jwttoken, httpResponse, request); + // Store the user in Redis (set a TTL of 30 minutes) + redisTemplate.opsForValue().set(redisKey, user, 30, TimeUnit.MINUTES); createUserMapping(mUser.get(0), resMap, serviceRoleMultiMap, serviceRoleMap, serviceRoleList, previlegeObj); @@ -199,6 +203,13 @@ public String userAuthenticate( } responseObj = iemrAdminUserServiceImpl.generateKeyAndValidateIP(responseObj, remoteAddress, request.getRemoteHost()); + + // Add tokens to response for mobile + if (isMobile && !mUser.isEmpty()) { + responseObj.put("jwtToken", jwtToken); + responseObj.put("refreshToken", refreshToken); + } + response.setResponse(responseObj.toString()); } catch (Exception e) { logger.error("userAuthenticate failed with error " + e.getMessage(), e); @@ -208,6 +219,58 @@ public String userAuthenticate( return response.toString(); } + @CrossOrigin() + @Operation(summary = "generates a refresh token") + @RequestMapping(value = "/refreshToken", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON) + public ResponseEntity refreshToken(@RequestBody Map request) { + String refreshToken = request.get("refreshToken"); + + try { + if (jwtUtil.validateToken(refreshToken) == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid token"); + } + + try { + Claims claims = jwtUtil.getAllClaimsFromToken(refreshToken); + logger.info("refresh token api claims are:" + claims); + } catch (Exception e) { + logger.info("refresh token api claims exception:" + e.getMessage()); + throw new RuntimeException(e); + } + + + Claims claims = jwtUtil.getAllClaimsFromToken(refreshToken); + + // Verify token type + if (!"refresh".equals(claims.get("token_type", String.class))) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid token type"); + } + + // Check revocation using JTI + String jti = claims.getId(); + if (!redisTemplate.hasKey("refresh:" + jti)) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Token revoked"); + } + + // Get user details + String userId = claims.get("userId", String.class); + User user = iemrAdminUserServiceImpl.getUserById(Long.parseLong(userId)); + + // Generate new tokens + String newJwt = jwtUtil.generateToken(user.getUserName(), userId); + + Map tokens = new HashMap<>(); + tokens.put("jwtToken", newJwt); + + return ResponseEntity.ok(tokens); + } catch (ExpiredJwtException ex) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Token expired"); + } catch (Exception e) { + logger.error("Refresh failed: ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Token refresh failed"); + } + } + @CrossOrigin() @Operation(summary = "Log out user from concurrent session") @RequestMapping(value = "/logOutUserFromConcurrentSession", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON) @@ -740,7 +803,7 @@ public String userLogout(HttpServletRequest request) { /** * - * @param request + * @param key * @return */ private void deleteSessionObjectByGettingSessionDetails(String key) { diff --git a/src/main/java/com/iemr/common/service/users/IEMRAdminUserService.java b/src/main/java/com/iemr/common/service/users/IEMRAdminUserService.java index 58ed2b00..3f1d8068 100644 --- a/src/main/java/com/iemr/common/service/users/IEMRAdminUserService.java +++ b/src/main/java/com/iemr/common/service/users/IEMRAdminUserService.java @@ -116,7 +116,7 @@ public List getUserServiceRoleMappingForProvider(Integ String generateTransactionIdForPasswordChange(User user) throws Exception; - + User getUserById(Long userId) throws IEMRException; diff --git a/src/main/java/com/iemr/common/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/common/utils/JwtUserIdValidationFilter.java index 2eb2ee2e..b83f4873 100644 --- a/src/main/java/com/iemr/common/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/common/utils/JwtUserIdValidationFilter.java @@ -52,13 +52,9 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo 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 + "/swagger-ui") - || path.startsWith(contextPath + "/v3/api-docs") - || path.startsWith(contextPath + "/public")) { - logger.info("Skipping filter for path: " + path); + // Skip authentication for public endpoints + if (shouldSkipAuthentication(path, contextPath)) { + logger.info("Skipping filter for path: {}", path); filterChain.doFilter(servletRequest, servletResponse); return; } @@ -71,17 +67,18 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo // Determine which token (cookie or header) to validate String jwtToken = jwtTokenFromCookie != null ? jwtTokenFromCookie : jwtTokenFromHeader; if (jwtToken == null) { + logger.error("JWT token not found in cookies or headers"); 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 (jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtToken)) { // If token is valid, allow the request to proceed + logger.info("Valid JWT token"); filterChain.doFilter(servletRequest, servletResponse); } else { + logger.error("Invalid JWT token"); response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid JWT token"); } } catch (Exception e) { @@ -90,6 +87,16 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } } + private boolean shouldSkipAuthentication(String path, String contextPath) { + return path.equals(contextPath + "/user/userAuthenticate") + || path.equalsIgnoreCase(contextPath + "/user/logOutUserFromConcurrentSession") + || path.startsWith(contextPath + "/swagger-ui") + || path.startsWith(contextPath + "/v3/api-docs") + || path.startsWith(contextPath + "/public") + || path.equals(contextPath + "/user/refreshToken") + ; + } + private String getJwtTokenFromCookies(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { diff --git a/src/main/java/com/iemr/common/utils/JwtUtil.java b/src/main/java/com/iemr/common/utils/JwtUtil.java index a6e8b942..faf3b89d 100644 --- a/src/main/java/com/iemr/common/utils/JwtUtil.java +++ b/src/main/java/com/iemr/common/utils/JwtUtil.java @@ -1,16 +1,21 @@ package com.iemr.common.utils; -import java.security.Key; import java.util.Date; +import java.util.UUID; import java.util.function.Function; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.UnsupportedJwtException; import io.jsonwebtoken.security.Keys; +import io.jsonwebtoken.security.SignatureException; + +import javax.crypto.SecretKey; @Component public class JwtUtil { @@ -18,51 +23,78 @@ public class JwtUtil { @Value("${jwt.secret}") private String SECRET_KEY; - private static final long EXPIRATION_TIME = 24L * 60 * 60 * 1000; // 1 day in milliseconds + @Value("${jwt.access.expiration}") + private long ACCESS_EXPIRATION_TIME; + + @Value("${jwt.refresh.expiration}") + private long REFRESH_EXPIRATION_TIME; - // Generate a key using the secret - private Key getSigningKey() { + private SecretKey getSigningKey() { if (SECRET_KEY == null || SECRET_KEY.isEmpty()) { throw new IllegalStateException("JWT secret key is not set in application.properties"); } return Keys.hmacShaKeyFor(SECRET_KEY.getBytes()); } - // Generate JWT Token public String generateToken(String username, String userId) { - Date now = new Date(); - Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME); + return buildToken(username, userId, "access", ACCESS_EXPIRATION_TIME); + } - // Include the userId in the JWT claims - return Jwts.builder().setSubject(username).claim("userId", userId) // Add userId as a claim - .setIssuedAt(now).setExpiration(expiryDate).signWith(getSigningKey(), SignatureAlgorithm.HS256) + public String generateRefreshToken(String username, String userId) { + return buildToken(username, userId, "refresh", REFRESH_EXPIRATION_TIME); + } + + private String buildToken(String username, String userId, String tokenType, long expiration) { + return Jwts.builder() + .subject(username) + .claim("userId", userId) + .claim("token_type", tokenType) + .id(UUID.randomUUID().toString()) + .issuedAt(new Date()) + .expiration(new Date(System.currentTimeMillis() + expiration)) + .signWith(getSigningKey()) .compact(); } - // Validate and parse JWT Token public Claims validateToken(String token) { try { - // Use the JwtParserBuilder correctly in version 0.12.6 - return Jwts.parser() // Correct method in 0.12.6 to get JwtParserBuilder - .setSigningKey(getSigningKey()) // Set the signing key - .build() // Build the JwtParser - .parseClaimsJws(token) // Parse and validate the token - .getBody(); - } catch (Exception e) { - return null; // Handle token parsing/validation errors + return Jwts.parser() + .verifyWith(getSigningKey()) + .build() + .parseSignedClaims(token) + .getPayload(); + + } catch (ExpiredJwtException ex) { + // Handle expired token specifically if needed + } catch (UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException ex) { + // Log specific error types } + return null; } - public String extractUsername(String token) { - return extractClaim(token, Claims::getSubject); + public T getClaimFromToken(String token, Function claimsResolver) { + final Claims claims = getAllClaimsFromToken(token); + return claimsResolver.apply(claims); } - public T extractClaim(String token, Function claimsResolver) { - final Claims claims = extractAllClaims(token); - return claimsResolver.apply(claims); + public Claims getAllClaimsFromToken(String token) { + return Jwts.parser() + .verifyWith(getSigningKey()) + .build() + .parseSignedClaims(token) + .getPayload(); + } + + public long getRefreshTokenExpiration() { + return REFRESH_EXPIRATION_TIME; + } + + // Additional helper methods + public String getJtiFromToken(String token) { + return getAllClaimsFromToken(token).getId(); } - private Claims extractAllClaims(String token) { - return Jwts.parser().setSigningKey(getSigningKey()).build().parseClaimsJws(token).getBody(); + public String getUsernameFromToken(String token) { + return getAllClaimsFromToken(token).getSubject(); } } \ No newline at end of file diff --git a/src/main/java/com/iemr/common/utils/UserAgentUtil.java b/src/main/java/com/iemr/common/utils/UserAgentUtil.java new file mode 100644 index 00000000..e6b0dbce --- /dev/null +++ b/src/main/java/com/iemr/common/utils/UserAgentUtil.java @@ -0,0 +1,9 @@ +package com.iemr.common.utils; + +public class UserAgentUtil { + public static boolean isMobileDevice(String userAgent) { + if (userAgent == null) return false; + String lowerUA = userAgent.toLowerCase(); + return lowerUA.contains("mobile") || lowerUA.contains("android") || lowerUA.contains("iphone"); + } +} diff --git a/src/main/java/com/iemr/common/utils/http/HTTPRequestInterceptor.java b/src/main/java/com/iemr/common/utils/http/HTTPRequestInterceptor.java index a31b2a2b..b8359fe6 100644 --- a/src/main/java/com/iemr/common/utils/http/HTTPRequestInterceptor.java +++ b/src/main/java/com/iemr/common/utils/http/HTTPRequestInterceptor.java @@ -101,13 +101,12 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons case "api-docs": case "updateBenCallIdsInPhoneBlock": case "userAuthenticateByEncryption": - case "sendOTP": case "validateOTP": case "resendOTP": case "validateSecurityQuestionAndAnswer": case "logOutUserFromConcurrentSession": - + case "refreshToken": break; case "error": status = false; From f33b2ae23897647723d566fb85127c7e68adebb3 Mon Sep 17 00:00:00 2001 From: Keval Kanpariya Date: Mon, 31 Mar 2025 12:11:22 +0530 Subject: [PATCH 10/30] unnecessary code removed --- .../common/controller/users/IEMRAdminController.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java index 246b9713..9cf8a515 100644 --- a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java +++ b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java @@ -230,15 +230,6 @@ public ResponseEntity refreshToken(@RequestBody Map request) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid token"); } - try { - Claims claims = jwtUtil.getAllClaimsFromToken(refreshToken); - logger.info("refresh token api claims are:" + claims); - } catch (Exception e) { - logger.info("refresh token api claims exception:" + e.getMessage()); - throw new RuntimeException(e); - } - - Claims claims = jwtUtil.getAllClaimsFromToken(refreshToken); // Verify token type From f864587161f706c05ee628ac9e9ffd00a7c1b1bf Mon Sep 17 00:00:00 2001 From: Keval Kanpariya <74661970+kevalkanp1011@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:47:49 +0530 Subject: [PATCH 11/30] Update src/main/java/com/iemr/common/controller/users/IEMRAdminController.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../com/iemr/common/controller/users/IEMRAdminController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java index 9cf8a515..8832cb7c 100644 --- a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java +++ b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java @@ -167,7 +167,7 @@ public String userAuthenticate( if (isMobile) { refreshToken = jwtUtil.generateRefreshToken(m_User.getUserName(), user.getUserID().toString()); - logger.info("Generated refresh token: {}", refreshToken); + logger.debug("Refresh token generated successfully for user: {}", user.getUserName()); String jti = jwtUtil.getJtiFromToken(refreshToken); redisTemplate.opsForValue().set( "refresh:" + jti, From dbcc0abc61dbdd2dc6dcbba8cedd4265d5408a6d Mon Sep 17 00:00:00 2001 From: Keval Kanpariya <74661970+kevalkanp1011@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:56:04 +0530 Subject: [PATCH 12/30] Update src/main/java/com/iemr/common/controller/users/IEMRAdminController.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../common/controller/users/IEMRAdminController.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java index 8832cb7c..0ba3f76b 100644 --- a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java +++ b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java @@ -243,10 +243,19 @@ public ResponseEntity refreshToken(@RequestBody Map request) return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Token revoked"); } + // Get user details // Get user details String userId = claims.get("userId", String.class); User user = iemrAdminUserServiceImpl.getUserById(Long.parseLong(userId)); - + + // Validate that the user still exists and is active + if (user == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("User not found"); + } + + if (user.getM_status() == null || !"Active".equalsIgnoreCase(user.getM_status().getStatus())) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("User account is inactive"); + } // Generate new tokens String newJwt = jwtUtil.generateToken(user.getUserName(), userId); From 067bf718fcaa44d5708d66919c6d294a05e28960 Mon Sep 17 00:00:00 2001 From: Keval Kanpariya Date: Mon, 31 Mar 2025 20:07:45 +0530 Subject: [PATCH 13/30] review changes: added doc for refresh token access and added jwt.access.expiration and jwt.refresh.expiration in common_example.properties file. --- src/main/environment/common_example.properties | 2 ++ .../controller/users/IEMRAdminController.java | 3 +-- src/main/java/com/iemr/common/utils/JwtUtil.java | 13 +++++++++++++ src/main/resources/application.properties | 4 +++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/environment/common_example.properties b/src/main/environment/common_example.properties index 9a90154d..5fd7cc99 100644 --- a/src/main/environment/common_example.properties +++ b/src/main/environment/common_example.properties @@ -169,6 +169,8 @@ eausadhaAuthorization= spring.main.allow-bean-definition-overriding=true spring.main.allow-circular-references=true jwt.secret= +jwt.access.expiration=900000 +jwt.refresh.expiration=604800000 fileBasePath =/Doc diff --git a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java index 9cf8a515..de4ef3b8 100644 --- a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java +++ b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java @@ -219,8 +219,7 @@ public String userAuthenticate( return response.toString(); } - @CrossOrigin() - @Operation(summary = "generates a refresh token") + @Operation(summary = "generating a auth token with the refreshToken.") @RequestMapping(value = "/refreshToken", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON) public ResponseEntity refreshToken(@RequestBody Map request) { String refreshToken = request.get("refreshToken"); diff --git a/src/main/java/com/iemr/common/utils/JwtUtil.java b/src/main/java/com/iemr/common/utils/JwtUtil.java index faf3b89d..03d2a9b1 100644 --- a/src/main/java/com/iemr/common/utils/JwtUtil.java +++ b/src/main/java/com/iemr/common/utils/JwtUtil.java @@ -85,6 +85,19 @@ public Claims getAllClaimsFromToken(String token) { .getPayload(); } + /** + * Retrieves the refresh token expiration time. + * + * The refresh token expiration time determines how long a refresh token remains valid. + * A longer expiration time allows users to stay logged in without frequently re-authenticating. + * + * Security & Business Considerations: + * - A longer expiration (e.g., 7 days or more) improves user experience but may pose security risks if tokens are leaked. + * - A shorter expiration (e.g., 1 hour) enhances security but may require users to log in more frequently. + * - This duration is configurable and can be overridden in the environment specific application properties file. + * + * @return The expiration time in milliseconds. + */ public long getRefreshTokenExpiration() { return REFRESH_EXPIRATION_TIME; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d645f273..9ff13bfa 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -178,4 +178,6 @@ everwellDataSyncDuration = 15 quality-Audit-PageSize=5 ## max no of failed login attempt -failedLoginAttempt=5 +failedLoginAttempt= + + From adba41e52f6e017e70c311948e25466691557597 Mon Sep 17 00:00:00 2001 From: Keval Kanpariya <74661970+kevalkanp1011@users.noreply.github.com> Date: Tue, 1 Apr 2025 09:49:13 +0530 Subject: [PATCH 14/30] Update src/main/java/com/iemr/common/controller/users/IEMRAdminController.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../controller/users/IEMRAdminController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java index 3f33a8fb..28cb7227 100644 --- a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java +++ b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java @@ -261,6 +261,20 @@ public ResponseEntity refreshToken(@RequestBody Map request) Map tokens = new HashMap<>(); tokens.put("jwtToken", newJwt); + Map tokens = new HashMap<>(); + tokens.put("jwtToken", newJwt); + + // Generate and store a new refresh token (token rotation) + String newRefreshToken = jwtUtil.generateRefreshToken(user.getUserName(), userId); + String newJti = jwtUtil.getJtiFromToken(newRefreshToken); + redisTemplate.opsForValue().set( + "refresh:" + newJti, + userId, + jwtUtil.getRefreshTokenExpiration(), + TimeUnit.MILLISECONDS + ); + tokens.put("refreshToken", newRefreshToken); + return ResponseEntity.ok(tokens); } catch (ExpiredJwtException ex) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Token expired"); From 5f382bf48b214476b229e83b15dacf114af3b099 Mon Sep 17 00:00:00 2001 From: Keval Kanpariya Date: Tue, 1 Apr 2025 09:57:11 +0530 Subject: [PATCH 15/30] review changes --- src/main/environment/common_ci.properties | 2 ++ src/main/environment/common_dev.properties | 2 ++ src/main/environment/common_test.properties | 2 ++ src/main/environment/common_uat.properties | 2 ++ src/main/resources/application.properties | 4 +--- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/environment/common_ci.properties b/src/main/environment/common_ci.properties index 1f82e9ea..9a5362ac 100644 --- a/src/main/environment/common_ci.properties +++ b/src/main/environment/common_ci.properties @@ -141,6 +141,8 @@ spring.main.allow-bean-definition-overriding=true spring.main.allow-circular-references=true jwt.secret=@env.JWT_SECRET_KEY@ +jwt.access.expiration=900000 +jwt.refresh.expiration=604800000 #ELK logging file name diff --git a/src/main/environment/common_dev.properties b/src/main/environment/common_dev.properties index 597a8bf6..25dabd6f 100644 --- a/src/main/environment/common_dev.properties +++ b/src/main/environment/common_dev.properties @@ -171,6 +171,8 @@ spring.main.allow-circular-references=true fileBasePath =/Doc jwt.secret= +jwt.access.expiration=900000 +jwt.refresh.expiration=604800000 ##grievance API call updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 diff --git a/src/main/environment/common_test.properties b/src/main/environment/common_test.properties index df9007ee..a13ae5fd 100644 --- a/src/main/environment/common_test.properties +++ b/src/main/environment/common_test.properties @@ -172,6 +172,8 @@ spring.main.allow-circular-references=true fileBasePath =/Doc jwt.secret= +jwt.access.expiration=900000 +jwt.refresh.expiration=604800000 ##grievance API call diff --git a/src/main/environment/common_uat.properties b/src/main/environment/common_uat.properties index 92c55f4a..637047ea 100644 --- a/src/main/environment/common_uat.properties +++ b/src/main/environment/common_uat.properties @@ -144,6 +144,8 @@ spring.main.allow-circular-references=true fileBasePath =/Doc jwt.secret= +jwt.access.expiration=900000 +jwt.refresh.expiration=604800000 ##grievance API call updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9ff13bfa..d645f273 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -178,6 +178,4 @@ everwellDataSyncDuration = 15 quality-Audit-PageSize=5 ## max no of failed login attempt -failedLoginAttempt= - - +failedLoginAttempt=5 From d288ed1518536c794c63ad711b1c37dd0bb8112b Mon Sep 17 00:00:00 2001 From: Keval Kanpariya Date: Tue, 1 Apr 2025 10:00:07 +0530 Subject: [PATCH 16/30] review changes --- src/main/environment/common_ci.properties | 2 -- src/main/environment/common_dev.properties | 2 -- src/main/environment/common_example.properties | 2 -- src/main/environment/common_test.properties | 2 -- src/main/environment/common_uat.properties | 2 -- src/main/resources/application.properties | 4 ++++ 6 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/environment/common_ci.properties b/src/main/environment/common_ci.properties index 9a5362ac..1f82e9ea 100644 --- a/src/main/environment/common_ci.properties +++ b/src/main/environment/common_ci.properties @@ -141,8 +141,6 @@ spring.main.allow-bean-definition-overriding=true spring.main.allow-circular-references=true jwt.secret=@env.JWT_SECRET_KEY@ -jwt.access.expiration=900000 -jwt.refresh.expiration=604800000 #ELK logging file name diff --git a/src/main/environment/common_dev.properties b/src/main/environment/common_dev.properties index 25dabd6f..597a8bf6 100644 --- a/src/main/environment/common_dev.properties +++ b/src/main/environment/common_dev.properties @@ -171,8 +171,6 @@ spring.main.allow-circular-references=true fileBasePath =/Doc jwt.secret= -jwt.access.expiration=900000 -jwt.refresh.expiration=604800000 ##grievance API call updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 diff --git a/src/main/environment/common_example.properties b/src/main/environment/common_example.properties index 5fd7cc99..9a90154d 100644 --- a/src/main/environment/common_example.properties +++ b/src/main/environment/common_example.properties @@ -169,8 +169,6 @@ eausadhaAuthorization= spring.main.allow-bean-definition-overriding=true spring.main.allow-circular-references=true jwt.secret= -jwt.access.expiration=900000 -jwt.refresh.expiration=604800000 fileBasePath =/Doc diff --git a/src/main/environment/common_test.properties b/src/main/environment/common_test.properties index a13ae5fd..df9007ee 100644 --- a/src/main/environment/common_test.properties +++ b/src/main/environment/common_test.properties @@ -172,8 +172,6 @@ spring.main.allow-circular-references=true fileBasePath =/Doc jwt.secret= -jwt.access.expiration=900000 -jwt.refresh.expiration=604800000 ##grievance API call diff --git a/src/main/environment/common_uat.properties b/src/main/environment/common_uat.properties index 637047ea..92c55f4a 100644 --- a/src/main/environment/common_uat.properties +++ b/src/main/environment/common_uat.properties @@ -144,8 +144,6 @@ spring.main.allow-circular-references=true fileBasePath =/Doc jwt.secret= -jwt.access.expiration=900000 -jwt.refresh.expiration=604800000 ##grievance API call updateGrievanceDetails = /grsbepro/igemr1097/public/api/v1/state-wise/grievance-list?page=PageNumber¤tpage=1 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d645f273..9418e973 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -179,3 +179,7 @@ quality-Audit-PageSize=5 ## max no of failed login attempt failedLoginAttempt=5 + +#Jwt Token configuration +jwt.access.expiration=900000 +jwt.refresh.expiration=604800000 From c16bf0ca19252cc1c9ccafc0474cf0c976965a44 Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Tue, 1 Apr 2025 13:24:43 +0530 Subject: [PATCH 17/30] Grievance repo condition added --- .../com/iemr/common/repository/grievance/GrievanceDataRepo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java index c289bc20..a0e8248e 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java @@ -49,7 +49,7 @@ public int allocateGrievance(@Param("grievanceId") Long grievanceId, + "group by grievance.preferredLanguage") public Set fetchGrievanceRecordsCount(@Param("userID") Integer userID); - @Query("SELECT g FROM GrievanceDetails g WHERE g.userID = :userID AND g.preferredLanguage = :language AND g.isAllocated = true") + @Query("SELECT g FROM GrievanceDetails g WHERE g.userID = :userID AND g.preferredLanguage = :language AND g.isAllocated = true AND g.isCompleted = false") List findAllocatedGrievancesByUserAndLanguage(@Param("userID") Integer userID, @Param("language") String language); From 0b7922e38b9d977035d049665d6ffc2c2c2c1f2e Mon Sep 17 00:00:00 2001 From: Ravi Shanigarapu Date: Tue, 1 Apr 2025 17:35:50 +0530 Subject: [PATCH 18/30] completed grievance API change --- .../grievance/GrievanceController.java | 7 ---- .../BeneficiaryCallRepository.java | 4 +-- .../grievance/GrievanceDataRepo.java | 2 +- .../GrievanceHandlingServiceImpl.java | 32 +++++++++++++------ 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java b/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java index d27be652..bf243f69 100644 --- a/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java +++ b/src/main/java/com/iemr/common/controller/grievance/GrievanceController.java @@ -2,8 +2,6 @@ import java.lang.reflect.Type; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -17,17 +15,12 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; diff --git a/src/main/java/com/iemr/common/repository/callhandling/BeneficiaryCallRepository.java b/src/main/java/com/iemr/common/repository/callhandling/BeneficiaryCallRepository.java index e48e8f9d..38c67f08 100644 --- a/src/main/java/com/iemr/common/repository/callhandling/BeneficiaryCallRepository.java +++ b/src/main/java/com/iemr/common/repository/callhandling/BeneficiaryCallRepository.java @@ -191,7 +191,7 @@ public ArrayList getExistingBCByCallIDAndAgentID(@Param("callID BeneficiaryCall findByBenCallID(Long benCallID); - @Query("SELECT b.remarks FROM BeneficiaryCall b WHERE b.beneficiaryRegID = :beneficiaryRegID") - List fetchBenCallRemarks(@Param("beneficiaryRegID") Long beneficiaryRegID); + @Query("SELECT b.remarks FROM BeneficiaryCall b WHERE b.benCallID = :benCallID") + List fetchBenCallRemarks(@Param("benCallID") Long benCallID); } diff --git a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java index a0e8248e..37d2f0dc 100644 --- a/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java +++ b/src/main/java/com/iemr/common/repository/grievance/GrievanceDataRepo.java @@ -137,7 +137,7 @@ public int updateCallCounter(@Param("callCounter") Integer callCounter, @Query("SELECT g FROM GrievanceDetails g WHERE " + "(g.state = :state OR :state IS NULL) " + "AND (g.complaintResolution = :complaintResolution OR :complaintResolution IS NULL) " - + "AND g.createdDate BETWEEN :startDate AND :endDate") + + "AND g.createdDate BETWEEN :startDate AND :endDate AND g.isCompleted = true") List fetchGrievanceDetailsBasedOnParams( @Param("state") String state, @Param("complaintResolution") String complaintResolution, diff --git a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java index 3fbe6e47..45e798f6 100644 --- a/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java +++ b/src/main/java/com/iemr/common/service/grievance/GrievanceHandlingServiceImpl.java @@ -1,5 +1,6 @@ package com.iemr.common.service.grievance; +import java.lang.reflect.Type; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Set; +import org.apache.commons.lang.StringUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -20,6 +22,11 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import com.iemr.common.data.grievance.GetGrievanceWorklistRequest; import com.iemr.common.data.grievance.GrievanceAllocationRequest; import com.iemr.common.data.grievance.GrievanceDetails; @@ -473,11 +480,8 @@ public String getGrievanceDetailsWithRemarks(String request) throws Exception { // Fetch and set remarks based on complaintResolution value String remarks = ""; - if(null != complaintResolution) { - remarks = fetchRemarksFromGrievanceWorklist(grievance.getComplaintID()); - if(remarks== null) { - remarks = fetchRemarksFromBenCallByComplaint(grievance.getComplaintID()); - } + if(!StringUtils.isEmpty(grievance.getRemarks())) { + remarks = grievance.getRemarks(); }else { remarks = fetchRemarksFromBenCallByComplaint(grievance.getComplaintID()); } @@ -488,9 +492,17 @@ public String getGrievanceDetailsWithRemarks(String request) throws Exception { // Add to response list grievanceResponseList.add(grievanceResponse); } - - // Convert the list of GrievanceResponse objects to JSON and return as a string - return objectMapper.writeValueAsString(grievanceResponseList); + Gson gson = new GsonBuilder() + .serializeNulls() + .registerTypeAdapter(Date.class, new JsonSerializer() { + @Override + public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return context.serialize(sdf.format(date)); // Format date + } + }) + .create(); + return gson.toJson(grievanceResponseList); } catch (Exception e) { logger.error("Error while getting grievance details with remarks: " + e.getMessage(), e); @@ -507,9 +519,9 @@ private String fetchRemarksFromBenCallByComplaint(String complaintID) throws Exc if (grievanceWorklist != null && !grievanceWorklist.isEmpty()) { GrievanceDetails grievance = grievanceWorklist.get(0); Long beneficiaryRegID = grievance.getBeneficiaryRegID(); // Fetch the beneficiaryRegID from the grievance - + Long benCallID = grievance.getBenCallID(); // Query t_bencall to fetch remarks based on benRegId - List benCallResults = beneficiaryCallRepo.fetchBenCallRemarks(beneficiaryRegID); + List benCallResults = beneficiaryCallRepo.fetchBenCallRemarks(benCallID); if (benCallResults != null && !benCallResults.isEmpty()) { if(null != benCallResults.get(0) && null != benCallResults.get(0)[0]) From 08fd1b823f514ef9f6f6273154be97687746a276 Mon Sep 17 00:00:00 2001 From: Keval Kanpariya Date: Fri, 4 Apr 2025 12:56:34 +0530 Subject: [PATCH 19/30] review changes --- pom.xml | 1 + .../com/iemr/common/controller/users/IEMRAdminController.java | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index db199065..cc723da8 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ common-API Piramal - Helpline: 1097 Module API + Piramal - Helpline: 1097 Module API org.springframework.boot diff --git a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java index 28cb7227..e26f15dd 100644 --- a/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java +++ b/src/main/java/com/iemr/common/controller/users/IEMRAdminController.java @@ -258,9 +258,6 @@ public ResponseEntity refreshToken(@RequestBody Map request) // Generate new tokens String newJwt = jwtUtil.generateToken(user.getUserName(), userId); - Map tokens = new HashMap<>(); - tokens.put("jwtToken", newJwt); - Map tokens = new HashMap<>(); tokens.put("jwtToken", newJwt); From b807305b488cc5a69e0762905ac10c8a499f236e Mon Sep 17 00:00:00 2001 From: Keval Kanpariya Date: Sat, 5 Apr 2025 15:46:20 +0530 Subject: [PATCH 20/30] duplicate description removed --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index cc723da8..db199065 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,6 @@ common-API Piramal - Helpline: 1097 Module API - Piramal - Helpline: 1097 Module API org.springframework.boot From cd4a707e2759b5cb5f0a1e7e95b666df9c9ce1df Mon Sep 17 00:00:00 2001 From: Keval Kanpariya Date: Thu, 10 Apr 2025 17:58:33 +0530 Subject: [PATCH 21/30] unnecssary comments are removed --- src/main/java/com/iemr/common/utils/JwtUtil.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/main/java/com/iemr/common/utils/JwtUtil.java b/src/main/java/com/iemr/common/utils/JwtUtil.java index 03d2a9b1..c0241954 100644 --- a/src/main/java/com/iemr/common/utils/JwtUtil.java +++ b/src/main/java/com/iemr/common/utils/JwtUtil.java @@ -85,19 +85,7 @@ public Claims getAllClaimsFromToken(String token) { .getPayload(); } - /** - * Retrieves the refresh token expiration time. - * - * The refresh token expiration time determines how long a refresh token remains valid. - * A longer expiration time allows users to stay logged in without frequently re-authenticating. - * - * Security & Business Considerations: - * - A longer expiration (e.g., 7 days or more) improves user experience but may pose security risks if tokens are leaked. - * - A shorter expiration (e.g., 1 hour) enhances security but may require users to log in more frequently. - * - This duration is configurable and can be overridden in the environment specific application properties file. - * - * @return The expiration time in milliseconds. - */ + public long getRefreshTokenExpiration() { return REFRESH_EXPIRATION_TIME; } From 72715a79bbd00227e01ffec736c6c32a609e46de Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 11 Apr 2025 14:21:06 +0530 Subject: [PATCH 22/30] firebase setup --- pom.xml | 8 +++- .../com/iemr/common/CommonApplication.java | 20 ++++++++++ .../FirebaseNotificationController.java | 25 +++++++++++++ .../notification/NotificationMessage.java | 14 +++++++ .../FirebaseNotificationService.java | 37 +++++++++++++++++++ 5 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java create mode 100644 src/main/java/com/iemr/common/model/notification/NotificationMessage.java create mode 100644 src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java diff --git a/pom.xml b/pom.xml index db199065..8e41c424 100644 --- a/pom.xml +++ b/pom.xml @@ -107,6 +107,12 @@ + + + com.google.firebase + firebase-admin + 9.4.3 + org.springframework.boot spring-boot-starter-data-jpa @@ -497,7 +503,7 @@ - commonapi-v3.0.0 + commonapi-v1.0 org.apache.maven.plugins diff --git a/src/main/java/com/iemr/common/CommonApplication.java b/src/main/java/com/iemr/common/CommonApplication.java index 83078018..cd140056 100644 --- a/src/main/java/com/iemr/common/CommonApplication.java +++ b/src/main/java/com/iemr/common/CommonApplication.java @@ -21,11 +21,16 @@ */ package com.iemr.common; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; +import com.google.firebase.messaging.FirebaseMessaging; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; +import org.springframework.core.io.ClassPathResource; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; @@ -36,6 +41,8 @@ import com.iemr.common.data.users.User; import com.iemr.common.utils.IEMRApplBeans; +import java.io.IOException; + @SpringBootApplication @EnableScheduling public class CommonApplication extends SpringBootServletInitializer { @@ -73,4 +80,17 @@ public RedisTemplate redisTemplate(RedisConnectionFactory factor return template; } + @Bean + FirebaseMessaging firebaseMessaging() throws IOException { + GoogleCredentials googleCredentials = GoogleCredentials.fromStream( + new ClassPathResource("Place your admin json").getInputStream() + + ); + FirebaseOptions firebaseOptions = FirebaseOptions.builder().setCredentials(googleCredentials).build(); + FirebaseApp firebaseApp = FirebaseApp.initializeApp(firebaseOptions); + return FirebaseMessaging.getInstance(firebaseApp); + + + } + } diff --git a/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java b/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java new file mode 100644 index 00000000..22f438ca --- /dev/null +++ b/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java @@ -0,0 +1,25 @@ +package com.iemr.common.controller.firebaseNotification; + +import com.iemr.common.model.notification.NotificationMessage; +import com.iemr.common.service.firebaseNotification.FirebaseNotificationService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping(value= "/firebaseNotification") +public class FirebaseNotificationController { + final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Autowired + FirebaseNotificationService firebaseNotificationService; + + @CrossOrigin + @RequestMapping(value = "sendNotification",method = RequestMethod.POST) + public String sendNotificationByToken(@RequestBody NotificationMessage notificationMessage){ + return firebaseNotificationService.sendNotification(notificationMessage); + } + + +} diff --git a/src/main/java/com/iemr/common/model/notification/NotificationMessage.java b/src/main/java/com/iemr/common/model/notification/NotificationMessage.java new file mode 100644 index 00000000..2838eca3 --- /dev/null +++ b/src/main/java/com/iemr/common/model/notification/NotificationMessage.java @@ -0,0 +1,14 @@ +package com.iemr.common.model.notification; + +import lombok.Data; + +import java.util.Map; + +@Data +public class NotificationMessage { + private String appType; + private String topic; + private String title; + private String body; + private Map data; +} diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java new file mode 100644 index 00000000..642bd6fa --- /dev/null +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -0,0 +1,37 @@ +package com.iemr.common.service.firebaseNotification; + +import com.google.firebase.FirebaseException; +import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.Message; +import com.google.firebase.messaging.Notification; +import com.iemr.common.model.notification.NotificationMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class FirebaseNotificationService { + final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Autowired + FirebaseMessaging firebaseMessaging; + + public String sendNotification(NotificationMessage notificationMessage) { + + Notification notification = Notification.builder().setTitle(notificationMessage.getTitle()).setBody(notificationMessage.getBody()).build(); + + Message message = Message.builder().setTopic(notificationMessage.getTopic()).setNotification(notification).putAllData(notificationMessage.getData()).build(); + + + try { + String response = FirebaseMessaging.getInstance().send(message); + + return response; + } catch (FirebaseException e) { + return "Error sending notification"; + + } + } + +} From 121928c71ac4635d34de301c9c152bd135b2f19a Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 11 Apr 2025 15:23:54 +0530 Subject: [PATCH 23/30] firebase setup --- src/main/java/com/iemr/common/CommonApplication.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/iemr/common/CommonApplication.java b/src/main/java/com/iemr/common/CommonApplication.java index cd140056..7b709768 100644 --- a/src/main/java/com/iemr/common/CommonApplication.java +++ b/src/main/java/com/iemr/common/CommonApplication.java @@ -94,3 +94,4 @@ FirebaseMessaging firebaseMessaging() throws IOException { } } + From 396359d637bbd4f7f1ae528c2ff942b0ac1a9185 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 11 Apr 2025 16:15:05 +0530 Subject: [PATCH 24/30] firebase setup --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8e41c424..454fd02a 100644 --- a/pom.xml +++ b/pom.xml @@ -503,7 +503,7 @@ - commonapi-v1.0 + commonapi-v3.0.0 org.apache.maven.plugins From 0e24515a15014282ad7aade9ff1d9e1151ed9ca2 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 11 Apr 2025 18:32:07 +0530 Subject: [PATCH 25/30] firebase setup --- .../firebaseNotification/FirebaseNotificationController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java b/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java index 22f438ca..18601d22 100644 --- a/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java +++ b/src/main/java/com/iemr/common/controller/firebaseNotification/FirebaseNotificationController.java @@ -8,14 +8,13 @@ import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping(value= "/firebaseNotification") +@RequestMapping(value= "/firebaseNotification",headers = "Authorization") public class FirebaseNotificationController { final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); @Autowired FirebaseNotificationService firebaseNotificationService; - @CrossOrigin @RequestMapping(value = "sendNotification",method = RequestMethod.POST) public String sendNotificationByToken(@RequestBody NotificationMessage notificationMessage){ return firebaseNotificationService.sendNotification(notificationMessage); From 70a425605d87cddacc876a361a307ceb86d5e3ec Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Mon, 14 Apr 2025 14:48:33 +0530 Subject: [PATCH 26/30] firebase setup --- .../com/iemr/common/CommonApplication.java | 12 ---- .../firebase/FirebaseMessagingConfig.java | 57 +++++++++++++++++++ 2 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java diff --git a/src/main/java/com/iemr/common/CommonApplication.java b/src/main/java/com/iemr/common/CommonApplication.java index 7b709768..ea0adb97 100644 --- a/src/main/java/com/iemr/common/CommonApplication.java +++ b/src/main/java/com/iemr/common/CommonApplication.java @@ -80,18 +80,6 @@ public RedisTemplate redisTemplate(RedisConnectionFactory factor return template; } - @Bean - FirebaseMessaging firebaseMessaging() throws IOException { - GoogleCredentials googleCredentials = GoogleCredentials.fromStream( - new ClassPathResource("Place your admin json").getInputStream() - - ); - FirebaseOptions firebaseOptions = FirebaseOptions.builder().setCredentials(googleCredentials).build(); - FirebaseApp firebaseApp = FirebaseApp.initializeApp(firebaseOptions); - return FirebaseMessaging.getInstance(firebaseApp); - - - } } diff --git a/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java b/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java new file mode 100644 index 00000000..438ca4f9 --- /dev/null +++ b/src/main/java/com/iemr/common/config/firebase/FirebaseMessagingConfig.java @@ -0,0 +1,57 @@ +package com.iemr.common.config.firebase; + +import com.google.auth.oauth2.GoogleCredentials; +import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; +import com.google.firebase.messaging.FirebaseMessaging; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Base64; + +@Configuration +public class FirebaseMessagingConfig { + + @Value("${firebase.enabled:false}") + private boolean firebaseEnabled; + + @Value("${firebase.credential-file:}") + private String firebaseCredentialFile; + + @Value("${firebase.credential-base64:}") + private String firebaseCredentialBase64; + + @Bean + public FirebaseMessaging firebaseMessaging() throws IOException { + if (!firebaseEnabled) { + throw new IllegalStateException("Firebase is disabled"); + } + + GoogleCredentials credentials; + + if (!firebaseCredentialBase64.isBlank()) { + byte[] decoded = Base64.getDecoder().decode(firebaseCredentialBase64); + credentials = GoogleCredentials.fromStream(new ByteArrayInputStream(decoded)); + } else if (!firebaseCredentialFile.isBlank()) { + credentials = GoogleCredentials.fromStream( + new ClassPathResource(firebaseCredentialFile).getInputStream() + ); + } else { + throw new IllegalStateException("No Firebase credentials provided"); + } + + FirebaseOptions options = FirebaseOptions.builder() + .setCredentials(credentials) + .build(); + + FirebaseApp firebaseApp = FirebaseApp.getApps().isEmpty() + ? FirebaseApp.initializeApp(options) + : FirebaseApp.getInstance(); + + return FirebaseMessaging.getInstance(firebaseApp); + } +} From 8df1a0fb68d596676c6c4772fe2a44bf317ea9bf Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 17 Apr 2025 14:22:00 +0530 Subject: [PATCH 27/30] firebase setup --- src/main/environment/common_ci.properties | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/environment/common_ci.properties b/src/main/environment/common_ci.properties index 1f82e9ea..0e498ac8 100644 --- a/src/main/environment/common_ci.properties +++ b/src/main/environment/common_ci.properties @@ -34,6 +34,13 @@ send-message-url=@env.SMS_MESSAGE_URL@ start-sms-scheduler=false cron-scheduler-sms=0 0/1 * * * ? * +// Firebase Configuration +firebase.enabled= @env.FIREBASE_ENABLE@ +# if using file +firebase.credential-file=@env.FIREBASE_CREDENTIAL@ +# for CI/CD +credential-base64 =@env.CREDENTIAL_BASE^$@ + #### Email Configuration send-email=@env.SEND_EMAIL@ spring.mail.host=@env.MAIL_HOST@ From 7222cbd725898cd680365d3ed1d1b676e34e8760 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 17 Apr 2025 14:25:40 +0530 Subject: [PATCH 28/30] Firebase Configuration in ci --- src/main/environment/common_ci.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/environment/common_ci.properties b/src/main/environment/common_ci.properties index 0e498ac8..478cd4e4 100644 --- a/src/main/environment/common_ci.properties +++ b/src/main/environment/common_ci.properties @@ -34,8 +34,8 @@ send-message-url=@env.SMS_MESSAGE_URL@ start-sms-scheduler=false cron-scheduler-sms=0 0/1 * * * ? * -// Firebase Configuration -firebase.enabled= @env.FIREBASE_ENABLE@ ++ # Firebase Configuration +firebase.enabled=@env.FIREBASE_ENABLE@ # if using file firebase.credential-file=@env.FIREBASE_CREDENTIAL@ # for CI/CD From ede033903ea402a6e3c1c918d66219985a7e80bd Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 17 Apr 2025 14:27:01 +0530 Subject: [PATCH 29/30] Firebase Configuration in ci --- src/main/environment/common_ci.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/environment/common_ci.properties b/src/main/environment/common_ci.properties index 478cd4e4..a9a8426f 100644 --- a/src/main/environment/common_ci.properties +++ b/src/main/environment/common_ci.properties @@ -34,12 +34,12 @@ send-message-url=@env.SMS_MESSAGE_URL@ start-sms-scheduler=false cron-scheduler-sms=0 0/1 * * * ? * -+ # Firebase Configuration +# Firebase Configuration firebase.enabled=@env.FIREBASE_ENABLE@ # if using file firebase.credential-file=@env.FIREBASE_CREDENTIAL@ # for CI/CD -credential-base64 =@env.CREDENTIAL_BASE^$@ +firebase.credential-base64=@env.CREDENTIAL_BASE64@ #### Email Configuration send-email=@env.SEND_EMAIL@ From e3a177e65d022e461a47d379075c712f30947f4f Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Fri, 2 May 2025 12:44:26 +0530 Subject: [PATCH 30/30] firebase notification setup --- .../com/iemr/common/model/notification/NotificationMessage.java | 1 + .../firebaseNotification/FirebaseNotificationService.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/common/model/notification/NotificationMessage.java b/src/main/java/com/iemr/common/model/notification/NotificationMessage.java index 2838eca3..eed0c171 100644 --- a/src/main/java/com/iemr/common/model/notification/NotificationMessage.java +++ b/src/main/java/com/iemr/common/model/notification/NotificationMessage.java @@ -7,6 +7,7 @@ @Data public class NotificationMessage { private String appType; + private String token; private String topic; private String title; private String body; diff --git a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java index 642bd6fa..e41ca94f 100644 --- a/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java +++ b/src/main/java/com/iemr/common/service/firebaseNotification/FirebaseNotificationService.java @@ -21,7 +21,7 @@ public String sendNotification(NotificationMessage notificationMessage) { Notification notification = Notification.builder().setTitle(notificationMessage.getTitle()).setBody(notificationMessage.getBody()).build(); - Message message = Message.builder().setTopic(notificationMessage.getTopic()).setNotification(notification).putAllData(notificationMessage.getData()).build(); + Message message = Message.builder().setToken(notificationMessage.getToken()).setNotification(notification).putAllData(notificationMessage.getData()).build(); try {